/*!!
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('Вс','Пн','Вт','Ср','Чт','Пт','Сб','Вс','Пн','Вт','Ср','Чт','Пт','Сб');
		self.months_sh=new Array('Янв','Фев','Мар','Апр','Май','Июнь','Июль','Авг','Сен','Окт','Ноя','Дек');
		self.monthup_title='Перейти на следующий месяц';
		self.monthdn_title='Перейти на предыдущий месяц';
		self.clearbtn_caption='Очистить';
		self.clearbtn_title='Очищает любые даты, отобранные на календаре';
		self.maxrange_caption='Это - максимальный диапазон';
		self.closebtn_caption='Закрыть';
		self.closebtn_title='Закрыть календарь';
	}

	function calConfig()
	{
		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='m/d/Y';
		self.minDate=new Date(2008,0,1);
		self.maxDate=new Date(2012,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()
			{
				//alert("clear");
				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;
}
function setMode(targetelement){
	if(self.mode=='popup'){
	self.calendar.style.position='absolute';
}if(targetelement){
	switch(self.mode){
	case 'flat':self.tgt=targetelement;
self.tgt.appendChild(self.calendar);
self.visible=true;
break;
case 'popup':self.calendar.style.position='absolute';
document.body.appendChild(self.calendar);
self.setTarget(targetelement,false);
break;
}}else{
	document.body.appendChild(self.calendar);
self.visible=false;
}}
function deleteCells(){
	self.calendar.celltable.removeChild(self.calendar.celltable.childNodes[1]);
}
function setClass(element,className){
	element.setAttribute('class',className);
element.setAttribute('className',className);
}
function setCellProperties(cellindex){

var cell=self.cells[cellindex];

var date;
idx=self.dateInArray(self.dates,cell.date);
if(idx>-1){
	date=self.dates[idx];
cell.date.selected=date.selected||false;
cell.date.type=date.type;
cell.date.canSelect=date.canSelect;
cell.setTitle(date.title);
cell.setURL(date.href);
cell.setHTML(date.cellHTML);
}else{
	cell.date.selected=false;
}if(cell.date.getTime()< self.minDate.getTime()|| cell.date.getTime()> self.maxDate.getTime()){
	cell.date.canSelect=false;
}cell.setClass();
}
function cal_onmouseover(){
	self.mousein=true;
}
function cal_onmouseout(){
	self.mousein=false;
}
function initXML(xml){
	try{
	self.xmlParser=new ActiveXObject('Microsoft.XMLDOM');
self.domType='ie';
}catch(E){
	self.xmlParser=new DOMParser();
self.domType='mz';
}if(xml){
	processXML(xml,true);
}}
function processXML(xml,init){

var dateRegExp=new RegExp('(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)');

var xmlobj;

function tagVal(parent,tagName){

var tag=parent.getElementsByTagName(tagName);
return tag.length?tag[0].firstChild.nodeValue:null;
}

function tagHnd(parent,tagName)
{
	return parent?parent.getElementsByTagName(tagName)[0]:null;
}if(typeof(xml)== 'string'){
	switch(self.domType){
	case 'ie':xmlobj=self.xmlParser;
xmlobj.loadXML(xml);
break;
case 'mz':xmlobj=self.xmlParser.parseFromString(xml,'text/xml');
break;
}}else{
	xmlobj=xml;
}
var cfgNode=tagHnd(xmlobj,'configs');
if(cfgNode)
{

	if(init)
	{

		var langNode=tagHnd(cfgNode,'lang');
		if(langNode)
		{

		var daynames_Node=tagHnd(langNode,'daylist');

		var monthnames_Node=tagHnd(langNode,'monthnames');

		var ltNode=tagHnd(langNode,'langtexts');

		if(ltNode)
		{
			self.clearbtn_caption=tagVal(ltNode,'clearbtn_caption')|| self.clearbtn_caption;
			self.maxrange_caption=tagVal(ltNode,'maxrange_caption')|| self.maxrange_caption;
			self.closebtn_caption=tagVal(ltNode,'closebtn_caption')|| self.closebtn_caption;
			self.monthup_title=tagVal(ltNode,'monthup_title')|| self.monthup_title;
			self.monthdn_title=tagVal(ltNode,'monthdn_title')|| self.monthdn_title;
			self.clearbtn_title=tagVal(ltNode,'clearbtn_title')|| self.clearbtn_title;
			self.closebtn_title=tagVal(ltNode,'closebtn_title')|| self.closebtn_title;
		}

		if(daynames_Node)
		{
			//alert("ok");
	self.daylist=new Array();
for(var i=0;i<7;i++){
	self.daylist[i]=daynames_Node.childNodes[i].getAttribute('sh');
self.daylist[i+7]=self.daylist[i];
}}if(monthnames_Node){
	self.months_sh=new Array();
for(
var i=0;
i<12;
i++){
	self.months_sh[i]=months_shNode.childNodes[i].getAttribute('sh');
}}}
var icNode=tagHnd(cfgNode,'initcfg');
if(icNode){

var tmp;
self.name=tagVal(icNode,'name')|| self.name;
self.mode=tagVal(icNode,'mode')|| self.mode;
tmp=tagVal(icNode,'multiselect');
if(tmp){
	self.selectMultiple =(tmp=='yes');
}if(self.mode=='popup'){
	self.selectMultiple=false;
}tmp=tagVal(icNode,'startday');
if(tmp){
	self.startDay=parseInt(tmp);
}tmp=tagVal(icNode,'showweeks');
if(tmp){
	self.showWeeks =(tmp=='yes');
}tmp=tagVal(icNode,'selcurmonthonly');
if(tmp){
	self.selCurMonthOnly =(tmp=='yes');
}}}
var stcNode=tagHnd(cfgNode,'statecfg');
if(stcNode){

var tmp;
self.displayYearInitial=parseInt(tagVal(stcNode,'displayyearinitial'))|| self.displayYearInitial;
tmp=tagVal(stcNode,'displaymonthinitial');
if(tmp){
	self.displayMonthInitial=parseInt(tmp)- 1;
}self.displayYear=parseInt(tagVal(stcNode,'displayyear'))|| self.displayYear;
tmp=tagVal(stcNode,'displaymonth');
if(tmp){
	self.displayMonth=parseInt(tmp)- 1;
}tmp=tagVal(stcNode,'mindate');
if(tmp){

var mindate=dateRegExp.exec(tmp);
self.minDate=new Date(mindate[1],mindate[2]-1,mindate[3]);
}tmp=tagVal(stcNode,'maxdate');
if(tmp){

var maxdate=dateRegExp.exec(tmp);
self.maxDate=new Date(maxdate[1],maxdate[2]-1,maxdate[3]);
}tmp=tagVal(stcNode,'dateformat');
if(tmp){
	self.defDateFormat=tmp;
}}}
var datesadd=tagHnd(xmlobj,'datesadd');

var datesrem=tagHnd(xmlobj,'datesrem');
if(datesrem){

var dates=datesrem.getElementsByTagName('date');

var dateArray=new Array,ds;
for(
var i=0;
i<dates.length;
i++){
	ds=dateRegExp.exec(dates[i].getAttribute('value'));
dateArray[i]=new Date(ds[1],ds[2]-1,ds[3]);
}self.removeDates(dateArray,false);
}if(datesadd){

var dates=datesadd.getElementsByTagName('date');

var dateArray=new Array,ds,dateObj;
for(
var i=0;
i<dates.length;
i++){
	ds=dateRegExp.exec(dates[i].getAttribute('value'));
dateObj=new Date(ds[1],ds[2]-1,ds[3]);
dateObj.type=dates[i].getAttribute('type')|| 'normal';
dateObj.title=dates[i].getAttribute('title')|| '';
dateObj.href=dates[i].getAttribute('href')|| '';

var selected=dates[i].getAttribute('selected');
dateObj.canSelect=dateObj.selected=true;
try{
	switch(selected){
	case 'disabled':dateObj.canSelect=dateObj.selected=false;
break;
case 'no':dateObj.selected=false;
break;
default:if(selected&&selected!='yes'){
	dateObj.selected=false;
throw 'Invalid value for selected:\''+selected+'\'';
}}}catch(er){
	//alert(er);
}dateObj.cellHTML=dates[i].firstChild?dates[i].firstChild.nodeValue:'';
dateArray[dateArray.length]=dateObj;
}self.addDates(dateArray,false);
}}
function updateSelectedDates(){




var idx=0;
self.selectedDates=new Array();
for(i=0;
i<self.dates.length;
i++){
	if(self.dates[i].selected){
	self.selectedDates[idx++]=self.dates[i];
}}}self.dateInArray=
function(arr,searchVal,startIndex){
	startIndex =(startIndex!=null?startIndex:0);
for(
var i=startIndex;
i<arr.length;
i++){
	if(searchVal.getUeDay()== arr[i].getUeDay()){
	return i;
}}return -1;
};

self.setTarget=
function(targetelement,focus){
	if(self.mode=='popup'){

function popupFocus(){
	self.show();
}
function popupBlur(){
	if(!self.mousein){
	self.hide();
}}
function popupKeyDown(){
	self.hide();
}if(self.tgt)
{
	removeEventHandler(self.tgt,'focus', popupFocus);
	removeEventHandler(self.tgt,'blur', popupBlur);
	removeEventHandler(self.tgt,'keydown', popupKeyDown);

}self.tgt=targetelement;

var dto=self.tgt.dateObj,pdateArr=new Array;

if(dto)
{
	if(self.tgt.value.length)
	{
		pdateArr[0]=dto;
	}self.goToMonth(dto.getFullYear(),dto.getMonth());

}self.selectDates(pdateArr,true,true,true);

self.topOffset=self.tgt.offsetHeight;
self.leftOffset=0;
self.updatePos(self.tgt);
addEventHandler(self.tgt,'focus',popupFocus);
addEventHandler(self.tgt,'blur',popupBlur);
addEventHandler(self.tgt,'keydown',popupKeyDown);
if(focus!==false){
	popupFocus();
}}else{
	if(self.tgt){
	self.tgt.removeChild(self.calendar);
}self.tgt=targetelement;
self.tgt.appendChild(self.calendar);
self.show();
}};
self.nextMonth=
function(){

var month=self.displayMonth;

var year=self.displayYear;
if(self.displayMonth<11){
	month++;
}else if(self.yearSelect.value<self.maxDate.getFullYear()){
	month=0;
year++;
}return self.goToMonth(year,month);
};
self.prevMonth=
function(){

var month=self.displayMonth;

var year=self.displayYear;
if(self.displayMonth>0){
	month--;
}else{
	month=11;
year--;
}return self.goToMonth(year,month);
};
self.goToMonth=
function(year,month){

var testdatemin=new Date(year,month,31);

var testdatemax=new Date(year,month,1);
if(testdatemin>=self.minDate&&testdatemax<=self.maxDate){
	self.monthSelect.value=self.displayMonth=month;
self.yearSelect.value=self.displayYear=year;
createCalCells();
deleteCells();
self.calendar.celltable.appendChild(self.calCells);
return true;
}else{
	//alert(self.maxrange_caption);
return false;
}};

self.updatePos=
function(target){
	if(self.mode=='popup')
	{
		self.calendar.style.top = getTop(target) - self.topOffset + 20 +'px';
		self.calendar.style.left = getLeft(target) + self.leftOffset + 100 +'px';
	}};

self.show=
function(){
	self.updatePos(self.tgt);
self.calendar.style.display='block';
self.visible=true;



};

self.hide=
function()
{
	self.calendar.style.display='none';
	self.visible=false;

//alert('This epochprime.self.hide');

    //alert('GL_Calendaric_FromID: '+ GL_Calendaric_FromID + "\n" + 'GL_Calendaric_ToID: '+ GL_Calendaric_ToID);
    //if (GL_Calendaric_TargetID != null && typeof(GL_Calendaric_TargetID)!= 'undefined') alert (GL_Calendaric_TargetID);
    //alert (GL_Calendaric_TargetID);
    //alert(self.calendar.name);
    if (GL_Calendaric_IsLoadedAndSeted == true && self)
    {
    	//alert(self.tgt.Keys( ));
    }

    //alert('GL_Calendaric_TargetID: ' + GL_Calendaric_TargetID);

    /*
	if (typeof(GL_Calendaric_FromID)!= 'undefined' && typeof(GL_Calendaric_ToID)!= 'undefined')
	{
		SendPlusOneToNextDateField(GL_Calendaric_FromID, GL_Calendaric_ToID, ".", 1);
	}

	/**/

	//alert (self.tgt.id);

	//alert('This self.hide: ' + GL_Calendaric_FromID + ' :: ' + GL_Calendaric_ToID);


};

self.toggle=
function(){
	self.visible?self.hide():self.show();
};
self.addDates=
function(dates,redraw){
	for(
var i=0;
i<dates.length;
i++){
	if(self.dateInArray(self.dates,dates[i])== -1){
	self.dates[self.dates.length]=dates[i];
}}updateSelectedDates();
if(redraw!=false){
	self.reDraw();
}};
self.removeDates=
function(dates,redraw){

var idx;
for(
var i=0;
i<dates.length;
i++){
	idx=self.dateInArray(self.dates,dates[i]);
if(idx!=-1){
	self.dates.splice(idx,1);
}}updateSelectedDates();
if(redraw!=false){
	self.reDraw();
}};

self.selectDates=
function(inpdates,selectVal,redraw,removeothers)
{
	var idx;
	//alert(self.dates.length);


	if(removeothers==true)
	{
		for(var i=0;i<self.dates.length;i++)
		{
			self.dates[i].selected=false;

		}
	}
	for(var i=0;i<inpdates.length;i++)
	{
		idx=self.dateInArray(self.dates,inpdates[i]);
		//alert(idx);
		if(selectVal==true)
		{
			inpdates[i].selected=true;
			inpdates[i].canSelect=true;
			if(idx==-1)
			{

				self.dates[self.dates.length]=inpdates[i];
			}
			else
			{
				self.dates[idx].selected=true;

			}
		}
		else
		{
			if(idx>-1)
			{
				self.dates[idx].selected=inpdates[i].selected=false;

				if(self.dates[idx].type=='normal')
				{
					//alert("this");
					self.dates.splice(idx,1);
				}
			}
		}
	}
	updateSelectedDates();
	if(self.mode=='popup'&&self.selectedDates.length)
	{
		self.tgt.value=self.selectedDates[0].dateFormat(self.defDateFormat);
	}
	if(redraw!=false)
	{
		self.reDraw();
	}
};

self.sendForm=
function(form,inputname){

//alert('this self.sendForm');

var inp=inputname||'epochdates';
for(
var i=0;
i<self.dates.length;
i++){
	inp=document.createElement('input');
inp.setAttribute('type','hidden');
inp.setAttribute('name',inputname+'[]');
inp.setAttribute('value',encodeURIComponent(self.dates[i].dateFormat('Y-m-d')));
form.appendChild(inp);
}};
self.outputAjaxQueryString=
function(
varname,dateFormat,includeConfig){

var qstr='',index=0;

var name=
varname||'epochdate',format=dateFormat||'Y-m-d';
for(
var i=0;
i<self.dates.length;
i++){
	if(self.dates[i].selected==true){
	qstr += name +'['+(index++)+']='+ encodeURIComponent(self.dates[i].dateFormat(format))+(self.dates[i+1]?'&':'');
}}if(includeConfig===true){
	qstr += '&'+self.name+'_displayyearinitial='+self.displayYearInitial;
qstr += '&'+self.name+'_displaymonthinitial=' +(self.displayMonthInitial+1);
qstr += '&'+self.name+'_displayyear='+self.displayYear;
qstr += '&'+self.name+'_displaymonth=' +(self.displayMonth+1);
qstr += '&'+self.name+'_mindate='+encodeURIComponent(self.minDate.dateFormat(format));
qstr += '&'+self.name+'_maxdate='+encodeURIComponent(self.maxDate.dateFormat(format));
}return qstr;
};
self.importXML=
function(xmldata){
	processXML(xmldata,false);
self.goToMonth(self.displayYear,self.displayMonth);
};
self.exportXML=

function()
{
	var dt,selected;

	var xml='<?xml version="1.0" encoding="UTF-8"?>\n<importdata>\n';
	xml += ' <configs>\n  <statecfg>\n';
	xml += '   <displayyearinitial>'+self.displayYearInitial+'</displayyearinitial>\n';
	xml += '   <displaymonthinitial>' +(self.displayMonthInitial+1)+ '</displaymonthinitial>\n';
	xml += '   <displayyear>'+self.displayYear+'</displayyear>\n';
	xml += '   <displaymonth>' +(self.displayMonth+1)+ '</displaymonth>\n';
	xml += '   <mindate>'+self.minDate.dateFormat('Y-m-d')+ '<mindate>\n';
	xml += '   <maxdate>'+self.maxDate.dateFormat('Y-m-d')+ '<maxdate>\n';
	xml += '  </statecfg>\n  </configs>\n';
	xml += ' <datesadd>\n';
	for(var i=0;i<self.dates.length;i++)
	{
		dt=self.dates[i];
		selected =(dt.selected?'yes':(dt.canSelect?'no':'disabled'));
		xml += '  <date value="'+dt.dateFormat('Y-m-d')+(dt.type.length?'" type="' +dt.type +'"':'')+(dt.title?' title="'+dt.title+'"':'')+' selected="'+selected +'">' +(dt.cellHTML?'<![CDATA[' +dt.cellHTML +']]>':'')+ '</date>\n';
	}
	//alert(xml);
	xml += ' </datesadd>\n';
	xml += '</importdata>\n';
	return xml;
};

self.resetSelections=
	function(retMonth)
	{
		self.dates=new Array();
		self.selectedDates=new Array();
		//self.selectDates(new Array(self.date),true,true,false);
		self.reDraw();
	};

self.reDraw=
function(index){
	self.state=1;

var len=index?index+1:self.cells.length;
for(
var i=index||0;
i<len;
i++){
	setCellProperties(i);
}self.state=2;
};
self.getCellIndex=
function(date){
	for(
var i=0;
i<self.cells.length;
i++){
	if(self.cells[i].date.getUeDay()== date.getUeDay()){
	return i;
}}return -1;
};
self.versionNumber='2.0.0';
self.state=0;
self.curDate=new Date();
self.dates=new Array();
self.selectedDates=new Array();
self.calendar;
self.calHeading;
self.calCells;
self.rows;
self.cols;
self.cells=new Array();
self.monthSelect;
self.yearSelect;
self.mousein=false;
calConfig();
setLang();
initXML(xmlconfig);
setDays();
createCalendar();
setMode(targetelement);
self.state=2;
self.visible?self.show():self.hide();
}
function CalHeading(owner,tableCell,dayOfWeek){

function DayHeadingonclick(){
//alert('this DayHeadingonclick');
var sdates=owner.dates;

var cells=owner.cells;

var dateArray=new Array();
owner.cols[dayOfWeek]=!owner.cols[dayOfWeek];
for(
var i=0;
i<cells.length;
i++){
	if(cells[i].dayOfWeek==dayOfWeek&&cells[i].date.canSelect &&(!owner.selCurMonthOnly||cells[i].date.getMonth()== owner.displayMonth&&cells[i].date.getFullYear()== owner.displayYear)){
	dateArray[dateArray.length]=cells[i].date;
}}owner.selectDates(dateArray,owner.cols[dayOfWeek],true);
}
var self=this;
self.dayOfWeek=dayOfWeek;
//addEventHandler(tableCell,'mouseup',DayHeadingonclick);
}

function WeekHeading(owner,tableCell,week,tableRow)
{
	function weekHeadingonclick()
	{
		var cells=owner.cells;

		var sdates=owner.dates;

		var dateArray=new Array();
		owner.rows[tableRow]=!owner.rows[tableRow];

		for(var i=0; i<cells.length; i++)
		{
			if(cells[i].tableRow==tableRow && cells[i].date.canSelect &&(!owner.selCurMonthOnly || cells[i].date.getMonth()== owner.displayMonth && cells[i].date.getFullYear()== owner.displayYear))
			{
				dateArray[dateArray.length]=cells[i].date;
			}
		}
		owner.selectDates(dateArray,owner.rows[tableRow],true);
	}

	var self=this;
	self.week=week;
	tableCell.setAttribute('class','wkhead');
	tableCell.setAttribute('className','wkhead');
	//addEventHandler(tableCell,'mouseup',weekHeadingonclick);
}

function CalCell(owner,tableCell,dateObj,row,week)
{
var self=this;

function calCellonclick()
{

	if(self.date.canSelect)
	{
		if(owner.selectMultiple==true)
		{

			if(owner.selectedDates.length==1)
			{

				date_1=new Date(owner.selectedDates[0]);
				date_2=new Date(self.date);
				if(date_2<date_1)
				{
					owner.dates=new Array();
					owner.selectedDates=new Array();
					self.date.type='normal';
					owner.selectDates(new Array(self.date),true,true,false);
					owner.reDraw();
					warning_element=document.getElementById('warning_element_id');
					if(warning_element)
					{
						warning_element.innerHTML='<span style="border-bottom:black dashed 1px;">Теперь выберите дату с</span>';
					}
					calculate_element=document.getElementById('calculate_id');
					if(calculate_element) calculate_element.style.color='black';
				}
				else
				{
					date_n=date_1+1;

					dateArray=new Array();
					for(i=date_1.getTime();i<=date_2.getTime();i+=86400000)
					{
						if(i==date_1.getTime()) continue;
						dateArray[dateArray.length]=new Date(i);
						if(i==date_2.getTime()) dateArray[dateArray.length-1].type='endday';
						else dateArray[dateArray.length-1].type='normal';
					}
					owner.selectDates(dateArray,true,true,false);

					warning_element=document.getElementById('warning_element_id');
					if(warning_element) warning_element.innerHTML='<span style="border-bottom:black dashed 1px;">Теперь нажмите кнопку <a href="#" onclick="window.make_date();document.getElementById(\'order_form\').submit();" style="text-decoration:none;"><b style="color:red;">Посчитать</b></a>, чтобы сохранить даты</span>';
					calculate_element=document.getElementById('calculate_id');
					if(calculate_element) calculate_element.style.color='red';
				}
			}
			else if(owner.selectedDates.length>=2)
			{
				owner.dates=new Array();
				owner.selectedDates=new Array();
				self.date.type='normal';
				owner.selectDates(new Array(self.date),true,true,false);
				owner.reDraw();
				warning_element=document.getElementById('warning_element_id');
				if(warning_element)
				{
					warning_element.innerHTML='<span style="border-bottom:black dashed 1px;">Теперь выберите дату с</span>';
				}
				calculate_element=document.getElementById('calculate_id');
				if(calculate_element) calculate_element.style.color='black';
			}
			else owner.selectDates(new Array(self.date),!self.date.selected,false);
			self.setClass();

		}
		else
		{
			owner.selectDates(new Array(self.date),true,false,true);
			if(owner.mode=='popup')
			{
				//update_dates();
				owner.tgt.dateObj = new Date(self.date);
				//alert('This calCellonclick');
				//alert('This calCellonclick: ' + GL_Calendaric_FromID + ' :: ' + GL_Calendaric_ToID);

				if (owner && typeof(GL_Calendaric_FromID)!= 'undefined' && typeof(GL_Calendaric_ToID)!= 'undefined')
				{
					//alert("This calCellonclick :: typeof(GL_Calendaric_FromID)!= 'undefined' && typeof(GL_Calendaric_ToID)!= 'undefined'");

					if (owner.tgt)
					{
						//alert('This calCellonclick :: owner.tgt = ' + owner.tgt);

						if (owner.tgt.id.length > 0)
						{
							/*
							alert('This calCellonclick :: owner.tgt.id = ' + owner.tgt.id);
							alert('This calCellonclick :: GL_Calendaric_FromID = ' + GL_Calendaric_FromID);
							/**/

							if (owner.tgt.id == GL_Calendaric_FromID)
							{
								//alert('This calCellonclick :: owner.tgt.id == GL_Calendaric_FromID');

								SendPlusOneToNextDateField(GL_Calendaric_FromID, GL_Calendaric_ToID, ".", 1);
							}
						}
					}
				}


				owner.hide();
			}
			owner.reDraw();
		}
	}
	//else alert("CANNOT SELECT");

}

function calCellonmouseover()
{
	//alert("calCellonmouseover");
	if(self.date.canSelect)
	{
		tableCell.setAttribute('class',self.cellClass+' hover');
		tableCell.setAttribute('className',self.cellClass+' hover');
	}
}

function calCellonmouseout()
{
	//alert("calCellonmouseout");
	self.setClass();
}

self.setClass =
function()
{
	if(self.date.canSelect!==false)
	{
		if(self.date.type=='endday' && self.date.selected)
		{
			self.cellClass='endday';
		}
		else if(self.date.selected)
		{
			//alert("cell_selected");
			self.cellClass='cell_selected';
		}
		else if(self.date.type=='holiday')
		{
			self.cellClass='hlday';
		}
		else if(owner.displayMonth!=self.date.getMonth())
		{
			self.cellClass='notmnth';
		}
		else if(self.dayOfWeek>0&&self.dayOfWeek<6)
		{
			self.cellClass='wkday';
		}
		else
		{
			self.cellClass='wkend';
		}
	}
	else
	{
		self.cellClass='noselect';
	}
	if(self.date.getUeDay()== owner.curDate.getUeDay())
	{
		self.cellClass=self.cellClass+' curdate';
	}
	tableCell.setAttribute('class',self.cellClass);
	tableCell.setAttribute('className',self.cellClass);
};
self.setURL=
function(href,type){
	if(href){
	if(type=='js'){
	addEventHandler(self.tableCell,'mousedown',
function(){
	window.location.href=href;
});
}else{

var url=document.createElement('a');
url.setAttribute('href',href);
url.appendChild(document.createTextNode(self.date.getDate()));
self.tableCell.replaceChild(url,self.tableCell.firstChild);
}}};
self.setTitle=
function(titleStr){
	if(titleStr&&titleStr.length>0){
	self.title=titleStr;
self.tableCell.setAttribute('title',titleStr);
}};
self.setHTML=
function(html){
	if(html&&html.length>0){
	if(self.tableCell.childNodes[1]){
	self.tableCell.childNodes[1].innerHTML=html;
}else{

var htmlCont=document.createElement('div');
htmlCont.innerHTML=html;
self.tableCell.appendChild(htmlCont);
}}};
self.cellClass;
self.tableRow=row;
self.tableCell=tableCell;
self.date=new Date(dateObj);
self.date.canSelect=true;
self.date.type='normal';
self.date.selected=false;
self.date.cellHTML='';
self.dayOfWeek=self.date.getDay();
self.week=week;
addEventHandler(tableCell,'click',calCellonclick);
addEventHandler(tableCell,'mouseover',calCellonmouseover);
addEventHandler(tableCell,'mouseout',calCellonmouseout);
self.setClass();
}Date.prototype.getDayOfYear=
function(){
	return parseInt((this.getTime()- new Date(this.getFullYear(),0,1).getTime())/86400000+1);
};
Date.prototype.getWeek=
function(dowOffset){
	dowOffset=typeof(dowOffset)== 'int'?dowOffset:0;

var newYear=new Date(this.getFullYear(),0,1);

var day=newYear.getDay()- dowOffset;
day =(day>=0?day:day+7);

var weeknum,daynum=Math.floor((this.getTime()- newYear.getTime()-(this.getTimezoneOffset()-newYear.getTimezoneOffset())*60000)/86400000)+ 1;
if(day<4){
	weeknum=Math.floor((daynum+day-1)/7)+ 1;
if(weeknum>52){
	nYear=new Date(this.getFullYear()+ 1,0,1);
nday=nYear.getDay()- dowOffset;
nday=nday>=0?nday:nday+7;
weeknum=nday<4?1:53;
}}else{
	weeknum=Math.floor((daynum+day-1)/7);
}return weeknum;
};
Date.prototype.getUeDay=
function(){
	return parseInt(Math.floor((this.getTime()- this.getTimezoneOffset()* 60000)/86400000));
};
Date.prototype.dateFormat=
function(format){
	if(!format){
	format='m/d/Y';
}LZ=
function(x){
	return(x<0||x>9?'':'0')+ x};

var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Янв','Фев','Мар','Апр','Май','Июн','Июл','Авг','Сен','Окт','Ноя','Дек');

var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');

var result="";

var i_format=0;

var c="";

var token="";

var y=this.getFullYear().toString();

var M=this.getMonth()+1;

var d=this.getDate();

var E=this.getDay();

var H=this.getHours();

var m=this.getMinutes();

var s=this.getSeconds();
value ={
	Y:y.toString(),y:y.substring(2),n:M,m:LZ(M),F:MONTH_NAMES[M-1],M:MONTH_NAMES[M+11],j:d,d:LZ(d),D:DAY_NAMES[E+7],l:DAY_NAMES[E],G:H,H:LZ(H)};
if(H==0){
	value['g']=12;
}else if(H>12){
	value['g']=H-12;
}else{
	value['g']=H;
}value['h']=LZ(value['g']);
if(H>11){
	value['a']='pm';
value['A']='PM';
}else{
	 value['a']='am';
value['A']='AM';
}value['i']=LZ(m);
value['s']=LZ(s);
while(i_format<format.length){
	c=format.charAt(i_format);
token="";
while((format.charAt(i_format)==c)&&(i_format<format.length)){
	token += format.charAt(i_format++);
}if(value[token]!=null){
	 result=result+value[token];
}else{
	 result=result+token;
}}return result;
};

function addEventHandler(element,type,func){
	if(element.addEventListener){
	element.addEventListener(type,func,false);
}else if(element.attachEvent){
	element.attachEvent('on'+type,func);
}}
function removeEventHandler(element,type,func){
	if(element.removeEventListener){
	element.removeEventListener(type,func,false);
}else if(element.attachEvent){
	element.detachEvent('on'+type,func);
}}

function getTop(element)
{

var oNode=element;

var iTop=0;
while(oNode.tagName!='HTML'){
	iTop += oNode.offsetTop||0;
if(oNode.offsetParent){
	oNode=oNode.offsetParent;
}else{
	break;
}}return iTop;
}

function getLeft(element)
{

var oNode=element;

var iLeft=0;
while(oNode.tagName!='HTML'){
	iLeft += oNode.offsetLeft||0;
if(oNode.offsetParent){
	oNode=oNode.offsetParent;
}else{
	break;
}}return iLeft;
}
