   var allDays = 'yes';
   var todayDate=new Date();
   var today=new Date();
   var thisMonth=todayDate.getMonth()+1;    // get current month (1-12)
   var curMonth=todayDate.getMonth()+1;     // get current month (1-12)
   var thisYear=todayDate.getFullYear();       // get current year
   var currYear=todayDate.getFullYear() ;      // get current year
   var satO;
   var iNum;
   var leadTime;
   var cutOff;
   var moreBadDates;
   var iBD;
   var Cal_AnyDateIsOk = true;  // dh set true to allow selection of any date, false for future only
   var wkday = new Array();
   var calxdiv
   wkday[0] = 'Sunday';
   wkday[1] = 'Monday';
   wkday[2] = 'Tuesday';
   wkday[3] = 'Wednesday';
   wkday[4] = 'Thursday';
   wkday[5] = 'Friday';
   wkday[6] = 'Saturday';
   


function buildCal(m, y, cM, cH, cDW, cD, brdr, satOnly) {
//alert('today='+today);
//   var satO = checkSaturday();
   var satO = 2;
   iBD = 0;
   checkLeadTimes();
   var mn=['January','February','March','April','May','June','July','August','September','October','November','December'];
   var dim=[31,28,31,30,31,30,31,31,30,31,30,31];
   var oD = new Date(y, m-1, 1);
   oD.od=oD.getDay()+1;
   var todayDate=new Date()
   if (Cal_AnyDateIsOk) {
     var scanForToday = 0 }
   else {
     var scanForToday=(y==todayDate.getFullYear() && m==todayDate.getMonth()+1)? todayDate.getDate() : 0 }
   dim[1]=(((oD.getFullYear()%100!=0)&&(oD.getFullYear()%4==0))||(oD.getFullYear()%400==0))?29:28;
   var t='';
   t+='<table class="'+cM+'" style="height:15px;" cols="5" cellpadding="0" border="'+brdr+'" cellspacing="0">';
   t+='<tr align="center">';
   t+='<td align="left" class="'+cH+'"><a href="#" class="nextPrev" onclick="prevYear(1); return false;" alt="Previous year" title="Previous year">&lt;&lt;</a></td>';
   t+='<td align="left" class="'+cH+'"><a href="#" class="nextPrev" onclick="prevMonth(); return false;" alt="Previous month" title="Previous month">&lt;</a></td>';
   t+='<td colspan="1" width="99%" align="center" class="'+cH+'">'+mn[m-1]+' - '+y+'</td>';
   t+='<td align="right" class="'+cH+'"><a href="#" class="nextPrev" onclick="nextMonth(); return false;" alt="Next month" title="Next month">&gt;</a></td>';
   t+='<td align="right" class="'+cH+'"><a href="#" class="nextPrev" onclick="nextYear(); return false;" alt="Next year" title="Next year">&gt;&gt</a></td>';
   t+='</tr>';
   t +='</table>';
   t+='<table class="'+cM+'" cols="7" cellpadding="0" border="'+brdr+'" cellspacing="0">';
   t+='<tr align="center">';
   for(s=0;s<7;s++)t+='<td class="'+cDW+'">'+"SMTWTFS".substr(s,1)+'</td>';
   t+='</tr><tr align="center">';
   for(var i=1;i<=42;i++){
      var x=((i-oD.od>=0)&&(i-oD.od<dim[m-1]))? i-oD.od+1 : '&nbsp;';
      if (x==scanForToday) {
         x='<span id="today">'+x+'</span>'
      } else {
         if (((i==2|i==3|i==4|i==5|i==6|i==9|i==10|i==11|i==12|i==13|i==16|i==17|i==18|i==19|i==20|i==23|i==24|i==25|i==26|i==27|i==30|i==31|i==32|i==33|i==34|i==37|i==38|i==39|i==40&&x>=scanForToday+1&&x!='&nbsp;')&&satO==1)&&goodDay=='yes') x='<span class=dDays onclick="selectDate('+x+')">'+x+'</span>'
         if (((i==7|i==14|i==21|i==28|i==35&&x>scanForToday+1&&x!='&nbsp;')&&satO==0)&&goodDay=='yes') x='<span class=dDays onclick="selectDate('+x+')">'+x+'</span>'
         if (x>scanForToday&&allDays=='yes') x='<span class=dDays onclick="selectDate('+x+')">'+x+'</span>'
      }
      t+='<td class="'+cD+'">'+x+'</td>';
      if(((i)%7==0)&&(i<36))t+='</tr><tr align="center">';
   }
   t+='</tr>';
   t+='</tr>';
   t+='<tr align="center">';
   t+='<td align="center" colspan="3" class="'+cH+'"><span class="close" onclick="closeIt()">Cancel</span></td>';
   t+='<td align="center" class="'+cH+'"></td>';
   t+='<td align="center" colspan="3" class="'+cH+'"><span class="close" onclick="blankIt()">Blank</span></td>';
   t+='</tr>';
   t +='</table>';
   return t;
}

function updateCal(themonth,num) {
   today=new Date();
//alert('updateCal today='+today);
   iNum = num;

   if (themonth == '' && Cal_AnyDateIsOk) {
     el = document.getElementById("dDate"+iNum);
     if (el) {
       var val = el.value;
       if (val) {
         var vala = val.split('/');
         themonth = vala[1];
         curMonth = themonth;
         currYear = vala[2];
       }
       else {
         themonth = curMonth;
       }
     }
     else
     {
       alert('Field dDate'+num+' doesnt exist so the calendar will not work properly');
       return false;
     }
   }

   var calendarstr=buildCal(themonth, currYear, "main", "month", "daysofweek", "days", 0, satO);
   calxdiv = createDynamicPopup('calendarspace');

   var box = getBounds("dDate"+iNum);

   hideSelects();

   calxdiv.innerHTML=calendarstr;
   calxdiv.style.display='block';
   var w = calxdiv.offsetWidth;
   var h = calxdiv.offsetHeight;

   calxdiv.style.left = xOnPage(box.x,w) + 'px';
   calxdiv.style.top =  yOnPage(box.y+box.h,h) + 'px';
}

function Qupdate() {
   var calendarstr=buildCal(curMonth, currYear, "main", "month", "daysofweek", "days", 0, satO);
   calxdiv.innerHTML=calendarstr;
}

function prevMonth() {
//alert('prevMonth');
   if (curMonth>thisMonth|thisYear<currYear || Cal_AnyDateIsOk) {
      --curMonth;
      if (curMonth==0) {
         curMonth = 12;
         --currYear;
      }
      Qupdate();
//      updateCal(curMonth,iNum);
   }
}

function nextMonth() {
//alert('nextMonth');
   ++curMonth;
   if (curMonth==13) {
      curMonth = 1;
      ++currYear;
   }
      Qupdate();
//   updateCal(curMonth,iNum);
}

function prevYear(jump) {
  if (jump == undefined) { jump = 1; }
   if (curMonth>thisMonth|thisYear<currYear || Cal_AnyDateIsOk) {
     currYear = currYear - jump;
      Qupdate();
   }
//   updateCal(curMonth,iNum);
}

function nextYear(jump) {
  if (jump == undefined) { jump = 1; }
   currYear = currYear + jump;
      Qupdate();
//   updateCal(curMonth,iNum);
}

function thisMonth() {
//alert('thisMonth');
   updateCal(curMonth,iNum);
}

function checkSaturday() {
   var oRad = document.getElementById("carrierSel"+iNum);
   var val = oRad.value;
   var x = val.search(/Sat=YES/i);
   var res = 1;
   if (x>0) res = 0;
   x = val.search(/cut=/i);
   var y = val.search(/lead=/i);
   var s = val.substr(x+4,y-x-4);
   cutOff = parseFloat(s);
   x = val.search(/lead=/i);
   y = val.search(/val=/i);
   var s = val.substr(x+5,y-x-5);
   leadTime = parseFloat(s);
   return res;
}

function clearDate(dd,iNum) {
   var oRad = document.getElementById(dd);
   oRad.value = 'dd/mm/yyyy';
   doTotals(iNum);
}

function killDate(dd) {
   document.getElementById(dd).style.display='none';
}

function closeIt() {
   if (calxdiv) { calxdiv.innerHTML=''; calxdiv.style.display='none'; }

   showSelects();

   thisMonth=todayDate.getMonth()+1    // get current month (1-12)
   curMonth=todayDate.getMonth()+1     // get current month (1-12)
   thisYear=todayDate.getFullYear()       // get current year
   currYear=todayDate.getFullYear()       // get current year
}

function blankIt() {
   var oD = document.getElementById("dDate"+iNum);
   oD.value = '';
   closeIt();
}

function zerofill(num,len) {
  num = num + '';
  while (num.length < len) { num = '0' + num; }
  return num;
}
function selectDate(day) {
   var oD = document.getElementById("dDate"+iNum);
   oD.value = zerofill(day,2)+'/'+zerofill(curMonth,2)+'/'+currYear;

   closeIt();
}

function doTotals(iNum) {
   var oC = document.getElementById("js_carriage"+iNum);
   var oT = document.getElementById("js_total"+iNum);
   var oX = document.getElementById("total_split");
   var oXv = oX.value;
   var oN = "document.carrier.carrierSel"+iNum;
   var oM = eval(oN);
   var i = oM.selectedIndex;
   var v = oM.options[i].value;
   var l = v.length;
   var x = v.search(/val=/i);
   var s = v.substr(x+4,l-x-4);
   var fT = parseFloat(oT.value);
   var fS =parseFloat(s);
   var jV;
   fT = fT+fS;
   fT = doDecimals(fT,2);
   document.getElementById('carr'+iNum).innerHTML = doDecimals(fS,2);
   document.getElementById('tot'+iNum).innerHTML = fT;
   oC.value = doDecimals(oC.value,2);
   var oTT = document.getElementById('js_carriage'+iNum);
   oTT.value = fS;
   var gT = 0;
   for (var j=1; j<=oXv; j++) {
      jV = right3(j.toString());
      oTT = document.getElementById('js_true_total'+jV);
      gT = gT+parseFloat(oTT.value);
      oTT = document.getElementById('js_carriage'+jV);
      gT = gT+parseFloat(oTT.value);
   }
   document.getElementById('grandTotal').innerHTML = doDecimals(gT,2);
}

function checkForBadDay(d,m,y) {
   d = right2(d);
   m = right2(m);
   var dat = d+'/'+m+'/'+y
   var bd = badDate.join('|');
   var answer = 'no';
   bd = bd+'|'+moreBadDates.join('|');
   var mbd = moreBadDates.join('|');
   var j = bd.indexOf(dat);
   if (j<0) answer = 'yes';
   return answer;
}
   
function checkLeadTimes() {
   moreBadDates = new Array();
   if (parseFloat(today.getHours(today))>cutOff) {incDate();}
   if (today.getDay()==6) incDate();
   if (today.getDay()==0) incDate();
   if (leadTime>1) {
      for (var i=1; i<=leadTime; i++) {
         incDate();
      }
   }
}
   
function incDate() {
   var tdgY = parseInt(today.getYear());
   var dinms = today.getTime();
   dinms = dinms+( 60 * 60 * 1000 * 24);
   today.setTime(dinms);
   dinms = today.getTime();
   if (tdgY<1000) tdgY=tdgY+1900;
   bd = right2(today.getDate())+'/'+right2(parseInt(today.getMonth()+1,10))+'/'+tdgY;
   moreBadDates[iBD] = bd;
   iBD++;
}

function right2(x) {
   x = '00'+x;
   var xl = x.length;
   return x.substr(xl-2,2)
}

function right3(x) {
   x = '000'+x;
   var xl = x.length;
   return x.substr(xl-3,3)
}
