/*
 * cldr v1 (Calendar)
 */

var cldr_dt=function(){
	this.Y=-1;
	this.m=-1;
	this.d=-1;
	this.H=-1;
	this.i=-1;
	this.s=-1;
	this.hasTime=false;
	this.toString=function(){
		return(this.Y+'-'+this.m+'-'+this.d+' '+this.H+':'+this.i+':'+this.s+' (hasTime='+this.hasTime+')');
	}
}

function cldr_dtInit(str){
	//var rv={'Y':-1,'m':-1,'d':-1,'H':-1,'i':-1,'s':-1};
	var rv=new cldr_dt();
	if(typeof(str)!='undefined'){
		var r=new RegExp('([+-])([0-9]{1,2})([YmdHis])');
		if(str==''){
		}else if(str=='today'){
			var m=cldr_dtNow.getMonth()+1;
			rv=cldr_parse(cldr_dtNow.getFullYear()+'-'+((m<10)?'0'+m:m)+'-'+cldr_dtNow.getDate());
		}else if(str=='now'){
			var dt=new Date();
			var m=dt.getMonth()+1;
			var H=dt.getHours();
			var i=dt.getMinutes();
			var s=dt.getSeconds();
			var tmp='';
			tmp=dt.getFullYear()+'-'+((m<10)?'0'+m:m)+'-'+cldr_dtNow.getDate();
			tmp+=' '+((H<10)?'0'+H:H)+':'+((i<10)?'0'+i:i)+':'+((s<10)?'0'+s:s);
			rv=cldr_parse(tmp);
		}else if(str.match(r)){
			r=new RegExp('^'+r.source+'$');
			var t=str.split(';');
			var i,s;
			var dt=new Date();
			for(i=0;i<t.length;i++){
				if(t[i].match(r)){
					s=r.exec(t[i]);
					if(s.length==4){
						if(s[3]=='Y') dt.setFullYear(dt.getFullYear()+(((s[1]=='+')?1:-1)*s[2]));
						else if(s[3]=='m') dt.setMonth(dt.getMonth()+(((s[1]=='+')?1:-1)*s[2]));
						else if(s[3]=='d') dt.setDate(dt.getDate()+(((s[1]=='+')?1:-1)*s[2]));
						else if(s[3]=='H') dt.setHours(dt.getHours()+(((s[1]=='+')?1:-1)*s[2]));
						else if(s[3]=='i') dt.setMinutes(dt.getMinutes()+(((s[1]=='+')?1:-1)*s[2]));
						else if(s[3]=='s') dt.setSeconds(dt.getSeconds()+(((s[1]=='+')?1:-1)*s[2]));
					}
				}
			}
			rv=cldr_dtToObj(dt);
			rv.hasTime=true;
		}else{
			rv=cldr_parse(str);
		}
	}
	return(rv);
}

var cldr_dtNow=new Date();
var cldr={
	'debug':false,
	'dti':cldr_dtInit(), /* DateTime Object */
	'dtd':cldr_dtInit(), /* DateTime Object for display */
	'dts':cldr_dtInit(), /* DateTime Object in calendar form */
	'div':'cldr',
	'divObj':null,
	'form':'cldrForm',
	'formObj':null,
	'refObj':null,
	'formatDefault':'Y-m-d H:i:00',
	'format':'',
	'field':null,
	'custFuncOnPick':null,
	'custFuncNotInInterval':null,
	'displayOffsetTop':0,
	'displayOffsetLeft':0,
	'lang':'fr',
	'langs':{
		'en':{
			'months':new Array('January','February','March','April','May','June','July','August','September','October','November','December'),
			'days':new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')
		},
		'fr':{
			'months':new Array('Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'),
			'days':new Array('Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi')
		}
	},
	'limDateMin':'',
	'limDateMinDefault':'-4Y',
	'limDateMax':'',
	'limDateMaxDefault':'+4Y',
	'limDtMin':cldr_dtInit(),
	'limDtMax':cldr_dtInit(),
	'firstDayOfWeek':1,
	'daysOrder':new Array(),
	'pageSize':null
};

function cldr_build(){
	var c,d,i,l,t;
	var code='';
	code+='\n<form id="'+cldr.form+'" action="#" method="post">\n';
	code+='\n<div class="h">';
	code+='<a href="#" onclick="return(cldr_update(\'m-\'))">&lt;</a>&nbsp;';
	code+='<select name="m" onchange="cldr_update(\'m\',this[this.selectedIndex].value)">';
	for(i=0;i<=11;i++) code+='<option value='+i+'>'+((cldr.langs[cldr.lang].months[i])?cldr.langs[cldr.lang].months[i]:i)+'</option>';
	code+='</select>';
	code+='&nbsp;<a href="#" onclick="return(cldr_update(\'m+\'))">&gt;</a>';
	code+='&nbsp;&nbsp;&nbsp;&nbsp;';
	code+='<a href="#" onclick="return(cldr_update(\'Y-\'))">&lt;</a>&nbsp;';
	code+='<select name="Y" onchange="cldr_update(\'Y\',this[this.selectedIndex].value)">';
	for(i=cldr.limDtMin.Y;i<=cldr.limDtMax.Y;i++) code+='<option value='+i+'>'+i+'</option>';
	code+='</select>';
	code+='&nbsp;<a href="#" onclick="return(cldr_update(\'Y+\'))">&gt;</a>';
	code+='&nbsp;&nbsp;&nbsp;&nbsp;';
	code+='&nbsp;<a href="#" onclick="return(cldr_close())" class="close"><span>X</span></a>';
	code+='\n</div>';
	var firstDay=new Date(cldr.dts.Y,cldr.dts.m,1).getDay();
	var lastDay=new Date(cldr.dts.Y,cldr.dts.m+1,0).getDate();
	code+='\n<table id="cldrCalTab" class="cal">\n<tr>';
	for(i=0;i<cldr.daysOrder.length;i++) code+='<th>'+cldr.daysOrder[i].substr(0,3)+'</th>';
	code+='</tr>\n<tr>';
	d=(firstDay-cldr.firstDayOfWeek>=0)?firstDay-cldr.firstDayOfWeek:7+(firstDay-cldr.firstDayOfWeek);
	for(i=0;i<d;i++) code+='<td>-</td>';
	var tmp=cldr_dtObjCopy(cldr.dts);
	for(i=1;i<=lastDay;i++){
		tmp.d=i;
		if(cldr_inInterval(tmp,null,null,true)) l='<a href="#" onclick="return(cldr_pickDate('+i+'))">'+i+'</a>';
		else l='<span>'+i+'</span>';
		c=cldr.div+'_d'+i;
		code+='<td id="'+c+'">'+l+'</td>';
		d++;
		if(d==7){
			code+='</tr>\n<tr>';
			d=0;
		}
	}
	if(d>0){
		for(i=d;i<7;i++) code+='<td>-</td>';
	}
	code+='</tr>\n</table>\n';
	if(cldr.format.match(/H/)||cldr.format.match(/i/)||cldr.format.match(/s/)){
		cldr_updateDtd();
		code+='<div class="t">';
		if(cldr.format.match(/H/)) code+='<input type="text" name="H" value="'+cldr.dtd.H+'" class="tu" maxlength="2" onblur="cldr_checkField(this)" />';
		if(cldr.format.match(/i/)) code+=' : <input type="text" name="i" value="'+cldr.dtd.i+'" class="tu" maxlength="2" onblur="cldr_checkField(this)" />';
		if(cldr.format.match(/s/)) code+=' . <input type="text" name="s" value="'+cldr.dtd.s+'" class="tu" maxlength="2" onblur="cldr_checkField(this)" />';
		code+=' &nbsp;<input type="button" name="sbt" value="OK" onclick="cldr_pickDate()" class="btn" />';
		code+='</div>';
	}
	code+='</form>\n';
	if(cldr.divObj) cldr.divObj.innerHTML=code;
	cldr.formObj=document.getElementById(cldr.form);
	if(cldr.formObj){
		cldr.formObj.m.value=cldr.dts.m;
		cldr.formObj.Y.value=cldr.dts.Y;
	}
	cldr_highlight();
}

function cldr_dtCmp(dtRef,dt){
	var rv=0;
	if((rv=(dt.Y-dtRef.Y))==0){
		if((rv=(dt.m-dtRef.m))==0){
			if((rv=(dt.d-dtRef.d))==0){
				if((rv=(dt.H-dtRef.H))==0){
					if((rv=(dt.i-dtRef.i))==0){
						rv=dt.s-dtRef.s;
					}
				}
			}
		}
	}
	return(rv);
}

function cldr_dtObjCopy(o){
	var rv=cldr_dtInit();
	var i;
	for(i in rv){
		if(typeof(o[i])!='undefined') rv[i]=o[i];
	}
	return(rv);
}

function cldr_dtToObj(dt){
	var rv=cldr_dtInit();
	rv.Y=dt.getFullYear();
	rv.m=dt.getMonth();
	rv.d=dt.getDate();
	rv.H=dt.getHours();
	rv.i=dt.getMinutes();
	rv.s=dt.getSeconds();
	return(rv);
}

function cldr_close(){
	if(cldr.divObj){
		if(cldr.divObj.parentNode) cldr.divObj.parentNode.removeChild(cldr.divObj);
	}
	return(false);
}

function cldr_checkField(o){
	if(o){
		var n=o.name;
		var v=parseInt(o.value);
		var s=null;
		if(!isNaN(v)){
			if(n=='H'){
				if(v<0||v>23) s=o;
			}else if(n=='i'){
				if(v<0||v>59) s=o;
			}else if(n=='s'){
				if(v<0||v>59) s=o;
			}
		}else s=o;
		if(s){
			s.value='00';
			s.select();
			s.focus();
		}
	}
}

function cldr_debug(str,clear){
	if(cldr.debug){
		var o=gebi('cldr_debug');
		if(o){
			if(clear) o.innerHTML='';
			o.innerHTML+=str.replace(/[\n]/g,'<br />')+'<br />';
		}
		else alert('cldr_debug(): '+str);
	}
}

function cldr_findPos(obj){
	var curleft=curtop=0;
	if(obj.offsetParent){
		do{
			curleft+=obj.offsetLeft;
			curtop+=obj.offsetTop;
		}while (obj=obj.offsetParent);
	}
	return [curleft,curtop];
}

function cldr_format(format,dt){
	if(!format) format=cldr.format;
	if(!dt) dt=cldr.dtd;
	var rv=format;
	var i;
	for(i in dt){
		rv=rv.replace(i,dt[i]);
	}
	return(rv);
}

function cldr_getPageSize(){
	var scrollX=0,scrollY=0,windowWidth=0,windowHeight=0;
	/* Modified code from Lightbox v1 (http://www.huddletogether.com/projects/lightbox/) */
	if(window.innerHeight&&window.scrollMaxY){
		scrollX=document.body.scrollWidth;
		scrollY=window.innerHeight+window.scrollMaxY;
	}else if(document.body.scrollHeight>document.body.offsetHeight){
		scrollX=document.body.scrollWidth;
		scrollY=document.body.scrollHeight;
	}else{
		scrollX=document.body.offsetWidth;
		scrollY=document.body.offsetHeight;
	}
	if(self.innerHeight){
		windowWidth=self.innerWidth;
		windowHeight=self.innerHeight;
	}else if(document.documentElement&&document.documentElement.clientHeight){
		windowWidth=document.documentElement.clientWidth;
		windowHeight=document.documentElement.clientHeight;
	}else if(document.body){
		windowWidth=document.body.clientWidth;
		windowHeight=document.body.clientHeight;
	}
	var pageWidth=(scrollX<windowWidth)?windowWidth:scrollX;
	var pageHeight=(scrollY<windowHeight)?windowHeight:scrollY;
	cldr.pageSize={'pageWidth':pageWidth,'pageHeight':pageHeight,'windowWidth':windowWidth,'windowHeight':windowHeight};
}

function cldr_highlight(d){
	var c,o,i;
	var p=cldr.div+'_d';
	o=document.getElementById('cldrCalTab');
	c=o.getElementsByTagName('td');
	for(i=0;i<c.length;i++) c[i].className=c[i].className.replace('selected','');
	if(typeof(d)=='undefined'){
		if((cldr.dts.Y!=cldr.dti.Y)||(cldr.dts.m!=cldr.dti.m)) d='0';
		else d=cldr.dts.d;
	}
	c=p+d.toString();
	o=document.getElementById(c);
	if(o) o.className='selected';
}

function cldr_inInterval(dt,dtMin,dtMax,pickMode){
	var rv=false;
	if(!dtMin) dtMin=cldr.limDtMin;
	if(!dtMax) dtMax=cldr.limDtMax;
	rv=(dtMin.Y==-1&&dtMax.Y==-1);
	if(typeof(pickMode)!='undefined'&&!rv){
		var f='Ymd';
		var t=cldr_format(f,dt);
		rv=((t==cldr_format(f,dtMin))||(t==cldr_format(f,dtMax)));
	}
	if(!rv){
		if(dtMin.Y!=-1&&dtMax.Y==-1) rv=(cldr_dtCmp(dtMin,dt)>=0);
		else if(dtMax.Y!=-1&&dtMin.Y==-1) rv=(cldr_dtCmp(dtMax,dt)<=0);
		else rv=(cldr_dtCmp(dtMin,dt)>=0&&cldr_dtCmp(dtMax,dt)<=0);
	}
	return(rv);
}

function cldr_init(o,format,more){
	var todo='- Add features:\n\t- Disable days (date or week day)\n\t- Disable time period for a date or a week day';
	cldr_debug('',true);
	if(todo.length>0) cldr_debug('<div class="todo"><strong>TODO:</strong>\n'+todo+'</div>');
	if(!format) format=cldr.formatDefault;
	cldr_close();
	var d=document.createElement('div');
	d.setAttribute('id',cldr.div);
	cldr.divObj=document.getElementsByTagName('body').item(0).appendChild(d);
	cldr_getPageSize();
	if(cldr.divObj){
		if(o){
			var i;
			cldr_debug('cldr_init(): Input value: '+o.value);
			cldr.field=o;
			cldr.format=format;
			cldr.refObj=null;
			cldr.custFuncOnPick=null;
			cldr.custFuncNotInInterval=null;
			cldr.limDateMin='';
			cldr.limDateMax='';
			cldr.displayOffsetTop=0;
			cldr.displayOffsetLeft=0;
			if(typeof(more)=='object'){
				for (i in more){
					cldr[i]=more[i];
				}
				if(typeof(cldr.refObj)=='string') cldr.refObj=document.getElementById(cldr.refObj);
				if(typeof(cldr.custFuncOnPick)!='function') cldr.custFuncOnPick=null;
				if(typeof(cldr.custFuncNotInInterval)!='function') cldr.custFuncNotInInterval=null;
			}
			cldr.dtd=cldr_dtInit();
			cldr.dti=cldr_dtInit();
			cldr.dts=cldr_dtInit();
			cldr.limDtMin=cldr_dtInit((cldr.limDateMin!='')?cldr.limDateMin:cldr.limDateMinDefault);
			cldr.limDtMax=cldr_dtInit((cldr.limDateMax!='')?cldr.limDateMax:cldr.limDateMaxDefault);
			cldr.dti=cldr_parse(o.value);
			cldr.dts=cldr_dtObjCopy(cldr.dti);
			cldr_updateDtd();
			cldr_setFirstWeekDay();
			cldr_show();
		}
	}else alert("Can't show calendar.");
}

function cldr_parse(str){
	var rv=cldr_dtInit();
	var parts=str.split(' ');
	if(parts.length>0){
		var part=parts[0].split('-');
		if(part.length==3){
			rv.Y=parseInt(part[0],10);
			rv.m=parseInt(part[1],10)-1;
			rv.d=parseInt(part[2],10);
		}
		if(typeof(parts[1])!='undefined'){
			part=parts[1].split(':');
			if(part.length==3){
				rv.H=parseInt(part[0],10);
				rv.i=parseInt(part[1],10);
				rv.s=parseInt(part[2],10);
				rv.hasTime=true;
			}
		}else{
			rv.H=0;
			rv.i=0;
			rv.s=0;
		}
	}
	if(rv.Y<0||rv.m<0||rv.d<0){
		rv.Y=cldr_dtNow.getFullYear();
		rv.m=cldr_dtNow.getMonth();
		rv.d=cldr_dtNow.getDate();
	}
	if(rv.H<0||rv.H>23) rv.H=0;
	if(rv.i<0||rv.i>59) rv.i=0;
	if(rv.s<0||rv.s>59) rv.s=0;
	return(rv);
}

function cldr_pickDate(d){
	if(cldr.formObj){
		var isD=(typeof(d)!='undefined');
		if(isD){
			cldr.dti.d=d;
			cldr.dts.d=d;
			cldr_highlight(d);
		}
		if(isD&&cldr.formObj.H){
			cldr.formObj.H.focus();
			cldr.formObj.H.select();
		}
		var act=(typeof(cldr.formObj.sbt)=='undefined')?true:!isD;
		if(act){
			cldr.dti.Y=cldr.formObj.Y[cldr.formObj.Y.selectedIndex].value;
			cldr.dti.m=cldr.formObj.m[cldr.formObj.m.selectedIndex].value;
			if(typeof(d)!='undefined') cldr.dti.d=d;
			if(cldr.formObj.H) cldr.dti.H=cldr.formObj.H.value;
			if(cldr.formObj.i) cldr.dti.i=cldr.formObj.i.value;
			if(cldr.formObj.s) cldr.dti.s=cldr.formObj.s.value;
			var v=cldr.limDateMinDefault;
			if(cldr.limDateMin.length>0) v=cldr.limDateMin;
			cldr.limDtMin=cldr_dtInit(v);
			var v=cldr.limDateMaxDefault;
			if(cldr.limDateMax.length>0) v=cldr.limDateMax;
			cldr.limDtMax=cldr_dtInit(v);
			cldr_debug('dti: '+cldr.dti.toString());
			cldr_debug('Min: '+cldr.limDtMin.toString());
			cldr_debug('Max: '+cldr.limDtMax.toString());
			if(cldr_inInterval(cldr.dti,cldr.limDtMin,cldr.limDtMax)){
				cldr_updateDtd();
				if(typeof(cldr.custFuncOnPick)=='function') cldr.custFuncOnPick();
				cldr_updateField();
				cldr_close();
			}else{
				if(typeof(cldr.custFuncNotInInterval)=='function') cldr.custFuncNotInInterval();
			}
		}
	}
	return(false);
}

function cldr_setFirstWeekDay(){
	var day=cldr.firstDayOfWeek;
	if(day<0||day>6) day=1;
		var i,j;
		for(i=day,j=0;i<cldr.langs[cldr.lang].days.length;i++,j++) cldr.daysOrder[j]=cldr.langs[cldr.lang].days[i];
		for(i=0;i<day;i++,j++) cldr.daysOrder[j]=cldr.langs[cldr.lang].days[i];
}

function cldr_show(){
	cldr_build();
	if(cldr.divObj){
		var o=(cldr.refObj!=null)?cldr.refObj:cldr.field;
		var t=cldr_findPos(o);
		var oL=t[0]+o.offsetWidth+2+cldr.displayOffsetLeft;
		var oT=t[1]+cldr.displayOffsetTop;
		cldr.divObj.style.display='';
		var cW=cldr.divObj.offsetWidth;
		if((oL+cW)>cldr.pageSize.windowWidth){
			oT=t[1]+o.offsetHeight+2;
			oL=t[0]+o.offsetWidth-cW;
		}
		if(oL<0) oL=0;
		if(oT<0) oT=0;
		cldr.divObj.style.top=oT+'px';
		cldr.divObj.style.left=oL+'px';
	}
}

function cldr_update(f,v){
	var argv=cldr_update.arguments;
	var i;
	var tmp=cldr_dtObjCopy(cldr.dts);
	if(argv.length==1){
		var mode=argv[0];
		if(mode=='Y+') tmp.Y++;
		else if(mode=='Y-') tmp.Y--;
		else if(mode=='m+') tmp.m++;
		else if(mode=='m-') tmp.m--;
	} else if(argv.length==2){
		var item=argv[0];
		var nval=parseInt(argv[1],10);
		if(item=='Y') tmp.Y=nval;
		else if(item=='m') tmp.m=nval;
	}
	if(tmp.m>11){
		tmp.Y++;
		tmp.m=0;
	}
	if(tmp.m<0){
		tmp.Y--;
		tmp.m=11;
	}
	cldr.dts=cldr_dtObjCopy(tmp);
	cldr_build();
	return(false);
}

function cldr_updateField(d){
	if(cldr.field){
		cldr.field.value=cldr_format();
	}
}

function cldr_updateDtd(){
	var i;
	cldr.dtd=cldr_dtObjCopy(cldr.dti);
	cldr.dtd.m++;
	if(cldr.dtd.m<10) cldr.dtd.m='0'+(cldr.dtd.m);
	if(cldr.dtd.d<10) cldr.dtd.d='0'+cldr.dtd.d;
	if(cldr.dtd.H.toString().length<2&&cldr.dtd.H<10) cldr.dtd.H='0'+cldr.dtd.H;
	if(cldr.dtd.i.toString().length<2&&cldr.dtd.i<10) cldr.dtd.i='0'+cldr.dtd.i;
	if(cldr.dtd.s.toString().length<2&&cldr.dtd.s<10) cldr.dtd.s='0'+cldr.dtd.s;
}

/* ----------------------------------------------------------------------------------------- */

if(cldr){
	cldr.limDateMinDefault='+1H';
	cldr.limDateMaxDefault='+1Y';
}
