function madCalSelector(oName,formElmLoc, dateformat, w, elemId ) {
	this.oName=oName;
	this.elemId=elemId;
	this.dateFormat=dateformat;
	this.formElmLoc=formElmLoc;
	this.w=w;
	this.monthSelected;
	this.yearSelected;
	this.dateSelected;
	this.omonthSelected;
	this.oyearSelected;
	this.calShow=false;
	this.bPageLoaded=false	
	this._calsel_elm;
	this.formObj;
	this.calOn=false;
	this.Config=new CalConfig();
	this.calDate=new CalDate();
        this.IFRH='<!--[if lte IE 6.5]><iframe></iframe><![endif]-->';
	this.init();
	this.htmlORIG;
	this.htmlCAL;
	this.htmlCALwrap;
	this.htmlICON;
	
}
madCalSelector.prototype.set_original_HTML=function(){
   	var html=	document.getElementById(this.elemId).innerHTML;
   	this.htmlORIG=html;
}
madCalSelector.prototype.set_CALWrap=function(){
        this.htmlCALWrap=
	'<div id="calSelector" style="'+this.Config.calselectorstyle+';visibility:hidden;" onclick="'+this.oName+'.calShow=true;"></div>';
}

madCalSelector.prototype.addCaltoWrap=function(){
	document.getElementById('calSelector').innerHTML=this.htmlCAL+this.IFRH	;
}
madCalSelector.prototype.show_for_build=function(){
       var elem=document.getElementById(this.elemId);
        document.getElementById(this.elemId).innerHTML=this.htmlORIG+this.htmlCALWrap+this.htmlICON;
        this.addCaltoWrap();
	elem.display="block";
}

madCalSelector.prototype.set_show_today=function() {
	if (this.Config.showToday == 1) {
		document.getElementById('desc_today').innerHTML =
		  this.Config.strTodayis 
		  + ' <a class="" href="#" onclick="'+this.oName+'.monthSelected='+this.oName+'.calDate.monthNow; '+this.oName+'.yearSelected='+this.oName+'.calDate.yearNow; '+this.oName+'.buildCalSelector(); return false;" onmousemove="window.status=\'' 
		  + this.Config.strCurrentMonth + '\'" onmouseout="window.status=\'\'" title="' 
		  + this.Config.strCurrentMonth + '">'
		  + this.Config.dayNameArr[(this.calDate.today.getDay() - this.Config.weekStart == -1) ? 6 : (this.calDate.today.getDay() - this.Config.weekStart)] 
		  + ', ' + this.calDate.dateNow + ' ' + this.Config.monthNameArr[this.calDate.monthNow].substring(0, 3) + ' ' + this.calDate.yearNow + '</a>';
	}
}
	
madCalSelector.prototype.init=function() {
       this.set_original_HTML(); //sets the original HTML
       this.set_CALWrap();
       this.printCalendar();	//sets the htmlCAL;
       this.makeIcon(); //sets the HTMLIcon;
       document.getElementById(this.elemId).innerHTML=this.htmlORIG+this.htmlICON+this.htmlCALWrap;
       this._calsel_elm = document.getElementById('calSelector');
       this.addCaltoWrap();
       this.set_show_today();
       this.htmlCAL=this._calsel_elm.innerHTML;     
        this.bPageLoaded=true;
        document.getElementById(this.elemId).innerHTML=this.htmlORIG+this.htmlICON;
        var _calsel_allowMany = false;
}
madCalSelector.prototype.makeIcon=function(){
        var html=	document.getElementById(this.elemId).innerHTML;
	this.htmlICON='<a class="cal_ico" onclick="'+this.oName+'.showCalSelector(this);"><img src="' + this.Config.imgDir + this.Config.imgArr[0] + '" alt="'+this.Config.choosedate+'" border="0" /></a>';
}

madCalSelector.prototype.hideCalSelector=function() {
        this.isHidden='true';
	document.getElementById(this.elemId).innerHTML=this.htmlORIG+this.htmlICON;
        this._calsel_elm.style.visibility = 'hidden';
	//_calsel_elm.style.display = 'none';
}



madCalSelector.prototype.printCalendar=function(){
 var html=
 '<table id="desc_hd" cellpadding="0" cellspacing="0" border="0" style="width:100%;">'
	+'<tr><td id="desc_prev" style="width:15%;"><a onclick="'+this.oName+'.decMonth();">'
	+ '<img src="' + this.Config.imgDir + this.Config.imgArr[1] + '" alt="'+this.Config.previous+'" border="0" /></a></td>'
	+ '<td id="desc_next" style="width:15%;"><a onclick="'+this.oName+'.incMonth();">'
	+ '<img src="' + this.Config.imgDir + this.Config.imgArr[2] + '" alt="'+this.Config.next+'" border="0" /></a></td>'
	+ '<td id="desc_month" style="width:55%;"></td><td id="desc_close" style="width:15%;">'
        + '<a onclick="'+this.oName+'.hideCalSelector();">'
	+ '<img src="' + this.Config.imgDir + this.Config.imgArr[3] + '" alt="'+this.Config.close+'" border="0" /></a>'
	+ '</td></tr></table><div id="content"></div>';
	if (this.Config.showToday == 1) {
		html+='<div id="desc_today"></div>';
	}
	html+='';
	this.htmlCAL=html;
}
madCalSelector.prototype.buildCalSelector=function(){
	var CalData=new Object();
        CalData.NDM; 
	CalData.datePointer;
	CalData.arrND = Array(31,0,31,30,31,30,31,31,30,31,30,31);
	CalData.dateMessage;
	CalData.startDate = new Date(this.yearSelected, this.monthSelected, 1);
	CalData.endDate;
	if (this.monthSelected == 1) {
		CalData.endDate = new Date(this.yearSelected, this.monthSelected + 1, 1);
		CalData.endDate = new Date(CalData.endDate	- (24 * 60 * 60 * 1000));
		CalData.NDM = CalData.endDate.getDate();
	} else {
		CalData.NDM = CalData.arrND[this.monthSelected];
	}
	CalData.datePointer = 0;
	CalData.dayPointer = CalData.startDate.getDay() - this.Config.weekStart;
	if (CalData.dayPointer < 0) {
		CalData.dayPointer = 6;
	}
	CalData.WN=this.WeekNbr(CalData.startDate);
	this.show_for_build();
	
	var Printer=new madCalPrinter(this, CalData);
	document.getElementById('content').innerHTML = Printer.printedCal;
	document.getElementById('desc_month').innerHTML = ' ' + this.Config.monthNameArr[this.monthSelected] + ' ' + this.yearSelected + ' ';
	 document.getElementById('calSelector').style.visibility = 'visible';
  
	this.calOn=true;
	
}
madCalSelector.prototype.closeCalSelector=function() {
	var sTmp;
	this.hideCalSelector();
	this.formObj.value = this.constructDate(this.dateSelected, this.monthSelected, this.yearSelected);
	
}

madCalSelector.prototype.showCalSelector=function(tag) {
 this.formObj=eval(this.formElmLoc);
 var leftpos = 0;  var toppos = 0;
 var format,fChar,tch;
 if (this.bPageLoaded) {
   if (this._calsel_elm.style.visibility == 'hidden') {
     var A = this.getFormat();
     fChar=A[0]; format=A[1];
     tch = 0
      if (fChar != '') {
       var aData = this.formObj.value.split(fChar);
       for (var i = 0; i < 3; i++) {
         if ((format[i] == 'd') || (format[i] == 'dd')) {
        	this.dateSelected = parseInt(aData[i], 10);
        	tch++;
         } else if ((format[i] == 'm') || (format[i] == 'mm')) {
        	this.monthSelected = parseInt(aData[i], 10) - 1;
        	tch++;
         } else if (format[i] == 'yyyy') {
        	this.yearSelected = parseInt(aData[i], 10);
        	tch++;
         } else if (format[i] == 'mmm') {
        	for (var j = 0; j < 12; j++) {
        		if (aData[i] == this.monthNameArr[j]) {
        			this.monthSelected = j;
        			tch++;
        		}
        	}
         } else if (format[i] == 'mmmm') {
        	for (var j = 0; j < 12; j++) {
        		if (aData[i] == this.monthNameArr2[j]) {
        			this.monthSelected = j;
        			tch++;
        		}
        	}
        }
      }
    }
    if ((tch != 3) || isNaN(this.dateSelected) || isNaN(this.monthSelected) || isNaN(this.yearSelected)) {
      this.dateSelected = this.calDate.dateNow;
      this.monthSelected = this.calDate.monthNow;
      this.yearSelected = this.calDate.yearNow;
     }
 
   this.odateSelected = this.dateSelected;
   this.omonthSelected = this.monthSelected;
   this.oyearSelected = this.yearSelected;
   var _tag=tag;
    this.buildCalSelector();
    
  //  document.getElementById(this.elemId).innerHTML=this.htmlORIG+this.htmlICON;
      document.getElementById('calSelector').style.zIndex  = '1000';
      document.getElementById('calSelector').style.visibility = 'visible';
    
      document.getElementById('calSelector').style.zIndex  = '1000';
    this.calShow = true;
   } else {
 this.hideCalSelector();
 
// if (ctlNow != ctl) {
//  this.showCalSelector();
// }
}
//ctlNow = ctl;
}
}
madCalSelector.prototype.incMonth=function(){
	this.monthSelected++;
	if (this.monthSelected > 11) {
		this.monthSelected = 0;
		this.yearSelected++;
	}
	this.buildCalSelector();
}
madCalSelector.prototype.decMonth=function(){
	this.monthSelected--;
	if (this.monthSelected < 0) {
		this.monthSelected = 11;
		this.yearSelected--;
	}
	this.buildCalSelector();
}

madCalSelector.prototype.WeekNbr=function(n){
	var year = n.getFullYear();
	var month = n.getMonth() + 1;
        var day;
	if (this.Config.weekStart == 0) {
		day = n.getDate() + 1;
	}
	else {
		day = n.getDate();
	}
	var a = Math.floor((14 - month) / 12);
	var y = year + 4800 - a;
	var m = month + 12 * a - 3;
	var b = Math.floor(y / 4) - Math.floor(y / 100) + Math.floor(y / 400);
	var J = day + Math.floor((153 * m + 2) / 5) + 365 * y + b - 32045;
	var d4 = (((J + 31741 - (J % 7)) % 146097) % 36524) % 1461;
	var L = Math.floor(d4 / 1460);
	var d1 = ((d4 - L) % 365) + L;
	return Math.floor(d1 / 7) + 1;
}
madCalSelector.prototype.padZero=function(num) {
	return (num < 10) ? '0' + num : num;
}

madCalSelector.prototype.constructDate=function(d, m, y) {
  var sTmp = this.dateFormat;
	sTmp = sTmp.replace("dd", "<e>");
	sTmp = sTmp.replace("d", "<d>");
	sTmp = sTmp.replace("<e>", this.padZero(d));
	sTmp = sTmp.replace("<d>", d);
	sTmp = sTmp.replace("mmmm", "<p>");
	sTmp = sTmp.replace("mmm", "<o>");
	sTmp = sTmp.replace("mm", "<n>");
	sTmp = sTmp.replace("m", "<m>");
	sTmp = sTmp.replace("<m>", m + 1);
	sTmp = sTmp.replace("<n>", this.padZero(m+1));
	sTmp = sTmp.replace("<o>", this.Config.monthNameArr[m]);
	sTmp = sTmp.replace("<p>", this.Config.monthNameArr2[m]);
	sTmp = sTmp.replace("yyyy", y);
	return sTmp.replace("yy", this.padZero(y % 100));
}

madCalSelector.prototype.getFormat=function(){
  var fChar = ' ';
  var format = this.dateFormat.split(fChar)
   if (format.length < 3) {
    fChar = '/';
    format = this.dateFormat.split(fChar)
    if (format.length < 3) {
     fChar = '.';
     format = this.dateFormat.split(fChar)
     if (format.length < 3) {
    	fChar = '-';
    	format = this.dateFormat.split(fChar)
    	if (format.length < 3) {
    		fChar = '';
    	}
     }
    }
  }
  return [fChar,format];

}
function madCalPrinter(CObj, CalData){
 this.CObj=CObj;
 var Config=this.CObj.Config;
 this.CalData=CalData;
var html;
  for(i in CalData){
   html+=i+"\n";
  }
   this.printedCal='';
 var sHTML = '<table class="calendar" cellpadding="0" cellspacing="0" border="0"><tr>';
 if (CObj.Config.showWeekNumber == 1) {
  sHTML += '<td class="date_week_hd">' + CObj.Config.strWeek + '</td><td rowspan="7"><div class="divider"></div></td>';
 } 
 for (var i = 0; i < 7; i++)	{
  sHTML +='<td class="date_hd">' + CObj.Config.dayNameArr[i] + '</td>';	
 }
 sHTML += '</tr><tr>';
 if (CObj.Config.showWeekNumber == 1) {
  sHTML += '<td class="date_week">' + CalData.WN + '</td>';
 }
 for (var i = 1; i <= CalData.dayPointer; i++) {
 sHTML += '<td class="date_empty"></td>';
 }
 for (CalData.datePointer = 1; CalData.datePointer <= CalData.NDM; CalData.datePointer++) {

  CalData.dayPointer++;
  sHTML += '<td class="date_normal">';
  var dateMessage = ' onmousemove="window.status=\'' + CObj.Config.strselectDate.replace("[date]", CObj.constructDate(CalData.datePointer, CObj.monthSelected, CObj.yearSelected)) + '\'" onmouseout="window.status=\'\'" ';
  if ((CalData.datePointer == CObj.calDate.dateNow) && (CObj.monthSelected == CObj.calDate.monthNow) && (CObj.yearSelected == CObj.calDate.yearNow)) { 
   sHTML += '<a' + dateMessage + ' class="day_curr" href="#" onclick="'+CObj.oName+'.dateSelected=\'' + CalData.datePointer + '\'; '+CObj.oName+'.closeCalSelector();return false;">' + CalData.datePointer + '</a>';
  } else if (CalData.dayPointer % 7 == (Config.weekStart * -1) + 1) { 
   sHTML += '<a' + dateMessage + ' class="day" href="#" onclick="'+CObj.oName+'.dateSelected=\'' + CalData.datePointer + '\'; '+CObj.oName+'.closeCalSelector();return false;">' + CalData.datePointer + '</a>';
  } else { 
   sHTML += '<a' + dateMessage + ' class="day" href="#" onclick="'+CObj.oName+'.dateSelected=\'' + CalData.datePointer + '\'; '+CObj.oName+'.closeCalSelector(); return false;">' + CalData.datePointer + '</a>';
  }
  sHTML += '</td>';
  if ((CalData.dayPointer + CObj.Config.weekStart) % 7 == CObj.Config.weekStart) { 
   sHTML += '</tr><tr>' ;
   if ((CObj.Config.showWeekNumber == 1) && (CalData.datePointer < CalData.NDM)) {
    sHTML += '<td class="date_week">' + (CObj.WeekNbr(new Date(CObj.yearSelected, CObj.monthSelected, CalData.datePointer + 1))) + '</td>';
   }
  }
 }
 this.printedCal=sHTML;
}


function CalDate(){
 this.today=new Date();
 this.dateNow = this.today.getDate();
 this.monthNow = this.today.getMonth();
 var Agnt = navigator.userAgent.toLowerCase();
 this.yearNow = this.today.getYear();
 this.yearNow = (Agnt.indexOf('gecko') != -1 ) ? this.yearNow+1900 : this.yearNow;
 
}