
// mode -> M - Monday first, S - Sunday first
var mode = "M";

// "`urlPrefix` & `pageParamSuff` must be defined elsewhere": DO NOT REDEFINE THEM HERE !!!!
// var urlPrefix = "/uk/events/fordate/";
// pageParamSuff = '/1'

// calendar controls
var source = null;
var hideTime = false;
var date = new Date();
/*var months = new Array("JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER");
var months_fr = new Array("JANVIER", "F&Eacute;VRIER", "MARS", "AVRIL", "PEUVENT", "JUIN", "JUILLET", "AO&Ucirc;T", "SEPTEMBRE", "OCTOBRE", "NOVEMBRE", "D&Eacute;CEMBRE");
var months_es = new Array("ENERO", "FEBRERO", "MARCHA", "ABRIL", "PUEDEN", "JUNIO", "JULIO", "AGOSTO", "SEPTIEMBRE", "OCTUBRE", "NOVIEMBRE", "DICIEMBRE");
var months_de = new Array("JANUAR", "FEBRUAR", "M&Auml;RZ", "APRIL", "M?GEN", "JUNI", "JULI", "AUGUST", "SEPTEMBER", "OKTOBER", "NOVEMBER", "DEZEMBER");
var months_it = new Array("GENNAIO", "FEBBRAIO", "MARZO", "APRILE", "POSSONO", "GIUGNO", "LUGLIO", "AGOSTO", "SETTEMBRE", "OTTOBRE", "NOVEMBRE", "DICEMBRE");
*/
var weekdays = new Array("M", "T", "W", "T", "F", "S", "S");
var weekdays_fr = new Array("L", "M", "M", "J", "V", "S", "D");
var weekdays_es = new Array("L", "M", "M", "J", "V", "S", "D");
var weekdays_de = new Array("M", "D", "M", "D", "F", "S", "S");
var weekdays_it = new Array("L", "M", "M", "G", "V", "S", "D");
if (locale != undefined) {
    try {
        // months = eval("months_" + locale);
        weekdays = eval("weekdays_" + locale);
    }
    catch (Ex) {
    }
}
var origWeekDays = weekdays.slice();
var corr = 1;
var currDay = date.getDate();
var currMonth = date.getMonth();
var currYear = date.getFullYear();
var currHours = date.getHours();
var currMins = date.getMinutes();
var defDay, defMonth, defYear, defHours, defMins;
/*
  month - 0 based month number (0-11)
  year -
  days -> array of days to hilight
*/
function getCalendarHTML(month, year, days, idSuff) {
    if (urlPrefix == undefined) {
        alert("The global variable `urlPrefix` must be defined before rendering the calendar!");
        return false;
    }
    var chDate = new Date(year, month, 1);
    var weekDay = chDate.getDay();
    var thisMonth = month;
    var boundDate = new Date(year, month - 1, 1);
    prYear = boundDate.getFullYear();
    prMonth = boundDate.getMonth();
    var boundDate = new Date(year, month + 1, 1);
    nxYear = boundDate.getFullYear();
    nxMonth = boundDate.getMonth();
    var html = "";
    mode = mode != "S" ? "M" : mode;
    if (mode == "S") {
        var s = weekdays.pop();
        weekdays.unshift(s);
        corr = 0;
    } else {
        weekDay = weekDay == 0 ? 7 : weekDay;
    }
    html = "<h3 id='monthTitle_" + month + idSuff + "'>" + months[month] + "</h3>";
    html += "<table><tr>";
    for (var i = 0; i < weekdays.length; i++) {
        html += "<th>" + weekdays[i] + "</th>";
    }
    html += "</tr>";
    d = 0;
  // write lead days from the prev. month
    html += "<tr>";
    var diff = weekDay - corr;
    for (i = 0; i < diff; i++) {
        chDate = new Date(year, month, 1 - (diff - i));
        html += "<td class=\"disabled\">" + chDate.getDate() + "</td>";
        d++;
    }
    c = 0;
    var nowSty = "";
    for (i = 1; i <= 7 - d; i++) {
        nowSty = "";
        chDate = new Date(year, month, i);
        if (inArray(i, days)) {
            html += "<td class=\"event\" ><a href=\"" + urlPrefix + getDateAsParam(chDate, true) + pageParamSuff + "\">" + i + "</a></td>";
        } else {
            html += "<td>" + i + "</td>";
        }
        c = i;
    }
    html += "</tr>";
    var numRows = 1;
    diff = 0;
    for (j = 0, i = c + 1; i <= 31; ++i, ++j) {
        nowSty = "";
        chDate = new Date(year, month, i);
        thisMonth = chDate.getMonth();
        if (thisMonth == month) {
            if (j % 7 == 0) {
                html += "</tr><tr class='dates' align='center'>";
                ++numRows;
                diff = 0;
            }
            if (inArray(i, days)) {
                html += "<td class=\"event\" ><a href=\"" + urlPrefix + getDateAsParam(chDate, true) + pageParamSuff + "\">" + i + "</a></td>";
            } else {
                html += "<td>" + i + "</td>";
            }
            ++diff;
        } else {
            break;
        }
    }

  // write trailing days
    d = chDate.getDate();
    while (chDate.getMonth() == month) {
        chDate = new Date(year, month, ++d);
    }
    d = 1;
    for (; diff < 7; ++diff) {
        html += "<td class=\"disabled\">" + (chDate.getDate()) + "</td>";
        chDate = new Date(chDate.getFullYear(), chDate.getMonth(), ++d);
    }
    while (numRows < 6) {
        html += "<tr style='visibility:hidden' class='bottom'><td colspan='7'></td></tr>";
        numRows++;
    }
    html += "</td></tr></table>";
    resetState();
    return html;
}
function resetState() {
    corr = 1;
    weekdays = origWeekDays.slice();
}
function inArray(elt, arr) {
    if (arr != null) {
        for (var i = 0; i < arr.length; i++) {
            if (elt == arr[i]) {
                return true;
            }
        }
    }
    return false;
}
function getDateAsParam(date, full) {
    var m = date.getMonth() + 1;
    m = m >= 10 ? m : "0" + m;
    var d = date.getDate();
    d = d >= 10 ? d : "0" + d;
    return (date.getFullYear() + "" + m + (full ? "" + d : ""));
}
/*

    Functions for Events Modules:

*/


// Calendars setup:
var today = new Date();
function scrollCalendar(dir, idSuff) {
    var lastCurrDate = eval("currDate_" + idSuff);
    var currDate = new Date(lastCurrDate.getFullYear(), lastCurrDate.getMonth() + dir, 1);
    eval("currDate_" + idSuff + " = currDate");
    var cal_offset = eval("cal_offset_" + idSuff);
    cal_offset = currDate == today ? 0 : cal_offset;
    cal_offset += dir;
    var month1 = currDate.getMonth();
    var year1 = currDate.getFullYear();
    var nextMonth = new Date(year1, month1 + 1, 1);
    var month2 = nextMonth.getMonth();
    var year2 = nextMonth.getFullYear();
    try {
        var days1 = eval("eventDays_" + idSuff + "[year1][month1]");
        var days2 = eval("eventDays_" + idSuff + "[year2][month2]");

        // setup calendars:
        setupCalendars(year1, month1, days1, year2, month2, days2, idSuff);
    }
    catch (Ex) {
        cal_offset += -(dir);
        if (Math.abs(cal_offset) > 10) {
            alert(dir > 0 ? err_next : err_prev);
            currDate = lastCurrDate;
        } else {
            setupCalendars(year1, month1, null, year2, month2, null, idSuff);
        }
    }
    eval("cal_offset_" + idSuff + " = " + cal_offset);
}


var gMonth1 = null;
var gMonth2 = null;
var gIdSuff = null;

function setupCalendars(year1, month1, days1, year2, month2, days2, idSuff) {
    try {
        calHTML = getCalendarHTML(month1, year1, days1, idSuff);
        document.getElementById("calendar1" + idSuff).innerHTML = calHTML;
        calHTML = getCalendarHTML(month2, year2, days2, idSuff);
        document.getElementById("calendar2" + idSuff).innerHTML = calHTML;
    }
    catch (Exc) {
        // if 2-nd calendar is not available ....
    }
    try {
        // fix calendar MONTH titles:

        gMonth1 = month1;
        gMonth2 = month2;
        gIdSuff = idSuff;

        var month1URL = monthTitleURL + escape(months[month1] + " '" + year1.toString().substr(2));
        var month2URL = monthTitleURL + escape(months[month2] + " '" + year2.toString().substr(2));
        new ImagePreloader(new Array(month1URL, month2URL), showMonthsTitles);
    }
    catch (Exc) {
        // if 2-nd calendar is not available ....
        // alert(Exc.description);
    }
    try {
        // setup months list:
        var sHTML = "";
        var currDate = eval("currDate_" + idSuff);
        for (var i = 0; i < 5; i++) {
            var chDate = new Date(currDate.getFullYear(), currDate.getMonth() + i, 1);
            var url = sideMonthURL + getDateAsParam(chDate) + pageParamSuff;
            var ySuff = (chDate.getFullYear() - 2000);
            ySuff = ySuff >= 10 ? ySuff : "0" + ySuff;
            sHTML += sideMonthHTML.replace("{URL}", url).replace("{MONTH}", months[chDate.getMonth()].substr(0, 1) + months[chDate.getMonth()].substr(1).toLowerCase() + " '" + ySuff);
        }
        document.getElementById("sideMonthsUL" + idSuff).innerHTML = sHTML;
    }
    catch (Exc) {
        // if months list is not available ...
    }
}
function showMonthsTitles(images, imgCount) {


    try {
        // alert('showMonthsTitles: '+images+"; -> "+imgCount);

        var month1URL = images[0].src;
        var month2URL = images[1].src;
        var img = null, con = null;

        img = document.createElement("img");
        img.setAttribute("src", month1URL);
        img.setAttribute("alt", months[gMonth1]);
        con = document.getElementById("monthTitle_" + gMonth1 + gIdSuff);
        removeChildren(con);
        con.appendChild(img);

        img = document.createElement("img");
        img.setAttribute("src", month2URL);
        img.setAttribute("alt", months[gMonth2]);
        con = document.getElementById("monthTitle_" + gMonth2 + gIdSuff);
        removeChildren(con);
        con.appendChild(img);
    }
    catch (Exc) {
        // alert(Exc.description);
    }
}
function removeChildren(node) {
    if (node !== null) {
        while (node.hasChildNodes()) {
            node.removeChild(node.firstChild);
        }
    }
}
/*
    Image preloading ::::
*/
function ImagePreloader(images, callback) {

   // store the call-back
    this.callback = callback;

   // initialize internal state.
    this.nLoaded = 0;
    this.nProcessed = 0;
    this.aImages = new Array;
   // record the number of images.
    this.nImages = images.length;

   // for each image, call preload()
    for (var i = 0; i < images.length; i++) {
        this.preload(images[i]);
    }
}
ImagePreloader.prototype.preload = function (image) {

   // create new Image object and add to array
    var oImage = new Image;
    this.aImages.push(oImage);

   // set up event handlers for the Image object
    oImage.onload = ImagePreloader.prototype.onload;
    oImage.onerror = ImagePreloader.prototype.onerror;
    oImage.onabort = ImagePreloader.prototype.onabort;

   // assign pointer back to this.
    oImage.oImagePreloader = this;
    oImage.bLoaded = false;

   // assign the .src property of the Image object
    oImage.src = image;
};
ImagePreloader.prototype.onComplete = function () {
    this.nProcessed++;
    if (this.nProcessed == this.nImages) {
        this.callback(this.aImages, this.nLoaded);
    }
};
ImagePreloader.prototype.onload = function () {
    this.bLoaded = true;
    this.oImagePreloader.nLoaded++;
    this.oImagePreloader.onComplete();
};
ImagePreloader.prototype.onerror = function () {
    this.bError = true;
    this.oImagePreloader.onComplete();
};
ImagePreloader.prototype.onabort = function () {
    this.bAbort = true;
    this.oImagePreloader.onComplete();
};

