//	Last updated 10 June 2009
//	Modified by Andrés Murman y Candelaria Montes de Oca

//You can edit these variables
var fixedX = -1; // x position (-1 if to appear below control)
var fixedY = -1; // y position (-1 if to appear below control)
var startAt = 1; // 0 - sunday ; 1 - monday
var showWeekNumber = 0; // Muestra el numero de la semana. 0 - no muestra; 1 - sí muestra.
var showToday = 1; // Muestra el día actual al pie del calendario. 0 - no muestra; 1 - sí muestra.
var imgDir = "./img/"; // directory for images ... e.g. var imgDir="/img/"
var todayString = "";
var monthName = new Array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");

//Don't Edit these variables
var crossobj, crossMonthObj, crossYearObj, monthSelected, yearSelected, dateSelected, omonthSelected, oyearSelected, odateSelected, monthConstructed, yearConstructed, intervalID1, intervalID2, timeoutID1, timeoutID2, ctlToPlaceValue, ctlNow, dateFormat, nStartingYear, day, month, year;
var bPageLoaded = false;
var ie = document.all && window.navigator.appVersion.indexOf('MSIE 9') == -1;
var dom = document.getElementById;
var ns4 = document.layers;
var today = new Date();
var dateNow = today.getDate();
var monthNow = today.getMonth();
var yearNow = today.getYear();
var img = new Array();
var bShow = false;

if (dom) {
    document.write("<div onclick='bShow=true' id='calendar'style='z-index:+999;position:absolute;visibility:hidden;'>");
    document.write("<table class='table-calendar' width=" + ((showWeekNumber == 1) ? 250 : 210) + " >");
    document.write("	<tr>");
    document.write("		<td width='" + ((showWeekNumber == 1) ? 248 : 218) + "' class='month'>" + "<a href=\"javascript:void(0);\" onclick=\"javascript:hideCalendar();\" class='close'><img src='" + imgDir + "calendar_close.png' border=0 align=middle></a>");
    document.write("			<span id='caption'></span></td>");
    document.write("		</td>");
    document.write("	</tr><tr>");
    document.write("		<td class='number'>");
    document.write("			<span id='content'></span>");
    document.write("		</td>");
    document.write("	</tr>");
    if (showToday == 1) {
        document.write("<tr><td class='date'><span id='lblToday'></span></td></tr>")
    }
    document.write("</table></div>");
    //dropdown
    document.write("<div id='selectMonth' class='calendarSelect'></div>");
    document.write("<div id='selectYear' class='calendarSelect'></div>");
}

if (startAt == 0) {
    dayName = new Array("Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab");
} else {
    dayName = new Array("Lun", "Mar", "Mie", "Jue", "Vie", "Sab", "Dom");
}

document.onkeypress = function hidecal1() {
    if (event.keyCode == 27)
        hideCalendar();
}

document.onclick = function hidecal2() {
    if (!bShow)
        hideCalendar();
    bShow = false;
}

if (ie) {
    init();
} else {
    window.onload = init;
}

function loadLanguage(i) {
    if (i.toString().toLowerCase() == 'en') { // paso a ingles
        monthName = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
        if (startAt == 0) {
            dayName = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
        } else {
            dayName = new Array("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun");
        }
        //todayString = "Today is ";
    }
    if (i.toString().toLowerCase() == 'po') { // paso a portugues  
        monthName = new Array("Janeiro", "Fevereiro", "Marzo", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro");
        if (startAt == 0) {
            dayName = new Array("Dom", "Pri", "Seg", "Ter", "Qua", "Qui", "Sab");
        } else {
            dayName = new Array("Pri", "Seg", "Ter", "Qua", "Qui", "Sab", "Dom");
        }
        //todayString = "Hoje ? "
    }
}

// hides <select> and <applet> objects (for IE only)
function hideElement(elmID, overDiv) {
    /*if (ie) {
        for (i = 0; i < document.all.tags(elmID).length; i++) {
            obj = document.all.tags(elmID)[i];
            if (!obj || !obj.offsetParent) {
                continue;
            }
            // Find the element's offsetTop and offsetLeft relative to the BODY tag.
            objLeft = obj.offsetLeft;
            objTop = obj.offsetTop;
            objParent = obj.offsetParent;
            while (objParent != null && objParent.tagName.toUpperCase() != "BODY") {
                objLeft += objParent.offsetLeft;
                objTop += objParent.offsetTop;
                objParent = objParent.offsetParent;
            }
            objHeight = obj.offsetHeight;
            objWidth = obj.offsetWidth;
            if ((overDiv.offsetLeft + overDiv.offsetWidth) <= objLeft);
            else if ((overDiv.offsetTop + overDiv.offsetHeight) <= objTop);
            else if (overDiv.offsetTop >= (objTop + objHeight + obj.height));
            else if (overDiv.offsetLeft >= (objLeft + objWidth));
            else {
                obj.style.visibility = "hidden";
            }
        }
    }*/
}

//unhides <select> and <applet> objects (for IE only)
function showElement(elmID) {
    /*if (ie) {
        for (i = 0; i < document.all.tags(elmID).length; i++) {
            obj = document.all.tags(elmID)[i];
            if (!obj || !obj.offsetParent) {
                continue;
            }
            obj.style.visibility = "";
        }
    }*/
}


function swapImage(srcImg, destImg) {
    if (ie) { document.getElementById(srcImg).setAttribute("src", imgDir + destImg) }
}

function init() {
    if (!ns4) {
        if (!ie) {
            yearNow += 1900 
        }
        crossobj = (dom) ? document.getElementById("calendar").style : ie ? document.all.calendar : document.calendar
        hideCalendar()
        crossMonthObj = (dom) ? document.getElementById("selectMonth").style : ie ? document.all.selectMonth : document.selectMonth
        crossYearObj = (dom) ? document.getElementById("selectYear").style : ie ? document.all.selectYear : document.selectYear
        monthConstructed = false;
        yearConstructed = false;
        if (showToday == 1) {
            document.getElementById("lblToday").innerHTML = todayString + " <a class='date' href=\"javascript:void(0);\" onclick='javascript:dateSelected=dateNow;monthSelected=monthNow;yearSelected=yearNow;closeCalendar();'>" + dayName[(today.getDay() - startAt == -1) ? 6 : (today.getDay() - startAt)] + ", " + monthName[monthNow].substring(0, 3) + " " + dateNow + ", " + yearNow + "</a>"
        }
        //meses - flecha
        sHTML1 = "<span id='spanDecMonth' onclick='decMonth()'><</span>&nbsp;<span id='spanMonth' onclick='popUpMonth()'></span>&nbsp;"
        sHTML1 += "<span id='spanYear' onclick='popUpYear()'></span>&nbsp;<span id='spanIncMonth' onclick='incMonth()'>></span>&nbsp;"
        document.getElementById("caption").innerHTML = sHTML1
        bPageLoaded = true
    }
}

function hideCalendar() {
    crossobj.visibility = "hidden"
    if (crossMonthObj != null) { crossMonthObj.visibility = "hidden" }
    if (crossYearObj != null) { crossYearObj.visibility = "hidden" }
    showElement('SELECT');
    showElement('APPLET');

}

function padZero(num) {
    return (num < 10) ? '0' + num : num;
}

function constructDate(d, m, y) {
    sTmp = dateFormat
    sTmp = sTmp.replace("dd", "<e>")
    sTmp = sTmp.replace("d", "<d>")
    sTmp = sTmp.replace("<e>", padZero(d))
    sTmp = sTmp.replace("<d>", d)
    sTmp = sTmp.replace("MMM", "<o>")
    sTmp = sTmp.replace("MM", "<n>")
    sTmp = sTmp.replace("M", "<m>")
    sTmp = sTmp.replace("<m>", m + 1)
    sTmp = sTmp.replace("<n>", padZero(m + 1))
    sTmp = sTmp.replace("<o>", monthName[m])
    return sTmp.replace("yyyy", y)
}

function closeCalendar() {
    hideCalendar();
    ctlToPlaceValue.value = constructDate(dateSelected, monthSelected, yearSelected);
    ctlToPlaceValue.focus();
}


// Month Pulldown
function StartDecMonth() {
    intervalID1 = setInterval("decMonth()", 80);
}

function StartIncMonth() {
    intervalID1 = setInterval("incMonth()", 80);
}

function incMonth() {
    monthSelected++;
    if (monthSelected > 11) {
        monthSelected = 0;
        yearSelected++;
    }
    constructCalendar();
}

function decMonth() {
    monthSelected--;
    if (monthSelected < 0) {
        monthSelected = 11;
        yearSelected--;
    }
    constructCalendar();
}

function constructMonth() {
    popDownYear();
    if (!monthConstructed) {
        sHTML = "";
        for (i = 0; i < 12; i++) {
            sName = monthName[i];
            if (i == monthSelected) {
                sName = "<B>" + sName + "</B>";
            }
            sHTML += "<tr><td id='m" + i + "' onmouseover='this.className=\"dropSelect\"' onmouseout='this.className=\"\"' style='cursor:pointer' onclick='monthConstructed=false;monthSelected=" + i + ";constructCalendar();popDownMonth();event.cancelBubble=true'>&nbsp;" + sName + "&nbsp;</td></tr>"
        }
        //style meses
        document.getElementById("selectMonth").innerHTML = "<table width=70	class='table-drop' cellspacing=0 onmouseover='clearTimeout(timeoutID1)'	onmouseout='clearTimeout(timeoutID1);timeoutID1=setTimeout(\"popDownMonth()\",100);event.cancelBubble=true'>" + sHTML + "</table>";
        monthConstructed = true;
    }
}


function popUpMonth() {
    constructMonth();
    crossMonthObj.visibility = (dom || ie) ? "visible" : "show";
    crossMonthObj.left = parseInt(crossobj.left) + 9 + "px";
    crossMonthObj.top = parseInt(crossobj.top) + 34 + "px";
    hideElement('SELECT', document.getElementById("selectMonth"));
    hideElement('APPLET', document.getElementById("selectMonth"));
}

function popDownMonth() {
    crossMonthObj.visibility = "hidden";
}

// Year Pulldown

function incYear() {
    for (i = 0; i < 7; i++) {
        newYear = (i + nStartingYear) + 1;
        if (newYear == yearSelected) {
            txtYear = "&nbsp;<B>" + newYear + "</B>&nbsp;"
        } else {
            txtYear = "&nbsp;" + newYear + "&nbsp;";
        }
        document.getElementById("y" + i).innerHTML = txtYear;
    }
    nStartingYear++;
    bShow = true;
}

function decYear() {
    for (i = 0; i < 7; i++) {
        newYear = (i + nStartingYear) - 1;
        if (newYear == yearSelected) {
            txtYear = "&nbsp;<B>" + newYear + "</B>&nbsp;"
        } else {
            txtYear = "&nbsp;" + newYear + "&nbsp;";
        }
        document.getElementById("y" + i).innerHTML = txtYear;
    }
    nStartingYear--;
    bShow = true;
}

function selectYear(nYear) {
    yearSelected = parseInt(nYear + nStartingYear);
    yearConstructed = false;
    constructCalendar();
    popDownYear();
}


function constructYear() {
    popDownMonth();
    sHTML = "";
    if (!yearConstructed) {
        sHTML = "<tr><td align='center'	onmouseover='this.className=\"dropSelect\"' onmouseout='clearInterval(intervalID1);this.className=\"\"' style='cursor:pointer'	onmousedown='clearInterval(intervalID1);intervalID1=setInterval(\"decYear()\",30)' onmouseup='clearInterval(intervalID1)'>-</td></tr>";
        j = 0;
        nStartingYear = yearSelected - 3;
        for (i = (yearSelected - 3); i <= (yearSelected + 3); i++) {
            sName = i;
            if (i == yearSelected) {
                sName = "<B>" + sName + "</B>";
            }
            sHTML += "<tr><td id='y" + j + "' onmouseover='this.className=\"dropSelect\"' onmouseout='this.className=\"\"' style='cursor:pointer' onclick='selectYear(" + j + ");event.cancelBubble=true'>&nbsp;" + sName + "&nbsp;</td></tr>";
            j++;
        }
        //dropdown año
        sHTML += "<tr><td align='center' onmouseover='this.className=\"dropSelect\"' onmouseout='clearInterval(intervalID2);this.className=\"\"' style='cursor:pointer' onmousedown='clearInterval(intervalID2);intervalID2=setInterval(\"incYear()\",30)'	onmouseup='clearInterval(intervalID2)'>+</td></tr>";
        document.getElementById("selectYear").innerHTML = "<table width=44 class='table-drop' onmouseover='clearTimeout(timeoutID2)' onmouseout='clearTimeout(timeoutID2);timeoutID2=setTimeout(\"popDownYear()\",100)' cellspacing=0>" + sHTML + "</table>";
        yearConstructed = true;
    }
}

function popDownYear() {
    clearInterval(intervalID1);
    clearTimeout(timeoutID1);
    clearInterval(intervalID2);
    clearTimeout(timeoutID2);
    crossYearObj.visibility = "hidden";

}

function popUpYear() {
    var leftOffset;
    constructYear();
    crossYearObj.visibility = (dom || ie) ? "visible" : "show";
    leftOffset = parseInt(crossobj.left) + document.getElementById("spanYear").offsetLeft;
    if (ie)
        leftOffset += 6;
    crossYearObj.left = leftOffset + "px";
    crossYearObj.top = parseInt(crossobj.top) + 34 + "px";
}


function WeekNbr(n) {
    // Algorithm used:
    // From Klaus Tondering's Calendar document (The Authority/Guru)
    // hhtp://www.tondering.dk/claus/calendar.html
    // a = (14-month) / 12
    // y = year + 4800 - a
    // m = month + 12a - 3
    // J = day + (153m + 2) / 5 + 365y + y / 4 - y / 100 + y / 400 - 32045
    // d4 = (J + 31741 - (J mod 7)) mod 146097 mod 36524 mod 1461
    // L = d4 / 1460
    // d1 = ((d4 - L) mod 365) + L
    // WeekNumber = d1 / 7 + 1

    year = n.getFullYear();
    month = n.getMonth() + 1;
    if (startAt == 0) {
        day = n.getDate() + 1;
    } else {
        day = n.getDate();
    }
    a = Math.floor((14 - month) / 12);
    y = year + 4800 - a;
    m = month + 12 * a - 3;
    b = Math.floor(y / 4) - Math.floor(y / 100) + Math.floor(y / 400);
    J = day + Math.floor((153 * m + 2) / 5) + 365 * y + b - 32045;
    d4 = (((J + 31741 - (J % 7)) % 146097) % 36524) % 1461;
    L = Math.floor(d4 / 1460);
    d1 = ((d4 - L) % 365) + L;
    week = Math.floor(d1 / 7) + 1;
    return week;
}

function constructCalendar() {
    var aNumDays = Array(31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    var startDate = new Date(yearSelected, monthSelected, 1);
    var endDate;
    var sClass = '';
    if (monthSelected == 1) {
        endDate = new Date(yearSelected, monthSelected + 1, 1);
        endDate = new Date(endDate - (24 * 60 * 60 * 1000));
        numDaysInMonth = endDate.getDate()
    } else {
        numDaysInMonth = aNumDays[monthSelected];
    }
    datePointer = 0
    dayPointer = startDate.getDay() - startAt;
    if (dayPointer < 0)
        dayPointer = 6;
    //style numeros
    sHTML = '<table border="0"><tr>';
    if (showWeekNumber == 1)
        sHTML += "<td width='22px'><b>wk</b></td><td width=1 rowspan=7 style='padding:0px'></td>";
    for (i = 0; i < 7; i++) {
        sHTML += "<td width='22px' align='right'><B>" + dayName[i] + "</B></td>";
    }
    sHTML += "</tr><tr>";
    if (showWeekNumber == 1)
        sHTML += "<td align=right>" + WeekNbr(startDate) + "&nbsp;</td>";
    for (var i = 1; i <= dayPointer; i++) {
        sHTML += "<td>&nbsp;</td>";
    }
    for (datePointer = 1; datePointer <= numDaysInMonth; datePointer++) {
        dayPointer++;
        sHTML += "<td align=right>";
        sClass = '';
        if ((datePointer == odateSelected) && (monthSelected == omonthSelected) && (yearSelected == oyearSelected)) {
            sClass = "class='selectedDay'";
        }
        var regexp = /\"/g;
        if ((datePointer == dateNow) && (monthSelected == monthNow) && (yearSelected == yearNow)) {
            sHTML += "<b><a " + sClass + " href=\"javascript:void(0);\" onclick='javascript:dateSelected=" + datePointer + ";closeCalendar();'><span class='dateselect'>&nbsp;" + datePointer + "</span>&nbsp;</a></b>"
        } else if (dayPointer % 7 == (startAt * -1) + 1) {
            sHTML += "<a " + sClass + " href=\"javascript:void(0);\" onclick='javascript:dateSelected=" + datePointer + ";closeCalendar();'>&nbsp;<span style='color:#909090'>" + datePointer + "</span>&nbsp;</a>"
        } else {
            sHTML += "<a " + sClass + " href=\"javascript:void(0);\" onclick='javascript:dateSelected=" + datePointer + ";closeCalendar();'>&nbsp;<span>" + datePointer + "&nbsp;</span></a>"
        }
        sHTML += "";
        if ((dayPointer + startAt) % 7 == startAt) {
            sHTML += "</tr><tr>";
            if ((showWeekNumber == 1) && (datePointer < numDaysInMonth)) {
                sHTML += "<td align=right>" + (WeekNbr(new Date(yearSelected, monthSelected, datePointer + 1))) + "&nbsp;</td>"
            }
        }
    }
    document.getElementById("content").innerHTML = sHTML;
    document.getElementById("spanMonth").innerHTML = "&nbsp;" + monthName[monthSelected] + "&nbsp;<IMG id='changeMonth' SRC='" + imgDir + "drop2.gif' WIDTH='8' HEIGHT='8' BORDER=0>";
    document.getElementById("spanYear").innerHTML = "&nbsp;" + yearSelected + "&nbsp;<IMG id='changeYear' SRC='" + imgDir + "drop2.gif' WIDTH='8' HEIGHT='8' BORDER=0>";
}



function popUpCalendar(ctlId, format, language) {
    var ctl = document.getElementById(ctlId);
    var leftpos = 0;
    var toppos = 0;
    imgDir = './img/';
    /*loadLanguage(language);
    init();*/
    if (bPageLoaded) {
        if (crossobj.visibility == "hidden") {
            ctlToPlaceValue = ctl;
            dateFormat = format;
            formatChar = " ";
            aFormat = dateFormat.split(formatChar);
            if (aFormat.length < 3) {
                formatChar = "/";
                aFormat = dateFormat.split(formatChar);
                if (aFormat.length < 3) {
                    formatChar = ".";
                    aFormat = dateFormat.split(formatChar);
                    if (aFormat.length < 3) {
                        formatChar = "-";
                        aFormat = dateFormat.split(formatChar);
                        if (aFormat.length < 3) {
                            // invalid date	format
                            formatChar = "";
                        }
                    }
                }
            }
            tokensChanged = 0;
            if (formatChar != "") {
                // use user's date
                aData = ctl.value.split(formatChar);
                for (i = 0; i < 3; i++) {
                    if ((aFormat[i] == "d") || (aFormat[i] == "dd")) {
                        dateSelected = parseInt(aData[i], 10);
                        tokensChanged++;
                    } else if ((aFormat[i] == "M") || (aFormat[i] == "MM")) {
                        monthSelected = parseInt(aData[i], 10) - 1;
                        tokensChanged++;
                    } else if (aFormat[i] == "yyyy") {
                        yearSelected = parseInt(aData[i], 10);
                        tokensChanged++;
                    } else if (aFormat[i] == "MMM") {
                        for (j = 0; j < 12; j++) {
                            if (aData[i] == monthName[j]) {
                                monthSelected = j;
                                tokensChanged++;
                            }
                        }
                    }
                }
            }
            if ((tokensChanged != 3) || isNaN(dateSelected) || isNaN(monthSelected) || isNaN(yearSelected)) {
                dateSelected = dateNow;
                monthSelected = monthNow;
                yearSelected = yearNow;
            }
            odateSelected = dateSelected;
            omonthSelected = monthSelected;
            oyearSelected = yearSelected;
            aTag = ctl;
            do {
                aTag = aTag.offsetParent;
                leftpos += aTag.offsetLeft;
                toppos += aTag.offsetTop;
            } while (aTag.offsetParent != null && aTag.tagName != "BODY");
            crossobj.left = fixedX == -1 ? ctl.offsetLeft + leftpos + "px" : fixedX;
            crossobj.top = fixedY == -1 ? ctl.offsetTop + toppos + ctl.clientHeight + 4 + "px" : fixedY;
            constructCalendar(1, monthSelected, yearSelected);
            crossobj.visibility = (dom || ie) ? "visible" : "show";
            hideElement('SELECT', document.getElementById("calendar"));
            hideElement('APPLET', document.getElementById("calendar"));
            bShow = true;
        }
        else {
            hideCalendar();
            if (ctlNow != ctl) {
                popUpCalendar(ctl, format);
            }
        }
        ctlNow = ctl;
    }
}
