// * JS Calendar (version 2.2)
// * 
// * Modified 2007/10 by Dynamicweb/Christian Hedemann Olsen
//
// * Originally adapted from 
// * http://www.dhtmlgoodies.com/index.html?page=calendarScripts
//
// <CONFIGURATION> 

function JSCalendar(XmlSource, showWeekNumber, languageCode, randomizeAccessMode) {

    //var languageCode = 'da';	// Possible values: 	en,ge,no,nl,es,pt-br,fr	
    // en = english, ge = german, no = norwegian,nl = dutch, es = spanish, pt-br = portuguese, fr = french, da = danish, hu = hungarian(Use UTF-8 doctype for hungarian)

    var showWeekNumber = false;
    var CellPadding = "0";
    var CellSpacing = "2";

    this.GoBackHTML = "&lt;&lt;"
    this.GoForwardHTML = "&gt;&gt;"
    this.ClassPrefix = "jscalendar";

    //var XmlSource = "/kalender/events1.xml";

    var showEventDayInfo = false;
    var showCurrentDateOnStart = true;

    //Not used in this version:
    var calendar_display_time = false;
    // </CONFIGURATION> 

    // Format of current day at the bottom of the calendar
    // [todayString] = the value of todayString
    // [dayString] = day of week (examle: mon, tue, wed...)
    // [UCFdayString] = day of week (examle: Mon, Tue, Wed...) ( First letter in uppercase)
    // [day] = Day of month, 1..31
    // [monthString] = Name of current month
    // [year] = Current year							
    var todayStringFormat = '[todayString] [UCFdayString]. [day]. [monthString] [year]';

    var speedOfSelectBoxSliding = 200; // Milliseconds between changing year and hour when holding mouse over "-" and "+" - lower value = faster
    var intervalSelectBox_minutes = 5; // Minute select box - interval between each option (5 = default)

    var calendar_offsetTop = 0; 	// Offset - calendar placement - You probably have to modify this value if you're not using a strict doctype
    var calendar_offsetLeft = 0; // Offset - calendar placement - You probably have to modify this value if you're not using a strict doctype
    var calendarDiv = ""; //false;

    var MSIE = false;
    var Opera = false;
    if (navigator.userAgent.indexOf('MSIE') >= 0 && navigator.userAgent.indexOf('Opera') < 0) MSIE = true;
    if (navigator.userAgent.indexOf('Opera') >= 0) Opera = true;

    switch (languageCode) {
        case "en": /* English */
            var monthArray = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
            var monthArrayShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
            var dayArray = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];
            var weekString = 'Week';
            var todayString = '';
            break;
        case "ge": /* German */
            var monthArray = ['Januar', 'Februar', 'MуБК', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];
            var monthArrayShort = ['Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'];
            var dayArray = ['Mon', 'Die', 'Mit', 'Don', 'Fre', 'Sam', 'Son'];
            var weekString = 'Woche';
            var todayString = 'Heute';
            break;
        case "no": /* Norwegian */
            var monthArray = ['Januar', 'Februar', 'Mars', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Desember'];
            var monthArrayShort = ['Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'];
            var dayArray = ['Man', 'Tir', 'Ons', 'Tor', 'Fre', 'L&oslash;r', 'S&oslash;n'];
            var weekString = 'Uke';
            var todayString = 'Dagen i dag er';
            break;
        case "nl": /* Dutch */
            var monthArray = ['Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December'];
            var monthArrayShort = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'];
            var dayArray = ['Ma', 'Di', 'Wo', 'Do', 'Vr', 'Za', 'Zo'];
            var weekString = 'Week';
            var todayString = 'Vandaag';
            break;
        case "es": /* Spanish */
            var monthArray = ['Enero', 'Febrero', 'Marzo', 'April', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
            var monthArrayShort = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'];
            var dayArray = ['Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab', 'Dom'];
            var weekString = 'Semana';
            var todayString = 'Hoy es';
            break;
        case "pt-br":  /* Brazilian portuguese (pt-br) */
            var monthArray = ['Janeiro', 'Fevereiro', 'Mar&ccedil;o', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];
            var monthArrayShort = ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'];
            var dayArray = ['Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'S&aacute;b', 'Dom'];
            var weekString = 'Sem.';
            var todayString = 'Hoje &eacute;';
            break;
        case "fr":      /* French */
            var monthArray = ['Janvier', 'FшЕВier', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'AoяПНSeptembre', 'Octobre', 'Novembre', 'DшЂЅmbre'];
            var monthArrayShort = ['Jan', 'Fev', 'Mar', 'Avr', 'Mai', 'Jun', 'Jul', 'Aou', 'Sep', 'Oct', 'Nov', 'Dec'];
            var dayArray = ['Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam', 'Dim'];
            var weekString = 'Sem';
            var todayString = "Aujourd'hui";
            break;
        case "da": /*Danish*/
            var monthArray = ['januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december'];
            var monthArrayShort = ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'];
            var dayArray = ['Ma', 'Ti', 'On', 'To', 'Fr', 'L&oslash;', 'S&oslash;'];
            var weekString = 'Uge';
            var todayString = 'I dag er den';
            break;
        case "hu": /* Hungarian  - Remember to use UTF-8 encoding, i.e. the <meta> tag */
            var monthArray = ['JanuУЁr', 'FebruУЁr', 'MУЁrcius', '�rilis', 'MУЁjus', 'JУКnius', 'JУКlius', 'Augusztus', 'Szeptember', 'OktУГber', 'November', 'December'];
            var monthArrayShort = ['Jan', 'Feb', 'MУЁrc', '�r', 'MУЁj', 'JУКn', 'JУКl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'];
            var dayArray = ['HУЉ', 'Ke', 'Sze', 'Cs', 'PУЉ', 'Szo', 'Vas'];
            var weekString = 'HУЉt';
            var todayString = 'Mai nap';
            break;
        case "it": /* Italian*/
            var monthArray = ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'];
            var monthArrayShort = ['Gen', 'Feb', 'Mar', 'Apr', 'Mag', 'Giu', 'Lugl', 'Ago', 'Set', 'Ott', 'Nov', 'Dic'];
            var dayArray = ['Lun', ';Mar', 'Mer', 'Gio', 'Ven', 'Sab', 'Dom'];
            var weekString = 'Settimana';
            var todayString = 'Oggi &egrave; il';
            break;
        case "sv": /* Swedish */
            var monthArray = ['Januari', 'Februari', 'Mars', 'April', 'Maj', 'Juni', 'Juli', 'Augusti', 'September', 'Oktober', 'November', 'December'];
            var monthArrayShort = ['Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'];
            var dayArray = ['M&aring;n', 'Tis', 'Ons', 'Tor', 'Fre', 'L&ouml;r', 'S&ouml;n'];
            var weekString = 'Vecka';
            var todayString = 'Idag &auml;r det den';
            break;
    }
    var daysInMonthArray = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    var currentMonth;
    var currentYear;
    var currentHour;
    var currentMinute;

    var calendarContentDiv;
    var returnDateTo;
    var returnFormat;
    var activeSelectBoxMonth;
    var activeSelectBoxYear;
    var activeSelectBoxHour;
    var activeSelectBoxMinute;

    var showEventsDiv;

    var xmlHttp;
    var d;
    var oEventDom;
    var maanedDiv;
    var yearDiv;


    //********* PRINTCALENDARDHTML *********//
    this.PrintCalendarHtml = function (calendarDivId, eventsDivId, initDate) {

        calendarDiv = document.getElementById(calendarDivId);
        showEventsDiv = document.getElementById(eventsDivId);
        d = initDate;
        currentMonth = d.getMonth();
        currentYear = d.getFullYear();
        currentHour = '08';
        currentMinute = '00';
        tmpDay = d.getDate();

        inputYear = currentYear;
        inputMonth = currentMonth;
        inputDay = tmpDay / 1;

        //Get data
        var currentObject = this;

        xmlHttp = CreateRequester();
        xmlHttp.onreadystatechange = function () {

            if (xmlHttp.readyState == 4) {
                oEventDom = CreateDom(xmlHttp.responseText);

                //Create UI
                currentObject.writeTopBar();
                currentObject.writeCalendarContent();

                //Show current date
                if (showCurrentDateOnStart) currentObject.showEvents(d.getDate(), currentMonth, currentYear);
            }


        };

        var finalXmlSource = XmlSource;
        if (randomizeAccessMode > 0) {
            var date = new Date();
            finalXmlSource += (XmlSource.indexOf("?") == -1) ? "?" : "&";
            finalXmlSource += "nocache=" + date.getYear() + date.getMonth() + date.getDate() + date.getHours();
            if (randomizeAccessMode == 1) {
                finalXmlSource += date.getMinutes();
                finalXmlSource += date.getSeconds();
            }
            if (randomizeAccessMode == 2) {
                finalXmlSource += date.getMinutes();
            }
        }

        xmlHttp.open("GET", finalXmlSource, true);
        xmlHttp.send(null);

    }


    //********* WRITETOPBAR *********//
    this.writeTopBar = function () {

        currentObject = this;

        var topBar = document.createElement('div');
        topBar.className = this.ClassPrefix + 'topbar';
        calendarDiv.appendChild(topBar);


        // Left arrow
        var leftDiv = document.createElement('div');
        leftDiv.className = this.ClassPrefix + "goback"
        leftDiv.innerHTML = this.GoBackHTML;
        leftDiv.onclick = function () { currentObject.monthBack() };
        topBar.appendChild(leftDiv);

        //Month
        maanedDiv = document.createElement('div');
        maanedDiv.className = this.ClassPrefix + "month";
        topBar.appendChild(maanedDiv);
        this.updateMonth();

        //Year
        yearDiv = document.createElement('div');
        yearDiv.className = this.ClassPrefix + "year";
        topBar.appendChild(yearDiv);
        this.updateYear();

        // Right arrow
        var rightDiv = document.createElement('div');
        rightDiv.className = this.ClassPrefix + "goforward";
        rightDiv.innerHTML = this.GoForwardHTML;
        rightDiv.onclick = function () { currentObject.monthForward() };
        topBar.appendChild(rightDiv);

        // clear
        var clearDiv = document.createElement('div');
        clearDiv.className = this.ClassPrefix + "clear";
        clearDiv.innerHTML = "<!---->";
        topBar.appendChild(clearDiv);

    }


    //********* ISLEAPYEAR *********//
    this.isLeapYear = function (inputYear) {
        if (inputYear % 400 == 0 || (inputYear % 4 == 0 && inputYear % 100 != 0)) return true;
        return false;

    }

    //********* ONMONTHCHANGE *********//
    //Called when month is changed by user
    this.onMonthChange = function (newMonth, newYear) {
        showEventsDiv.innerHTML = "";
    }


    //********* DAYRENDER *********//
    //Called when a day is drawn
    this.dayRender = function (day, month, year) {
        var dayDiv = document.createElement('div');

        if (xPath(oEventDom, "/events/event[month=" + (month + 1) + " and day=" + day + " and year=" + year + "]").length > 0) {
            dayDiv.className = this.ClassPrefix + "day " + this.ClassPrefix + "dayevent";
            currentObject = this;
            dayDiv.onclick = function () { currentObject.showEvents(day, month, year); }
        } else {
            dayDiv.className = this.ClassPrefix + "day";
        }

        dayDiv.innerHTML = day;

        return dayDiv;

    }


    //********* SHOWEVENTS *********//
    this.showEvents = function (day, month, year) {

        var result;

        var events = xPath(oEventDom, "/events/event[month=" + (month + 1) + " and day=" + day + " and year=" + year + "]");

        if (events.length == 0) {
            result = "&nbsp;";
        } else {
            result = (showEventDayInfo) ? "Aktiviteter " + day + ". " + monthArray[month] + " " + year + "<br/>" : "";
            result += "<ul class=\"CalendarEventsList\"><ul class=\"" + this.ClassPrefix + "eventlist\">";
            for (var i = 0; i < events.length; i++) {
                var linkNode = events[i].selectSingleNode("popuplink");
                var textNode = events[i].selectSingleNode("title");

                var startNode = events[i].selectSingleNode("startdatetime");
                var endNode = events[i].selectSingleNode("enddatetime");
                var locationNode = events[i].selectSingleNode("location");
                var link = (linkNode != null) ? ((linkNode.childNodes.length > 0) ? linkNode.firstChild.nodeValue : "") : "";
                var text = (textNode != null) ? ((textNode.childNodes.length > 0) ? textNode.firstChild.nodeValue : "") : "";
                var start = (startNode != null) ? ((startNode.childNodes.length > 0) ? startNode.firstChild.nodeValue : "") : "";
                var end = (endNode != null) ? ((endNode.childNodes.length > 0) ? endNode.firstChild.nodeValue : "") : "";
                var _location = (locationNode != null) ? ((locationNode.childNodes.length > 0) ? locationNode.firstChild.nodeValue : "") : "";
                result += (text != "" && link != "") ? "<li><span class=\"EventDate\"><a href=\""+grafiskkalender.calendarlistpage+"?KalenderEventID=" + link + "\">" + text + /*"<span class=\"locationField\">Sted: "+_location+"</span>"<span class=\"dateField\">Start: "+start+"</span>*/"</a></span></li>" : "";
            }
            result += "</ul></div>";
        }
        showEventsDiv.innerHTML = result;
    }
    /*
    <div class="eventList">
    <ul>
    <div class="cItem">
    <a href="/via13.html?id=14">
    <h3>det koster fyre krone</h3>
    <span class="locationField">Sted: langt vхЉМ/span>
    <span class="dateField">Start: 12-10-2007 11:40</span>
    <br/>intro tekst, vi skal have malket maren, hun er et stor og brovten kvinde pу�0 ton.</a>
    </div>
    <div class="cItem">
    <a href="/via13.html?id=2">
    <h3>hallo!</h3>
    <span class="locationField">Sted: Hammel</span>
    <span class="dateField">Start: 15-10-2007 12:00</span>
    <br/>ghgdhgdfgh fgdh g hfgh gfh </a>
    </div>
    </ul>
    </div>

    */
    //********* WRITECALENDARCONTENT *********//
    this.writeCalendarContent = function () {

        var calendarContentDivExists = true;
        if (!calendarContentDiv) {
            calendarContentDiv = document.createElement('div');

            calendarContentDiv.className = "calendarContentDiv";

            calendarDiv.appendChild(calendarContentDiv);
            calendarContentDivExists = false;
        }
        currentMonth = currentMonth / 1;
        var d = new Date();

        d.setFullYear(currentYear);
        d.setDate(1);
        d.setMonth(currentMonth);

        var dayStartOfMonth = d.getDay();
        if (dayStartOfMonth == 0) dayStartOfMonth = 7;
        dayStartOfMonth--;



        var existingTable = calendarContentDiv.getElementsByTagName('table');
        if (existingTable.length > 0) {
            calendarContentDiv.removeChild(existingTable[0]);
        }

        var calTable = document.createElement('table');
        calTable.cellSpacing = 0; // CellSpacing;

        calTable.cellPadding = CellPadding;
        calendarContentDiv.appendChild(calTable);

        var calTBody = document.createElement('tbody');
        calTable.appendChild(calTBody);


        /*FIRST ROW*/

        var row = calTBody.insertRow(-1); // weekdays
        //21.04  	row.className = this.ClassPrefix + 'calendar_week_row'; 
        row.className = "titleCalendar";

        if (showWeekNumber) {
            var cell = row.insertCell(-1);
            cell.innerHTML = weekString;
            cell.className = this.ClassPrefix + 'calendar_week_column';
        }

        for (var no = 0; no < dayArray.length; no++) {
            var cell = row.insertCell(-1);
            cell.innerHTML = dayArray[no];
            //21.04    		cell.className=this.ClassPrefix + 'weekday'
        }

        var row = calTBody.insertRow(-1);

        if (showWeekNumber) {
            var cell = row.insertCell(-1);
            cell.className = this.ClassPrefix + 'calendar_week_column';
            var week = this.getWeek(currentYear, currentMonth, 1);
            cell.innerHTML = week; 	// Week
        }

        for (var no = 0; no < dayStartOfMonth; no++) {
            var cell = row.insertCell(-1);
            cell.innerHTML = '&nbsp;';
        }

        var colCounter = dayStartOfMonth;
        var daysInMonth = daysInMonthArray[currentMonth];
        if (daysInMonth == 28) {
            if (this.isLeapYear(currentYear)) daysInMonth = 29;
        }

        /*DAYS IN MONTH*/
        for (var no = 1; no <= daysInMonth; no++) {
            d.setDate(no - 1);
            if (colCounter > 0 && colCounter % 7 == 0) {
                /*WEEK NUMBER*/
                var row = calTBody.insertRow(-1);
                if (showWeekNumber) {
                    var cell = row.insertCell(-1);
                    cell.className = this.ClassPrefix + "calendar_week_column";
                    var week = this.getWeek(currentYear, currentMonth, no);
                    cell.innerHTML = week; 	// Week			
                }
            }
            var cell = row.insertCell(-1);
            if (currentYear == inputYear && currentMonth == inputMonth && no == inputDay) {
                cell.className = this.ClassPrefix + "activeday " + this.ClassPrefix + "daycell";
            } else {
                cell.className = this.ClassPrefix + "daycell";
            }
            cell.appendChild(this.dayRender(no, currentMonth, currentYear));
            colCounter++;
        }

    }

    //********* UPDATEMONTH *********//
    this.updateMonth = function () {

        maanedDiv.innerHTML = monthArray[currentMonth];

    }

    //********* UPDATEYEAR *********//
    this.updateYear = function () {

        yearDiv.innerHTML = currentYear

    }


    //********* GETWEEK *********//
    // This function is from http://www.codeproject.com/csharp/gregorianwknum.asp
    // Only changed the month add
    this.getWeek = function (year, month, day) {
        day = day / 1;
        year = year / 1;
        month = month / 1 + 1; //use 1-12
        var a = Math.floor((14 - (month)) / 12);
        var y = year + 4800 - a;
        var m = (month) + (12 * a) - 3;
        var jd = day + Math.floor(((153 * m) + 2) / 5) +
                     (365 * y) + Math.floor(y / 4) - Math.floor(y / 100) +
                     Math.floor(y / 400) - 32045;      // (gregorian calendar)
        var d4 = (jd + 31741 - (jd % 7)) % 146097 % 36524 % 1461;
        var L = Math.floor(d4 / 1460);
        var d1 = ((d4 - L) % 365) + L;
        NumberOfWeek = Math.floor(d1 / 7) + 1;
        return NumberOfWeek;
    }


    //********* MONTHBACK *********//
    this.monthBack = function () {
        currentMonth = currentMonth - 1; ;
        if (currentMonth < 0) {
            currentMonth = 11;
            currentYear = currentYear - 1;
        }
        this.switchMonth();
    }


    //********* MONTHFORWARD *********//
    this.monthForward = function () {
        currentMonth = currentMonth + 1; ;
        if (currentMonth > 11) {
            currentMonth = 0;
            currentYear = currentYear / 1 + 1;
        }
        this.switchMonth();
    }


    //********* SWITCHMONTH *********//
    this.switchMonth = function () {
        this.updateMonth();
        this.updateYear();
        this.writeCalendarContent();

        this.onMonthChange(currentMonth, currentYear);
    }


    //********* PICKDATE *********//
    this.pickDate = function (e, inputDay) {
        alert(e);
        return null;
    }
}

