var aRulesPattern = {
            'nonzero'           : '-?[1-9][0-9]*',
            'nopunctuation'     : '[^().\\/\\*\\^\\?#!@$%+=,\\"\'><~\[\]{}]+',
            'lettersonly'       : '[a-zA-Z]+',
            'alphanumeric'      : '[a-zA-Z0-9]+',
            'numeric'           : '(^-?\\d\\d*\\.\\d*$)|(^-?\\d\\d*$)|(^-?\\.\\d\\d*$)',
            'login'             : '[a-zA-Z\\d]{6,16}',
            'email'             : '[a-zA-Z\\d_\.\\-]+@[a-zA-Z\\d\.\\-]{2,}\.[a-zA-Z]{2,}',
            'zip'               : '[a-zA-Z\\d\\s\-]{10}',
            'zip_us'            : '(([\\d]{5})|([\\d]{5}-[\\d]{4}))',
            'zip_canada'        : '[\\d]{6}',
            'phone_us'          : '(([2-9][\\d]{2}-[\\d]{3}-[\\d]{4})|(\\([2-9][\\d]{2}\\)[\\s]{0,1}[\\d]{3}-[\\d]{4}))',
            'phone_extension'   : '[\\w\\d]{5}',
            'phone_ru'          : '[\\d\\-\\(\\)\.\\+]{5,50}',
            'password'          : '[a-zA-Z\\d]{6,16}',
            'money'             : '[\\d]+(\.[\\d]{2}){0,1}',
            'money_us'          : '[\\$]{0,1}(([\\d]+\,[\\d]{3})|([\\d]+))(\.[\\d]{2}){0,1}',
            'domain'            : '((ftp|http|https):\\/\\/){0,1}([\\w\\d\-]+\.){0,1}[\\w\\d\-]{2,}\.[\\w]{2,}[\/]{0,1}',
            'url'               : '((ftp|http|https):\\/\\/){0,1}([\\w\\d\\-\\.]+\\.){0,1}[\\w\\d\\-]{2,}\\.[\\w]{2,}(\\/.*){0,1}',
            'ccnum'             : '[\\d]{12,18}',
            'cc_visa'           : '4([\\d]{11}|[\\d]{14})',
            'cc_master_card'    : '5[1-5][\\d]{12}',
            'cc_amex'           : '3[47][\\d]{11}',
            'cc_discover'       : '6011[\\d]{8}',
            'cc_diners_club'    : '3(0[0-5]|[68])[\\d]{11}',
            'cc_jcb'            : '(3[\\d]{4}|2131|1800)[\\d]{11}',
            'cc_enroute'        : '2(014|149)[\\d]{11}',
            'cvv'               : '[\\d]{3,4}',
            'ssn'               : '([\\d]{2,3}-[\\d]{2}(-|\\d)[\\d]{4})',
            'integer'           : '[\\d]+',
            'double'            : '[\\d]+\.[\\d]+',
            'float_negative'    : '\-[\\d]+\.[\\d]+',
            'ip'                : '[0-2][0-5]{0,1}[0-5]{0,1}\.[0-2][0-5]{0,1}[0-5]{0,1}\.[0-2][0-5]{0,1}[0-5]{0,1}\.[0-2][0-5]{0,1}[0-5]{0,1}',
            'date_us'           : '(0[1-9]|1[0-2])\/(([\\d]{2})|([12][\\d]{3}))\/([\\d]{4})|(1[0-2]|1[0-2])\/(([\\d]{2})',
            'short_date_us'     : '(0[1-9]|1[0-2])\/(([\\d]{2})|([12][\\d]{3}))',
            'date_ru'           : '(0[1-9]|[12]\\d|3[01])\.(0[1-9]|1[12])\.(([\\d]{2})|([12][\\d]{3}))',
            'short_date_ru'     : '(0[1-9]|[12]\\d|3[01])\.(0[1-9]|1[12])\.[\\d]{2}',
            'time'              : '([01]\\d|2[0-3]):[0-5]\\d',
            'time_short'        : '(0?\\d|1[0|1]):[0-5]\\d\\s?[a|A|p|P][m|M]',
            'time_us'           : '((([01]\\d|2[0-3]):[0-5]\\d)|((0[1-9]|1[0-2]):[0-5]\\d[\s]{0,1}([aA]|[pP])[mM]))'
            };
//'time_short'        : '(0\\d|1[0|1]):[0-5]\\d\\s?([a|A|p|P])|([m|M])',
function customRegexp(validateFormObj, formField, option) {
	//alert(validateFormObj.elements[formField].value);
	//alert(option);
	//alert(validateFormObj.elements[formField].value.match(option));
	return validateFormObj.elements[formField].value.match(option);
}

function required(validateFormObj, formField) {
	if(validateFormObj.elements[formField].type == 'checkbox') {
		if(validateFormObj.elements[formField].checked) return true;
	} else if(validateFormObj.elements[formField].type == 'select-one') {
        if (validateFormObj.elements[formField][validateFormObj.elements[formField].selectedIndex].value.length != 0) {
            return true;
        }
	} else if(validateFormObj.elements[formField].length) {
    	for(var i = 0;i < validateFormObj.elements[formField].length;i++) {
			if(validateFormObj.elements[formField][i].checked) return true;
			
		}
	} else {
		if(validateFormObj.elements[formField].value.length > 0) return true;
	}
    return false;
}

function maxlength(validateFormObj, formField, option) {
	return (validateFormObj.elements[formField].value.length <= option);
}

function minlength(validateFormObj, formField, option) {
	return (validateFormObj.elements[formField].value.length >= option);
}

function validateOne(validateFormObj, formField, validatorType, validationOptions) {
    var option = unescape(validationOptions['option']);
	switch(validatorType) {
		case 'required':
			return required(validateFormObj, formField);
			break;
		case 'maxlength':
			return maxlength(validateFormObj, formField, option);
			break;
		case 'minlength':
			return minlength(validateFormObj, formField, option);
			break;
		case 'customRegexp':
			return customRegexp(validateFormObj, formField, option);
			break;
		default:
            if (!aRulesPattern[validatorType]) return true;
			return customRegexp(validateFormObj, formField, aRulesPattern[validatorType]);			
	}
}

function validateForm(formObject, validationArray) {	
	var validationResult = {};
	var validationResultOneControl = {};
	var isValid = true;
	var isValidControl;
	for(var oneControl in validationArray) {
		isValidControl = true;
		validationResultOneControl = {};

		var oneValidatorArray = validationArray[oneControl];
		for(var oneValidator in oneValidatorArray) {
			if(!validateOne(formObject, oneControl, oneValidator, validationArray[oneControl][oneValidator])) {
				validationResultOneControl[oneValidator] = {result: false, err_msg: validationArray[oneControl][oneValidator]['err_msg']};
				isValidControl = false;
			}
		}
		if(!isValidControl) {
			validationResult[oneControl] = validationResultOneControl;
			isValid = false;
		}
	}	
	return {result: isValid, errors: validationResult};
}

function validateShowOne(formObject0, validationResult) {
	for(oneControl in validationResult['errors']) {	
		for(oneValidator in validationResult['errors'][oneControl]) {					
            var elLabel = document.getElementById('label_' + formObject0.attributes['name'].value + '_' + oneControl).innerHTML.replace(/((<.+>)|(\s\*))/g, '');
//			alert("Ошибка:\n" + elLabel + ' : ' + (validationResult['errors'][oneControl][oneValidator]['err_msg']) + "\n");
			alert("Error:\n" + elLabel + ' : ' + (validationResult['errors'][oneControl][oneValidator]['err_msg']) + "\n");
            formObject0.elements[oneControl].focus();
			return true;
		}
	}
}

function validateShowAll(validationResult) {
	var alertString = '';
	for(oneControl in validationResult['errors']) {
		alertString = alertString + "control[" + oneControl + "] : \n";
		for(oneValidator in validationResult['errors'][oneControl]) {
			alertString = alertString + "\t" + validationResult['errors'][oneControl][oneValidator]['err_msg'] + "\n";
		}
	}
	alert("Error:\n" + alertString);
	return true;
}

function validateShow(formObject0, validationArray0) {		
	var validationResult = validateForm(formObject0, validationArray0);	
	if(validationResult['result']) return true;
	validateShowOne(formObject0, validationResult);
	return false;
}
