var cellWidth=20;
var cellHeight=18;

var mouseOverCal = false;

// Restore the colours to restore
var preOverBackground = "" ;
var preOverColor = "" ;

// Restore the colours 
function out(el)
    {
    el.style.backgroundColor = preOverBackground ;
    el.style.color = preOverColor ;
    }
    
//TODO: Pick up the colours of the style sooner than B/W
function over(el)
{
    //TODO: var elRows = el.parentElement.parentElement.rows;
    //TODO: var elCols = elRows[1].childNodes ;
    //TODO: window.status = "cal:" + elCols[0].innerHTML + "," + elCols[0].style.backgroundColor ;
    
    preOverBackground = el.style.backgroundColor ;
    preOverColor = el.style.color ;

    //TODO: el.style.backgroundColor = elCols[0].style.backgroundColor ;
    
    el.style.background='black';
    el.style.color='white';
}

var currentlyDisplayingCalendar="";
function showCalendar(baseName,slaveId,masterId,shadowLayerName,dateMillis,maxDateMillis)
{   
    iframeSetVisible(true, shadowLayerName);    
    //alert("show!");
    var selD=document.getElementById(baseName+"CalD");
    var selMY=document.getElementById(baseName+"CalMY");
    
    var d8=getNewDateObj(selD.value,selMY.value);
    //var maxd8=getNewDateObj(selD.value,selMY.value);    

    var layerName=baseName+"CalendarId";
    var str=baseName+" = new mcomCalendar('" + baseName + "',slaveId,masterId,d8,shadowLayerName);";
    //alert("evaling:"+str);
    eval(str);
    str="document.getElementById(layerName).innerHTML="+baseName+".write();";
    
    eval(str);
    //showImage(baseName);
    //document.getElementById(layerName).innerHTML=baseName.write();
    if (document.getElementById) // Netscape 6 and IE 5+
    {
        var targetElement = document.getElementById(layerName);
        var shadowElement = document.getElementById(shadowLayerName);       
        var h = targetElement.innerHTML;
        shadowElement.innerHTML = h;  
        targetElement.innerHTML="";
        shadowElement.style.visibility = "visible";
        shadowElement.style.display = "block";
        shadowElement.style.top=selD.style.top;
    }
    selectIndexes(eval(baseName));
    currentlyDisplayingCalendar=baseName;    
    
}

function showCalendarWithUpdate(baseName,slaveId,masterId,shadowLayerName,dateMillis,maxDateMillis)
{   
    iframeSetVisible(true, shadowLayerName);    
    //alert("show!");
    var selD=document.getElementById(baseName+"CalD");
    var selMY=document.getElementById(baseName+"CalMY");
    
    var d8=getNewDateObj(selD.value,selMY.value);
    //var maxd8=getNewDateObj(selD.value,selMY.value);    

    var layerName=baseName+"CalendarId";
    var str=baseName+" = new mcomCalendarWithUpdate('" + baseName + "',slaveId,masterId,d8,shadowLayerName);";
    //alert("evaling:"+str);
    eval(str);
    str="document.getElementById(layerName).innerHTML="+baseName+".write();";
    
    eval(str);
    //showImage(baseName);
    //document.getElementById(layerName).innerHTML=baseName.write();
    if (document.getElementById) // Netscape 6 and IE 5+
    {
        var targetElement = document.getElementById(layerName);
        var shadowElement = document.getElementById(shadowLayerName);       
        var h = targetElement.innerHTML;
        shadowElement.innerHTML = h;  
        targetElement.innerHTML="";
        shadowElement.style.visibility = "visible";
        shadowElement.style.display = "block";
        shadowElement.style.top=selD.style.top;
    }
    selectIndexes(eval(baseName));
    currentlyDisplayingCalendar=baseName;    
    
}

function iframeSetVisible(state, shadowLayerName)
{
   var IfrRef = document.getElementById(shadowLayerName+'IEFix');
   if(IfrRef)
   {
        var DivRef = document.getElementById(shadowLayerName);  
        if(state)
        {     
            IfrRef.style.display = "block";    
            IfrRef.style.top = DivRef.style.top;
            IfrRef.style.left = DivRef.style.left;          
            
            IfrRef.style.height = 167;
            IfrRef.style.width = 150;  
            IfrRef.style.zIndex = 10;  
        }       
        else
        {         
            IfrRef.style.display = "none";
        }
   }
}

function getNewDateObj(D,MY){
    //var newD8 = new Date();
    var fy=MY.substring(MY.indexOf("-")+1);
    //newD8.setFullYear(fy);
    var mSelect=0;
    var monthName=MY.substring(0,MY.indexOf("-"));
    for(var i=0;i<months.length;i++){
        var srch=months[i].substring(0,3);
        if(srch.toLowerCase()==monthName.toLowerCase()){
        mSelect=i;
        break;
        }
    }
    
    var origD=D;
    var test=getLengthFromMonth(mSelect,fy);
    if(D>test){
        //alert(D+" is larger than "+test);
        D=test; 
    }
    
    if(D.length<2){D="0"+D};
    if(mSelect<10){mSelect="0"+mSelect;}
    //alert(fy);
    var mm = mSelect;
    var dd = D;
    var yy = fy; //.substring(2,4);
    //fy=fy.substring(2,4);

    var dateStr=yy+", "+mm+", "+dd;
    //alert(dateStr);
    var newD8 = new Date(yy,mm,dd);
    //alert(newD8.getTime());
    return newD8;
    
    //newD8.setMonth(mSelect);    
    //alert("get"+newD8.getMonth());

    //newD8.setDate(D);
    
    //return newD8;
}

function hideCalendar(baseName,shadowLayerName)
{   
    iframeSetVisible(false, shadowLayerName);
    var layerName=baseName+"CalendarId";
    if (document.getElementById) 
    {
        var shadowElement = document.getElementById(shadowLayerName);         
        shadowElement.innerHTML = "";
        shadowElement.style.visibility = 'hidden';
        shadowElement.style.display = "none";
    }
    currentlyDisplayingCalendar="";
}
function toggleCalendar(baseName,shadowLayerName,dateMillis,maxDateMillis)
{
    var layerName=baseName+"CalendarId";
    if (document.getElementById) 
    {
        var str="var test = document.getElementById(layerName).innerHTML";
        eval(str);
        var shadowElement = document.getElementById(shadowLayerName);
        if(currentlyDisplayingCalendar==baseName){
        //if(shadowElement.style.visibility == 'visible'){
          hideCalendar(baseName,shadowLayerName);
        }else{
          showCalendar(baseName,shadowLayerName,dateMillis,maxDateMillis);
    }
    }
}
function toggleCalendarWithUpdate(baseName,shadowLayerName,dateMillis,maxDateMillis)
{
    var layerName=baseName+"CalendarId";
    if (document.getElementById) 
    {
        var str="var test = document.getElementById(layerName).innerHTML";
        eval(str);
        var shadowElement = document.getElementById(shadowLayerName);
        if(currentlyDisplayingCalendar==baseName){
        //if(shadowElement.style.visibility == 'visible'){
          hideCalendar(baseName,shadowLayerName);
        }else{
          showCalendarWithUpdate(baseName,shadowLayerName,dateMillis,maxDateMillis);
    }
    }
}
function setMonthOldXXX(mo,cal){
    //more trickery!
    calId=cal;
    cal = eval(cal);
    //The Date object is smart enough to know that it should roll over in December
    //when going forward and in January when going back
    cal.dateObject.setMonth(mo);
    cal = new mcomCalendar(calId,cal.slaveId,cal.masterId,cal.dateObject,cal.shadowLayerName);
    cal.formattedDate = cal.getFormattedDate();
    //alert("shadowLayerName="+cal.shadowLayerName);
        
        var layerName=cal.bn+"CalendarId";
    
    //document.getElementById(cal.bn+"DaysRow").innerHTML = cal.writeDays();
    document.getElementById(layerName).innerHTML=cal.write();
    //showImage(calId);
    //document.getElementById(cal.bn+"DaysRow").innerHTML = cal.writeDays();
    if (document.getElementById) // Netscape 6 and IE 5+
    {
        var targetElement = document.getElementById(layerName);
        var shadowElement = document.getElementById(cal.shadowLayerName);
    var h = targetElement.innerHTML;
    shadowElement.innerHTML = h;      
    targetElement.innerHTML="";  
        shadowElement.style.visibility = 'visible';
    }
    selectIndexes(cal);

}
function setYearOldXXX(mo,cal){
    //more trickery!
    calId=cal;  
    cal = eval(cal);
    //The Date object is smart enough to know that it should roll over in December
    //when going forward and in January when going back
    cal.dateObject.setFullYear(mo);
    cal = new mcomCalendar(cal.bn,cal.slaveId,cal.masterId,cal.dateObject,cal.shadowLayerName);
    cal.formattedDate = cal.getFormattedDate();
        var layerName=cal.bn+"CalendarId";
    
    //document.getElementById(cal.bn+"DaysRow").innerHTML = cal.writeDays();
    document.getElementById(layerName).innerHTML=cal.write();
    //showImage(calId);
    //document.getElementById(cal.bn+"DaysRow").innerHTML = cal.writeDays();
    if (document.getElementById) // Netscape 6 and IE 5+
    {
        var targetElement = document.getElementById(layerName);
        var shadowElement = document.getElementById(cal.shadowLayerName);
        var h = targetElement.innerHTML;
        shadowElement.innerHTML = h;    
        targetElement.innerHTML="";    
        shadowElement.style.visibility = 'visible';
    }
    selectIndexes(cal);

}

function selectIndexesOldXXX(cal){
    var sel=document.getElementById(cal.bn+"CalMonth");
    var newM=cal.dateObject.getMonth();
    //alert(newM);
    sel.selectedIndex=newM;    
    var sel=document.getElementById(cal.bn+"CalYear");
    var newY=cal.dateObject.getFullYear();    
    for(var i=0;i<sel.options.length;i++){
        if(sel.options[i].value==newY){         
            sel.selectedIndex=i;
        }
    }
}

// Calendar specific functions
var days = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
var months = new Array('January','February','March','April','May','June','July','August','September','October','November','December');


function getFormattedDate(){
    return days[this.day] + ', ' + months[this.month] + ' ' + this.date + ', ' + this.year;
    //return this.month + '/' + this.date + '/' + this.year;
}
function getFormattedDateFromDateObj(d){
    return d.getDate() + ' ' + months[d.getMonth()] + ' ' + d.getFullYear();
    //return this.month + '/' + this.date + '/' + this.year;
}
function getLength(){
    return getLengthFromMonth(this.month,this.dateObject.getFullYear());    
}
function getLengthFromDateObj(dateObj){
    return getLengthFromMonth(dateObj.getMonth(),dateObj.getFullYear());
}

function getLengthFromMonth(month,fullYear){
    switch(month){
        case 1:
            if((fullYear%4==0&&fullYear%100!=0)||fullYear%400==0)
                return 29; //leap year
            else
                return 28;
        case 3:
            return 30;
        case 5:
            return 30;
        case 8:
            return 30;
        case 10:
            return 30
        default:
            return 31;
    }   
}
function mcomCalendar(id,slaveId,masterId,d,shadowLayerName){

    this.bn = id;
    this.slaveId = slaveId;
    this.masterId = masterId;
    this.dateObject = d;
    //alert("cal1");   
    this.write = writeNewCal;
    this.writeDays = writeCalDays;
    //alert("cal2");    
    this.length = getLength;
    this.month = d.getMonth();
    this.date = d.getDate();
    this.day = d.getDay();
    this.year = d.getFullYear();
    this.getFormattedDate = getFormattedDate;
    this.shadowLayerName = shadowLayerName;
    //get the first day of the month's day
    d.setDate(1);
    this.firstDay = d.getDay();
    //then reset the date object to the correct date
    d.setDate(this.date);
}
function mcomCalendarWithUpdate(id,slaveId,masterId,d,shadowLayerName){

    this.bn = id;
    this.slaveId = slaveId;
    this.masterId = masterId;
    this.dateObject = d;
    //alert("cal1");   
    this.write = writeNewCal;
    this.writeDays = writeCalDaysWithUpdate;
    //alert("cal2");    
    this.length = getLength;
    this.month = d.getMonth();
    this.date = d.getDate();
    this.day = d.getDay();
    this.year = d.getFullYear();
    this.getFormattedDate = getFormattedDate;
    this.shadowLayerName = shadowLayerName;
    //get the first day of the month's day
    d.setDate(1);
    this.firstDay = d.getDay();
    //then reset the date object to the correct date
    d.setDate(this.date);
}

function writeCalDays(){
    var dayString = "";
    //baseName = this.baseName;
    //alert("calDays:"+bName);
    //var cal = eval(bName);
    //TEMPORARY!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
    //alert("writeCalDays");
    //create 6 rows so that the calendar doesn't resize
    var whStr=' width="'+cellWidth+'" height="'+cellHeight+'" ';
    for(j=0;j<42;j++){
        var displayNum = (j-this.firstDay+1);
        if(j<this.firstDay){
            //write the leading empty cells
            dayString += '<td class="t" '+whStr+'>&nbsp;</td>';
        }else if(displayNum==this.date){
            dayString += '<td id="' + this.bn +'selected" class="caltdtoday" onmouseout="javascript:out(this);" onmouseover="javascript:over(this);" onClick="javascript:changeDate(this,\'' + this.bn + '\')"'+whStr+'>' + displayNum + '</td>';
        }else if(displayNum > this.length()){
            //Empty cells at bottom of calendar
            dayString += '<td class="t"'+whStr+'></td>';
        }else{
            //the rest of the numbered cells
            dayString += '<td id="" class="caltd" onmouseout="javascript:out(this);" onmouseover="javascript:over(this);" onClick="javascript:changeDate(this,\'' + this.bn + '\');"'+whStr+'>' + displayNum + '</td>';
        }
        if(j%7==6){
            dayString += '</tr>';
        }
    }
    //alert("wholeCal:"+dayString); 
    return dayString;
}

function writeCalDaysWithUpdate(){
    var dayString = "";
    //baseName = this.baseName;
    //alert("calDays:"+bName);
    //var cal = eval(bName);
    //TEMPORARY!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
    //alert("writeCalDays");
    //create 6 rows so that the calendar doesn't resize
    var whStr=' width="'+cellWidth+'" height="'+cellHeight+'" ';
    for(j=0;j<42;j++){
        var displayNum = (j-this.firstDay+1);
        if(j<this.firstDay){
            //write the leading empty cells
            dayString += '<td class="t" '+whStr+'>&nbsp;</td>';
        }else if(displayNum==this.date){
            dayString += '<td id="' + this.bn +'selected" class="caltdtoday" onmouseout="javascript:out(this);" onmouseover="javascript:over(this);" onClick="javascript:changeDate(this,\'' + this.bn + '\')"'+whStr+'>' + displayNum + '</td>';
        }else if(displayNum > this.length()){
            //Empty cells at bottom of calendar
            dayString += '<td class="t"'+whStr+'></td>';
        }else{
            //the rest of the numbered cells
            dayString += '<td id="" class="caltd" onmouseout="javascript:out(this);" onmouseover="javascript:over(this);" onClick="javascript:changeDate(this,\'' + this.bn + '\'); updateDuration();"'+whStr+'>' + displayNum + '</td>';
        }
        if(j%7==6){
            dayString += '</tr>';
        }
    }
    //alert("wholeCal:"+dayString); 
    return dayString;
}

function writeNewCal(){
    
    var dMillis=this.dateObject.getTime();
    var calId=this.bn+"Id";
    var calString = '<table onMouseOver="mouseOverCal = true" onMouseOut="mouseOverCal = false" id="' + this.bn + 'CalTable" class="caltable" cellpadding="0" cellspacing="1">';
    calString += '<tr id="' + this.bn + 'DropDownRow">';
    //alert("drops");
    calString += writeCalDropdowns(this.bn);
    calString += '</tr>';
    calString += '<tr id="' + this.bn + 'DaysRow">';
    //alert("days");
    var dayStr=this.writeDays();
    //alert("dayStr:"+dayStr);
    calString += dayStr;
    //calString+='<tr><td colspan="7" onmouseout="javascript:out(this);" onmouseover="javascript:over(this);" class="closeButton" onclick="hideCalendar(\''+this.bn+'\',\''+this.shadowLayerName+'\')"><img alt="close" name="closeImage" src="javascript:closeImage" width="40" height="16"></td></tr>';
    calString+='<tr><td colspan="7" onmouseout="javascript:out(this);" onmouseover="javascript:over(this);" class="closeButton" onclick="hideCalendar(\''+this.bn+'\',\''+this.shadowLayerName+'\')">';
    calString+='close</td></tr>';
    calString += '</table>';
    //alert(calString);
    return calString;
}



function writeCalDropdownsOldXXX(bName){
    var calId=bName;

    var calString = '<td colspan="4">'; 
    calString += '<select class="calselect" name="' + calId + 'CalMonth" id="' + calId + 'CalMonth" onchange="setMonth(this.value,\'' + calId + '\');"><option value="0">January</option><option value="1">February</option><option value="2">March</option><option value="3">April</option><option value="4">May</option><option value="5">June</option><option value="6">July</option><option value="7">August</option><option value="8">September</option><option value="9">October</option><option value="10">November</option><option value="11">December</option></select>';
    calString += '</td><td colspan="3">';
    
    calString += '<select align="right" class="calselect" name="' + calId + 'CalYear" id="' + calId + 'CalYear" onchange="setYear(this.value,\'' + calId + '\');">';
    
    var startDate=new Date(eval(bName+"MinDateMillis"));
    var endDate=new Date(eval(bName+"MaxDateMillis"));
    
    var startVal=startDate.getFullYear();
    var stopVal=endDate.getFullYear();

    while(startVal<=stopVal){
        calString += '<option value="'+startVal+'">'+startVal+'</option>';
        startVal++;
    }
    
    calString += '</select></td>';  

//alert(calString);
    calString += '</tr><tr>';
    
    for(i=0;i<days.length;i++){
        calString += '<th class="days">' + days[i].substring(0,1) + '</th>';
    }

    return calString;
}



function changeDate(td,cal){
    
    //Some JavaScript trickery
    //Change the cal argument to the existing calendar object
    //This is why the first argument in the constructor must match the variable name
    //The cal reference also allows for multiple calendars on a page
    //alert("changeDate:"+td+":"+bName);
    //var eStr = "bName = " + bName + ";";
    //alert("cal:"+cal);
    cal = eval(cal);
    //alert("cal:"+cal);
    //document.getElementById(cal.id + "selected").className = "caltd";
    document.getElementById(cal.bn + "selected").bn = "";
    //td.className = "caltd";
    td.bn = cal.bn + "selected";
    //set the calendar object to the new date
    cal.dateObject.setDate(td.firstChild.nodeValue);
    cal = new mcomCalendar(cal.bn,cal.slaveId,cal.masterId,cal.dateObject,cal.shadowLayerName);
    
    var startDate=new Date(eval(cal.bn+"MinDateMillis"));
    var endDate=new Date(eval(cal.bn+"MaxDateMillis"));
    
    if(cal.dateObject.getTime() < startDate.getTime() -(1000*60*60*24) || cal.dateObject.getTime() > endDate.getTime()){
        var errString = "Please select a date within the range:\n";
        errString+=getFormattedDateFromDateObj(startDate)+" and \n";
        errString+=getFormattedDateFromDateObj(endDate);
        
        alert(errString);
        return;
    }
   
    
    updateFields(cal);
    hideCalendar(cal.bn,cal.shadowLayerName);   
}

function updateFields(cal) {
    var labelField = document.getElementById(cal.bn+"CalLabel");
    var dayField = document.getElementById(cal.bn+"CalD");
    var monthYearField = document.getElementById(cal.bn+"CalMY");
    var newD=cal.dateObject.getDate();
    if (newD < 10) {
        newD = "0" + newD;
    }
    dayField.value = newD;
    
    var newM = cal.dateObject.getMonth();
    var newY = cal.dateObject.getFullYear();
    var monthYear = months[newM].substring(0,3) + "-" + newY;
    monthYearField.value = monthYear;
    
    newM++;
    if (newM < 10) {
        newM = "0" + newM;
    }
    labelField.value = newD + "/" + newM + "/" + newY;
    
    if (cal.slaveId != null) {
        ensureLaterThan(cal.bn, cal.slaveId);
    }
}

function updateDayOfWeek(baseName){
    var selD=document.getElementById(baseName+"CalD");
    var selMY=document.getElementById(baseName+"CalMY");
    var d8=getNewDateObj(selD.value,selMY.value);
    var dayDiv=document.getElementById(baseName+"DayOfWeek");
    dayDiv.innerHTML = days[d8.getDay()].substr(0,3);
}

function ensureLaterThan(masterId,slaveId){
    if(masterId==null||masterId==""){
        alert("no slaved");
        return;
    }
    
    var masterD=document.getElementById(masterId+"CalD");
    var masterMY=document.getElementById(masterId+"CalMY");
        
    var slaveD=document.getElementById(slaveId+"CalD");
    var slaveMY=document.getElementById(slaveId+"CalMY"); 
    
    var masterD8=getNewDateObj(masterD.value,masterMY.value);
    var slaveD8=getNewDateObj(slaveD.value,slaveMY.value);
    
    var newMillis=masterD8.getTime()+(1000*60*60*24);//one day
    
    if(slaveD8.getTime()<newMillis){
        slaveD8.setTime(newMillis);
    }
        
    var newD=slaveD8.getDate();
    if(newD<10){
        newD="0"+newD;
    }    
    
    slaveD.value = newD;
    
    var newM=slaveD8.getMonth();
    var newY=slaveD8.getFullYear();
       
    var search = months[newM].substring(0,3)+"-"+newY;
    
    slaveMY.value = search;
    
    document.getElementById(slaveId+"CalLabel").value = '';
       
    var layerName=slaveId+"CalendarId";
    if(document.getElementById(layerName).innerHTML!=""){
        selectIndexes(eval(slaveId));   
    }
        if(currentlyDisplayingCalendar==slaveId){
            var c=eval(slaveId);
            showCalendar(slaveId,c.shadowLayerName,eval(slaveId+"MinDateMillis"),eval(slaveId+"MaxDateMillis"));
    }
}

function selectIndexes(cal){
    var sel=document.getElementById(cal.bn+"CalMonthYear");
   
    
    var newM=cal.dateObject.getMonth();
    var newY=cal.dateObject.getFullYear();
    
    var val=months[newM].substring(0,3)+"-"+newY;

    for(var i=0;i<sel.options.length;i++){
        if(sel.options[i].value==val){
            sel.selectedIndex=i;
        }
    }
}

function writeCalDropdowns(bName){
    
    var calId=bName;

    var calString = '<td colspan="7" align="center">'; 
    calString += '<select class="calselect" name="' + calId + 'CalMonthYear" id="' + calId + 'CalMonthYear" onchange="setMonthYear(this.value,\'' + calId + '\');">';
    //<option value="0">January</option><option value="1">February</option><option value="2">March</option><option value="3">April</option><option value="4">May</option><option value="5">June</option><option value="6">July</option><option value="7">August</option><option value="8">September</option><option value="9">October</option><option value="10">November</option><option value="11">December</option>
    var startDate=new Date(eval(bName+"MinDateMillis"));
    var endDate=new Date(eval(bName+"MaxDateMillis"));
    
    //Something goes wrong in the conversion of maxDateMillis to the endDate
    //The following line would otherwise be while(startDate.getYear() != endDate.getYear() || startDate.getMonth() != endDate.getMonth() + 1){
    //Dipu : Patrick please note : I  added startDate.getYear() <= endDate.getYear() condition as it 
    //was going on infinite loop on the eurostar search pages
    while(startDate.getYear() <= endDate.getYear() && (startDate.getYear() != endDate.getYear() || startDate.getMonth() <= endDate.getMonth())){
        var y=startDate.getFullYear();
        var m=startDate.getMonth();
        var val=months[m].substring(0,3)+"-"+y;
        calString += '<option value="'+val+'">'+val+'</option>';
        startDate.setMonth(m+1);
        //check we haven't skipped a month (30/01 + 1 month = 02/03...)
        var check = startDate.getMonth();
        if (check - m == 2) {
            startDate.setMonth(check-1);
        }
    }
    
    calString += '</select></td>';  

    calString += '</tr><tr>';
    
    for(i=0;i<days.length;i++){
        calString += '<th class="days">' + days[i].substring(0,1) + '</th>';
    }

    return calString;
}
function setMonthYear(moy,cal){
    
    var fy=moy.substring(moy.indexOf("-")+1);
    //newD8.setFullYear(fy);
    var mSelect=0;
    var monthName=moy.substring(0,moy.indexOf("-"));
    for(var i=0;i<months.length;i++){
        var srch=months[i].substring(0,3);
        if(srch.toLowerCase()==monthName.toLowerCase()){
        mSelect=i;
        break;
        }
    }
    
    
    //more trickery!
    calId=cal;
    cal = eval(cal);
    //The Date object is smart enough to know that it should roll over in December
    //when going forward and in January when going back
    cal.dateObject.setFullYear(fy);
    cal.dateObject.setMonth(mSelect);
    cal = new mcomCalendar(calId,cal.slaveId,cal.masterId,cal.dateObject,cal.shadowLayerName);
    cal.formattedDate = cal.getFormattedDate(); 
    
    var layerName=cal.bn+"CalendarId";
    
    //document.getElementById(cal.bn+"DaysRow").innerHTML = cal.writeDays();
    document.getElementById(layerName).innerHTML=cal.write();
    //showImage(calId);
    //document.getElementById(cal.bn+"DaysRow").innerHTML = cal.writeDays();
    if (document.getElementById) // Netscape 6 and IE 5+
    {
        var targetElement = document.getElementById(layerName);
        var shadowElement = document.getElementById(cal.shadowLayerName);
    var h = targetElement.innerHTML;
    shadowElement.innerHTML = h;      
    targetElement.innerHTML="";  
        shadowElement.style.visibility = 'visible';
    }
    selectIndexes(cal);

}

function setMonth(mo,cal){
    //more trickery!
    calId=cal;
    cal = eval(cal);
    //The Date object is smart enough to know that it should roll over in December
    //when going forward and in January when going back
    cal.dateObject.setMonth(mo);
    cal = new mcomCalendar(calId,cal.slaveId,cal.masterId,cal.dateObject,cal.shadowLayerName);
    cal.formattedDate = cal.getFormattedDate(); 
        
    var layerName=cal.bn+"CalendarId";
    
    //document.getElementById(cal.bn+"DaysRow").innerHTML = cal.writeDays();
    document.getElementById(layerName).innerHTML=cal.write();
    //showImage(calId);
    //document.getElementById(cal.bn+"DaysRow").innerHTML = cal.writeDays();
    if (document.getElementById) // Netscape 6 and IE 5+
    {
        var targetElement = document.getElementById(layerName);
        var shadowElement = document.getElementById(cal.shadowLayerName);
        var h = targetElement.innerHTML;
        shadowElement.innerHTML = h;      
        targetElement.innerHTML="";  
        shadowElement.style.visibility = 'visible';
    }
    selectIndexes(cal);
}
function setYear(mo,cal){
    //more trickery!
    calId=cal;  
    cal = eval(cal);
    //The Date object is smart enough to know that it should roll over in December
    //when going forward and in January when going back
    cal.dateObject.setFullYear(mo);
    cal = new mcomCalendar(cal.bn,cal.slaveId,cal.masterId,cal.dateObject,cal.shadowLayerName);
    cal.formattedDate = cal.getFormattedDate();
    var layerName=cal.bn+"CalendarId";
    
    //document.getElementById(cal.bn+"DaysRow").innerHTML = cal.writeDays();
    document.getElementById(layerName).innerHTML=cal.write();
    //showImage(calId);
    //document.getElementById(cal.bn+"DaysRow").innerHTML = cal.writeDays();
    if (document.getElementById) // Netscape 6 and IE 5+
    {
        var targetElement = document.getElementById(layerName);
        var shadowElement = document.getElementById(cal.shadowLayerName);
        var h = targetElement.innerHTML;
        shadowElement.innerHTML = h;    
        targetElement.innerHTML="";    
        shadowElement.style.visibility = 'visible';
    }
    selectIndexes(cal);
}

function closeCalendar(target)
{                   
    if(!mouseOverCal)
    {
         hideCalendar('start',target);      
    }          
}

function __mcomX(__mcomEl){var curleft=0;while(__mcomEl.offsetParent){curleft+=__mcomEl.offsetLeft;__mcomEl=__mcomEl.offsetParent;}return curleft;}
function __mcomY(__mcomEl){var curtop=0;while(__mcomEl.offsetParent){curtop+=__mcomEl.offsetTop;__mcomEl=__mcomEl.offsetParent;}return curtop;}
function __mcomW(__mcomEl){return __mcomEl.offsetWidth;}
function __mcomH(__mcomEl){return __mcomEl.offsetHeight;}
function __mcomGetElementInfo(__mcomEl){return __mcomX(__mcomEl)+'/'+__mcomY(__mcomEl)+'/'+__mcomW(__mcomEl)+'/'+__mcomH(__mcomEl);}
