/////////////////////////////////////////////////////////////////////////////////////////
/// DatePicker.js -- Backend functionality for the DatePicker ASP.NET Custom Control
/// dsmith -- Created: 12/12/2006
/////////////////////////////////////////////////////////////////////////////////////////
/// Constants
/////////////////////////////////////////////////////////////////////////////////////////
var __dpDays = new Array(['Su','Sun','Sunday'],['M','Mon','Monday'],['Tu','Tue','Tuesday'],['W','Wed','Wednesday'],['Th','Thu','Thursday'],['F','Fri','Friday'],['Sa','Sat','Saturday']);
var __dpMonths = new Array(['Jan','January'],['Feb','February'],['Mar','March'],['Apr','April'],['May','May'],['Jun','June'],['Jul','July'],['Aug','August'],['Sept','September'],['Oct','October'],['Nov','November'],['Dec','December']);

/////////////////////////////////////////////////////////////////////////////////////////
/// Public Functions
/////////////////////////////////////////////////////////////////////////////////////////

function dpToggle(id) {
    var o = __dpGetObj(id + '_div');
    if (o != null) {
        // hide other calendar divs
        __dpHideAllExcept(id);
        
        // toggle and render this calendar div
        o.style.display = (o.style.display == 'none') ? 'block' : 'none';
        if (o.style.display == 'block') {
            __dpRenderCal(id);
}   }   }

function dpAddDay(id) {
    // hide other calendar divs
    __dpHideAll();
    
    // update selected date
    var d = __dpGetSelectedDate(id);
    d.setDate(d.getDate()+1);
    __dpSetSelectedDate(id, d);
}

function dpSubtractDay(id) {
    // hide other calendar divs
    __dpHideAll();
    
    // update selected date
    var d = __dpGetSelectedDate(id);
    d.setDate(d.getDate()-1);
    __dpSetSelectedDate(id, d);
}

/////////////////////////////////////////////////////////////////////////////////////////
/// Private Functions
/////////////////////////////////////////////////////////////////////////////////////////

function __dpRenderCal(id, zMonth, year) {
    var curDate = __dpGetSelectedDate(id);
    if (zMonth == null || year == null) {
        zMonth = curDate.getMonth();
        year = curDate.getFullYear();
    }
    
    var tBody, tHead;
    var div = __dpGetObj(id + '_div');
    var tbl = __dpGetObj(id + '_tbl');
    if (!div.hasChildNodes() || tbl == null) {
        tbl = document.createElement('table');
        tbl.id = id + '_tbl';
        tbl.className = 'dpCal';
        div.appendChild(tbl);
        
        tHead = document.createElement('thead');
        tHead.id = id + '_tHead';
        tbl.appendChild(tHead);
        
        tBody = document.createElement('tbody');
        tBody.id = id + '_tBody';
        tbl.appendChild(tBody);
    } else {
        tHead = __dpGetObj(id + '_tHead');
        tBody = __dpGetObj(id + '_tBody');
    }
    
    __dpRenderTHead(tHead, zMonth, year);
    __dpRenderTBody(tBody, zMonth, year, curDate);
}

function __dpRenderTHead(tHead, zMonth, year) {
    while(tHead.hasChildNodes()) {
        tHead.removeChild(tHead.firstChild);
    }
    var tRow = document.createElement('tr');

    var thPrev = document.createElement('th');
    thPrev.className = 'dpCalPrevNext';
    thPrev.setAttribute('align','left');
    tRow.appendChild(thPrev);
    
    var prevLink = document.createElement('a');
    prevLink.href = '#';
    prevLink.setAttribute('_month', ((zMonth == 0) ? 11 : parseInt(zMonth)-1));
    prevLink.setAttribute('_year', ((zMonth == 0) ? parseInt(year)-1 : year));
    prevLink.onclick = function(){ __dpSwitchMonth(this); return false; };
    prevLink.appendChild(document.createTextNode('<<'));
    thPrev.appendChild(prevLink);
    
    var thMonth = document.createElement('th');
    thMonth.colSpan = 5;
    thMonth.setAttribute('align','center');
    thMonth.appendChild(document.createTextNode(__dpMonths[zMonth][1] + ' ' + year));
    tRow.appendChild(thMonth);
    
    var thNext = document.createElement('th');
    thNext.className = 'dpCalPrevNext';
    thNext.setAttribute('align','right');
    tRow.appendChild(thNext);
    
    var nextLink = document.createElement('a');
    nextLink.href = '#';
    nextLink.setAttribute('_month', ((zMonth == 11) ? 0 : parseInt(zMonth)+1));
    nextLink.setAttribute('_year', ((zMonth == 11) ? parseInt(year)+1 : year));
    nextLink.onclick = function(){ __dpSwitchMonth(this); return false; };
    nextLink.appendChild(document.createTextNode('>>'));
    thNext.appendChild(nextLink);
    
    tHead.appendChild(tRow);
}

function __dpRenderTBody(tBody, zMonth, year, curDate) {
    while(tBody.hasChildNodes()) {
        tBody.removeChild(tBody.firstChild);
    }
    
    var tRow = document.createElement('tr');
    for(var i=0; i<7; i++) {
        var th = document.createElement('th');
        th.appendChild(document.createTextNode(__dpDays[i][1]));
        tRow.appendChild(th);
    }
    tBody.appendChild(tRow);
    
    var daysInMonth = __dpDaysInMonth(zMonth, year);    
    var dayNum = 1 - new Date(year, zMonth, 1).getDay();
    while (dayNum <= daysInMonth) {
        tRow = document.createElement('tr');
        for(var i=0; i<7; i++) {
            var tCell = document.createElement('td');
            if (dayNum > 0 && dayNum <= daysInMonth) {
                var dayLink = document.createElement('a');
                dayLink.href = '#';
                dayLink.setAttribute('_day', dayNum);
                dayLink.setAttribute('_month', zMonth);
                dayLink.setAttribute('_year', year);
                dayLink.onclick = function(){ __dpSelectDay(this); return false; };
                dayLink.appendChild(document.createTextNode(dayNum));
                if(curDate.getDate() == dayNum && curDate.getMonth() == zMonth && curDate.getFullYear() == year)
                    tCell.className = 'curDate';
                tCell.appendChild(dayLink);
            } else {
                tCell.className = 'nonDate';
            }
            tRow.appendChild(tCell);
            dayNum++;
        }
        tBody.appendChild(tRow);
}   }

function __dpSwitchMonth(link) {
    __dpRenderCal(__dpGetParentDpID(link), link.getAttribute('_month'), link.getAttribute('_year'));
}

function __dpSelectDay(link) {
    __dpSetSelectedDate(__dpGetParentDpID(link), new Date(link.getAttribute('_year'), link.getAttribute('_month'), link.getAttribute('_day')));
    __dpHideAll();    
}

function __dpGetParentDpID(o) {
    while(o.id.indexOf('_div') == -1) {
        o = o.parentNode;
    }
    return o.parentNode.id;
}

function __dpGetObj(id) {
    return (document.getElementById) ? document.getElementById(id) : document.all[id];
}

function __dpDaysInMonth(zMonth, year) {
    return 32 - new Date(year, zMonth, 32).getDate();
}

function __dpGetSelectedDate(id) {
    var tb = __dpGetObj(id + '_tb');
    if (tb != null) {
        if(tb.value.match(/^\d{1,2}\/\d{1,2}\/\d{4}$/)) {
            return new Date(tb.value);
        } else {
            __dpSetSelectedDate(id, new Date());
        }
    }
    return new Date();
}

function __dpSetSelectedDate(id, d) {
    var o = __dpGetObj(id + '_tb');
    if (o != null) {
        o.value = (d.getMonth()+1) + '/' + d.getDate() + '/' + d.getFullYear();
}   }

function __dpHideAll() {
    __dpHideAllExcept('');
}

function __dpHideAllExcept(id) {
if (typeof(dpCtrls) != 'undefined') {
        for(var i=0; i<dpCtrls.length; i++) {
            if (dpCtrls[i] != id) {
                var dp = __dpGetObj(dpCtrls[i] + '_div');
                if (dp != null) {
                    dp.style.display = 'none';
}   }   }   }   }