﻿/* Common Functions */
function getDaysInMonth(date)
{
    var year = date.getFullYear();
    var month = date.getMonth();
    return [31,((!(year % 4 ) && ( (year % 100 ) || !( year % 400 ) ))?29:28),31,30,31,30,31,31,30,31,30,31][month];
}
function string2Date(strdate)
{
    var year = strdate.split('-')[0];
    var month = strdate.split('-')[1];
    if(month.indexOf(0)=="0")
        month = month.substring(1,2);
    month = parseInt(month)-1;
    var date = strdate.split('-')[2];
    if(date.indexOf(0)=="0")
        date = date.substring(1,2);
    date = parseInt(date);
    return (new Date(year,month,date));
}
    
/* Calendar */ 
function showCalendar(calAttachObj)
{
    var popupCalendar = new PopupCalendar(calAttachObj);
    popupCalendar.drawCalendar();
}

function PopupCalendar(attachedObject,initYear,initMonth,initDate)
{
    if(attachedObject==null)
        return;
    
    var today = new Date();
    var currentYear = today.getFullYear();            
    var currentMonth = today.getMonth()+1;
    var currentDate = today.getDate();
    var container = null;
    
    this.drawCalendar = drawCalendar;
    function drawCalendar()
    {
        if(initYear!=null)
            currentYear = initYear;
        if(initMonth!=null)
            currentMonth = initMonth;
        if(initDate!=null)
            currentDate = initDate;
            
        // Init Calendar
        initContainer();
        // Navigation
        attachNavigation(container);
        // Week Top                 
        attachWeekTop(container);
        // Month Days
        attachMonthDays(container);
        // Footer
        attachFooter(container);
    }
    
    function initContainer()
    {
        if(container==null)
        {
            container = document.createElement("DIV");
            container.className = "PopupCalendar";
            attachedObject.parentNode.appendChild(container);
                
            if(typeof(attachedObject) != "object")
                attachedObject = document.getElementById(attachedObject);
            
    
            var attachedDate = null;
            if(attachedObject.tagName.toLowerCase()=="input" && trim(attachedObject.value)!="")
            {
                try{attachedDate = string2Date(attachedObject.value);}catch(e){}
            }
            else
            {
                try{attachedDate = string2Date(attachedObject.innerHTML);}catch(e){}
            }
            if(attachedDate!=null)
            {
                currentYear = attachedDate.getFullYear();
                currentMonth = attachedDate.getMonth()+1;
                currentDate = attachedDate.getDate();
            }

            var position = new positionInfo(attachedObject);
            var x = position.getElementLeft();
            var y = position.getElementBottom();
            container.style.top = y+"px";
            container.style.left = x+"px";
        }
        else
        {
            while(container.childNodes.length>0)
                container.removeChild(container.childNodes[0]);
        }
    }
    
    function attachNavigation(container)
    {
        var objPreYear = document.createElement("DIV");
        objPreYear.title = "上一年";
        objPreYear.innerHTML = "&lt;&lt;";
        objPreYear.className = "btnnav";
        objPreYear.onclick = function(){currentYear--;drawCalendar();};
        container.appendChild(objPreYear);
        
        var objPreMonth = document.createElement("DIV");
        objPreMonth.title = "上一月";
        objPreMonth.innerHTML = "&lt;";      
        objPreMonth.className = "btnnav";
        objPreMonth.onclick = function(){currentMonth--;if(currentMonth==0){currentMonth = 12;currentYear--;}drawCalendar();};
        container.appendChild(objPreMonth);
        
        var objTitle = document.createElement("DIV");
        objTitle.innerHTML = currentYear+"年"+currentMonth+"月";       
        objTitle.className = "title";
        container.appendChild(objTitle);
        
        var objNxtMonth = document.createElement("DIV");
        objNxtMonth.title = "下一月";
        objNxtMonth.innerHTML = "&gt;"; 
        objNxtMonth.className = "btnnav"; 
        objNxtMonth.onclick = function(){currentMonth++;if(currentMonth==13){currentMonth = 1;currentYear++;}drawCalendar();};  
        container.appendChild(objNxtMonth);
                      
        var objNxtYear = document.createElement("DIV");
        objNxtYear.title = "下一年";
        objNxtYear.innerHTML = "&gt;&gt;";     
        objNxtYear.className = "btnnav";  
        objNxtYear.onclick = function(){currentYear++;drawCalendar();};
        container.appendChild(objNxtYear);  
    }
    
    function attachWeekTop(container)
    {                
        var strWeekDays = ["日","一","二","三","四","五","六"];
        for(var i=0;i<strWeekDays.length;i++)
        {
            var objWeekTop = document.createElement("DIV");
            objWeekTop.className = "weektop";
            objWeekTop.innerHTML = strWeekDays[i];
            container.appendChild(objWeekTop);
        }
    }
    
    function attachMonthDays(container)
    {        
        var currentDay = string2Date(currentYear+"-"+currentMonth+"-"+currentDate);
        var daysInMonth = getDaysInMonth(currentDay);
        var firstWeekDateOfMonth = string2Date(currentYear+"-"+currentMonth+"-"+1).getDay();
        
        for(var i=0;i<(daysInMonth+firstWeekDateOfMonth);i++)
        {        
            var tpdiv = document.createElement("DIV");
            if(i<firstWeekDateOfMonth)
            {
                tpdiv.className = "empty";
            }
            else
            {
                tpdiv.innerHTML = i-firstWeekDateOfMonth+1;
                tpdiv.className = ((i+1)%7==0 || i%7==0)?"weekend":"weekday";
                if(checkIsCurrent(tpdiv.innerHTML))
                    tpdiv.className = "current";
                tpdiv.onclick = function(){currentDate = parseInt(this.innerHTML);setValue();};
            }
            container.appendChild(tpdiv);
        }
    }
    
    //如果是当天日期，或者是源输入框中的日期，则返回 true.
    function checkIsCurrent(date)
    {
        if(currentYear==today.getFullYear() && currentMonth==(today.getMonth()+1) && date==today.getDate())
            return true;
        var currentDateString = currentYear+"-"+currentMonth+"-"+date;
        if(attachedObject.innerHTML == currentDateString || attachedObject.value == currentDateString)
            return true;
            
        return false;
    }
    
    function setValue()
    {
        if(attachedObject==null)
            return ;
        if(attachedObject.tagName.toLowerCase() == "input")
            attachedObject.value = currentYear+"-"+currentMonth+"-"+currentDate;
        else
            attachedObject.innerHTML = currentYear+"-"+currentMonth+"-"+currentDate;
            
        container.parentNode.removeChild(container);
    }
    
    function attachFooter(container)
    {
        var objFooter = document.createElement("DIV");
        objFooter.className = "footer";
        objFooter.innerHTML = "关闭";        
        container.appendChild(objFooter);
        
        objFooter.onclick = function(){container.parentNode.removeChild(container);};
    }
}
