/**
* @description  format text message for output
*
* @param string sKey - key of message
* @param string sField - Human readable name of field
*
* @return  string formatted message.
**/
function formatMes(sKey, sField){  //temp
	var aMes = new Array();
		aMes['minlen']  = 'field is required.';
		aMes['pattern'] = 'this field contains invalid value.';

	return ('"'+sField + '" : ' + aMes[sKey]);
}

/**
* @description  check, if form is valid
*
* @param object oForm  - form to validate
* @param array aShema  - array of validation shemas (hash) related to certan field
* @param array aRules  - array of validation rules bentween 2 fields
*
* @return  boolean  true if all is ok or false + alert wiht error messages if form contains errors.
**/
function isValid(oForm, aShema, aRules) {

	var aDef = new Array();  // default shemas like 'email',
        aDef['email']     = {'pattern': /^[\w\d_\.\-]+@[\w\d\.\-]{2,}\.[a-zA-Z]{2,}$/ };
	aDef['name']      = {'minlen':1, 'maxlen':150 };
	aDef['required']  = {'minlen':1 };
	aDef['positive']  = {'pattern': /^[0-9]+$/  };
	aDef['phone']     = {'pattern': /^[0-9A-Za-z\-.()+]+$/  };

	var aErr  = new Array();
	var aTitles = new Array();

	for( i=0; i< aShema.length; ++i ) { // for each fiels
		var sTitle = aShema[i].title;
		// store info
		aTitles[aShema[i].field] = sTitle;

		var oShema = (aShema[i].def != undefined)? aDef[aShema[i].def] : aShema[i];


		//get value
		var sVal = oForm.elements[aShema[i].field].value;

		/*  TODO create function getFormValue(oForm,sWidget,$sFieldName)
		switch (aShema[i].widget) {
			case 'select':
				sVal = oForm.elements[aShema[i].field].options[oForm.elements[aShema[i].field].selectedIndex].value;
			case 'input':
			case 'textarea':
			default:
		}
		*/
		// validation
		if ( oShema.minlen != undefined &&  oShema.minlen > sVal.length)
			aErr[aErr.length] = formatMes('minlen', sTitle);
		if ( oShema.pattern != undefined && sVal.search(oShema.pattern) == -1 )
			aErr[aErr.length] = formatMes('pattern', sTitle);
		// other conditions ....
	}// end validation of single values

	//start rules
	if ( 'undefined' != typeof(aRules) ){
		for( i=0; i < aRules.length; ++i ) { // for each rules  0 - first op, 1 - second op, 2 - operation, 3 - Error message text
			var v1 = oForm.elements[aRules[i][0]].value;
			var v2 = oForm.elements[aRules[i][1]].value;
			switch( aRules[i][2] ){
				case '==' :
					if ( v1 != v2 )
						aErr[aErr.length] = aRules[i][3];
				break;
				case '!=' :
					if ( v1 == v2 )
						aErr[aErr.length] = aRules[i][3];
				case 'req' :
					if ( v1 && !v2 )
						aErr[aErr.length] = aRules[i][3];
				break;
			}
		}
	}
	//end rules

	if ( aErr.length ) {
		alert(aErr.join("\n\n"));
		return false;
	}

	return true;
}
