var g_strNoForm = "The specified form was not found. Please check the component's parameters.";
var g_strNoField = "The specified field was not found. Please check the component's parameters.";

function submitDate(event)
    {
    if(!document.forms["navbar"].elements)
        {    
        alert('wsCalendar was unable to resolve this form element.')
        return;
        }
    var cdate = (Number(document.forms["navbar"].elements["selMonth"].selectedIndex) + 1);
    var objYear = document.forms["navbar"].elements["selYear"];
    cdate += "/" + g_selDay + "/" + objYear.options[objYear.selectedIndex].value;

    var strHref = parseInParameter(window.location.href,'cdate',cdate);
    var strHref = parseInParameter(strHref,'cmode',g_cmode);
    window.location.href = strHref;
    return;
    }

function submitFilter(event)
    {
    if(!document.forms["navbar"].elements)
        {    
        alert('wsCalendar was unable to resolve this form element.')
        return;
        }
    var objValue = document.forms["navbar"].elements["selFilter"];
    var strValue = objValue.options[objValue.selectedIndex].value;
    if (strValue != '')
        window.location.href = parseInParameter(window.location.href,'cfilter','[' + g_strFilterField + ']=' + objValue.options[objValue.selectedIndex].value);
    else
        window.location.href = parseInParameter(window.location.href,'cfilter');
    return;
    }

function parseInParameter(strURL, strParam, strValue)
    {
    var strExp;

    if (strValue && strValue != '')
        strExp = [strParam, '=', strValue].join('');
    var arrP = strURL.split('&');
    if (strURL.indexOf('?') == -1 || arrP[0].indexOf(strParam + '=') != -1)
        arrP[0] = arrP[0].split('?')[0] + (strExp ? '?' + strExp : '');        
    else
        {
        var arrNew = new Array();

        arrNew[0] = arrP[0];
        for (var i=1;i<arrP.length;i++)
	    {
            if (arrP[i].indexOf(strParam) == -1)
              arrNew[arrNew.length] = arrP[i];
            }
        if (strExp)
            arrNew[arrNew.length] = strExp;

        arrP = arrNew;
        }

    return arrP.join('&');
    }

function closeCalendar()
    {
    var obj = parent.document.getElementById("wsDatePicker");
    if (obj)
        obj.style.visibility="hidden";
    }

function setField(idA, fNewMonth, fPrevNext) 
    {
    var objSrc = document.getElementById(idA);
    if ((!objSrc) || (objSrc.tagName!="A"))
        return false;
    var fld=idA;
    // find number of forms on page
    var nForms = parent.document.forms.length;
    var objForm;
    if (nForms == 1)
        objForm = parent.document.forms[0];
    else if (g_strRegion)
        objForm = parent.document.forms[g_strRegion];
    
    if (!objForm)
        {
        alert(g_strNoForm);
        return false; 
        }
    
    var objField = objForm.elements[g_strField];
    if (!objField)
        {
        alert(g_strNoField);
        return false; 
        }
     
    var sd= objSrc.href.substring(objSrc.href.indexOf("cdate=")+6);
    // set the form field to the selected date
    if (!fPrevNext)
        {
        objField.value=sd;
        closeCalendar();
        }
    //set the current selection to the newly selected cell
    var pd;
    sIdCurrent = fld;
    var objPrev = document.getElementById(g_sIdCurrent);
    if ((objPrev) && (objPrev.tagName=='A'))
        {
        // turn off highlighting of previous selection
        objPrev.parentNode.style.backgroundColor="";
        if ((g_sIdCurrent == 0) 
                || (g_sIdCurrent == 6))
            objPrev.parentNode.style.backgroundColor=g_sWeekendDayBackground;

        // get the value of the previous date
        pd = objPrev.href.substring(objPrev.href.indexOf("cdate=")+6);
        }
    
    // if the selected date is a different month, redraw the calendar
    if ((!fNewMonth) && (pd.substring(0,2) != sd.substring(0,2)))
        drawMonth(idA);
    else
        {
         // same month, highlight the current selection
        if (!fPrevNext)
            {
             objSrc.parentNode.style.backgroundColor=g_sSelectedDayBackground;
            }
        // save the selected day
        g_sIdCurrent = idA;
        } 
    return false;    
    }

function drawMonth(idPN) 
    {
    var iDayMSecs=24*60*60*1000;
    var stDayOtherMonth= '#999999';
    var objSrc;
    var sd;
    objSrc = document.getElementById(idPN);
    if (objSrc.tagName!="A")
        return false;        
    var href = objSrc.href;
    sd = href.substring(href.indexOf("cdate=")+6);

    var d= new Date(Date.UTC(Number(sd.substring(6,10)),
                    Number(sd.substring(0,2)) -1,
                    Number(sd.substring(3,5)),0,0,0));

    if (d.toString()=="NaN")
        return false;
    var year = d.getUTCFullYear();
    var month = d.getUTCMonth();                
    var dCalStart = initCalStart(year, month);

    var iWeeksInMonth = weeksInMonth(year, month);
    var fld=idPN.substring(2);

    var idA;
    var dThisDay;
    var sdThisDay;
    var objA;
    var strCount = '';
    for (var i=0;i<6;i++)
        {
        for(var j = 0; j < 7; j++) 
            {
            idA = i.toString().substring(0,1) 
                + j.toString().substring(0,1) 
                + fld;
            dThisDay = new Date(dCalStart.valueOf() 
                        + (i * 7 * iDayMSecs) + (j * iDayMSecs));
            objA = document.getElementById(idA);
            if (i<iWeeksInMonth)
                {
                sdThisDay=getShortDate(dThisDay);
                objA.innerHTML =  dThisDay.getUTCDate();
                objA.href = window.location.pathname
                       + "?cdate=" + sdThisDay;
                
                objA.onclick = function() { return setField(this.id); };

                // if we're on the selected day, highlight and save the id
                if (sd == sdThisDay)
                    {
                    if ((idPN.substring(0,2)=='pm')
                        || (idPN.substring(0,2)=='nm'))           
                            setField(idA, true, true);
                    else
                            setField(idA, true, false);

                    }

                if (dThisDay.getUTCMonth() != d.getUTCMonth())
                    objA.style.color = g_sDayOtherMonthColor;
                else
                   objA.style.color = "";
                }
            else
                {
                objA.innerHTML = "";
                objA.href = "";
                objA.style.color = "";
                }
            }
        }

//    alert(parent.frames["wsDatePicker"].document.body.innerHTML);
    idA = "ti" + fld;
    document.getElementById(idA).innerHTML = formatTitle(d);
    idA = "pm" + fld;
    document.getElementById(idA).href =window.location.pathname + "?cdate=" + getShortDate(getPrevMonth(d));
    idA = "nm" + fld;
    document.getElementById(idA).href=window.location.pathname + "?cdate=" + getShortDate(getNextMonth(d));
    
    var objSize = parent.getSize(window);
    var objDP = parent.document.getElementById("wsDatePicker");
    if (objDP)
        {
        objDP.style.height = objSize.height;
        objDP.style.width = objSize.width;
        }
    return false ;      
    }

function weeksInMonth(year, month)
    {
    var iDaysInMonth;
    var iFirstSaturday;
    var iDaysInLastWeek;
    var dFirst;
    var iWeeksInMonth;

    dFirst = new Date(Date.UTC(year, month, 1, 0, 0, 0));
    iFirstSaturday = 7 - dFirst.getUTCDay();
    iDaysInMonth = daysInMonth(year, month);
    iDaysInLastWeek = (iDaysInMonth - iFirstSaturday) % 7;
    iWeeksInMonth = 1  + ((iDaysInLastWeek == 0) ? 0 : 1) + 
                    + (iDaysInMonth - iDaysInLastWeek - iFirstSaturday)/7;
    return(iWeeksInMonth);
    }    

function initCalStart(year, month)
    {
    var iDayMSecs=24*60*60*1000;
    var dFirst = new Date(Date.UTC(year, month, 1, 0,0,0));
    var iFirstSaturday = 7 - dFirst.getUTCDay();
    var dFirstSaturday = new Date(Date.UTC(year, month, iFirstSaturday, 0, 0, 0));

    var dCalStart  = new Date(dFirstSaturday.valueOf() - (6 * iDayMSecs));
    return(dCalStart);

    }

function formatTitle(dCurrent)
	{
	var str = String();
        str += monthString(dCurrent.getUTCMonth());
        str += " " + dCurrent.getUTCFullYear();
	return str;
	}

function monthString(iMonth) 
	{
        var str  = String();
	switch(Number(iMonth).valueOf())
		{
		case 0: str = "January"; break;
		case 1: str = "February"; break;
		case 2: str = "March"; break;
		case 3: str = "April"; break;
		case 4: str = "May"; break;
		case 5: str = "June"; break;
		case 6: str = "July"; break;
		case 7: str = "August"; break;
		case 8: str = "September"; break;
		case 9: str = "October"; break;
		case 10: str = "November"; break;
		case 11: str = "December"; break;
		default: str = "Error";
		}
        return str;
	}

function daysInMonth(iYear, iMonth)
	{
	if(iMonth == 11)
		{
		iMonth = 0;
		iYear++;
		}
	else
		iMonth++;
	var d = new Date(Date.UTC(iYear, iMonth, 1, 0, 0, 0));
	var dl = new Date(d.valueOf() - 24*60*60*1000);
	return dl.getUTCDate();
	}


function getPrevMonth(dCurrent) 
    {
    var year = dCurrent.getUTCFullYear();
    var month = dCurrent.getUTCMonth();
    var day = dCurrent.getUTCDate(); 
    var dPrevMonth;
    if (month < 1) 
        dPrevMonth = new Date(Date.UTC(year - 1, 11, 1, 0, 0, 0));
    else 
        dPrevMonth = new Date(Date.UTC(year, month-1, 1, 0, 0, 0));
    
    return dPrevMonth;
    }

function getNextMonth(dCurrent)
    {
    var year = dCurrent.getUTCFullYear();
    var month = dCurrent.getUTCMonth();
    var day = dCurrent.getUTCDate(); 
    var dNextMonth; 

    if (month > 10) 
        dNextMonth = new Date(Date.UTC(year + 1, 0, 1, 0, 0, 0));
    else 
        dNextMonth = new Date(Date.UTC(year, month+1, 1, 0, 0, 0));

    return dNextMonth;
    }


function getShortDate (d) {
    var month = d.getUTCMonth();
    var day = d.getUTCDate();
    var year = d.getUTCFullYear();
    var sm = String(month + 1);
    var sd = String(day);
    var shortDate = String(((sm.length==1) ? "0" : "") + sm + "/" 
            + ((sd.length==1) ? "0" : "") + sd + "/" 
            + year.toString());
    return (shortDate);
}
