/**
 * @fileoverview Tímto skriptem simulujeme, jak by asi probíhalo zpracování
 * ajaxových požadavků skriptem na straně serveru (například skriptem jazyka
 * PHP).
 * Rozhodně není možné tento kód považovat za skutečné řešení – hned bychom
 * narazili na spoustu problémů. Existuje řada frameworků jazyka JavaScript,
 * které eleminují nutnost používat jazyk na straně serveru pro takovéto
 * účely, toto ale není jeden z nich.
 */
 
(function($) {

switch (odesliAjaxovyPozadavek.pozadavek.typ) {
  /************************************************************************
  Validace formulářového pole.
  Očekáváme následující data požadavku:
    - id – identifikátor formulářového pole,
	- hodnota – hodnota formulářového pole.
  Jako odpověd vracíme objekt s následujícími vlastnostmi:
    - hodnotaJePlatna – true, jestliže je hodnota pole platná; jinak false,
	- chybovaZprava – v případě, že je hodnota neplatná, obsahuje chybovou
	  zprávu.
  *************************************************************************/
  case 'validuj':
    var data = odesliAjaxovyPozadavek.pozadavek.data,
      hodnotaJePlatna,
      chybovaZprava = '';
    switch (data.id) {
      /* Kontrola pole s termínem – hodnota musí být neprázdná. Zde bychom měli
	  kontrolovat i správnost formátu data. Vzhledem k tomu, že toto není
	  skutečná validace a náš ovládací prvek Datepicker nám nedovolí zadat datum ručně,
	  tak tuto kontrolu nemusíme dělat. Ve skutečném skriptu pro validaci by to
	  však bylo nezbytné. */
      case 'termin':
        if (data.hodnota != '') {
          hodnotaJePlatna = true;
        } else {
          hodnotaJePlatna = false;
          chybovaZprava = 'Termín je povinný.';
        }
        break;

      /* Kontrola pole se jménem – hodnota musí být neprázdná. */
      case 'jmeno':
        if (data.hodnota != '') {
          hodnotaJePlatna = true;
        } else {
          hodnotaJePlatna = false;
          chybovaZprava = 'Jméno je povinné.';
        }
        break;

      /* Kontrola pole se příjmením – hodnota musí být neprázdná. */
      case 'prijmeni':
        if (data.hodnota != '') {
          hodnotaJePlatna = true;
        } else {
          hodnotaJePlatna = false;
          chybovaZprava = 'Příjmení je povinné.';
        }
        break;

      /* Kontrola pole s e-mailovou adresou – hodnota musí být neprázdná a musí
      odpovídat platné e-mailové adrese. */
      case 'email':
        if (data.hodnota != '') {
          hodnotaJePlatna = data.hodnota.search(/^((\"[^\"\f\n\r\t\v\b]+\")|([\w\!\#\$\%\&'\*\+\-\~\/\^\`\|\{\}\=\?]+(\.[\w\!\#\$\%\&'\*\+\-\~\/\^\`\|\{\}\=\?]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/) != -1;
		  if (!hodnotaJePlatna) {
		    chybovaZprava = 'Zadejte prosím platnou e-mailovou adresu.';
		  }
		} else {
          hodnotaJePlatna = false;
		  chybovaZprava = 'E-mailová adresa je povinná.';
        }
        break;

      /* Kontrola pole s PSČ – pokud je hodnota neprázdná, musí odpovídat
      platnému českému PSČ. */
      case 'psc':
        if (data.hodnota != '') {
          hodnotaJePlatna = data.hodnota.search(/^[1-9]{1}[0-9]{2}\s?[0-9]{2}$/) != -1;
		  if (!hodnotaJePlatna) {
		    chybovaZprava = 'Zadejte prosím platné PSČ.';
		  }
		} else {
          hodnotaJePlatna = true;
        }
        break;

      // Hodnotu pole neznámého typu označíme jako platnou.
      default:
        hodnotaJePlatna = true;
        break;
	}

	// Vrátíme objekt s odpovědí.
	odesliAjaxovyPozadavek.odpoved = {
      hodnotaJePlatna: hodnotaJePlatna,
      chybovaZprava: chybovaZprava
    };

    break;

  /************************************************************************
  Načtení popisu vybraného školení.
  Očekáváme následující data požadavku:
    - vybraneSkoleni – identifikátor vybraného školení.
  Jako odpověd vracíme objekt s následujícími vlastnostmi:
    - popisSkoleni – textový řetězec s kódem jazyka HTML,
    - chybovaZprava – chybová zpráva, pokud nastanou problémy.
  *************************************************************************/
  case 'nactiSkoleni':
    var data = odesliAjaxovyPozadavek.pozadavek.data,
      popisSkoleni = '',
      chybovaZprava = '';
    switch (data.vybraneSkoleni) {
      case 'css':
        popisSkoleni = 'Na tomto školení se seznamíte s jazykem CSS. Školení pořádá zkušený kódér Jan Novák každé úterý od 16. do 17. hodiny. Cena je 300 Kč za hodinu.';
        break;
      case 'javascript':
        popisSkoleni = 'S tímto školením získáte základní znalosti jazyka JavaScript. Toto školení pořádá programátor Petr Havelka každé pondělí a středu od 17. do 18. hodiny. Cena je 400 Kč za hodinu.';
        break;
      case 'xhtml':
        popisSkoleni = 'Toto školení se podrobně zabývá značkovacím jazykem XHTML. Pořádá jej kodér Adam Dlouhý každý čtvrtek od 16. do 17. hodiny. Cena je 300 Kč za hodinu.';
        break;
      default:
        chybovaZprava = 'Vznikla neočekávaná chyba – neznámý typ školení.';
        break;
    }

	// Vrátíme objekt s odpovědí.
    odesliAjaxovyPozadavek.odpoved = {
      popisSkoleni: popisSkoleni,
      chybovaZprava: chybovaZprava
    };

    break;

  /************************************************************************
  Načítání rezervovatelných dnů.
  Požadavek s sebou nenese žádná data.
  Jako odpověd vracíme objekt, v němž jsou identifikátory jednotlivých
  školení jako vlastnosti a jejich hodnotami jsou pole s rezervovatelnými
  dny (respektive jejich časovými známkami).
  *************************************************************************/
  case 'nactiRezervovatelneDny':
    // Minimální datum bude aktuální den.
    var minimalniDatum = new Date();
    minimalniDatum.setHours(0);
    minimalniDatum.setMinutes(0);
    minimalniDatum.setSeconds(0);
    minimalniDatum.setMilliseconds(0);

    // Maximální datum bude dva měsíce v budoucnu.
    var maximalniDatum = new Date(minimalniDatum.getTime());
    maximalniDatum.setMonth(maximalniDatum.getMonth() + 2);

	// Dny v týdnu
    var denVTydnu,
      PONDELI = 1,
      UTERY = 2,
      STREDA = 3,
      CTVRTEK = 4,
      PATEK = 5,
      SOBOTA = 6,
      NEDELE = 0;

    var casovaZnamkaDne,
      rezervovatelneDny = {
      css: [],
      javascript: [],
      xhtml: []
    };

    for (var den = new Date(minimalniDatum.getTime());
      den <= maximalniDatum;
      den.setDate(den.getDate() + 1)) {
      /* Správně bychom teď měli ověřit, jestli už není příliš mnoho
      rezervací na tento den, ale tuto funkčnost v naší simulaci
      ignorujeme. */

      denVTydnu = den.getDay();
      casovaZnamkaDne = den.getTime();

      if (denVTydnu == UTERY) {
        rezervovatelneDny.css.push(casovaZnamkaDne);
      }
      if (denVTydnu == PONDELI || denVTydnu == STREDA) {
        rezervovatelneDny['javascript'].push(casovaZnamkaDne);
      }
      if (denVTydnu == CTVRTEK) {
        rezervovatelneDny['xhtml'].push(casovaZnamkaDne);
      }
    }

	// Vrátíme objekt s odpovědí.
    odesliAjaxovyPozadavek.odpoved = rezervovatelneDny;

    break;

  /************************************************************************
  Neznámý typ požadavku.
  Odpověď nastavíme jako nedefinovanou hodnotu (undefined).
  *************************************************************************/
  default:
    odesliAjaxovyPozadavek.odpoved = undefined;

    break;
}

})(jQuery);