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 findFieldInForm(objForm, strField)
    {
    var objField;
    for (var i=0;i<objForm.elements.length;i++)
        {
        if (objForm.elements[i].name.toLowerCase() == strField.toLowerCase())
            {
            objField = objForm.elements[i];
            break;
            }
        }
    return objField; 
    }

function getField(doc, strField, strRegion)
    {
    var nForms = doc.forms.length;
    var objForm;
    var objField; 
    if (nForms == 1)
        {
        objForm = doc.forms[0];
        objField = findFieldInForm(objForm, strField);
        }
    else
        {
        var bSet = false;
        // check if set, and if set properly
        if (strRegion)
            {
            for (var i=0;i<nForms;i++)
                {
                if (doc.forms[i].name.toLowerCase() == strRegion.toLowerCase())
                    objForm = doc.forms[i];
                }
            }
        
        if (objForm)
            {     
            objField = findFieldInForm(objForm, strField);
            if (objField)
                bSet = true;
            }
        
        if (!bSet)
            {
            var nElements;
            // check everywhere for field name
            for (var i=0;i<nForms;i++)
                {
                nElements = doc.forms[i].elements.length;
                objField = findFieldInForm(doc.forms[i], strField);
                if (objField)
                    break;
                }
            }
        }
    return objField;    
    }

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 objField = getField(parent.document, g_strField, g_strRegion);
    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);
}

function getSize(w)
    {
    var obj;
    for (var i=0;i<w.document.body.childNodes.length;i++)
      {
      if (w.document.body.childNodes[i].nodeName.toLowerCase()=='table')
        {
        obj = w.document.body.childNodes[i];
        break;
        }
      }
    if (!obj)
      return;
    else
      {
      var size = new Object();
      size.height = obj.offsetHeight;
      size.width = obj.offsetWidth;
      return size;
      }
    }

function getPos(dn)
    {
    var top = dn.offsetHeight;
    var left = 0;
    var last = dn;
    while (dn != null)
      {
      top  += dn.offsetTop;
      if (dn.scrollTop)
        top += dn.scrollTop;
        
      left  += dn.offsetLeft;
      if (dn.scrollLeft)
        left += dn.scrollLeft;
      last = dn;
      dn = dn.offsetParent;
      }
    var pos = new Object;
    pos.top = top;
    if (last.scrollTop)
      pos.top -= last.scrollTop;
    pos.left = left;
    if (last.scrollLeft)
      pos.left -= last.scrollLeft;
    return pos;
    }

function getNextSibling(dn)
    {
    var dnParent = dn.parentNode;
    if (!dnParent)
      return null;
    var nChild = getChildIndex(dn);
    if (nChild==-1)
      return null;
    while(true)
      {
      nChild++;
      if (nChild == dnParent.childNodes.length)
        return null;
      if (dnParent.childNodes[nChild].tagName && dnParent.childNodes[nChild].tagName.toLowerCase() == 'iframe')
        return dnParent.childNodes[nChild];
      }
    }
  function getChildIndex(dn)
    {
    var dnParent = dn.parentNode;
    var i;
    for (i=0;i< dnParent.childNodes.length;i++)
      {
      if (dnParent.childNodes[i] == dn)
        return i;
      }
    return -1;
    }

 function getTable(dn)
    {
    while (dn.nodeName.toLowerCase() != 'table')
        {
        dn = dn.parentNode;
        }
    var o = getPos(dn);
    
    return o;
    }

function showDatePicker(dn,strRegion,strField)
    {
    var obj = document.getElementById("wsDatePicker");
    var objPos = getPos(dn);
    var objSize; 
    var w = window.frames["wsDatePicker"];
    if (!w)
        return;
    else
        {
        objSize = getSize(w);
        w.g_strField = strField;
        w.g_strRegion = strRegion;
        }
    if (obj)
      {
      if (objSize)
        {
        obj.style.height = objSize.height;
        obj.style.width = objSize.width;
        }
        
      obj.style.top = objPos.top + 10;
      obj.style.left = objPos.left;
      obj.style.visibility="visible";
      }
    }

