UICalendar = {
setup : function (params){
	var inp = document.getElementById(params.input) || document.getElementsByName(params.input)[0];
	var but = document.getElementById(params.button);
		but.tabIndex = "-1";
		but.input = inp;
		but.onclick = function () { UICalendar.show(this.input); }
},
daysCount : new Array(31,28,31,30,31,30,31,31,30,31,30,31),
dayName : new Array("П","В","С","Ч","П","С","В"),
monthName : new Array("Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"),
popup : null,
themepath : "",
show : function(input)
{
  	this.invalidate(input);
  	var val = ( input.value == "" ? new Date() : this.strToDate(input.value) );
	
	UIPopup.onInit = function (){
		if(UIPopup.type == "POPUP")
		UIPopup.popup.document.write("\
			<html>\
				<head>\
					<link rel=\"stylesheet\" type=\"text/css\" href=\""+UICalendar.themepath+"style/UICalendar.css\" charset=\"windows-1251\">\
				</head>\
				<body scroll=\"no\" style=\"border-style:none;margin:0px;padding:0px\">\
					<div class=\"datepicker_canvas\"/>\
				</body>\
			</html>");
		 else UIPopup.popup.document.className = "datepicker_canvas"
	}
	
	this.popup = UIPopup.getInstance();

	if(UIPopup.type == "POPUP")	canvas = this.popup.document.body.firstChild;
	else canvas = this.popup.document;
	
	this.drawUICalendar(canvas, val.getMonth(), val.getFullYear(), input.value, function(v){input.value = v; UICalendar.popup.hide();});
	
	if(UIPopup.type == "POPUP")
	{
		this.popup.show(0, 0 + input.offsetHeight, 0, 0, input);
		this.popup.hide();
	}
	
	this.popup.show(0, input.offsetHeight, 183, 178, input);
},
listen : function (input)
{
  if(event.keyCode == 13)
  {
	if(input.value == "") input.value = this.dateToStr(new Date()); // today 
	else this.invalidate(input);
  }
},
invalidate : function (input)
{
  if(!this.validate(input.value)) input.value = '';
},
validate : function (datetxt)
{
  var now = new Date();
  var m=now.getMonth() + 1;
  var y=now.getFullYear();
  var d;
  var s=datetxt.replace(/^\s*/,'').replace(/\s*$/,'');
  var ss='';
  var h=0; 
  var n=0; 
  var c=1;
  for(var i=0;i<s.length;i++){if(parseFloat(s.charAt(i))<10){ss+=s.charAt(i);}else{ss+='.';}}
  s=ss;
  if(s.indexOf('.')<1 && s.length>2){s=s.substr(0,2)+'.'+s.substr(2,2)+'.'+s.substr(4,4);};
  if(s.indexOf('.')<1){
   d=Number(s);
  }else{
   d=Number(s.substring(0,s.indexOf('.')));
   s=s.substring(s.indexOf('.')+1);
   if(s.indexOf('.')<1){
	m=Number(s);  
   }else{
	m=Number(s.substring(0,s.indexOf('.')));
	s=s.substring(s.indexOf('.')+1);
	if(s.indexOf('.')<1){
	 y=Number(s);
	}else{
	 y=Number(s.substring(0,s.indexOf('.')));
	 s=s.substring(s.indexOf('.')+1);
	 if(s.indexOf('.')<1){
	  h=Number(s);
	 }else{
	  h=Number(s.substring(0,s.indexOf('.')));
	  s=s.substring(s.indexOf('.')+1);
	  if(s.indexOf('.')<1){
	   n=Number(s);
	  }else{
	   n=Number(s.substring(0,s.indexOf('.')));
	   s=s.substring(s.indexOf('.')+1);
	   if(s.indexOf('.')<1){
		c=Number(s);
	   }else{
		c=Number(s.substring(0,s.indexOf('.')));
	   };
	  } 
	 }
	}
   }  
  }
  if(y<999){if(y<31||y>99){y+=2000;}else{y+=1900;};};
  s=((d<10)?'0'+d:d)+'.'+((m<10)?'0'+m:m)+'.'+y;
  var D=new Date(y,m-1,d);
  if(h>=0 && h<24 && n>=0 && n<60 && c>=0 && c<60 && (c+n+h>1)){
   s+=' '+((h<10)?'0'+h:h)+':'+((n<10)?'0'+n:n)+':'+((c<10)?'0'+c:c);
  };
  if((d==D.getDate())&&(m-1==D.getMonth())&&(y==D.getFullYear())) return s;

  return false
},
getUICalendar : function (document, month, year, currval, onSelectDate)
{
  var today = this.dateToStr(new Date());
  var UICalendar = document.createElement("TBODY");
  var d = new Date(year,month,1);
  var fDay = d.getDay() - 1;
  var lDay = this.getCountDays(month,year) + fDay;
  var td,tr = null;
  var day = 0;
  for( var j=0; j < 6; j++)
  {
   tr = document.createElement("TR");
   for( var i=0; i < 7; i++ )
   {
	 td = document.createElement("TD");
	 tr.appendChild(td);
	 if( fDay <= day && day  < lDay ) 
	 {
	   td.innerHTML = day - fDay + 1;
	   td.cdate = ( td.innerHTML > 9 ? td.innerHTML : "0" + td.innerHTML ) + "." +( (month + 1) > 9 ? (month + 1) : "0" + (month+1))  + "." + year;
	   td.onclick = function (){onSelectDate(this.cdate);};
	   td.onmouseover = function (){ this.oldClassName = this.className; this.className = "datepicker_hover"; };
	   td.onmouseout = function (){ this.className = this.oldClassName; };
	   if( (day - 6)%7 == 0 || (day - 5)%7 == 0 ) 
		 td.className = "datepicker_weekend";
	   if( td.cdate == today ) 
		 td.style.fontWeight = "bold";
	   if( td.cdate == currval ) 
		 td.style.borderColor = "highlight";
	 }
	 day++;
   }
   UICalendar.appendChild(tr);
  }
  return UICalendar;
},
drawUICalendar : function (canvas, month, year, currval, onSelectDate)
{
  var document = canvas.ownerDocument;
  
  canvas.innerHTML = "";

  var tr,td,th,but;
  var table = document.createElement("TABLE");
  table.className = "datepicker_table";
  table.cellPpacing = 0;
  table.cellSpacing = 1;
  
  // Header
  var tbody = document.createElement("TBODY");
  tr = document.createElement("TR");
  tr.className = "datepicker_header";
   
  td = document.createElement("TD");
  but = document.createElement("BUTTON");
  but.innerHTML = "<img src='"+UICalendar.themepath+"style/UICalendar_arrow.left.blue.png'/>";
  but.objRef = this;
  but.onclick = function () 
  { 
	year--; 
	this.objRef.drawUICalendar(canvas, month, year, currval, onSelectDate);
  }
  td.appendChild(but);
  tr.appendChild(td);

  td = document.createElement("TD");
  but = document.createElement("BUTTON");
  but.innerHTML = "<img src='"+UICalendar.themepath+"style/UICalendar_arrow.left.png'/>";
  but.objRef = this;
  but.onclick = function () 
  { 
	month--;
	if(month < 0){ month = 11; year--; } 
	this.objRef.drawUICalendar(canvas, month, year, currval, onSelectDate);
  }
  td.appendChild(but);
  tr.appendChild(td);
   
  th = document.createElement("TD");
  th.colSpan = 3;
  th.innerHTML = "<span style='color:#06f'>" + year + "</span><br>" + this.monthName[month];
  tr.appendChild(th);
   
  td = document.createElement("TD");
  but = document.createElement("BUTTON");
  but.innerHTML = "<img src='"+UICalendar.themepath+"style/UICalendar_arrow.right.png'/>";
  but.objRef = this;
  but.onclick = function () 
  {
	month++;
	if(month > 11){ month = 0; year++; }
	this.objRef.drawUICalendar(canvas, month, year, currval, onSelectDate);
  }
  td.appendChild(but);
  tr.appendChild(td);
   
  td = document.createElement("TD");
  but = document.createElement("BUTTON");
  but.innerHTML = "<img src='"+UICalendar.themepath+"style/UICalendar_arrow.right.blue.png'/>";
  but.objRef = this;
  but.onclick = function () 
  {
	year++;
	this.objRef.drawUICalendar(canvas, month, year, currval, onSelectDate);
  }
  td.appendChild(but);
  tr.appendChild(td);

  tbody.appendChild(tr);
  
  tr = document.createElement("TR");
  tr.className = "datepicker_week";
  for(var k = 0 ; k < this.dayName.length; k++)
  {
	td = document.createElement("TD");
	td.innerHTML = this.dayName[k];
	tr.appendChild(td);
  }   
  tbody.appendChild(tr);

  table.appendChild(tbody);
  table.appendChild(this.getUICalendar(document, month, year, currval, onSelectDate));

  canvas.appendChild(table);
},
dateToStr : function(date)
{
  var d = date.getDate(date);
  var m = date.getMonth(date) + 1;
  var y = date.getFullYear(date);
  return (d > 9 ? d : "0" + d) + "." + (m > 9 ? m : "0" + m ) + "." + y;
},
strToDate : function(str)
{
  var d = new Date();
  d.setFullYear(str.substr(6, 4));
  d.setMonth(str.substr(3, 2)-1);
  d.setDate(str.substr(0, 2));
  return d;
},
getCountDays : function(month, year) 
{
  if (month == 1) 
	return (year % 4 == 0) ? 29 : 28;
  return this.daysCount[month];
}
}