/**
usage:

validation.setRule(<name>, <regexp>)
validation.applyRule(<element>, <name>, <is_required>)
validation.applyLimit(<element>, <limit>, <is_required>)

**/
validation = {
	validFields: Array(),
	validateForm: '',
	rules: {
		'year': /^((19|20)[0-9]{2})?$/,
		'integer': /^[0-9]*$/,
		'number': /^[0-9\., ]*$/,
		'price': /^[0-9\., ]*$/,
		'email': /^([^@]+@([^@\.]{2,}\.)+[^@\.]{2,})?$/i
	},
	/* add validation rule (type, regexp) */ 
	setRule: function(type, rexp) {
		validation.rules[type] = rexp;
	},
  
	validate: function(field, type, required) {
		if( field ) {
			if( required && field.value.length <= 0 ) 
				return false;
			if( type in validation.rules )
				if( !(validation.rules[type]).test(field.value) )
					return false;					
			// additional validation of range fields
			if(field.id.indexOf ('s_g') != -1) {
				var firstField = field;
				var firstFieldId = firstField.id;
				var firstPartIdOfSecondField = 's_l';
				var secondPartIdOfSecondField = firstFieldId.substring(3);
				var secondFieldId = firstPartIdOfSecondField + secondPartIdOfSecondField;
				var secondField = document.getElementById(secondFieldId);
				var firstFieldValue = parseFloat(firstField.value.replace(',','.'))
				var secondFieldValue = parseFloat(secondField.value.replace(',','.'))
				
				if( secondField.value.length > 0 && firstFieldValue > secondFieldValue )
					return false;
			}
			else if(field.id.indexOf ('s_l') != -1) {
				var secondField = field;
				var secondFieldId = secondField.id;
				var firstPartIdOfFirstField = 's_g';
				var secondPartIdOfFirstField = secondFieldId.substring(3);
				var firstFieldId = firstPartIdOfFirstField + secondPartIdOfFirstField;
				var firstField = document.getElementById(firstFieldId);
				var firstFieldValue = parseFloat(firstField.value.replace(',','.'));
				var secondFieldValue = parseFloat(secondField.value.replace(',','.'));
									
				if( secondField.value.length > 0 && firstFieldValue > secondFieldValue )
					return false;
			}
			// end of additional validation of range fields
		}
    return true;
	},

	mark: function(field, valid) {
		if (field) {
			if (valid) 
				removeClass(field, 'fillError');
	    	else 
				addClass(field, 'fillError');
		}
	},

	updateButtonState: function() {
		var disable = false;
		var field;
		for (var iField in validation.validFields) {
			field = document.getElementById(iField);
	        valid = validation.validate(field, validation.validFields[iField][0], validation.validFields[iField][1]);
	    	validation.mark(field, valid);
	
	    	if( !valid ) {
	    		disable = true;
	    	}
    	}

	    // locate button to disable
		var button;
	    if ( document.getElementById ('submit') ) {
	        button = document.getElementById ('submit');
	    } else {
	    	return false;
	    }

	    button.disabled = disable;

	    if( !validation.validateForm ) {
		    window.clearInterval(validation.validateForm);
		   	validation.validateForm = '';
		    if( disable ) {
		    	validation.validateForm = window.setInterval("validation.updateButtonState ()", 1000);
		    }
		}
	},

	checkRule: function (field, type, required) {
	    var valid = validation.validate(field, type, required);

	    // return if no changes
	    if ( typeof validation.validFields[field]!='undefined' && validation.validFields[field][0]==valid ) {
	    	return;
	    }

	    // add entry into array
	    validation.validFields[field.id] = Array(type, required);

	    // disable submit button if something wrong
	    validation.updateButtonState();
	},

	checkLimit: function(field, maxLength, required) {
		if ( field.value.length > maxLength ) {
    	validation.mark(field, false);
			// cut too long text
			field.value = field.value.substr(0, maxLength);
			// alert userabout to long text
			alert(descriptionexceed1 + ' ' + maxLength + ' ' + descriptionexceed2 + '.');
    } else {
			if( required && field.value.length == 0 )
	    	validation.mark(field, false);
			else
	    	validation.mark(field, true);
		}
	},

	/* init validation on given field */
	applyRule: function( e, type, required ) {
		var target = e;
		if( typeof target == 'string' )
				target = document.getElementById(target);
		if( target ) {
		  	target.onchange = function() { validation.checkRule(this, type, required); };
		  	target.onkeyup = function() { validation.checkRule(this, type, required); };
		  	target.onkeydown = function() { validation.checkRule(this, type, required); };
		} else {
			listenEvent(window, 'load', function() { validation.applyRule( e, type, required );});
		}
	},

	applyLimit: function( e, limit, required ) {
		var target = e;
		if( typeof target == 'string' )
				target = document.getElementById(target);
		if( target ) {
				target.onchange = function() {  validation.checkLimit(this, limit, required); };
		  	target.onkeyup = function() { validation.checkLimit(this, limit, required); };
		  	target.onkeydown = function() { validation.checkLimit(this, limit, required); };
		} else {
			listenEvent(window, 'load', function() { validation.applyLimit( e, limit, required );});
		}
	}
}
