function datetime(k,e,o,b,f){
	if(o.tagName!='INPUT')return;
	var getCpos=function(o){
		if(document.selection){
			var e=document.selection.createRange();
			var l=e.text.length;
			e.moveStart('character',-o.value.length);
			return e.text.length-l;
		}else if(o.selectionStart || o.selectionStart=='0'){
			return o.selectionStart;
		}
	}
	var setCpos=function(o,p){
		if(document.selection){
			o.focus();
			var e=document.selection.createRange();
			e.moveStart ('character',-o.value.length);
			e.moveEnd ('character',-o.value.length);
			e.moveEnd ('character',p);
			e.moveStart('character',p);
			e.select();
		}else if(o.selectionStart || o.selectionStart=='0'){
			o.selectionStart=p;
			o.selectionEnd=p;
			o.focus();
		}
	}
	var num=function(v){
		try{v=new Number(v);}catch(e){v=0;}
		return v;
	}
	var pad=function(s,v){
		v=v.toString();
		while(v.length<s)v='0'+v;
		return v;
	}

	var feb=function(y){
		return y%4==0&&(y<=1752||y%100!=0)||y%400==0 ? true:false;
	}
	var maxd=function(m,y){
		if(m==2&&y&&feb(y))return 29;
		if(m==2&&y&&!feb(y))return 28;
		if(m==2)return 28;
		if(m==4||m==6||m==9||m==11)return 30;
		return 31;
	}
	var datesplit=function(s,v){
		v=v.split('/');
		v[0]=num(v[0]);
		v[1]=num(v[1]);
		if(s==10)v[2]=num(v[2]);
		return v;
	}
	var datejoin=function(s,v){
		if(s==5)return pad(2,v[0])+'/'+pad(2,v[1]);
		if(s==7)return pad(2,v[0])+'/'+pad(4,v[1]);
		return pad(2,v[0])+'/'+pad(2,v[1])+'/'+pad(4,v[2]);
	}
	var datecheck=function(s,v){
		switch(s){
			case 5:
				if(v[0]==0&&v[1]==0)return '';
				if(v[0]<1){--v[1];v[0]=maxd(v[1]);}
				if(v[0]>maxd(v[1])){v[0]=1;++v[1];}
				if(v[1]<1)v[1]=1;
				if(v[1]>12)v[1]=12;
				return datejoin(s,v);
			case 7:
				if(v[0]==0&&v[1]==0)return '';
				if(v[0]<1){v[0]=12;--v[1];}
				if(v[0]>12){v[0]=1;++v[1];}
				if(v[1]<1)v[1]=cdate()[2];
				if(v[1]>9999)v[1]=9999;
				return datejoin(s,v);
			default:
				if(v[0]==0&&v[1]==0&&v[2]==0)return '';
				if(v[0]<1){--v[1];v[0]=maxd(v[1],v[2]);}
				if(v[0]>maxd(v[1],v[2])){v[0]=1;++v[1];}
				if(v[1]<1){v[1]=12;--v[2];}
				if(v[1]>12){v[1]=1;++v[2];}
				if(v[2]<1)v[2]=cdate()[2];
				if(v[2]>9999)v[2]=9999;
				return datejoin(s,v);
		}
		return '';
	}
	var datemove=function(p,s,v,a){
		if(p<2)v[0]+=a;
		if(p>2&&p<5)v[1]+=a;
		if(p>5&&p<=10)v[2]+=a;
		return datecheck(s,v);
	}
	var cdate=function(){
		var v=new Date();
		return new Array(v.getDate(),v.getMonth()+1,v.getFullYear());
	}
	var makedate=function(e,o,b){
		if(!e)return;
		var p=getCpos(o);
		var s=o.maxLength;
		var v=(o.value+'          ').substr(0,s).split('');
		switch(s){
			case 5: // HH/MM
			case 7: // MM/EEEE
				v[2]='/';
				break;
			case 10: // HH/MM/EEEE
				v[2]=v[5]='/';
				break;
		}
		o.value=v.join('');
		v=datesplit(s,o.value);
		if(b){ // onblur
			v=datecheck(s,v);
			if(v.length==0)
				o.value='';
			else if(o.value!=v){
				o.value=v;
				o.focus();
			}
			return;
		}
		var c=(e.keyCode|e.which);
		switch(c){
			case 96: //NUMPAD 1
			case 97:
			case 98:
			case 99:
			case 100:
			case 101:
			case 102:
			case 103:
			case 104:
			case 105:
				c-=48;
			case 48: //KEYPAD 1
			case 49:
			case 50:
			case 51:
			case 52:
			case 53:
			case 54:
			case 55:
			case 56:
			case 57:
				if(p<s){
					if(p==2||s==10&&p==5)++p;
					v=o.value.split('');
					v[p]=String.fromCharCode(c);
					v=v.join('');
					o.value=v.search(' ')>=0 ? v:datecheck(s,datesplit(s,v));
					if(++p==2||s==10&&p==5)++p;
				}
				break;
			case 40://DOWN
				o.value=datemove(p,s,v,-1);
				break;
			case 38://UP
				o.value=datemove(p,s,v,1);
				break;
			case  8://BS
				o.value='';
				p=0;
				break;
			case 46://DEL
				o.value=o.value.substr(0,p);
				break;
			case 9 ://TAB
			case 35://END
			case 36://HOME
				return;
			case 37://LEFT
				if(p>0)--p;
				if(p==2 || p==5)--p;
				break;
			case 39://RIGHT
				if(p<s)++p;
				if(p==2 || p==5)++p;
				break;
			case 32://SP TODAY
				v=cdate();
				if(s==7)v=v.slice(1,3);
				o.value=datejoin(s,v);
				p=0;
				break;
		}
		setCpos(o,p)
		e.returnValue=false;
	}

	var timesplit=function(f,v){
		v=v.split(':');
		v[0]=num(v[0]);
		if(f.length>2)v[1]=num(v[1]);
		if(f.length>5)v[2]=num(v[2]);
		return v;
	}
	var timejoin=function(f,v){
		if(f.length==2)return pad(2,v[0]);
		if(f.length==5)return pad(2,v[0])+':'+pad(2,v[1]);
		return pad(2,v[0])+':'+pad(2,v[1])+':'+pad(2,v[2]);
	}
	var timecheck=function(f,v){
		var m;
		switch(f.length){
			case 2:
				if(v[0]==0)return'';
				if(v[0]<0)v[0]=0;
				m=f.charAt(0)=='h'?23:59;
				if(v[0]>m)v[0]=m;
				return timejoin(f,v);
			case 5:
				if(v[0]==0&&v[1]==0)return '';
				if(v[1]<0){v[1]=59;--v[2]};
				if(v[1]>59)v[1]=59;
				m=f.charAt(0)=='h'?23:59;
				if(v[0]<0||v[0]>m)v[0]=m;
				return timejoin(f,v);
			default:
				if(v[0]==0&&v[1]==0&&v[2]==0)return '';
				if(v[2]<0)if(v[1]==0){v[2]=0;}else{v[2]=59;--v[1];}
				if(v[2]>59)if(v[1]==59){v[2]=59;}else{v[2]=0;++v[1];}
				if(v[1]<0)if(v[0]==0){v[1]=0;}else{v[1]=59;--v[0];}
				if(v[1]>59)if(v[0]==23){v[1]=59}else{v[1]=0;++v[0];}
				if(v[0]<0)v[0]=0;
				if(v[0]>23)v[0]=23;
				return timejoin(f,v);
		}
		return '';
	}
	var timemove=function(p,f,v,a){
		if(p<2)v[0]+=a;
		if(p>2&&p<5)v[1]+=a;
		if(p>5&&p<=8)v[2]+=a;
		return timecheck(f,v);
	}
	var ctime=function(){
		var v=new Date();
		return new Array(v.getHours(),v.getMinutes(),v.getSeconds());
	}
	var maketime=function(e,o,b,f){
		if(!e)return;
		var p=getCpos(o);
		var v=(o.value+'          ').substr(0,f.length).split('');
		switch(f.length){
			case 2: // HH or MM or SS
				break;
			case 5: // HH:MM or MM:SS
				v[2]=':';
				break;
			case 8: // HH:MM:SS
				v[2]=v[5]=':';
				break;
		}
		o.value=v.join('');
		v=timesplit(f,o.value);
		if(b){ // onblur
			v=timecheck(f,v);
			if(v.length==0)
				o.value='';
			else if(o.value!=v){
				o.value=v;
				o.focus();
			}
			return;
		}
		var c=(e.keyCode|e.which);
		switch(c){
			case 96: //NUMPAD 1
			case 97:
			case 98:
			case 99:
			case 100:
			case 101:
			case 102:
			case 103:
			case 104:
			case 105:
				c-=48;
			case 48: //KEYPAD 1
			case 49:
			case 50:
			case 51:
			case 52:
			case 53:
			case 54:
			case 55:
			case 56:
			case 57:
				if(p<f.length){
					if(p==2||f.length==8&&p==5)++p;
					v=o.value.split('');
					v[p]=String.fromCharCode(c);
					v=v.join('');
					o.value=v.search(' ')>=0 ? v:timecheck(f,timesplit(f,v));
					if(++p==2||f.length==8&&p==5)++p;
				}
				break;
			case 40://DOWN
				o.value=timemove(p,f,v,-1);
				break;
			case 38://UP
				o.value=timemove(p,f,v,1);
				break;
			case  8://BS
				o.value='';
				p=0;
				break;
			case 46://DEL
				o.value=o.value.substr(0,p);
				break;
			case 9 ://TAB
			case 35://END
			case 36://HOME
				return;
			case 37://LEFT
				if(p>0)--p;
				if(p==2 || p==5)--p;
				break;
			case 39://RIGHT
				if(p<f.length)++p;
				if(p==2 || p==5)++p;
				break;
			case 32://SP TODAY
				o.value=timejoin(f,ctime());
				p=0;
				break;
		}
		setCpos(o,p)
		e.returnValue=false;
	}
	if(!e)e=window.event;
	if(k=='d')
		makedate(e,o,b);
	else
		maketime(e,o,b,f);
}
function CalendarOpen(el,format,bformat){
	if(calendar!=null){
		calendar.hide();
	}else{
		var cal=new Calendar(false,null,CalendarChange,CalendarHide);
		cal.weekNumbers=true;
		calendar=cal;
		cal.setRange(1900,2070);
		cal.create();
	}
	calendar.setDateFormat(format,bformat);
	var v=el.value;
	if(v.indexOf('_')>-1) v='';
	calendar.parseDate(v);
	calendar.sel = el;
	if(document.getElementById('WindowsLoader')){
		calendar.showAt(event.clientX+document.body.scrollLeft,event.clientY+document.body.scrollTop+10);
	}else{
		calendar.showAtElement(el);
	}
}
function CalendarChange(cal,date){
	var sep='/';
	var i,fo=cal.dateFormat.split(sep),dt=date.split(sep);
	var dd,mm,yy;
	for(i=0;i<fo.length;i++){
		switch(fo[i].substr(0,1)){
			case 'd':dd = dt[i];break;
			case 'm':mm = dt[i];break;
			case 'y':yy = dt[i];break;
		}
	}
	cal.sel.value='';
	for(i=0;i<cal.datebFormat.length;i++){
		sep=cal.datebFormat.substr(i,1);
		switch(sep){
			case 'd':cal.sel.value += dd;break;
			case 'm':cal.sel.value += mm;break;
			case 'Y':cal.sel.value += yy;break;
			default:cal.sel.value += sep;break;
		}
	}
	if(cal.sel.func)eval(cal.sel.func);
	cal.sel.focus();
}
function CalendarHide(cal){
	cal.hide();
}

