/*  ******************************************************************
 **  Soubor  :  /ariadne/javascript/calendar.js
 **
 **  Modul   :  Kalendář
 **  Verze   :  0.1.0
 **
 **  Autor   :  Petr Ludwig          petr.ludwig@lifeweb.cz
 **  Revize  :  Martin Jonáš         martin.jonas@lifeweb.cz
 **
 **  Popis   :  Funkce pro zobrazení a skrytí kalendáře
 **
 **  TODO:      Napsat classy podle instrukcí grafika
 **             Pole s názvy dnů a měsíců budou generována ariadne
 ** ***************************************************************** */

// Názvy měsíců a dnů. Budou nahrazeny globálními
var MonthNames = new Array('Leden','Únor','Březen','Duben','Květen','Červen','Červenec','Srpen','Září','Říjen','Listopad','Prosinec');
var DayNamesShort = new Array('Ne','Po','Út','St','Čt','Pá','So');

/**
 * Funkce zobrazí nebo skryje kalendář
 * @param format Formát data které kalendář vrátí
 * @param firstday První den v týdnu (0 = neděle, 1 = pondělí, ...)
 * @param calendar Id elementu (DIVu) ve kterém bude kalendář vykreslen
 * @param datefield Reference na element kam se zapíše výsledek
 */
function ShowHideCalendar(format, firstday, calendar, datefield) {
  if (returnObjById(calendar).style.visibility == "visible")
    HideCalendar(calendar);
  else
    ShowCalendar(format, firstday, calendar, datefield);
}


/**
 * Funkce zobrazí kalendář
 * @param format Formát data které kalendář vrátí
 * @param firstday První den v týdnu (0 = neděle, 1 = pondělí, ...)
 * @param calendar Id elementu (DIVu) ve kterém bude kalendář vykreslen
 * @param datefield Reference na element kam se zapíše výsledek
 */
function ShowCalendar(format, firstday, calendar, datefield) {

  // Aktuální datum
  var date = new Date();

  // Datum získané ze zadávacího pole
  var timestamp = getDateFromFormat(datefield.value, format);

  // Pokud se datum povedlo získat, použije se
  if (timestamp != 0) {
    date.setTime(timestamp);
  }

  // Počty dnů v měsících
  DayCount = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

  // V přestupném roce se počet dní v únoru zvýší o 1
  if (IsLeapYear(date.getFullYear()))
    DayCount[1]++;

  // Aktuálně vybrané datum
  var ActDate = date.getDate();

  // Datum se nastaví na první den v měsíci
  date.setDate(1);

  // Předchozí měsíc
  var PrevMonth = new Date(date);
  PrevMonth.setMonth(PrevMonth.getMonth() - 1);

  // Následující měsíc
  var NextMonth = new Date(date);
  NextMonth.setMonth(NextMonth.getMonth() + 1);

  // Počet dní v aktuálním měsíci
  var DC = DayCount[date.getMonth()];

  // Poloha prvního dne
  var DayFirst = (date.getDay() - firstday + 7) % 7;

  // Poloha neděle
  var Sun = (7 - firstday) % 7;

  // Volání zobrazení kalendáře, které se bude vkládat do HTML
  var show = "ShowCalendar(\"" + format + "\", " + firstday + ", \"" + calendar + "\", document." + datefield.form.name + "." + datefield.name + ");"

  // Volání skrytí kalendáře, které se bude vkládat do HTML
  var hide = "HideCalendar(\"" + calendar + "\");";

  // Začátek tabulky s kalendářem
  var HTML = '<table class="AriadneCalendar" Cols="7">\n';
  HTML += '<tr>\n';

  // Tlačítko "předchozí měsíc"
  HTML += "<th class=\"AriadneCalendarNextMonth\"><a Href=\"Javascript: {}\" onclick=\'document." + datefield.form.name + "." + datefield.name + ".value=\"" + formatDate(PrevMonth, format) + "\"; " + show + "\'>&laquo;</a></th>\n";

  // Aktuální měsíc
  HTML += '<th class="AriadneCalendarActMonth" colspan="5">' + MonthNames[date.getMonth()] + '/' + date.getFullYear() + '</th>\n';

  // Tlačítko "následující měsíc"
  HTML += "<th class=\"AriadneCalendarPrevMonth\"><a href=\"Javascript: {}\" onclick=\'" + datefield.form.name + "." + datefield.name + ".value=\"" + formatDate(NextMonth, format) + "\"; " + show + "\'>&raquo;</a></th>\n";

  HTML += '</tr>\n';

  // Názvy dnú
  HTML += '<tr>';
  for (var i = 0; i < 7; i++) {
    HTML += '<td>' + DayNamesShort[(i + firstday) % 7] + '</td>';
  }
  HTML += '</tr>\n';

  // Prázdná políčka před prvním dnem
  HTML += '<tr>';
  for (var i = 0; i < DayFirst; i++) {
    HTML += '<td></td>';
  }

  var Col = DayFirst;

  // Tělo kalendáře
  for (var i = 1; i <= DC; i++) {
    // Zobrazovaný den
    date.setDate(i);

    // Konec týdne
    if (Col > 6) {
      HTML += '</tr>\n<tr>';
      Col = 0;
    }

    HTML += '<td ';

    // Aktuálně vybrané datum
    if (i == ActDate)
      HTML += 'class="AriadneCalendarActDate" ';

    // Neděle
    else if (Col == Sun)
      HTML += 'class="AriadneCalendarSunday" ';

    // Normální den
    else
      HTML += 'class="AriadneCalendarDay" ';

    HTML += "><a href=\"Javascript: {}\" onclick=\'" + datefield.form.name + "." + datefield.name + ".value=\"" + formatDate(date, format) + "\"; " + hide + "\'>"
    HTML += i;
    HTML += '</a>';

    HTML += '</td>';
    Col++;
  }

  // Prázdná políčka za posledním dnem
  for (var i = 0; i <= (6 - Col); i++) {
    HTML += '<td></td>';
  }
  HTML += '</tr>\n';

  // Konec kalendáře
  HTML += '</table>\n';

  // Objekt s tabulkou kalendáře
  var element = returnObjById(calendar);

  // Vyplnění kalendáře
  element.innerHTML = HTML;

  // Zobrazení kalendáře
  element.style.visibility = "visible";
}


/**
 * Funkce skryje kalendář
 * @param calendar Id elementu (DIVu) ve kterém bude kalendář vykreslen
 */
function HideCalendar(calendar) {
  // Objekt s tabulkou kalendáře
  var element = returnObjById(calendar);

  // Skrytí kalendáře
  element.style.visibility = "hidden";
}
