/**
 * @fileOverview Kapitola 5 – skript příkladu Rezervace školení.
 * V tomto skriptu se nachází komentáře ve formátu dokumentačních bloků
 * nástroje JsDoc Toolkit.
 * Oficiální stránky projektu JsDoc Toolkit jsou k dispozici na adrese
 * http://code.google.com/p/jsdoc-toolkit/.
 * @author Ondřej Baše
 */

var minimalniDatum = 0,
  maximalniDatum = '+2m',
  rezervovatelneDny,
  geocoder = new google.maps.Geocoder();

$(function() {
  /* Zajistíme načtení popisu školení při výběru školení, přičemž rovnou toto
  školení načteme. */
  $('#skoleni')
    .change(nactiPopisSkoleni)
    .each(nactiPopisSkoleni);

  /* Svážeme funkci pro validaci hodnoty se změnou všech viditelných
  formulářových polí (kromě odesílacího tlačítka). Za tyto pole ještě
  přidáme statový element pro průběh zpracování ajaxových požadavků. */
  $(':input:visible:not(:submit)')
    .change(validujHodnotuPole)
    .each(pridejStavovyElement);

  /* Před odesláním formuláře ověříme hodnoty všech polí a pokud se
  ve formuláři nachází nějaká chyba, zrušíme odesílání. */
  $('#rezervace-skoleni').submit(validujHodnotyVsechPoli);

  // Uživatel bude moct měnit velikost pole pro poznámku.
  $('#poznamka').resizable({
    handles: 'se',
    minHeight: 60,
    minWidth: 150
  });

  // Rezervovatelné datum si bude moct uživatel vybrat z kalendáře.
  $('#termin').datepicker({
    minDate: minimalniDatum,
    maxDate: maximalniDatum,
    beforeShowDay: zpracujDen
  });
  nactiRezervovatelneDny();

  /* Jak bude uživatel psát svou obec do příslušného formulářového pole,
  budeme mu zobrazovat návrhy obcí, a to pomocí ovládacího prvku Autocomplete
  a funkce rozhraní Google Maps JavaScript API verze 3. */
  $('#obec').autocomplete({
    source: nactiNavrhyObci,
	minLength: 2
  });
});

/**
 * Načte rezervovatelné dny pomocí ajaxového požadavku a uloží je
 * do globální proměnné rezervovatelneDny.
 */
function nactiRezervovatelneDny() {
  odesliAjaxovyPozadavek(
    'nactiRezervovatelneDny',
    {},
    function(odpoved) {
      rezervovatelneDny = odpoved;
    },
    hledejStavovyElement($('#termin'))
  );
}

/**
 * Zpracuje uvedené datum tak, že ověří, jestli je možné provést
 * v tento den rezervaci pro aktuálně vybrané školení. K tomuto
 * účelu používá data z proměnné rezervovatelneDny.
 * @param {Date} datum Datum ke kontrole.
 * @returns {Array} Pole, jehož první prvek označuje, zda má být
 *   tento den v kalendáři zakázaný. Ostatní prvky nás momentálně
 *   nezajímají (proto mají vždy hodnotu '').
 */
function zpracujDen(datum) {
  var jeMozneRezervovat = false,
    vybraneSkoleni = $('#skoleni :selected').attr('value');
  if (rezervovatelneDny[vybraneSkoleni] &&
    rezervovatelneDny[vybraneSkoleni].indexOf(datum.getTime()) != -1) {
    jeMozneRezervovat = true;
  }
  return [jeMozneRezervovat, '', ''];
}

/**
 * Načte návrhy obcí pomocí funkce rozhraní Google Maps JavaScript API
 * ve verzi 3.
 * @param {Object} pozadavek Objekt požadavku s vlastností term, která
 *   obsahuje aktuální hodnotu příslušného textového pole.
 * @param {function} odpovez Funkce, s jejíž pomocí vracíme návrhy obcí
 *   v podobě pole s objekty obsahujícími vlastnosti label a value.
 */
function nactiNavrhyObci(pozadavek, odpovez) {
  geocoder.geocode(
    {
      address: pozadavek.term,
      region: 'CZ'
    },
    function(mista) {
      var pocetMist = mista.length,
        navrhy = [],
        misto,
        jeObec;
      for (var poradiMista = 0; poradiMista < pocetMist; poradiMista++) {
        misto = mista[poradiMista];
        jeObec = misto.types.indexOf('locality') != -1;
        if (jeObec) {
          navrhy.push({
            label: misto.formatted_address,
            value: misto.address_components[0].long_name
          });
        }
      }
      odpovez(navrhy);
    }
  );
}