_currFragment="d";
var _currDate;
var _currInput;
var _Months_ru_ru=new Array("Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь");

window.onload=loadDocument;
function loadDocument(){
//document.body.innerHTML+='<div id="_calendur" style="position:absolute;top:0;left:0;z-index:1000;background-color:white"></div>';
/* by illion */
	var div = document.createElement('DIV');
	div.style.position = 'absolute';
	div.style.zIndex = 1000;
	//div.style.background = "#fff";
	div.id = "_calendur";
	document.body.appendChild(div);

for(i=0;i<document.forms.length;i++){
for(j=0;j<document.forms[i].elements.length;j++){
if(document.forms[i].elements[j].className=="dateInput") setDate(document.forms[i].elements[j]);
if(document.forms[i].elements[j].className=="floatInput") setFloat(document.forms[i].elements[j]);
}
}
}

function setDate(el){
//el.onpaste=function(){return false;}
if(window.navigator.appName=="Opera") el.onkeypress=checkDate;
else
 el.onkeydown=checkDate;
//el.onkeypress=function(){return false;}
el.onmousemove=move;
el.onmouseup=up;
el.onclick=clc;
el.onblur=lost;
el.onfocus=ent;
}

function setFloat(el){
el.onkeydown=checkDate;
el.onkeypress=function(){return false;}
el.onmousemove=move;
el.onmouseup=up;
el.onclick=clc;
el.onblur=lost;
el.onfocus=ent;
}






function checkDate(evt){
var ev = window.event || evt;
var el = ev.target || ev.srcElement;

val=el.value;

if(ev.keyCode==32){
	_currDate=new Date();
	el.value=addZero(_currDate.getDate())+'.'+addZero(_currDate.getMonth()+1)+'.'+_currDate.getFullYear();
	selectDay(el);
	if(document.getElementById("_calendur").innerHTML!="") calCreate(document.getElementById("_calendur"),_currDate);
	return false;
}
else{
if(val.length==10){
if(_currDate==null)
	_currDate=new Date(val.substr(6,4),val.substr(3,2)-1,val.substr(0,2));
}
}



if(ev.keyCode==9) return true;

if((ev.keyCode==46)||(ev.keyCode==8)){
if((selLen(el)>=10)||(val.length<10)) return true;
else {el.value=""; _currDate=new Date(); document.getElementById("_calendur").innerHTML="";}
}

if(ev.keyCode==37){
if(val.length<10) return false;
if(_currFragment=="y"){selectMonth(el); _currFragment="m"; return false;}
if(_currFragment=="m"){selectDay(el); _currFragment="d"; return false;}
return false;
}

if(ev.keyCode==39){
if(val.length<10) return true;
if(_currFragment=="d"){selectMonth(el); _currFragment="m"; return false;}
if(_currFragment=="m"){selectYear(el); _currFragment="y"; return false;}
return false;
}

if(ev.keyCode==38){
if(val.length<10) return true;

if(_currFragment=="d"){
	_currDate.setDate(_currDate.getDate()+1);
	el.value=addZero(_currDate.getDate())+'.'+addZero(_currDate.getMonth()+1)+'.'+_currDate.getFullYear();
	selectDay(el);
}
if(_currFragment=="m"){
	_currDate.setMonth(_currDate.getMonth()+1);
	el.value=addZero(_currDate.getDate())+'.'+addZero(_currDate.getMonth()+1)+'.'+_currDate.getFullYear();
	selectMonth(el);
}
if(_currFragment=="y"){
	_currDate.setYear(_currDate.getFullYear()+1);
	el.value=addZero(_currDate.getDate())+'.'+addZero(_currDate.getMonth()+1)+'.'+_currDate.getFullYear();
	selectYear(el);
}
if(document.getElementById("_calendur").innerHTML!="") calCreate(document.getElementById("_calendur"),_currDate);
return false;
}

if(ev.keyCode==40){
if(val.length<10) return true;

if(_currFragment=="d"){
	_currDate.setDate(_currDate.getDate()-1);
	el.value=addZero(_currDate.getDate())+'.'+addZero(_currDate.getMonth()+1)+'.'+_currDate.getFullYear();
	selectDay(el);
}
if(_currFragment=="m"){
	_currDate.setMonth(_currDate.getMonth()-1);
	el.value=addZero(_currDate.getDate())+'.'+addZero(_currDate.getMonth()+1)+'.'+_currDate.getFullYear();
	selectMonth(el);
}
if(_currFragment=="y"){
	_currDate.setYear(_currDate.getFullYear()-1);
	el.value=addZero(_currDate.getDate())+'.'+addZero(_currDate.getMonth()+1)+'.'+_currDate.getFullYear();
	selectYear(el);
}
if(document.getElementById("_calendur").innerHTML!="") calCreate(document.getElementById("_calendur"),_currDate);
return false;
}
/*
ss=String.fromCharCode(ev.keyCode)+"";
reg=/[^0-3]/g;
if((val.length==0)&&(ss.match(reg))) return false;
reg=/[^0-9]/g;
if((val.length==1)&&(ss.match(reg))) return false;
if(val.length==1) day=parseInt(""+(val.substr(0,1)=="0" ? "": val.substr(0,1))+ss);
if((val.length==1)&&(day>31)) return false;
if(val.length==2) {el.value+="."; return false;}
reg=/[^0-1]/g;
if((val.length==3)&&(ss.match(reg))) return false;
reg=/[^0-9]/g;
if((val.length==4)&&(ss.match(reg))) return false;
if(val.length==4) month=parseInt(""+(val.substr(3,1)=="0" ? "": val.substr(3,1))+ss)-1;
if((val.length==4)&&(month>12)) return false;
if(val.length==5)  {el.value+="."; return false;}
reg=/[^1-9]/g;
if((val.length==6)&&(ss.match(reg))) return false;
reg=/[^0-9]/g;
if((val.length==7)&&(ss.match(reg))) return false;
if((val.length==8)&&(ss.match(reg))) return false;
if((val.length==9)&&(ss.match(reg))) return false;
if(val.length>9) return false;
if(val.length==9) {
year=parseInt(""+val.substr(6,3)+ss);
el.value+=ss;
try{
_currDate=new Date(year,month,day);
}
catch(e){alert("Ошибка в дате!"); el.value=""; return false;}
el.value=addZero(_currDate.getDate())+'.'+addZero(_currDate.getMonth()+1)+'.'+_currDate.getFullYear();
selectDay(el);
if(document.getElementById("_calendur").innerHTML!="") calCreate(document.getElementById("_calendur"),_currDate);
return false;}
*/
//alert(ev.keyCode);
ss = (ev.keyCode==190 || ev.keyCode==191 || ev.keyCode==46 || ev.keyCode==47)?'.':((ev.keyCode < 96)?ev.keyCode-48:ev.keyCode-96);
if((ss=='.')&&((val.length==0)||(val.substr(val.length-1,1)=='.')||(val.length>4))) return false;
if (!/^[0-9.]$/.test(ss) || (val.lenght>=6 && !/^[0-9]$/.test(ss)) ) return false; 
var newValue = val + ss;
if (val.length == 0 && ss > 3) newValue = '0' + ss + '.';
if (val.length == 1) newValue = (ss=='.')?('0'+newValue):(newValue+'.'); 
if ((day = parseInt(newValue.substr(0,2),10)) > 31) return false;
if (val.length == 3 && ss > 1) newValue = el.value + '0' + ss + '.'; 
if (val.length == 4) newValue = (ss=='.')?(el.value.substr(0,3)+'0'+el.value.substr(3,1)+'.'):(el.value + ss +'.');
if ((month = parseInt(newValue.substr(3,2),10)-1) > 12) return false;
if (val.length>9) return false;
if (newValue.length == 10)
{
  year = parseInt(newValue.substr(6,4));
  try{ _currDate=new Date(year,month,day); }
  catch(e){alert("Ошибка в дате!"); el.value=""; return false;}
  el.value=setValue(_currDate);
  selectDay(el);
  if(document.getElementById("_calendur").innerHTML!="") calCreate(document.getElementById("_calendur"),_currDate);
}
else {el.value = newValue;
if(el.selectionStart!=null) {el.selectionStart=el.value.length;el.selectionEnd=el.value.length;}
}
return false;

}

function setValue(date) { return addZero(date.getDate())+'.'+addZero(date.getMonth()+1)+'.'+date.getFullYear(); }

function selectDay(el){
if (el.selectionStart==null){
	rng=el.createTextRange();
	rng.move("character",0);
	rng.moveEnd("character",1);
	rng.expand("character");
	rng.select();
}
else{
	el.selectionStart=0;
	el.selectionEnd=2;
}
_currFragment="d";
}

function addZero(n){
if(n.toString().length<2) return ""+"0"+n;
else return ""+n;
}

function selectMonth(el){
if (el.selectionStart==null){
	rng=el.createTextRange();
	rng.move("character",3);
	rng.moveEnd("character",1);
	rng.expand("character");
	rng.select();
}
else{
	el.selectionStart=3;
	el.selectionEnd=5;
}
}

function selectYear(el){
if (el.selectionStart==null){
	rng=el.createTextRange();
	rng.move("character",6);
	rng.moveEnd("character",3);
	rng.expand("character");
	rng.select();
}
else{
	el.selectionStart=6;
	el.selectionEnd=10;
}
}

function selLen(el){
if (el.selectionStart==null){
	return document.selection.createRange().text.length;
}
else{
	return el.selectionEnd-el.selectionStart;
}
}

function lost(evt){
var ev = window.event || evt;
var el = ev.target || ev.srcElement;
if(el.value.length<10) el.value="";
document.getElementById("_calendur").innerHTML="";

}


function ent(evt){
var ev = window.event || evt;
var el = ev.target || ev.srcElement;

if(el.value.length==10) selectDay(el);
_currInput=el;
}

function move(evt){
var ev = window.event || evt;
var el = ev.target || ev.srcElement;
var leftPos = 0;
obj=el;
while( obj.tagName != "BODY" && obj.tagName != "HTML")
{
      leftPos += obj.offsetLeft;
      obj = obj.offsetParent;
}

if(leftPos+parseInt(el.clientWidth)-parseInt(ev.clientX)<=16) el.style.cursor="pointer";
else el.style.cursor="text";
}

function clc(evt){
var ev = window.event || evt;
var el = ev.target || ev.srcElement;

var leftPos = 0;
var topPos = el.offsetHeight;
obj=el;
while( obj.tagName != "BODY" && obj.tagName != "HTML")
{
      leftPos += obj.offsetLeft;
      topPos += obj.offsetTop;
      obj = obj.offsetParent;
}
if (leftPos+parseInt(el.clientWidth)-parseInt(ev.clientX)<=16){
 cal=document.getElementById("_calendur");
if (el.value.length==10) _currDate=new Date(el.value.substr(6,4),el.value.substr(3,2)-1,el.value.substr(0,2));
 calCreate(cal,_currDate);
 cal.style.top=topPos+'px';
 cal.style.left=leftPos+'px';
}
}

function calCreate(el,curr){
if(curr==null) curr=new Date();
first=new Date(curr);
first.setDate(1);
last=new Date(curr);
last.setDate(first.getDay()+32);
last.setDate(0);
wrk=new Date(curr);
n=first.getDay();
n=n==0?7:n;
html="<center>"+
"<table class='dropDown'  border='0'   cellpadding='0' cellspacing='2'><tr><td width='18'><img src='images/butl.gif' onmousedown='yearLeft();' style='cursor:pointer;'></td>"+
"<td class='year'>"+
curr.getFullYear()+"г.</td><td width='18'><img src='images/butr.gif' align='right' onmousedown='yearRight(); return false;'  style='cursor:pointer'></td></tr>"+
"<tr><td><img src='images/butl.gif' onmousedown='monthLeft(); return false;' style='cursor:pointer'></td>"+
"<td class='month'>"+_Months_ru_ru[curr.getMonth()]+
"</td><td><img src='images/butr.gif' align='right' onmousedown='monthRight(); return false;' style='cursor:pointer'></td></tr></table></center>"+
"<table class='days' border='1' cellpadding='2' style='border-collapse:collapse;cursor:pointer' onmousedown='tableClick(event); return false;'>"+
"<tr><th>Пн</th><th>Вт</th><th>Ср</th><th>Чт</th><th>Пт</th><th>Сб</th><th>Вс</th></tr>";
for(j=0;(wrk.getDate()<=last.getDate())&&(wrk.getMonth()==last.getMonth());j++){
html+="<tr>";
for(i=j*7-n+2;i<9-n+j*7;i++){
wrk=new Date(curr);
wrk.setDate(i);

if(wrk.getMonth()!=curr.getMonth()) {html+="<td class='otherMonth'>"+wrk.getDate()+"</td>";}
else{
 if(wrk.getDate()==curr.getDate())  {html+="<td class='currentDay'>"+wrk.getDate()+"</td>";}
 else {html+="<td onmouseover='dayOver(this);' onmouseout='dayOut(this);' class='daysOfMonth'>"+wrk.getDate()+"</td>";}
 }

}
html+="</tr>";
}
document.getElementById("_calendur").innerHTML=html+"</table>";
document.getElementById("_calendur").firstChild.firstChild.style.width=document.getElementById("_calendur").lastChild.clientWidth;
}

function dayOver(el){
el.className="dayOver";
}

function dayOut(el){
el.className="daysOfMonth";
}

function up(evt){
var ev = window.event || evt;
var el = ev.target || ev.srcElement;

if (el.selectionStart==null){
rng=document.selection.createRange();
rng.expand("word");
if(rng.text==".") rng.move("character",1);
rng.expand("word");
rng.moveStart("character",-1);
if(rng.text.length==5) {selectYear(el); _currFragment="y"; return;}
if(rng.text.length==3) {selectMonth(el); _currFragment="m"; return;}
_currFragment="d";
selectDay(el);
}
else{
if(el.selectionStart<=2) {selectDay(el); _currFragment="d"; return;}
if(el.selectionStart>=6) {selectYear(el); _currFragment="y"; return;}
_currFragment="m";
selectMonth(el);
}
}
function tableClick(evt){
var ev = window.event || evt;
var el = ev.target || ev.srcElement;
if(el.tagName=="TD"){
if (el.className=="otherMonth") {document.getElementById("_calendur").innerHTML="";
	return false;}
if(_currDate==null) _currDate=new Date();
_currInput.value=addZero(el.innerHTML)+'.'+addZero(_currDate.getMonth()+1)+'.'+_currDate.getFullYear();
_currDate.setDate(el.innerHTML);
}
document.getElementById("_calendur").innerHTML="";
}
function monthLeft(){
if(_currDate==null) _currDate=new Date();
_currDate.setMonth(_currDate.getMonth()-1);
_currInput.value=addZero(_currDate.getDate())+'.'+addZero(_currDate.getMonth()+1)+'.'+_currDate.getFullYear();
selectMonth(_currInput); _currFragment="m";
calCreate(_currInput,_currDate);
}

function monthRight(){
if(_currDate==null) _currDate=new Date();
_currDate.setMonth(_currDate.getMonth()+1);
_currInput.value=addZero(_currDate.getDate())+'.'+addZero(_currDate.getMonth()+1)+'.'+_currDate.getFullYear();
selectMonth(_currInput); _currFragment="m";
calCreate(_currInput,_currDate);
}
function yearLeft(){
if(_currDate==null) _currDate=new Date();
_currDate.setFullYear(_currDate.getFullYear()-1);
_currInput.value=addZero(_currDate.getDate())+'.'+addZero(_currDate.getMonth()+1)+'.'+_currDate.getFullYear();
selectYear(_currInput); _currFragment="y";
calCreate(_currInput,_currDate);
}
function yearRight(){
if(_currDate==null) _currDate=new Date();
_currDate.setFullYear(_currDate.getFullYear()+1);
_currInput.value=addZero(_currDate.getDate())+'.'+addZero(_currDate.getMonth()+1)+'.'+_currDate.getFullYear();
selectYear(_currInput); _currFragment="y";
calCreate(_currInput,_currDate);
}
