function _inputDate_getDisplayDiv( eltname )
{
    var divObj = document.all[eltname];

    if ( typeof divObj == 'undefined' ) {
        divObj = document.createElement( "div" );
        divObj.id = eltname;
        divObj.style.zIndex = 6;
        divObj.style.position = "absolute";
        document.body.appendChild( divObj );

        return divObj;
    }

    return divObj;
}

function _inputDate_makeRectangularDropShadow(el, color, size)
{
    var i;
    for (i=size; i>0; i--)
    {
        var rect = document.createElement('div');
        var rs = rect.style
        rs.position = 'absolute';
        rs.left = (el.style.posLeft + i) + 'px';
        rs.top = (el.style.posTop + i) + 'px';
        rs.width = el.offsetWidth + 'px';
        rs.height = el.offsetHeight + 'px';
        rs.zIndex = el.style.zIndex - i;
        rs.backgroundColor = color;
        var opacity = 1 - i / (i + 1);
        rs.filter = 'alpha(opacity=' + (100 * opacity) + ')';
        el.insertAdjacentElement('afterEnd', rect);
        _inputDate_shadowObjs[ _inputDate_shadowObjs.length ] = rect;
    }
}

function _inputDate_getXBrowserRef(eltname)
{
     return _inputDate_getDisplayDiv( eltname ).style;
}

function _inputDate_hideElement(eltname)
{
    _inputDate_getXBrowserRef(eltname).visibility = 'hidden';
}

var _inputDate_elementParaX;
var _inputDate_elementParaY;
var _inputDate_intersectObjs = new Array();
var _inputDate_intersectObjsOldStatus = new Array();
var _inputDate_shadowObjs = new Array();

function _inputDate_getElementXY ( elt )
{
    // Find the element's offsetTop and offsetLeft relative to the BODY tag.
    var objLeft   = elt.offsetLeft;
    var objTop    = elt.offsetTop;

    objParent = elt;

    while (objParent.tagName.toUpperCase() != "BODY")
    {
        objParent = objParent.offsetParent;
        objLeft  += objParent.offsetLeft;
        objTop   += objParent.offsetTop;
    }

    _inputDate_elementParaX = objLeft;
    _inputDate_elementParaY = objTop;
}

var _inputDate_nowEltName="";

var _inputDate_popFlag = false;

function _inputDate_getDisplayObjs( obj, nodeName )
{
var objs = new Array();

    for( var i=0, j=0; i < obj.childNodes.length; i++ ) {
        if ( obj.childNodes(i).nodeType != 1 ) continue;

        if ( obj.childNodes(i).style.display == "none" )
            continue;

        if ( obj.childNodes(i).nodeName == nodeName ) {
            objs[j++] = obj.childNodes(i);
        }
        else {
            var objs1 = _inputDate_getDisplayObjs( obj.childNodes(i), nodeName );

            for ( var k=0; k < objs1.length; k++ ) {
                objs[j++] = objs1[k];
            }
        }
    }

    return objs;
}

function _inputDate_isIntersect( sX1, eX1, sX2, eX2 )
{
    if ( sX1 > eX2 || eX1 < sX2 ) return false;

    return true;
}

function _inputDate_scanPage( elt )
{
var obj;
var objArray = new Array();
var sX, sY, eX, eY;

    _inputDate_getElementXY( elt );

    sX = _inputDate_elementParaX;
    sY = _inputDate_elementParaY;
    eX = sX + elt.offsetWidth;
    eY = sY + elt.offsetHeight;

    var selectObjs = _inputDate_getDisplayObjs( document, "SELECT" );

    for ( var i=0, j=0; i < selectObjs.length; i++ ) {
        obj = selectObjs[i];

        _inputDate_getElementXY( obj );
        var oSX = _inputDate_elementParaX;
        var oSY = _inputDate_elementParaY;
        var oEX = oSX + obj.offsetWidth;
        var oEY = oSY + obj.offsetHeight;

        if ( _inputDate_isIntersect( sX, eX, oSX, oEX ) && _inputDate_isIntersect( sY, eY, oSY, oEY ) )
            objArray[j++] = obj;
    }

    return objArray;
}

function _inputDate_onMouseUp()
{
    if ( _inputDate_popFlag == true )
    {
        _inputDate_popFlag = false;
        return ;
    }

    var divObj = _inputDate_getDisplayDiv( _inputDate_nowEltName+"Div" );

    var eventX = event.clientX;
    var eventY = event.clientY;

    var divX = divObj.offsetLeft - document.body.scrollLeft;
    var divY = divObj.offsetTop - document.body.scrollTop;

    if ( eventX >= divX && eventX <= ( divX + divObj.offsetWidth ) )
        if ( eventY >= divY && eventY <= ( divY + divObj.offsetHeight ) )
        {
            return ;
        }

    _inputDate_toggleVisible(_inputDate_nowEltName);
}

function _inputDate_toggleVisible(eltname)
{
     elt = _inputDate_getXBrowserRef(eltname+"Div");
     if (elt.visibility == 'visible' || elt.visibility == 'show')
     {
           for ( var i=0; i < _inputDate_shadowObjs.length ; i++ )
           {
                _inputDate_shadowObjs[i].removeNode(true);
           }

           _inputDate_shadowObjs = new Array();

           elt.visibility = 'hidden';

           _inputDate_nowEltName = "";
           for ( var i=0; i < _inputDate_intersectObjs.length; i++ ) {
            _inputDate_intersectObjs[i].style.visibility = _inputDate_intersectObjsOldStatus[i];
           }

           document.body.detachEvent( 'onmouseup', _inputDate_onMouseUp );
     }
     else
     {
           var posObj = document.all[ eltname+"Pos" ];
           _inputDate_getElementXY( posObj );
           var buttonX = _inputDate_elementParaX;
           var buttonY = _inputDate_elementParaY;
           var divObj = document.all[ eltname + "Div" ];
           var divX;
           var divY;

           if ( (document.body.offsetWidth - buttonX - posObj.offsetWidth) > (divObj.offsetWidth+4) ) {
               divX = buttonX + posObj.offsetWidth;
           }
           else {
               divX = buttonX - divObj.offsetWidth;
           }

           if ( (document.body.offsetHeight - buttonY - posObj.offsetHeight) > (divObj.offsetHeight+4) ) {
               divY = buttonY + posObj.offsetHeight;
           }
           else {
               divY = buttonY - divObj.offsetHeight;
           }

           elt.left = divX;
           elt.top = divY;

           _inputDate_makeRectangularDropShadow( divObj, '#666666', 4 );

           elt.visibility = 'visible';
           _inputDate_nowEltName = eltname;
           _inputDate_popFlag = true;
           _inputDate_intersectObjs = _inputDate_scanPage( _inputDate_getDisplayDiv(eltname+"Div") );

           for ( var i=0; i < _inputDate_intersectObjs.length; i++ ) {
            _inputDate_intersectObjsOldStatus[i] = _inputDate_intersectObjs[i].style.visibility;
            _inputDate_intersectObjs[i].style.visibility = "hidden";
           }
           document.body.attachEvent( 'onmouseup', _inputDate_onMouseUp );

     }
}

// 初始月份及各月份天数数组
var _inputDate_months = new Array("一　月", "二　月", "三　月", "四　月", "五　月", "六　月", "七　月", "八　月", "九　月", "十　月", "十一月", "十二月");
var _inputDate_daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var displayMonth;
var displayYear;
var _inputDate_today;
var displayDivName;
var displayElement;

function _inputDate_getDays(month, year)
{
    //测试选择的年份是否是润年？
    if (1 == month) { return ((0 == year % 4) && (0 != (year % 100))) || (0 == year % 400) ? 29 : 28; }
    else { return _inputDate_daysInMonth[month]; }
}

function _inputDate_parseDate( dateStr )
{
    var nowDate = new Date;
    var dayStr, monthStr, yearStr;
    var sep = "-";

    var index = dateStr.indexOf( sep );

    if ( index == -1 ) {
        sep = "/";
        index = dateStr.indexOf( sep );

        if ( index == -1 ) {
            sep = ".";
        }
    }

    var index = dateStr.lastIndexOf( sep );

    if ( index == -1 ) {
        dayStr = dateStr;
    }
    else {
        dayStr = dateStr.substring( index+1 );
    }

    dateStr = dateStr.substring(0, index );
    index = dateStr.lastIndexOf( sep );

    if ( index == -1 ) {
        monthStr = dateStr;
    }
    else {
        monthStr = dateStr.substring( index+1 );
    }

    dateStr = dateStr.substring( 0, index );
    index = dateStr.lastIndexOf( sep );

    if ( index == -1 ) {
        yearStr = dateStr;
    }
    else {
        yearStr = dateStr.substring( index+1 );
    }

    this.year = parseInt( yearStr, 10 );
    if ( isNaN( this.year ) == true )
        this.year = nowDate.getYear();

    this.month = parseInt( monthStr, 10 )-1;
    if ( isNaN( this.month ) == true )
        this.month = nowDate.getMonth();

    this.day = parseInt( dayStr, 10 );
    if ( isNaN( this.day ) == true )
        this.day = nowDate.getDate();
}

function _inputDate_newCalendar( eltName, attachedElement )
{
    if ( attachedElement ) {
        if ( _inputDate_nowEltName != "" ) _inputDate_toggleVisible( _inputDate_nowEltName );
        displayElement = attachedElement;
    }

    var divObj = _inputDate_getDisplayDiv( eltName + "Div" );
    var posObj = document.all[ eltName + "Pos" ];

    var parseYear = displayYear;
    var newCal = new Date(parseYear,displayMonth,1);
    var startDayOfWeek = newCal.getDay();
    var day=_inputDate_today.day;
    var intDaysInMonth = _inputDate_getDays(newCal.getMonth(), newCal.getFullYear());
    if ( day > intDaysInMonth ) day=intDaysInMonth;

    var submitIcon = posObj.submitIcon;
    var cancelIcon = posObj.cancelIcon;
    var daysGrid = _inputDate_makeDaysGrid(startDayOfWeek,day,intDaysInMonth,newCal,eltName, submitIcon, cancelIcon );
    divObj.innerHTML = daysGrid;

}

function _inputDate_incMonth(delta,eltName)
{
    displayMonth += delta;

    if (displayMonth >= 12) {
        displayMonth = 0;
        _inputDate_incYear(1,eltName);
    }
    else if (displayMonth <= -1) {
        displayMonth = 11;
        _inputDate_incYear(-1,eltName);
    }
    else {
        _inputDate_newCalendar(eltName);
    }
}

function _inputDate_incYear(delta,eltName)
{
    displayYear = parseInt(displayYear + '') + delta;
    _inputDate_newCalendar(eltName);
}

function _inputDate_makeDaysGrid(startDay,day,intDaysInMonth,newCal,eltName, submitIcon, cancelIcon)
{
        var daysGrid;
        var month = newCal.getMonth();
        var year = newCal.getFullYear();
        var isThisYear = (year == _inputDate_today.year);
        var isThisMonth = (month == _inputDate_today.month);

        daysGrid = '<table width=100 cellspacing=0 cellpadding=2 class=\'datedialog\' >';
        daysGrid += '<tr>';
        daysGrid += '<td nowrap>&nbsp;<a title="关闭" href="javascript:_inputDate_toggleVisible(\'' + eltName + '\')">x</a>';
        daysGrid += '&nbsp;&nbsp;';
        daysGrid += '<a title="上一月" href="javascript:_inputDate_incMonth(-1,\'' + eltName + '\')">&laquo; </a>';

        if (isThisMonth) { daysGrid += '<label style=\'color:red\'>' + _inputDate_months[month] + '</label>'; }
        else { daysGrid += _inputDate_months[month]; }

        daysGrid += '<a title="下一月" href="javascript:_inputDate_incMonth(1,\'' + eltName + '\')"> &raquo;</a>';
        daysGrid += '&nbsp;&nbsp;';
        daysGrid += '<a title="上一年" href="javascript:_inputDate_incYear(-1,\'' + eltName + '\')">&laquo; </a>';

        if (isThisYear) { daysGrid += '<label style=\'color:red\'>' + year + '</label>'; }
        else { daysGrid += ''+year; }

        daysGrid += '<a title="下一年" href="javascript:_inputDate_incYear(1,\'' + eltName + '\')"> &raquo;</a>&nbsp;</td></tr>';
        daysGrid += '<tr ><td><table width="100%" cellspacing=0 cellpadding=0 style=\'border:none\' class=\'datedialog\' ><tr><td>日</td><td>一</td><td>二</td><td>三</td><td>四</td><td>五</td><td>六</td></tr>';
        var dayOfMonthOfFirstSunday = (7 - startDay + 1);

        for (var intWeek = 0; intWeek < 6; intWeek++)
        {
           daysGrid += "<tr>";
           var dayOfMonth;
           for (var intDay = 0; intDay < 7; intDay++)
           {
                 dayOfMonth = (intWeek * 7) + intDay + dayOfMonthOfFirstSunday - 7;

                if (dayOfMonth > 0 && dayOfMonth <= intDaysInMonth)
                 {
                     daysGrid += "<td>";
                       var color = "";
                       if (day > 0 && day == dayOfMonth) color="red";
                       daysGrid += "<a href=\"javascript:_inputDate_setDay(";
                       daysGrid += dayOfMonth;
                       daysGrid += ",\'" + eltName + "\')\"";
                       if ( color != "" ) daysGrid += " style=color:" + color;
                       daysGrid += " >";
                       var dayString = dayOfMonth + "</a> ";
                       if (dayString.length == 6) dayString = "&nbsp;"+dayString;
                       daysGrid += dayString;
                       daysGrid += "</td>"
                 }
                 else
                     daysGrid += "<td>&nbsp;&nbsp;</td>";
           }
           daysGrid +="</tr>";
        }

        daysGrid +="</table></td></tr>";
//        daysGrid +="<tr style='text-align: right' ><td style='text-align: right'><a href=\"javascript:_inputDate_setDay("+ day + ",\'"+ eltName +"\')\"";
//        daysGrid +="><img alt='确认' border='0' src='" + submitIcon + "'></a>&nbsp;";
//        daysGrid +="<a href=\"javascript:_inputDate_toggleVisible(\'"+ eltName +"\')\"";
//        daysGrid +="><img alt='取消' border='0' src='" + cancelIcon + "'></a></td></tr></table>";

        return daysGrid;
}

function _inputDate_setDay(day,eltName)
{
    var strMonth, strDay;

    if ((displayMonth+1) < 10) strMonth = "0" + (displayMonth + 1); else strMonth = (displayMonth +1) + "";
    if ( day < 10) strDay = "0" + day; else strDay = day + "";
    displayElement.value = displayYear + "-" + strMonth + "-" + strDay;

    _inputDate_toggleVisible(eltName);
}

function _inputDate_getInputDateObject( inputDateObjectId )
{
    return eval( "document.all." + inputDateObjectId );
}

function _inputDate_toggleDatePicker( eltName )
{
    var inputDateObject = _inputDate_getInputDateObject( eltName );

    _inputDate_today = new _inputDate_parseDate( inputDateObject.value );
    displayYear = _inputDate_today.year;
    displayMonth = _inputDate_today.month;

    _inputDate_newCalendar( eltName, inputDateObject );
    _inputDate_toggleVisible(eltName);
}
