jQuery.extend({

	validateForm: function( form, inputs ) {
		var errorMessage = '';
		var f = document.forms[form];
	
		for ( i=0; i<inputs.length; i++ ) {
			t = inputs[i].split(',');
			field = f.elements[t[0]];

			if ( jQuery.validateInput(field, t[1]) )
				errorMessage += '<br /><i>- ' + field.title + '</i>';
		}

		if ( errorMessage != '' ) {
			bmAlert(jQuery.formMessages.notvalidform + errorMessage, 'error');
			return false;
		}
		else {
			jQuery.event.trigger( "ajaxStart" );
			form.submit();
			return true;
		}		
	},
	
	validateInput: function( input, filters ) {
		var error   = false;
		filters = filters.split('');

		for ( j=0; j<filters.length; j++ ) {
			if ( error = jQuery.validatorRules( input, filters[j] ) )
				break;
		}

		if ( error ) {
			$(input).css('background', jQuery.formErrorBg);
		}
		else {

			if ( input.nodeName == 'INPUT' ) {

				( input.offsetWidth < 120 )
					? $(input).css('background', $.formInputBg2)
					: $(input).css('background', $.formInputBg);

				if ( navigator.appName == 'Microsoft Internet Explorer' && !window.XMLHttpRequest )
					$(input).css('background-attachment', 'fixed');
//				else if ()
			}
			else if ( input.nodeName == 'TEXTAREA' ) {
				$(input).css('background', $.formTextareaBg);
				
				if ( navigator.appName == 'Microsoft Internet Explorer' && !window.XMLHttpRequest )
					$(input).css('background-attachment', 'fixed');
			}
			else
				$(input).css('background', '');
		}

		return error;
	},

	validateInput1: function( input ) {
//		for ( j=0; j<jQuery.bmForms[input.form.name].length; j++ ) {
		var f = $(input.form).attr('name');
		for ( j=0; j<jQuery.bmForms[f].length; j++ ) {
			r = jQuery.bmForms[f][j].split(',');

			if ( r[0] == input.name ) {
				return jQuery.validateInput( input, r[1] );
			}
		}
	},
	
	validatorRules: function( input, rule ) {
		switch( rule ) {
			case '+':		// isEmpty
				return Validator.isEmpty(input);
/*				var nl, i;
		
				if (input.nodeName == 'SELECT' && input.selectedIndex < 1)
					return true;
		
				if (input.type == 'checkbox' && !input.checked)
					return true;
		
				if (input.type == 'radio') {
					for (i=0, nl = input.form.elements; i<nl.length; i++) {
						if (nl[i].type == "radio" && nl[i].name == input.name && nl[i].checked)
							return false;
					}
		
					return true;
				}
		
				return new RegExp('^\\s*$').test(input.nodeType == 1 ? input.value : input);*/

			case 'W':		// isAbsURL
				return !Validator.isAbsUrl(input);
				//return this.test(input, '^(news|telnet|nttp|file|http|ftp|https)://[-A-Za-z0-9\\.]+\\/?.*$');
				

			case 'N':		// isNumber
				return !Validator.isNumber(input);
				//return !isNaN(input.nodeType == 1 ? input.value : input) && (!d || !this.test(input, '^-?[0-9]*\\.[0-9]*$'));

			case 'E':		// isEmail
				return !Validator.isEmail(input);
				//return this.test(input, '^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$');
			
			case 'T':		// test
				input = input.nodeType == 1 ? input.value : input;
				return input == '' || new RegExp(p).test(input);

		}
	}
	
});

var Validator = {
	isEmail : function(s) {
		return this.test(s, '^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$');
	},

	isAbsUrl : function(s) {
		return this.test(s, '^(news|telnet|nttp|file|http|ftp|https)://[-A-Za-z0-9\\.]+\\/?.*$');
	},

	isEmpty : function(s) {
		var nl, i;

		if (s.nodeName == 'SELECT' && s.selectedIndex < 1)
			return true;

		if (s.type == 'checkbox' && !s.checked)
			return true;

		if (s.type == 'radio') {
			for (i=0, nl = s.form.elements; i<nl.length; i++) {
				if (nl[i].type == "radio" && nl[i].name == s.name && nl[i].checked)
					return false;
			}

			return true;
		}

		return new RegExp('^\\s*$').test(s.nodeType == 1 ? s.value : s);
	},

	isNumber : function(s, d) {
		return !isNaN(s.nodeType == 1 ? s.value : s) && (!d || !this.test(s, '^-?[0-9]*\\.[0-9]*$'));
	},

	test : function(s, p) {
		s = s.nodeType == 1 ? s.value : s;

		return s == '' || new RegExp(p).test(s);
	}
};