// Title: datecheck.js
// Created by:		Dmitry Shats
// Created Date:	Sep 15, 2004
//
// Edited by:		Dmitry Shats
// Edited Date:		Sep 15, 2004
//
// Description: 	Validate a text element for right date format
//					Validate a text element for any data
// Version: 1.1 (testing)



// <INPUT NAME="date"  TYPE="text" onFocus="setupDate(this);"  > 
//  Script Setup  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////

var ifErrorObjBg = 0; 				//Color Background if an error (0 - if disable)
var ifNotErrorObjBg = 0;			//Color Background if NO errors (0 - if disable) "white"
var defaultDateFormat = "M-D-Y";		//Default Date Format

var defaultDelimeter = "-"				//Default date Delimeter (DO NOT delimeter which is a system char for Regular Expression)
var showErrorDiv = 1;					//Show an error message below the object
var allowFutureDate = 0;				//Validate entered date if it is future date
var minYear = 1760;						//minimum allowed  year (0 - if disable)

var divTextColor = "#FF0000";			// Error Message text color (HEX)
var divTextSize = "12px";				// Error Message text size (px|pt)
var divTextFamily = "Arial";			// Error Message Font name

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


var errorMessage = new Array();
	errorMessage[0] = "Wrong Date Format";					//DateMask does not much
	errorMessage[1] = "Wrong Date";							//Date Does Not Exist 
	errorMessage[2] = "Future date is not allowed";			//Check if date is future date
	errorMessage[3] = "Invalid year";						//Check Minimum Year
	errorMessage[4] = "Please enter right data";
	errorMessage[5] = "";
	errorMessage[6] = "";
	errorMessage[7] = "";

var errorMessageNumber =-1;



document.writeln('<STYLE TYPE="text/css">');
document.writeln('.DateErrorDiv {');
document.writeln('font-family: '+divTextFamily+';');
document.writeln('font-size: '+divTextSize+';');
document.writeln('color: '+divTextColor+';');
document.writeln('</STYLE>');	


function _IsFutureDate(str1)
     {
          re = /(\d{1,2})\/(\d{1,2})\/(\d{4})/ //string in DD/MM/YYYY format
          var arr = re.exec( str1 );
          var dt1 = new Date( parseInt(arr[3]), parseInt(arr[2], 10) - 1, parseInt(arr[1], 10) );
     
          return dt1 > new Date();
     }
function _isValidDate(dateStr, format, required) { 
	if (required ==null)if(dateStr=="")return true;
	if(!format) format = defaultDateFormat;
   format = format.toUpperCase();
   list = format.split("-");
   regArray = new Array();
   for (var i=0;i<list.length;i++)
		if(list[i] == "Y"){regArray[i] = "d{4}"}else{regArray[i] = "d{1,2}"}

   var regxp = new RegExp("^\\"+regArray[0]+"(\\-|\\/|\\.|\\s)\\"+regArray[1]+"\\1\\"+regArray[2]+"$");
   if (regxp.test(dateStr) == false ) {errorMessageNumber=0; return false;}
   var parts = dateStr.split(RegExp.$1); 
   for (var n=0;n<parts.length;n++)
   	{
		if(list[n] == "M") numMonth = parts[n];
		if(list[n] == "D") numDay = parts[n];
		if(list[n] == "Y") numYear = parts[n];
	}
	var dateToCheck = new Date(numYear,numMonth-1,numDay);
	if(dateToCheck.getMonth() != (numMonth-1)){errorMessageNumber=1;return false;}
	if(allowFutureDate!=null)if (allowFutureDate == 0)if(_IsFutureDate(numDay+"/"+numMonth+"/"+numYear)){errorMessageNumber=2;return false;}
	if(minYear!=null)if (minYear != 0)if (numYear <=minYear) {errorMessageNumber=3;return false;}
   return true;
}

function _formatDate(obj,strValue) {
  var	objRegExp  = new RegExp('([0-9]+)([^y])([0-9]+)([^y])([0-9]+)');
	 	strValue = strValue.replace(objRegExp, '$1'+defaultDelimeter+'$3'+defaultDelimeter+'$5');  
	 	objRegExp  = new RegExp('(^[0-9]{1}'+defaultDelimeter+')');
	  	strValue = strValue.replace(objRegExp, '0$1');
		var regtmp = '('+defaultDelimeter+')([0-9]{1}'+defaultDelimeter+')';
	 	objRegExp  = new RegExp(regtmp);
	  	strValue = strValue.replace(objRegExp, '$10$2');
 		obj.value = strValue;
}

function _findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function _findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}


function _checkNumInput(key)
{
	if (key >= 65 & key <=90 )return false;
}
function _checkSpecInput(keyCode,keyName)
{
	if (keyCode==222 || keyCode == 16 || keyCode == 219 || keyCode == 221|| keyCode == 188 || keyCode == 192 || keyCode == 220 || keyCode == 191 )return false;
}


function _createDiv(name,msg)
{
	var IE=(document.all)?1:0;
	if (!document.getElementById(name)) {
      if (IE) {
        newDiv=document.createElement("DIV");
        newDiv.setAttribute("id",name);
		newDiv.innerHTML=msg;
		
		document.body.appendChild(newDiv);
      	} else {
		d=document.createElementNS("http://www.w3.org/1999/xhtml","div");
       	d.setAttribute("id",name);
		newDiv.innerHTML=msg;
		document.body.appendChild(newDiv); 
		}
		document.getElementById(name).className="DateErrorDiv";
	}
}

function _showDiv(obj,name,msg)
{
	if (!document.getElementById(name)) 
		{
			_createDiv(name,msg)
		}
		else
		{
			document.getElementById(name).innerHTML=msg;
			document.getElementById(name).style.visibility="inherit";
		}
}

function _hideDiv(name)
{
	if (document.getElementById(name)) document.getElementById(name).style.visibility="hidden";
}

function _moveTo(name,x,y)
{
	var s = document.getElementById(name).style;
	if(null!=x||null!=y)
	{
		s.position="absolute"
		if(null!=x)
		{
			if(isNaN(x))s.left=x
			else s.pixelLeft=x
		}
		if(null!=y){
		if(isNaN(y))s.top=y
		else s.pixelTop=y
		}
	}
}

function _checkDate(obj,required) {
	var divName = obj.name+"_div";
   	if (!_isValidDate(obj.value,defaultDateFormat,required)) 
        {
		if (ifErrorObjBg !=0)document.getElementById(obj.id).style.backgroundColor=ifErrorObjBg;
		if (showErrorDiv !=0){
		_showDiv(obj,divName,errorMessage[errorMessageNumber]);
		_moveTo(divName,_findPosX(obj),_findPosY(obj)+22);}
		}
  	else
	{
		if (ifNotErrorObjBg !=0) document.getElementById(obj.id).style.backgroundColor=ifNotErrorObjBg;
		_formatDate(obj,obj.value);
		if (showErrorDiv !=0)
		_hideDiv(divName);
	};
}

function _checkString(obj,errorMsg) {
	var divName = obj.name+"_div";
   	if (obj.value == "") 
        {
		errorMessageNumber=4
		if (ifErrorObjBg !=0)document.getElementById(obj.id).style.backgroundColor=ifErrorObjBg;
		if (showErrorDiv !=0){
		if(!errorMsg)
		_showDiv(obj,divName,errorMessage[errorMessageNumber]);
		else
		_showDiv(obj,divName,errorMsg);
		_moveTo(divName,_findPosX(obj),_findPosY(obj)+22);}
		}
  	else
	{
		if (ifNotErrorObjBg !=0) document.getElementById(obj.id).style.backgroundColor=ifNotErrorObjBg;
		_formatDate(obj,obj.value);
		if (showErrorDiv !=0)
		_hideDiv(divName);
	};
}

function setupDate(obj,required)
{
	obj.onblur = function() {_checkDate(obj,required)}
	obj.onkeydown = function() {return _checkNumInput(event.keyCode)}
	obj.id = obj.name;
}

function setupString(obj,errorMsg)
{
	obj.onblur = function() {_checkString(obj,errorMsg)}
	obj.onkeydown = function() {return _checkSpecInput(event.keyCode)}
	obj.id = obj.name;
}
