/*
/* "#" - any characters, but not empty
/* "latin"  - lower latin characters (plus " "./,\'-)
/* "Latin"  - upper latin character
/* "russian"- lower russian characters (plus " "./,\'-)
/* "Russian"- upper russian character
/* "input"  - input characters (latin+_+0123456789)
/* "mnemo"  - latin characters (plus "_")
/* "date_SF" - short date format
/* "date_LF" - long date format
/* "integer"- integer
/* "float"  - float
/* "email"  - e-mail
/* "login"  - login
*/

function jsCheckForm(obj)
{
    var missFields = new Array();
    var totalFields = 0;
    var arrMessages = new Array();
    var reNull = /^(\s*)(\b.+\b)?(\s*)$/g;

    for (i=0; i<obj.length; i++)
	{
        if ( (obj[i].type=="text" || obj[i].type=="password" || obj[i].type=="textarea" || obj[i].type=="select" || obj[i].type=="select-one") && obj[i].mandatory)
		{
		  //  alert("2");
		  var isMissing = false, errMessage='';
		  //obj[i].value = obj[i].value.trim();
          //alert(obj[i].name);
    	  //str = obj[i].value;
		  //alert(str);


		  //alert('|'+obj[i].value+'|');
		  //re = new RegExp("^[\S ]{1,}$", "gi");
		  obj[i].value = obj[i].value.replace(reNull, "$2");
		  if (obj[i].value=='') {
			  var errMessage = form_empty;
			  var isMissing = true;
		  } else {

			 // Start switch 1
		  	  switch(obj[i].mandatory)
			  {
			      case "#": break;

				  case "date_SF":
					if (!jsCheckDate("date_SF", obj[i])) isMissing = true;
					var errMessage = form_date;
				  break;

				  case "date_LF":
					if (!jsCheckDate("date_LF", obj[i])) isMissing = true;
					var errMessage = form_date;
				  break;

				  case "email":
				    re = new RegExp("^[a-z0-9._]{1,}@[a-z0-9_\-]{1,}[a-z0-9_.\-]{0,}\.[a-z]{2,6}$", "gi");
					if (!obj[i].value.match(re)) isMissing = true;
					var errMessage = form_email;
				  break;

				  case "integer":
				    re = new RegExp("^-?[0-9]{1,}$", "gi");
					if (!obj[i].value.match(re)) isMissing = true;
					var errMessage = form_integer;
				  break;

				  case "float":
				    re = new RegExp("^-?[0-9]{1,}(\.[0-9]{1,10})?(e[-\+]?[0-9]{1,})?$", "gi");
					if (!obj[i].value.match(re)) isMissing = true;
					var errMessage = form_float;
				  break;

				  default:
					  var arrSets = obj[i].mandatory.split("|");
	    			  var charsPlus='', charsMinus='', reg='';

	    			  for (j=0; j<arrSets.length; j++) {

						// Start switch 2
	    				switch(arrSets[j]) {
	    				  case "#":
	    				    charsPlus += "\\S";
	    				  break;
	    				  case "latin":
	    				    charsPlus += "a-z";
	    					if (errMessage=='') {
							  if (arrSets.length>1)
							    errMessage += form_error;
							  else
							    errMessage += form_latin_lower;
							}
	    				  break;

	    				  case "Latin":
	    				    charsPlus += "A-Z";
	    					if (errMessage=='') {
							  if (arrSets.length>1)
							    errMessage += form_error;
							  else
							    errMessage += form_latin_upper;
							}
	    				  break;

	    				  case "russian":
	    				    charsPlus += "а-я";
	    					if (errMessage=='') {
							  if (arrSets.length>1)
							    errMessage += form_error;
							  else
							    errMessage += form_russian_lower;
							}
	    				  break;

	    				  case "Russian":
	    				    charsPlus += "А-Я";
	    					if (errMessage=='') {
							  if (arrSets.length>1)
							    errMessage += form_error;
							  else
							    errMessage += form_russian_upper;
							}
	    				  break;

	    				  case "input":
	    				    charsPlus += "a-zA-Z_0-9";
	    					if (errMessage=='') {
							  if (arrSets.length>1)
							    errMessage += form_error;
							  else
							    errMessage += form_input;
							}
	    				  break;

	    				  case "mnemo":
	    				    charsPlus += "a-zA-Z_";
	    					if (errMessage=='') {
							  if (arrSets.length>1)
							    errMessage += form_error;
							  else
							    errMessage += form_mnemo;
							}
	    				  break;

	    				  case "mnemoInt":
	    				    charsPlus += "a-zA-Z_0-9";
	    					if (errMessage=='') {
							  if (arrSets.length>1)
							    errMessage += form_error;
							  else
							    errMessage += form_mnemo;
							}
	    				  break;

	    				  /*case "login":
	    				    charsPlus += "a-zA-Zа-яА-Я_@!";
	    					if (errMessage=='') {
							  if (arrSets.length>1)
							    errMessage += form_error;
							  else
							    errMessage += form_login;
							}
	    				  break;*/

	    				  default :
	    					  if (arrSets[j].substr(0,1)=='+')
							    charsPlus += arrSets[j].substr(1, arrSets[j].length-1);
							  else
	    					  if (arrSets[j].substr(0,1)=='-')
							    charsMinus += arrSets[j].substr(1, arrSets[j].length-1);
							  else
							    charsPlus = arrSets[j];
							  errMessage += form_error;
	    				  break;
	    			    }
					    // End switch 2
					  }
					  if (charsPlus!='' || charsMinus!='') {
					    var r='';
					    if (charsPlus!='') r += '['+charsPlus+']';
						if (charsMinus!='') r += '[^'+charsMinus+']';
						//alert("^"+r+"{1,}$");
					  	re = new RegExp("^("+r+"){1,}$", "g");
						if (!obj[i].value.match(re)) isMissing = true;
					  }

				  break;
			  }
			  // End switch 1

		 }

		 if ( isMissing ) {
			missFields[totalFields] = obj[i];
            arrMessages[totalFields] = errMessage;
            totalFields++
		 }
	  }
	}

    // -- Is bad fields ? -----------------------------------
    if (totalFields > 0)
    {
        var missMessage = form_header+"\n__________________________________\n\n";
        for (i=0; i<missFields.length; i++) {
            missMessage += missFields[i].title + " : ";
            missMessage += " " + arrMessages[i] + " \n";
        }
        alert(missMessage);
        missFields[0].focus();
        return false;
    }
    else
        return true;
}

//
// Check on "DATE"
//
function jsCheckDate(type, obj)
{
	if (type=="date_SF") dateFormat = date_SF; else dateFormat = date_LF;

	// search separator
	var re = new RegExp("^%.(.).*$", "g");
	var sep = dateFormat.replace(re, "$1");


	//alert("sep="+sep);

	//alert(type);
	// search day, month, year
	var re = new RegExp("^([^\\"+sep+"]{2,})\\"+sep+"([^\\"+sep+"]{2,})\\"+sep+"([^\\"+sep+" ]{2,4}).*", "g");
	var type1 = dateFormat.replace(re, "$1");
	var type2 = dateFormat.replace(re, "$2");
	var type3 = dateFormat.replace(re, "$3");

	//alert(dateFormat);
	//alert("type1="+type1+"\ntype2="+type2+"\n type3="+type3);

	if (type=="date_SF")
	  var re = new RegExp("^([0-9]{2,4})\\"+sep+"([0-9]{2,4})\\"+sep+"([0-9]{2,4})$", "g");
	else
	  var re = new RegExp("^([0-9]{2,4})\\"+sep+"([0-9]{2,4})\\"+sep+"([0-9]{2,4}) ([0-9]{2}):([0-9]{2}):?([0-9]{2})?$", "g");
	var value1 = obj.value.replace(re, "$1");
	var value2 = obj.value.replace(re, "$2");
	var value3 = obj.value.replace(re, "$3");
	if (type=="date_LF") {
		var mHour = obj.value.replace(re, "$4");
		var mMinute = obj.value.replace(re, "$5");
		var mSecond = obj.value.replace(re, "$6");
	}

	//alert("value1="+value1+"\n\rvalue2="+value2+"\n\rvalue3="+value3);

	switch(type1) {
	  case "%d": var mDay = value1; break;
	  case "%m": var mMonth = value1; break;
	  case "%Y": var mYear = value1; break;
	}
	switch(type2) {
	  case "%d": var mDay = value2; break;
	  case "%m": var mMonth = value2; break;
	  case "%Y": var mYear = value2; break;
	}
	switch(type3) {
	  case "%d": var mDay = value3; break;
	  case "%m": var mMonth = value3; break;
	  case "%Y": var mYear = value3; break;
	}

	//alert("day="+mDay+"\nmonth="+mMonth+"\nyear="+mYear);

	//if (type=="date_LF") alert("hour="+mHour+"\n minute="+mMinute+"\n second="+mSecond);
	var monthes = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	mYear = mYear*1;
	mMonth = mMonth*1;
	mDay = mDay*1;

	if ((mYear%4)==0) monthes[1] = 29;
	if (!isFinite(mYear) || !isFinite(mMonth) || !isFinite(mDay) ||
	     mYear<1700 || mYear>9999 || mMonth<1 || mMonth>12 || monthes[mMonth-1]<mDay || mDay<1) {
        return false;
	} else {
	    if (type=="date_LF") {
			mHour = mHour*1;
			mMinute = mMinute*1;
			if (!isFinite(mHour) || !isFinite(mMinute) || mHour<0 || mHour>23 || mMinute<0 || mMinute>59 ) return false
		}
        return true;
	}
}
