function checkdate (day, month, year) {
    var myDate = new Date();
	myDate.setDate(day);
	myDate.setMonth(month-1);
	myDate.setFullYear(year);
	return month >= 1 && month <= 12 && year >= 1 && year <= 32767 && ((myDate.getMonth()+1) == month && day<32);
}
function pasEqual() {
	if ( typeof $('newPassword1') != 'undefined' &&
		typeof $('newPassword2') != 'undefined' ) {
		$('newPassword1').value = $('newPassword1').value.trim();
		$('newPassword2').value = $('newPassword2').value.trim();
		return $('newPassword1').value == $('newPassword2').value;
	}
	return false;
}
function errorMessage(field, text, errClass) {
	innerDiv = new Element('span', 
							{
							html: text, 
							'class': 'err_msg' + (typeof errClass != 'undefined'? ' ' + errClass:'')});
							
	errorDescription = new Element('span', {
									'class': 'err_cnt',
										html: ''
									});
	innerDiv.inject(errorDescription);
	errorDescription.inject($('label_' + field), 'before');
}

function errorClear(errClass) {
	if ( typeof errClass == 'undefined' )
		errClass = '.err_msg';
	//remove error
	errorDescriptions = $$(errClass);
	for(i=0;i<errorDescriptions.length;i++) {
		errorDescriptions[i].dispose();
	}
}

function checkPassword(str){
	str = str.trim().length;
	if ( $('passwordType') != null ) {
		if ( $('passwordType').value == 'md5' ) {
			
			return  str > 0 ? (str >= 5 && str <= 20): true;
		}
		else
			return str >= 5 && str <= 20;
	}
	else
		return str >= 5 && str <= 20;
}

function xssClean(str){
	var search = new Array(
	    /^<script[^>]*?>.*?<\/script>$/,  // Strip out javascript
	    /^<[\/\!]*?[^<>]*?>$/,           // Strip out HTML tags
	    /^<style[^>]*?>.*?<\/style>$/,    // Strip style tags properly
	    /^<![\s\S]*?--[ \t\n\r]*>$/      // Strip multi-line comments
	);
 
    return !str.match(search);
}

function validateDate(str){
	var reg = /^(0[1-9]|[1-2][0-9]|3[0-1])(\.)(0[1-9]|1[0-2])\2\d{4}$/;
	return str.match(reg);
}

function validateEmail(str){
	var reg = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$/;
	return str.match(reg);
}
/* Validate phone
Enabled formats:
123-45-67
123 45 67
1234567
14567
(34) 1234567
+(34) 1234567
+3(34) 1234567
+3(34) 123-45-67
+3 (34) 123-45-67
*/
function validatePhone(str){
	 var reg=/^(\+{0,1}\d{0,1}){0,1}\s*(\(\d+\)\s{0,1}){0,1}\d+(-{0,1}|\s{0,1}){1}\d{2}(-{0,1}|\s{0,1}){1}\d{2}$/;
	 return str.match(reg);
}

/*
 * Validate amount of money
 * Enabled formats:
 * 12
 * 12.1
 * 12.12
 */
function validateSum(str) {
	var reg = /^\d{1,}(\.\d{1,2})?$/;
	return str.match(reg) && parseFloat(str)!=0
}

function unique(entity){
	valid = 0;
	request = new Request({
		url: $('validationUniqueUrl').value + '/' + entity ,
		async: false,
		onComplete: function(response) { 
			valid = response;
        }
	});
	request.send();
	return valid;
}

function truth(str){
	return true;
}

function checkRule(rule, obj){
	switch ( rule ){
		case 'xssclean': 
			return xssClean(obj.str);
			
		case 'email': 
			return validateEmail(obj.str);

		case 'phone': 
			return validatePhone(obj.str);
			
		case 'date':
			return validateDate(obj.str);

		case 'numeric': 
			return !isNaN(obj.str);
			break;
			
		case 'int': 
			return obj.str.match('^[0-9]+$');
			break;
			
		case 'trim':
			obj.str = obj.str.trim();
			return true;
			break;
			
		default:
			if (rule.match('^regexp:.+')) {
			regExpStr = rule.split(":");
			return obj.str.match(regExpStr[1]);
			}
			else  if (rule.match('^range:.+')) {
			values = rule.split(":");
			ranges = values[1].split("..");
			return obj.str >= ranges[0] || obj.str <= ranges[1];
			}
			else if (rule.match('^minlength:.+')) {
			values = rule.split(":");
			return obj.str.length >= values[1];
			}
			else if (rule.match('^maxlength:.+')) {
			values = rule.split(":");
			return obj.str.length <= values[1];
			}
			else if (rule.match('^unique:.+')) {
			values = rule.split(":");
			valid = unique(values[1]);
			return valid;
			} else {
				if ( rule.match('^[A-Za-z]+') ) {
					if ( typeof eval(rule) == 'function' ) {
						return eval(rule+"('"+ obj.str + "')");
					}
					else {
						return true;
					}
				}
			}
	}
			return true;
	}

validation = new Object();
formSubmition = false;

function validate(formElement, errClass) {
	errorClear('.'+errClass);
	var ok = true;
	if ( typeof( validation[formElement.id] ) != 'undefined' )
		for ( i = 0; i < validation[formElement.id]['rules'].length; i++ ) {
			element = $(validation[formElement.id]['rules'][i]['id']);
			rules = validation[formElement.id]['rules'][i]['code'].split("|");
			rulesOk = true;
			validationObj = {str:$(validation[formElement.id]['rules'][i]['id']).value};
			for ( j = 0; j < rules.length; j++) {
				valid = checkRule(rules[j], validationObj);
				if ( !valid && validation[formElement.id]['rules'][i]['required'] == 1 ||
					!valid && validationObj.str.trim() !='' 
						&& validation[formElement.id]['rules'][i]['required'] == 0 ) {
						rulesOk = false;
					}
			}
			
			if ( !rulesOk ) {
				errorMessage(validation[formElement.id]['rules'][i]['id'], 
					validation[formElement.id]['rules'][i]['message'],
					errClass);
			}
			ok = ok && rulesOk;
		}
	return ok;
}

function checkForm(formId, isSubmit){
	formElement = $(formId);
	if (validate(formElement, formId+'ErrorClass') === true) {
		formSubmition = true;
		if (isSubmit) {
			formElement.submit();
		}
		else {
			return true;
		}
	}
	return false;
}

function createInitialFormState(formId) {
	form = $(formId);
	formInitialState = new Element('input', {
		id: 'form_initial_state_' + formId,
		type: 'hidden',
		value: form.toQueryString()
		}).inject(form, 'before');
	return formInitialState;
}

function initValidation(){
	var validationUrl = $('validationUrl') ? $('validationUrl').value : basePath+'validation/';
	validation = [];
	var formIds = [];
	if ($('formIds')) {
		formIds = $('formIds').value.split(',');
	}
	else {
		var forms = $$('form');
		forms.each(function(item) {
			if (item.get('id') != 'loginForm') {
				formIds.push(item.get('id'));
			}
		});
	}

	noticeFormIds = new Array();
	for ( formCount = 0; formCount < formIds.length; formCount++) {
		if ( formIds[formCount].trim() != '' ) {
			formId = formIds[formCount];
			
			new Request({url: validationUrl+formIds[formCount],
				async: false,
		        onComplete: function(response) { 
					form = JSON.decode(response);
					
					if (form['fields']) {
					
						validation[formId] = new Object();
						validation[formId]['rules'] = new Array();
						
						rulesCount = 0;
						for (i = 0; i < form['fields'].length; i++) {
							for ( j=0; j < form['fields'][i]['rules'].length; j++) {
								validation[formId]['rules'][rulesCount] = new Object();
								validation[formId]['rules'][rulesCount]['id'] = form['fields'][i]['id'];
								validation[formId]['rules'][rulesCount]['code'] = form['fields'][i]['rules'][j]['code'];
								validation[formId]['rules'][rulesCount]['message'] = form['fields'][i]['rules'][j]['errorMessage'];
								validation[formId]['rules'][rulesCount]['required'] = form['fields'][i]['rules'][j]['required'];
								rulesCount++;
							}
						}
						var currentFormId = formId;
						if ( form['fields'].length > 0 ) {
							if ( typeof(form['submitId']) != 'undefined' && $(form['submitId']) != null) {
									$(form['submitId']).addEvent('click', function(e) {
										e.stop();
										checkForm(currentFormId, true);
									});
									$(currentFormId).addEvent('submit', function() {
										return checkForm(currentFormId, false);
									});
							}
							new Element('input', {type: 'submit', value: '', 'class': 'fictitiousSubmit'}).inject(currentFormId);
						}

						if ( form['formChangedNotice'] == 1) {
							changedForm = $(formId);
							createInitialFormState(formId);
							noticeFormIds[noticeFormIds.length] = formId;
						}
					}
				}
			}).send();
		}
	}
	window.onbeforeunload = closeWarning;
}

function closeWarning(){
	if (!formSubmition) {
		for ( var noticeIndex = 0; noticeIndex < noticeFormIds.length; noticeIndex++ ) {
			if (typeof $('form_initial_state_'+noticeFormIds[noticeIndex]) != 'undefined' &&
				$(noticeFormIds[noticeIndex]).toQueryString() != $('form_initial_state_'+noticeFormIds[noticeIndex]).value) {
				return 'Ваши изменения будут утеряны.';
			}
		}
	}
	return ;
}

function showErrors(){
	
	if ( typeof( validationErrors ) != 'undefined' ) {
		errors = JSON.decode(validationErrors);  
		for (i = 0; i < validationErrors.length; i++) {
			errorMessage(validationErrors[i]['id'], validationErrors[i]['message']);
		}	
	}
	
}

function setFieldRequire(formId, fieldNum, required){
	validation[formId]['rules'][fieldNum]['required'] = required;
}

window.addEvent('domready', function(){

	showErrors();
	initValidation();
	
});
