/**
 * @fileoverview NIN go to page calendar.
 *
 * @author Iain White iain.white@aot.com.au
 * @version 2.0 
 */

if (NIN == undefined) var NIN = {};

NIN.pageCalendar = {
    version: '2.0',
    numDays: 90,
    startToday: true,
    frontPage: false,
    columns: 2,
    rows: 0,
    curPage: 1,
    fieldId: 'goDate',
    today: null,
    start: null,
    end: null,
    containerDiv: null,
    iFrame: null,
    curFld: null,
    selectedDate: null,
    monthNames: [],
    dayNames: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
    dayNamesFull: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
    dayNamesAb: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
    monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
    __construct: function(selectedDate) {

        //JADE.timeDiff.setStartTimer();

        var dateArray = selectedDate.split('/');
        if (dateArray.length > 2) {
            selectedDate = dateArray[2] + '-' + dateArray[0] + '-' + dateArray[1];
        }
        dateArray = null;
        delete dateArray;

        this.selectedDate = selectedDate;
        this.today = new Date();
        if (this.startToday) {
            this.start = this.today;
        }
        this.start.setHours(0);
        this.start.setMinutes(0);
        this.start.setSeconds(0);
        this.start.setMilliseconds(0);
        this.end = this.addDays(this.start, this.numDays);
        this.end.setHours(23);
        this.end.setMinutes(59);
        this.end.setSeconds(59);
        this.end.setMilliseconds(0);

        this.createCalendar();

        //alert(JADE.timeDiff.getTimeDiff() / 1000 + ' seconds');
    },
    addDays: function(date, days) {
        return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days,
            date.getHours(), date.getMinutes(), date.getSeconds());
    },
    createCalendar: function() {
        // Container DIV
        this.containerDiv = document.createElement('div');
        this.containerDiv.id = 'pageCalendarContainer';
        this.containerDiv.className = 'pageCalendar';
        this.containerDiv.style.position = 'absolute';
        this.containerDiv.style.visibility = 'visible';
        this.containerDiv.style.display = 'none';
        this.containerDiv.style.zIndex = 9999;
        this.containerDiv.style.width = (180 * this.columns) + 6 + 'px';
        var calStr = ['<div id="calCloseDiv"><a href="#" onclick="NIN.pageCalendar.hideCal(); return false;" class="close"><img id="closeButtonCal" src="images/close.jpg" width="15" height="15" alt="close" /></a></div><div id="pageCalendarTitle">', this.monthNames[this.start.getMonth()], ' ', this.start.getFullYear(), ' - ', this.monthNames[this.end.getMonth()], ' ', this.end.getFullYear(), '</div>'];
        var month = this.start.getMonth();
        var year = this.start.getFullYear();
        calStr[calStr.length] = '<table><tr valign="top">';
        var columnCounter = 1;
        month--;
        for (var i = 0; i < 4; i++) {
            month++;
            if (month >= 12) {
                month = month-12;
                year++;
            }
            calStr[calStr.length] = '<td class="dpMonth"><div>';
            calStr[calStr.length] = this.createMonthCalendar(month, year);
            calStr[calStr.length] = '</div></td>';
            columnCounter++;
            if (columnCounter > this.columns) {
                columnCounter = 1;
                calStr[calStr.length] = '</tr><tr valign="top">';
                this.rows++;
            }
        }
        calStr[calStr.length] = '</tr></table>';
        calStr[calStr.length] = '<div id="pageCalendarTitleFooter"><a href="http://www.365hotels.needitnow.com.au/">Book more than ' + this.numDays + ' days ahead &gt;&gt;</a></div>';
        this.containerDiv.innerHTML = calStr.join('');
        document.body.appendChild(this.containerDiv);
        calStr = null;
        delete calStr;
        if (JADE.iFrameShimRequired()) {
            this.iFrame = JADE.createIframe('calendarShim');
            var pos = Position.get(this.containerDiv);
            this.iFrame.style.left = pos.left;
            this.iFrame.style.top = pos.top;
            this.iFrame.style.width = (180 * this.columns) + 6 + 'px';
            this.iFrame.style.height = (192 * this.columns) + 10 + 'px';
            this.iFrame.style.visibility = 'visible';
            this.iFrame.style.zIndex = 0;
            pos = null;
            delete pos;
        }
        // Add date picker
        if (this.selectedDate) {
            var dateArray = this.selectedDate.split('-');
            var dayDate = new Date(dateArray[0], dateArray[1] - 1, dateArray[2]);
            dateArray = null;
            delete dateArray;
        }
        var inputFlds = document.getElementsByTagName('input');

        for (var i = 0; i < inputFlds.length; i++) {
            var id = inputFlds[i].id;
            var pos = id.indexOf(this.fieldId);
            if (pos != -1) {
                inputFlds[i].className = 'calInput';
                inputFlds[i].onfocus = function() {
                    NIN.pageCalendar.show(this);
                };
                inputFlds[i].onchange = function() {
                    NIN.pageCalendar.hide(this)
                };
                if (this.selectedDate) {
                    inputFlds[i].value = this.dayNamesAb[dayDate.getDay()] + ', ' + dayDate.getDate() + ' ' + this.monthNames[dayDate.getMonth()] + ' ' + dayDate.getFullYear();
                } else {
                    inputFlds[i].value = this.dayNamesAb[this.start.getDay()] + ', ' + this.start.getDate() + ' ' + this.monthNames[this.start.getMonth()] + ' ' + this.start.getFullYear();
                }
                // Add button
                var ancher = document.createElement("a");
                ancher.href = '#';
                ancher.onclick = function() {
                    var fldEl = this.parentNode.firstChild;
                    var id = fldEl.id;
                    var fldNum = parseInt(id.substring(NIN.pageCalendar.fieldId.length, id.length));
                    NIN.pageCalendar.toggle(fldNum);
                    return false;
                };
                var img = document.createElement("img");
                img.src = '/images/cal_button.gif';
                img.width = 25;
                img.height = 19;
                img.alt = 'Calendar';
                ancher.appendChild(img);
                inputFlds[i].parentNode.appendChild(ancher);
                inputFlds[i].parentNode.style.visibility = "visible";
                img = null;
                delete img;
                ancher = null;
                delete ancher;
            }
        }

        inputFlds = null;
        delete inputFlds;
    },
    createMonthCalendar: function(month, year) {
        var weekDates = new Array();
        var i = 0;
        var firstOfMonth = new Date(year, month, 1);
        var days = this.getDaysInMonth(month, year);
        var startingDay = firstOfMonth.getDay();
        days += startingDay;
        var startingRow = -1;
        for (i = 0; i < startingDay; i++) {
            if (i % 7 == 0) { // New row
                weekDates[++startingRow] = new Array();
            }
            weekDates[startingRow][i % 7] = 0;
        }
        for (i = startingDay; i < days; i++) {
            if (i % 7 == 0) {
                weekDates[++startingRow] = new Array();
            }
            weekDates[startingRow][i % 7] = i - startingDay + 1;
        }
        for (i = days; i < 42; i++) {
            if (i % 7 == 0) {
                break;
            }
            weekDates[startingRow][i % 7] = 0;
        }

        var html = ['<table border="0" cellpadding="0" cellspacing="0"  class="dpCalendar">', '<tr  class="dpCalendarTitle"><td colspan="7">', this.monthNames[firstOfMonth.getMonth()], ' ', firstOfMonth.getFullYear(), '</td></tr>'];
        // Add weekday names
        html[html.length] = '<tr>';
        for (i = 0; i < this.dayNames.length; i++) {
            html[html.length] = '<td class="dpDayName">' + this.dayNames[i] + '</td>';
        }
        html[html.length] = '</tr>';

        // Add the days to the table
        for (i = 0; i < weekDates.length; i++) {
            html[html.length] = '<tr>';
            week = weekDates[i];
            // Add the day links
            for (j = 0; j < 7; j++) {
                day = week[j];
                html[html.length] = this.getDayHtml(day, month, year);
            }
            html[html.length] = '</tr>';
        }

        html[html.length] = '</table>';

        return html.join('');
    },
    getDayHtml: function(day, month, year) {
        if (day == 0) {
            return '<td class="dpDayDisable">&nbsp;</td>';
        }
        dayDate = new Date(year, month, day);

        if (dayDate < this.start || dayDate > this.end) {
            return '<td class="dpDayDisable">' + day + '</td>';
        } else {
            var js = 'NIN.pageCalendar.doSelected(' + year + ', ' + (month + 1) + ', ' + day + '); return false;';
            var dow = this.dayNamesFull[dayDate.getDay()];
            var html = ['<td class="dpDay"'];
            if (year + '-' + (month + 1) + '-' + day == this.selectedDate) {
                html[html.length] = ' id="dpDaySelected"';
            }
            html[html.length] = '><a href="#" onclick="';
            html[html.length] = js;
            html[html.length] = '" title="';
            html[html.length] = dow;
            html[html.length] = ' ';
            html[html.length] = day;
            html[html.length] = ' ';
            html[html.length] = this.monthNames[month];
            html[html.length] = ' ';
            html[html.length] = year;
            html[html.length] = '">';
            html[html.length] = day;
            html[html.length] = '</a></td>';
            return html.join('');
        }
        return '';
    },
    getDaysInMonth: function(month, year) {
        switch (month) {
            case 0:
                return 31;
            case 1:
                return this.isLeapYear(year) ? 29 : 28;
            case 2:
                return 31;
            case 3:
                return 30;
            case 4:
                return 31;
            case 5:
                return 30;
            case 6:
                return 31;
            case 7:
                return 31;
            case 8:
                return 30;
            case 9:
                return 31;
            case 10:
                return 30;
            case 11:
                return 31;
            default:
                return -1;
        }
    },
    isLeapYear: function(year) {
        if (0 == year % 400) return true;
        if (0 == year % 100) return false;
        return (0 == year % 4) ? true : false;
    },
    show: function(el) {
        var id = el.id;
        var fldNum = parseInt(id.substring(this.fieldId.length, id.length));
        NIN.pageCalendar.toggle(fldNum, 1);
    },
    hideCal: function() {
        NIN.pageCalendar.containerDiv.style.display = 'none';
        if (NIN.pageCalendar.iFrame) {
            NIN.pageCalendar.iFrame.style.display = 'none';
        }
        NIN.pageCalendar.curFld = null;
    },
    hide: function(el) {
        NIN.pageCalendar.containerDiv.style.display = 'none';
        if (NIN.pageCalendar.iFrame) {
            NIN.pageCalendar.iFrame.style.display = 'none';
        }
        NIN.pageCalendar.curFld = null;
        // Has entered date changed?
        if (el) {
            var inputDate = el.value;
            var dateArray = inputDate.split(' ');
            // Very basic checking of entered date
            if (dateArray.length < 4 || parseInt(dateArray[3]) < 2000 || parseInt(dateArray[1]) < 1 || parseInt(dateArray[1]) > 31) {
                alert('Date not valid!');
                el = null;
                delete el;
                return false;
            }
            var monthNum = -1;
            switch (dateArray[2]) {
                case 'January':
                    monthNum = 0;
                    break;
                case 'February':
                    monthNum = 1;
                    break;
                case 'March':
                    monthNum = 2;
                    break;
                case 'April':
                    monthNum = 3;
                    break;
                case 'May':
                    monthNum = 4;
                    break;
                case 'June':
                    monthNum = 5;
                    break;
                case 'July':
                    monthNum = 6;
                    break;
                case 'August':
                    monthNum = 7;
                    break;
                case 'September':
                    monthNum = 8;
                    break;
                case 'October':
                    monthNum = 9;
                    break;
                case 'November':
                    monthNum = 10;
                    break;
                case 'December':
                    monthNum = 11;
                    break;
            }
            if (monthNum == -1) {
                alert('Date not valid!');
                el = null;
                delete el;
                return false;
            }
            var enteredDate = dateArray[3] + '-' + (monthNum + 1) + '-' + dateArray[1];
            if (this.selectedDate != enteredDate) {
                NIN.pageCalendar.doSelected(dateArray[3], monthNum + 1, dateArray[1]);
            }
            el = null;
            delete el;
        }
    },
    toggle: function(id, forceShow) {
        if (NIN.pageCalendar.containerDiv) {
            if (NIN.pageCalendar.curFld == id && NIN.pageCalendar.containerDiv.style.display == 'block' && !forceShow) {
                NIN.pageCalendar.containerDiv.style.display = 'none';
                if (NIN.pageCalendar.iFrame) {
                    NIN.pageCalendar.iFrame.style.display = 'none';
                }
                NIN.pageCalendar.curFld = null;
            } else {
                var inputEl = document.getElementById(NIN.pageCalendar.fieldId + id);
                var pos = Position.get(inputEl);
                inputEl = null;
                delete inputEl;
                NIN.pageCalendar.containerDiv.style.left = pos.left + 'px';
                if (document.frmSearchBox && document.frmSearchBox.pageNo) {
                    var offset = (192 * this.rows) + 50;
                    NIN.pageCalendar.containerDiv.style.top = pos.top - offset + 'px';
                } else {
                    NIN.pageCalendar.containerDiv.style.top = pos.top + 25 + 'px';
                }
                if (this.iFrame) {
                    this.iFrame.style.left = JADE.getStyle(this.containerDiv, 'left');
                    this.iFrame.style.top = JADE.getStyle(this.containerDiv, 'top');
                    this.iFrame.style.display = 'block';
                }
                NIN.pageCalendar.containerDiv.style.display = 'block';
                NIN.pageCalendar.curFld = id;
            }
        }
        return false;
    },
    doSelected: function(year, month, day) {
        var dayDate = new Date(year, month - 1, day);
        if (NIN.pageCalendar.curFld) {
            var fldId = NIN.pageCalendar.fieldId + NIN.pageCalendar.curFld;
            var el = document.getElementById(fldId);
            el.value = this.dayNamesAb[dayDate.getDay()] + ', ' + day + ' ' + this.monthNames[month - 1] + ' ' + year;
        }
        NIN.pageCalendar.containerDiv.style.display = 'none';
        if (NIN.pageCalendar.iFrame) {
            NIN.pageCalendar.iFrame.style.display = 'none';
        }
        NIN.pageCalendar.curFld = null;
        var daysDiff = (dayDate - this.start) / (1000 * 60 * 60 * 24);
        var pageNo = parseInt(daysDiff / 7 + 1);
        var selectedDate = year + '-' + month + '-' + day;
        // On home page don't redirect
        if (document.frmSearchBox && document.frmSearchBox.pageNo) {
            document.frmSearchBox.pageNo.value = pageNo;
            document.frmSearchBox.selectedDate.value = selectedDate;
            return false;
        }
        var url = document.location.href.replace('&pageno=' + currentPage, '').replace('&pageNo=' + currentPage, '').replace('&PageNo=' + currentPage, '').replace('&pageno=', '&p=') + '&pageno=' + pageNo;
        //url = url.toLowerCase();
        var pos = url.indexOf("&RoomsErr");
        if (pos >= 0)
            url = url.substring(0, pos);
        url = JADE.replaceQueryString(url, "selectedDate", selectedDate);
        url = url.replace('#&', '&');
        url = url.replace('#?', '?');
        if (pageNo != currentPage) {
            document.location.href = url;
        }
        //alert(url);
        return false;
    }
}

