//for format date='dd.mm.yyy'
var kbevent;
var cl_type = 0; // 0 - ie, 1 - mozilla

//for mozilla 1.7.4 ;-)
function isNavigatorNetscape() {
	return navigator.appName=="Netscape" && parseFloat(navigator.appVersion) >= 4.7;
}

function onKeyDateFormat(el,keyevent){
	resolveBrowserType(keyevent);
	if (isValidKey(cl_type == 0?event:kbevent)){
		var str = el.value;
		if (str.indexOf(',')!=-1) str = replaceComa(str);
		var separator = '.';
		var nol = '0';
		if (str.length==2){
		   if (str.substring(str.length-1,str.length)!=separator) {
			   if (!isValidDay(str)) return;
			   el.value = str+separator;
			   var rg;
			   if(document.selection){
			   		var rg  = document.selection.createRange();
			   		rg.move('character',str.length);
// RG.SELECT: There was a problem in Opera 9.5 with rg.select(): it moved cursor on start of input element.
// It is not clear what rg.select() considered to use for. This script works properly without it (tested in Opera 9.27, Opera 9.5, IE 7, Firefor 2.0.0.14, Firefox 3.0)		   		
				    //rg.select();
			   }else{
			 	  	//var selLength = el.textLength;
					//var selStart = el.selectionStart;
					//var selEnd = el.selectionEnd;
					//if (selEnd==1 || selEnd==2) selEnd=selLength;
					//var rg = (el.value).substring(selStart, selEnd).createRange();
					//var rg = el.createTextRange();
					//rg.move('character',str.length);
					//rg.select();
				}
			   return;
		   } else {
			   if (!isValidDay(str)) return;
		   	   el.value = nol+str;
		   	   if(document.selection){
			   	   var rg1  = document.selection.createRange();
			   	   rg1.move('character',str.length);
// RG.SELECT: see first commentar
				   //rg1.select();
				}
		   	   return;
		   }
		}

		if (str.length==5){
		   if (str.substring(str.length-1,str.length)!=separator) {
			   if (!isValidDayInMonth(str)) return;
			   el.value = str+separator;
			   if(document.selection){
				   var rg2  = document.selection.createRange();
				   rg2.move('character',str.length);
// RG.SELECT: see first commentar				   
				   //rg2.select();
				}
			   return;
		   } else {
			   if (!isValidDayInMonth(str.substring(0,str.length-1))) return;
		   	   tmp = str.substring(0,3);
		   	   el.value = tmp+nol+str.substring(3);
		  		if(document.selection){
			   	   var rg3  = document.selection.createRange();
			   	   rg3.move('character',str.length);
// RG.SELECT: see first commentar			   	   
				   //rg3.select();
				 }
		   	   return;
		   }
		}
		
		//not duple dot
		if (str.length==4 || str.length==7){
			if (str.substring(str.length-1,str.length)==separator && dotOnly(cl_type == 0?event:kbevent)){
				el.value = str.substring(0,str.length-1);
			}
		}
		
	} 
}



//for format date='mm.yyy'
function onKeyDateFormatShort(el,event){
	resolveBrowserType(event);
	if (isValidKey(cl_type == 0?event:kbevent)){
		var str = el.value;
		if (str.indexOf(',')!=-1) str = replaceComa(str);
		var tmp = '';
		var separator = '.';
		var nol = '0';
		if (str.length==2){
		   if (str.substring(str.length-1,str.length)!=separator) {
			   if (!isValidMonth(str)) return;
			   el.value = str+separator;
			   if(document.selection){
				   var rg2  = document.selection.createRange();
				   rg2.move('character',str.length);
// RG.SELECT: see first commentar				   
				   //rg2.select();
				}
			   return;
		   } else {
			   if (!isValidMonth(str.substring(0,str.length-1))) return;
		   	   el.value = nol+str;
		   	   if(document.selection){
			   	   var rg1  = document.selection.createRange();
			   	   rg1.move('character',str.length);
// RG.SELECT: see first commentar			   	   
				   //rg1.select();
				}
		   	   return;
		   }
		}
		//not duple dot
		if (str.length==4){
			if (str.substring(str.length-1,str.length)==separator && dotOnly(cl_type == 0?event:kbevent)){
				el.value = str.substring(0,str.length-1);
			}
		}
		
	} 
}

//for format date='tt.mm'
function onKeyDateFormatTTMM(el,keyevent){
	resolveBrowserType(keyevent);
	if (isValidKey(cl_type == 0?event:kbevent)){
		var str = el.value;
		if (str.indexOf(',')!=-1) str = replaceComa(str);
		var separator = '.';
		var nol = '0';
		if (str.length==2){
		   if (str.substring(str.length-1,str.length)!=separator) {
			   if (!isValidDay(str)) return;
			   el.value = str+separator;
			   var rg;
			   if(document.selection){
			   		var rg  = document.selection.createRange();
			   		rg.move('character',str.length);
			   }
			   return;
		   } else {
			   if (!isValidDay(str)) return;
		   	   el.value = nol+str;
		   	   if(document.selection){
			   	   var rg1  = document.selection.createRange();
			   	   rg1.move('character',str.length);
				}
		   	   return;
		   }
		}
	} 
}

//for format date='dd.mm.yyy'
function onBloorDateFormat(el){
		var str = el.value;
		var separator = '.';
		var nol = '0';
		var tmp = '';
		if (str.length<8) return;
		if (str.length==8 && str.substring(3,4)!='.'){
			var y = parseInt(str.substring(6),10);
			
			if (!isNaN(y)){
				tmp = str.substring(0,6);
				if (y<=30) {
					var sy = '';
					if (y<10) sy=nol+y;
					else sy=y;
					el.value = tmp+'20'+sy;
				} else {
					el.value = tmp+'19'+y;
				}
			}
			else return;
		}
}


//for format date='mm.yyy'
function onBloorDateFormatShort(el){
		var str = el.value;
		var separator = '.';
		var nol = '0';
		var tmp = '';
		if (str.length<5) return;
		if (str.length==5){
			
			var y = parseInt(str.substring(3),10);
			
			if (!isNaN(y)){
				tmp = str.substring(0,3);
				if (y<=30) {
					var sy = '';
					if (y<10) sy=nol+y;
					else sy=y;
					el.value = tmp+'20'+sy;
				} else {
					el.value = tmp+'19'+y;
				}
			}
			else return;
		}
}

//for format date='tt.mm'
function onBloorDateFormatTTMM(el){
}

function isValidKey(evt){
	 return numeralsOnly(evt)||dotOnly(evt);
}

function numeralsOnly(evt) {
//    evt = (evt) ? evt : (cl_type == 0?event:kbevent);
//    var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode : 
//       ((evt.which) ? evt.which : 0));
	var charCode = getKeyCode(evt);
    if (charCode < 58 && charCode > 47) {
        return true;
    }
    
	if (charCode < 106 && charCode > 95) {
		return true;
	}
	
    return false;
}

function dotOnly(evt) {
//    evt = (evt) ? evt : (cl_type == 0?event:kbevent);
//    var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode : 
//        ((evt.which) ? evt.which : 0));
	var charCode = getKeyCode(evt);
    if ((charCode == 188 || charCode == 44 || charCode == 78 || charCode == 46 || charCode == 190 || charCode == 191 ||  charCode ==110 || charCode == 59 || charCode == 186)) {
        return true;
    }
    return false;
}

function getKeyCode(evt) {
    evt = (evt) ? evt : (cl_type == 0?event:kbevent);
    return (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode : ((evt.which) ? evt.which : 0));
}

function moveCursor(length) {
	if(document.selection){
		var rg = document.selection.createRange();
		rg.move('character', length);
// RG.SELECT: see first commentar		
		//rg.select();
	}
}

function isValidDay(str_dd){
	var dd = parseInt(str_dd,10);
		if (!isNaN(dd)){
		  if (dd>31 || dd <1) return false;
		} else {
		  return false;
		}
	return true;	
}

function isValidMonth(str_mm){
	var mm = parseInt(str_mm,10);
		if (!isNaN(mm) || mm!='' ){
		  if (mm>12 || mm <1) return false;
		} else {
		  return false;
		}
	return true;	
}

function isValidDayInMonth(str_dd_mm){
	var s_mm = str_dd_mm.substring(3);
	if (!isValidMonth(s_mm)) return false;
	var s_dd = str_dd_mm.substring(0,2);
	if (!isValidDay(s_dd)) return false;
	
	var d = parseInt(s_dd,10);
	var m = parseInt(s_mm,10);

	if (d<=31 && (m==1||m==3||m==5||m==7||m==8||m==10||m==12)) return true;
	if (d<=30 && (m==4||m==6||m==9||m==11)) return true;
	if (d<=29 && m==2) return true;
	return false;
}

function replaceComa(str){
	var tmp = '';
	if (str.substring(str.length-1,str.length)==',')
		tmp = str.substring(0,str.length-1)+'.';
	else 
	    tmp = str;	
	return tmp;
}

function isValidDate(strDatum) {
	re = new RegExp("^([0-9]){1,2}\\.([0-9]){1,2}\\.([0-9]){4}$");
	return re.test(strDatum);
}

function trimString(str){
   var rab = str;
   while (rab.charAt(0)==" "){
      rab = rab.substring(1,rab.length);
   }
   while (rab.charAt(rab.length-1)==" "){
      rab = rab.substring(0,rab.length-1);
   }
   return rab;
}

function onKeyDateTimeFormat(el, keyevent){
	resolveBrowserType(keyevent);	
	
//	opera.postError(getKeyCode(keyevent));
	
	var lastChar = el.value.substring(el.value.length - 1, el.value.length);
	if (el.value.length < 11) {
		if (el.value.length > 8 && lastChar == ' ') {
			el.value = el.value.substring(0, el.value.length-1);
			onBloorDateFormat(el);
			el.value = el.value + " ";
			moveCursor(el.value.length);
		} else {
			onKeyDateFormat(el, keyevent);
		}
	}
	
	if (el.value.length > 11 && isValidKey(cl_type == 0 ? event : kbevent)) {
		var str = el.value;
		if (str.length == 13) {
			if (lastChar != ':') {
				if (isValidHour(str.substring(10, 13))) {
					str = str + ":";
					el.value = str;
					moveCursor(str.length);
				}
			} else {
				var hour = str.substring(11, 13);
				if (isValidHour(hour)) {
					str = str.substring(0, 11) + "0" + hour;
					el.value = str;
					moveCursor(str.length);
				}
			}
		
		 
		}
	}

}

function isValidHour(str) {
	var h = parseInt(str, 10);
	if (!isNaN(h)) {
		if (h < 0 || h > 24) return false; 
		return true;
	}
	return false;
}

function isValidMinutes(str) {
	var m = parseInt(str, 10);
	if (!isNaN(m)) {
		if (m < 0 || m > 60) return false; 
		return true;
	}
	return false;
}

function onBloorDateTimeFormat(el) {
	el.value = trimString(el.value);
	if (el.value.length < 11) {
		onBloorDateFormat(el);
		if (isValidDate(el.value)) {
			el.value = el.value + " 00:00";
		}
	} else {
		var spacepos = el.value.indexOf(' ');
		if (spacepos > 0) {
			var time = el.value.substring(spacepos + 1, el.value.length);
			var separator = time.indexOf(':');
			if (separator > 0) {
				var hour = time.substring(0, separator);
				var minutes = time.substring(separator + 1, time.length);
				if (isValidHour(hour) && isValidMinutes(minutes)) {
		//opera.postError(hour + '--' + minutes);
					if (hour.length < 2) {
						hour = "0" + hour;
					}
					if (minutes.length < 2) {
						minutes = "0" + minutes;
					}
					el.value = el.value.substring(0, spacepos + 1) + hour + ":" + minutes;;
				}
			}
		}
	}
}

function resolveBrowserType(keyevent){
	try{
		if(keyevent instanceof KeyboardEvent){
			//Mozilla
			kbevent = keyevent;
			cl_type=1;
			return;
		}
	}catch(err){
		//using poor IE
		cl_type=0;
		return;
	}
	
	if(isNavigatorNetscape()){
		kbevent = keyevent;
		cl_type=1;
		return;
	}
}

