/*!!
Epoch Prime AJAX JavaScript Calendar
Primary JavaScript File
(c) 2006 MeanFreePath
http://www.meanfreepath.com
All rights reserved.

This file intended for evaluation purposes only.  Please purchase
a license for full access to the source code with comments.
!!*/
function EpochPrime(targetelement,xmlconfig){
	var self=this;
	
	function setLang(){
		self.daylist=new Array('Sö','Må','Ti','On','To','Fr','Lö','Sö','Må','Ti','On','To','Fr','Lö');
		self.months_sh=new Array('Jan','Feb','Mar','Apr','Maj','Jun','Jul','Aug','Sep','Okt','Nov','Dec');
		self.monthup_title='Gå till nästa månad';
		self.monthdn_title='Gå till föregående månad';
		self.clearbtn_caption='Radera valda datum';
		self.clearbtn_title='Raderar alla valda datum';
		self.maxrange_caption='This is the maximum range';
		self.closebtn_caption='Stäng';
		self.closebtn_title='Stäng kalendern';
		}
	function calConfig(){
		var thisyear = self.curDate.getFullYear();
		self.versionNumber='1.0.1';
		self.name='epochprime';
		self.mode='flat';
		self.selectMultiple=true;
		self.displayYearInitial=self.curDate.getFullYear();
		self.displayMonthInitial=self.curDate.getMonth();
		self.displayYear=self.displayYearInitial;
		self.displayMonth=self.displayMonthInitial;
		self.defDateFormat='Y-m-d';
		self.minDate=new Date(thisyear-1,0,1);
		self.maxDate=new Date(thisyear+2,0,1);
		self.startDay=1;
		self.showWeeks=true;
		self.selCurMonthOnly=true;
		}
	function setDays(){
		self.daynames=new Array();
		var j=0;
		for(var i=self.startDay;i<self.startDay+7;i++){
			self.daynames[j++]=self.daylist[i];
		}
		self.monthDayCount=new Array(31,((self.curDate.getFullYear()- 2000)% 4?28:29),31,30,31,30,31,31,30,31,30,31);
		}
	function createCalendar(){
		var tbody,tr,td;
		self.calendar=document.createElement('table');
		self.calendar.setAttribute('id',self.name+'_calendar');
		setClass(self.calendar,'calendar');
		self.calendar.style.display='none';
		addEventHandler(self.calendar,'selectstart',function(){return false;});
		addEventHandler(self.calendar,'drag',function(){return false;});
		tbody=document.createElement('tbody');
		var tr_tmp=document.createElement('tr'),td_tmp=document.createElement('td');
		tr=tr_tmp.cloneNode(false);
		td=td_tmp.cloneNode(false);
		td.appendChild(createMainHeading());
		tr.appendChild(td);
		tbody.appendChild(tr);
		tr=tr_tmp.cloneNode(false);
		td=td_tmp.cloneNode(false);
		self.calendar.celltable=document.createElement('table');
		setClass(self.calendar.celltable,'cells');
		self.calendar.celltable.appendChild(createDayHeading());
		self.calendar.celltable.appendChild(createCalCells());
		td.appendChild(self.calendar.celltable);
		tr.appendChild(td);
		tbody.appendChild(tr);
		tr=tr_tmp.cloneNode(false);
		td=td_tmp.cloneNode(false);
		td.appendChild(createFooter());
		tr.appendChild(td);
		tbody.appendChild(tr);
		self.calendar.appendChild(tbody);
		addEventHandler(self.calendar,'mouseover',cal_onmouseover);
		addEventHandler(self.calendar,'mouseout',cal_onmouseout);
		}
	function createMainHeading(){
		var container=document.createElement('div');
		setClass(container,'mainheading');
		self.monthSelect=document.createElement('select');
		self.yearSelect=document.createElement('select');
		var monthDn=document.createElement('input'),monthUp=document.createElement('input');
		var opt_tmp=document.createElement('option'),opt,i;
		for(i=0;i<12;i++){
			opt=opt_tmp.cloneNode(false);
			opt.setAttribute('value',i);
			self.displayMonth==i?opt.setAttribute('selected','selected'):opt.removeAttribute('selected');
			opt.appendChild(document.createTextNode(self.months_sh[i]));
			self.monthSelect.appendChild(opt);
			}
		var yrMax=self.maxDate.getFullYear(),yrMin=self.minDate.getFullYear();
		for(i=yrMin;i<=yrMax;i++){
			opt=opt_tmp.cloneNode(false);
			opt.setAttribute('value',i);
			self.displayYear==i?opt.setAttribute('selected','selected'):opt.removeAttribute('selected');
			opt.appendChild(document.createTextNode(i));
			self.yearSelect.appendChild(opt);
			}
		monthUp.setAttribute('type','button');
		monthUp.setAttribute('value','>');
		monthUp.setAttribute('title',self.monthup_title);
		monthDn.setAttribute('type','button');
		monthDn.setAttribute('value','<');
		monthDn.setAttribute('title',self.monthdn_title);
		self.monthSelect.owner=self.yearSelect.owner=monthUp.owner=monthDn.owner=self;
		function selectonchange(){
			if(self.goToMonth(self.yearSelect.value,self.monthSelect.value)){
				self.displayMonth=self.monthSelect.value;
				self.displayYear=self.yearSelect.value;
			}else{
				self.monthSelect.value=self.displayMonth;
				self.yearSelect.value=self.displayYear;
			}
		}
		addEventHandler(monthUp,'click',function(){self.nextMonth();});
		addEventHandler(monthDn,'click',function(){self.prevMonth();});
		addEventHandler(self.monthSelect,'change',selectonchange);
		addEventHandler(self.yearSelect,'change',selectonchange);
		container.appendChild(monthDn);
		container.appendChild(self.monthSelect);
		container.appendChild(self.yearSelect);
		container.appendChild(monthUp);
		return container;
		}
	function createFooter(){
		var container=document.createElement('div');
		var clearSelected=document.createElement('input');
		clearSelected.setAttribute('type','button');
		clearSelected.setAttribute('value',self.clearbtn_caption);
		clearSelected.setAttribute('title',self.clearbtn_title);
		clearSelected.owner=self;
		addEventHandler(clearSelected,'click',function(){self.resetSelections(false);});
		container.appendChild(clearSelected);
		if(self.mode=='popup'){
			var closeBtn=document.createElement('input');
			closeBtn.setAttribute('type','button');
			closeBtn.setAttribute('value',self.closebtn_caption);
			closeBtn.setAttribute('title',self.closebtn_title);
			addEventHandler(closeBtn,'click',function(){self.hide();});
			setClass(closeBtn,'closeBtn');
			container.appendChild(closeBtn);
		}
		return container;
		}
	function createDayHeading(){
		self.calHeading=document.createElement('thead');
		setClass(self.calHeading,'caldayheading');
		var tr=document.createElement('tr'),th_tmp=document.createElement('th'),th;
		self.cols=new Array(false,false,false,false,false,false,false);
		if(self.showWeeks){
			th=th_tmp.cloneNode(false);
			setClass(th,'wkhead');
			tr.appendChild(th);
		}
		for(var dow=0;dow<7;dow++){
			th=th_tmp.cloneNode(false);
			th.appendChild(document.createTextNode(self.daynames[dow]));
			if(self.selectMultiple){
				th.headObj=new CalHeading(self,th,(dow+self.startDay<7?dow+self.startDay:dow+self.startDay-7));
			}
			tr.appendChild(th);
		}
		self.calHeading.appendChild(tr);
		return self.calHeading;
	}
	function createCalCells(){
		self.rows=new Array(false,false,false,false,false,false);
		self.cells=new Array();
		var row=-1,totalCells =(self.showWeeks?48:42);
		var beginDate=new Date(self.displayYear,self.displayMonth,1);
		var endDate=new Date(self.displayYear,self.displayMonth,self.monthDayCount[self.displayMonth]);
		var sdt=new Date(beginDate);
		sdt.setDate(sdt.getDate()+(self.startDay-beginDate.getDay())-(self.startDay-beginDate.getDay()> 0?7:0));
		self.calCells=document.createElement('tbody');
		var tr_tmp=document.createElement('tr'),td_tmp=document.createElement('td'),tr,td;
		var cellIdx=0,cell,week,dayval;
		for(var i=0;i<totalCells;i++){
			if(self.showWeeks){
				if(i%8==0){
					row++;
					week=sdt.getWeek(self.startDay);
					tr=tr_tmp.cloneNode(false);
					td=td_tmp.cloneNode(false);
					self.selectMultiple?td.weekObj=new WeekHeading(self,td,week,row):setClass(td,'wkhead');
					td.appendChild(document.createTextNode(week));
					tr.appendChild(td);
					i++;
				}
			}else if(i%7==0){
				row++;
				week=sdt.getWeek(self.startDay);
				tr=tr_tmp.cloneNode(false);
			}
			dayval=sdt.getDate();
			td=td_tmp.cloneNode(false);
			td.appendChild(document.createTextNode(dayval));
			cell=new CalCell(self,td,sdt,row,week);
			self.cells[cellIdx]=cell;
			td.cellObj=cell;
			tr.appendChild(td);
			self.calCells.appendChild(tr);
			self.reDraw(cellIdx++);
			sdt.setDate(dayval+1);
		}
		return self.calCells;
	}
}
