if(typeof _clndr=="undefined")var _clndr=new Object();
_clndr=function(pid,id,clicked,css){
	if(css&&css!=''){
		var lnk=document.createElement('link');
		lnk.rel='stylesheet';
		lnk.type='text/css';
		lnk.href=css;
		document.getElementsByTagName('head')[0].appendChild(lnk);
	}
	this.id=id;//the id of the element created
	this.pid=pid;
	this.clicked=clicked;//what to execute when a day is clicked
	this.frstdyofwk=0;//sunday=0, monday=1
	this.mnthnms=['January','February','March','April','May','June','July','August','September','October','November','December'];
	this.dysinmnth=[31,28,31,30,31,30,31,31,30,31,30,31]
	this.dynms=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
	var dt=new Date();
	this.today={day:dt.getDate(),month:dt.getMonth(),year:dt.getFullYear()}
	this.crrnt={day:0,month:0,year:0};
	this.hilites=[];
	for(var i=0;i<20;i++){
		this.hilites[this.hilites.length]={day:0,month:0,year:0};
	}
	this.cid;//id of the element that called the calendar's 'show' function
	this.init(pid);
}

_clndr.prototype={
	dt:function(d,m,y){
		this.day=d;
		this.month=month;
		this.year=y;
	},
	init:function(pid){
		var o;
		var dt=new Date();
		this.crrnt.month=dt.getMonth();
		this.crrnt.year=dt.getFullYear();
		this.crrnt.day=dt.getDate();
		var d=document.getElementById(this.id);
		
		if(!d){
			d=document.createElement('div');
			d.id=this.id;
			
			if(!pid){
				document.body.appendChild(d);
			}else{
				document.getElementById(pid).appendChild(d);
			}
		}
		d.style.display='none';
		d.className='clndr';
		//create headings
		o='<div class="clndrh1">'+
				'<select id="'+this.id+'mnth"class="clndrmnth"onchange="'+this.id+'.update()">';
		for(var i=0;i<12;i++){
			o+='<option value="'+i+'"'+(i==this.today.month?' selected':'')+'>'+this.mnthnms[i]+'</option>';
		}
		o+= '</select>'+
				'<select id="'+this.id+'yr" class="clndryr"onchange="'+this.id+'.update()">';
		for(var i=this.today.year;i<(this.today.year+5);i++){
			o+='<option value="'+i+'">'+i+'</option>'
		}
		o+= '</select>'+
			'</div>'+
			'<div class="clndrh2">';
		for(var i=this.frstdyofwk;i<7;i++){
			o+='<div class="clndrdy">'+this.dynms[i].substr(0,1)+'</div>';
		}
		if(this.frstdyofwk!=0)o+='<div class="clndrdy">'+this.dynms[0].substr(0,1)+'</div>';
		o+='</div>'+
			 '<div id="'+this.id+'dys"class="clndrdys"><div>';
		d.innerHTML=o;
	},
	drawdays:function(frstdy){
		var o='',cd;
		if(this.cid){
			cd=new Date(document.getElementById(this.cid).value+' GMT+0200');
		}else{
			cd=new Date(' GMT+0200');
		}
		//change this to month number
		var mnthnm=this.mnthnms[this.crrnt.month];
		var mnthnmnum=this.crrnt.month;
		var hilite;
		for(var i=1-frstdy+this.frstdyofwk;i<=this.daysinmonth(this.crrnt.month,this.crrnt.year);i++){
			if(i<1){
				o+='<div class="clndrdy"></div>';
			}else{
				hilite=false;
				for(var y=0;y<this.hilites.length;y++){
					if(this.hilites[y].day==i&&this.hilites[y].month==this.crrnt.month&&this.hilites[y].year==this.crrnt.year)hilite=true;
				}
				if(cd.getDate()==i&&cd.getMonth()==this.crrnt.month&&cd.getFullYear()==this.crrnt.year)hilite=true;
				//function always returns the caller id then the date in string format then this object's id
				
				o+='<div class="clndrdy"><a href="javascript:;"onclick="'+this.clicked+'(\''+this.cid+'\',\''+i+' '+mnthnmnum+' '+this.crrnt.year+'\',\''+this.id+'\')"onmouseover="window.status=\'\';return(true)"onfocus="blur()"'+(this.today.day==i&&this.today.month==this.crrnt.month&&this.today.year==this.crrnt.year?' class="crrntdt"':(hilite?' class="hilitedt"':''))+'>'+i+'</a></div>';
			}
		}
		o+='<div class="clr"></div>';
		//alert(o);
		document.getElementById(this.id+'dys').innerHTML=o;
	},
	hide:function(){
		this.cid=null;
		document.getElementById(this.id).style.display='none';
	},
	show:function(o){
		var clndr=document.getElementById(this.id);
		
		if(o){
			if(this.cid==o.id){
				this.hide();
				return;
			}
			this.cid=o.id;
		
			if(!o)o=document.getElementById(this.pid);
			var coords={x:o.offsetLeft,y:(o.offsetTop+o.offsetHeight-1)};
			
			if(navigator.appName.indexOf('Internet Explorer')>-1){
				var p;
				p=o.offsetParent;
				while(p){
					coords.y+=p.offsetTop;
					coords.x+=p.offsetLeft;
					p=p.offsetParent;
				}
			}
			clndr.style.left=coords.x+'px';
			clndr.style.top=coords.y+'px';
		}
		dt=new Date('1 '+this.mnthnms[this.crrnt.month]+' '+this.crrnt.year+' GMT+0200');
		var frstdy=dt.getDay();
		this.drawdays(frstdy);
		clndr.style.display='block';
	},
	update:function(){
		this.crrnt.month=document.getElementById(this.id+'mnth').value;
		this.crrnt.year=document.getElementById(this.id+'yr').value;
		var dt=new Date('1 '+this.mnthnms[this.crrnt.month]+' '+this.crrnt.year+' GMT+0200');
		var frstdy=dt.getDay();
		this.drawdays(frstdy);
	},
	daysinmonth:function(mnth,yr){
		var dys=this.dysinmnth[mnth];
		if(mnth==1)dys+=(yr%4==0?1:0);
		return dys;
	}
}