// HELPERS //

function submit (form) {
	if (form.onsubmit==null || form.onsubmit()) {
		form.submit();
	}
}

function addClassName (element, name) {
	if (element.constructor == Array) {
		for (var i=0; i<element.length; i++) {
			addClassName_(element[i], name);
		}
	}
	else {
		addClassName_(element, name);
	}
}
function addClassName_ (element, name) {
	var classes = element.className.split(' ');
	for (var i=0; i<classes.length; i++) {
		if (classes[i] == name) {
			break;
		}
	}
	if (i >= classes.length) {
		classes[classes.length] = name;
	}
	element.className = classes.join(' ');
}
function removeClassName (element, name) {
	if (element.constructor == Array) {
		for (var i=0; i<element.length; i++) {
			removeClassName_(element[i], name);
		}
	}
	else {
		removeClassName_(element, name);
	}
}
function removeClassName_ (element, name) {
	var classes = element.className.split(' ');
	for (var i=0; i<classes.length; i++) {
		if (classes[i] == name) {
			classes[i] = null;
		}
	}
	element.className = classes.join(' ');
}


// VALIDATION //

var validate_errors = [];
var validate_msg = {
	errors:'Please check the following fields...',
	empty:'$input is missing',
	minimum:'$input does not contain enough characters (mininimum $minimum)',
	email:'$input is invalid',
	password:'$input contains invalid characters',
	telephone:'$input is missing',
	module:'Validation module could not be found...'
};
function validate_reset (form) {
	for (var i=0; i<form.elements.length; i++) {
		removeClassName(form.elements[i],'invalid');
	}
}
function validate_test (type, input, name, options) {
	if (type instanceof Array) {
		for (var i=0; i<type.length; i++) {
			if (!validate_test(type[i],input,name,options)) {
				return false;
			}
		}
		return true;
	}
	else {
		var valid = false;
		switch (type) {
			case 'empty':
				valid = validate_test_empty(input,name,options);
				break;
			case 'minimum':
				valid = validate_test_minimum(input,name,options);
				break;
			case 'email':
				valid = validate_test_email(input,name,options);
				break;
			case 'password':
				valid = validate_test_password(input,name,options);
				break;
			case 'telephone':
				var form = input;
				input = [];
				input[0] = form[options.groupName+'[region]'];
				input[1] = form[options.groupName+'[part1]'];
				input[2] = form[options.groupName+'[part2]'];
				valid = validate_test_telephone(input,name,options);
				break;
			default:
				validate_error(input,validate_msg.module,name);
				valid = false;
		}
		if (valid) {
			removeClassName(input,'invalid');
		}
		else {
			addClassName(input,'invalid');
		}
		return valid;
	}
}
function validate_error (input, msg, name) {
	validate_errors[validate_errors.length] = {input:input,msg:msg.replace(/\$input/,name?name:input.name)};
}
function validate_test_empty (input, name, options) {
	var valid;
	switch (input.type) {
		case 'text':
		case 'password':
		case 'textarea':
			var value = input.stringValue==null ? input.value : input.stringValue;
			valid = value.length > 0;
			break;
		case 'select-one':
		case 'select-multiple':
			valid = input.selectedIndex > 0;
			break;
		case null:
			valid = input.length > 0;
	}
	if (!valid) {
		validate_error(input,validate_msg.empty,name);
	}
	return valid;
}
function validate_test_email (input, name, options) {
	if (input.type != null) {
		input = input.value;
	}
	if (!input.match(/^[a-zA-Z0-9\_\-\.]+@[a-zA-Z0-9\_\-\.]+\.[a-zA-Z0-9\_\-\.]+$/)) {
		validate_error(input,validate_msg.email,name);
		return false;
	}
	return true;
}
function validate_test_minimum (input, name, options) {
	if (input.type != null) {
		input = input.value;
	}
	if (input.length < options.minimum) {
		validate_error(input,validate_msg.minimum.replace(/\$minimum/,options.minimum),name);
		return false;
	}
	return true;
}
function validate_test_password (input, name, options) {
	if (input.type != null) {
		input = input.value;
	}
	if (!input.match(/^[a-zA-Z0-9]*$/)) {
		validate_error(input,validate_msg.password,name);
		return false;
	}
	return true;
}
function validate_test_password (input, name, options) {
	if (input.type != null) {
		input = input.value;
	}
	if (!input.match(/^[a-zA-Z0-9]*$/)) {
		validate_error(input,validate_msg.password,name);
		return false;
	}
	return true;
}
function validate_test_telephone (inputs, name, options) {
	for (var i=0; i<inputs.length; i++) {
		var value = inputs[i].stringValue==null ? inputs[i].value : inputs[i].stringValue;
		valid = value.length > 0;
		if (!valid) {
			validate_error(inputs,validate_msg.telephone,name);
			return false;
		}
	}
	return true;
}
function validate_summary () {
	var div = document.getElementById('validateMessage');
	if (validate_errors.length) {
		/*var msg = validate_msg.errors+'\n';
		for (var i=0; i<validate_errors.length; i++) {
			msg += '- '+validate_errors[i].msg+'\n';
		}
		alert(msg);*/
		msg = '<strong>'+validate_msg.errors+'</strong><ul>';
		for (var i=0; i<validate_errors.length; i++) {
			msg += '<li>'+validate_errors[i].msg+'</li>';
		}
		msg += '</ul>';
		div.innerHTML = msg;
		div.style.display = 'block';
		return false;
	}
	else {
		div.innerHTML = '';
		div.style.display = 'none';
		return true;
	}
}


// SPECIAL ATTRIBUTES //

$(document).ready(function () {
	$('input').each(function (i) {
		
		if ($(this).attr('empty')!=null) {
			this.emptyValue = $(this).attr('empty');
			this.stringValue = '';
			$(this).focus(function (e) {
				var input = $(this);
				$(this).removeClass('empty');
				if (this.value == this.emptyValue) {
					this.value = '';
				}
			});
			$(this).blur(function (e) {
				if (this.value.length && (this.value != this.emptyValue)) {
					$(this).removeClass('empty');
					this.stringValue = this.value;
				}
				else {
					$(this).addClass('empty');
					this.stringValue = '';
					this.value = this.emptyValue;
				}
			});
			$(this).blur();
		}
		
		if ($(this).attr('autoformat')!=null) {
			$(this).change(function (e) {
				var value = jQuery.trim(this.value);
				switch ($(this).attr('autoformat')) {
					case 'uc_first':
						value = value.substring(0,1).toUpperCase()+value.substring(1).toLowerCase();
						break;
					case 'uc_words':
						var words = value.split(' ');//match(/(.+|\-|\s)/);
						for (var i=0; i<words.length; i++) {
							words[i] = words[i].substring(0,1).toUpperCase()+words[i].substring(1).toLowerCase();
						}
						value = words.join(' ');
						break;
					case 'uc_all':
						value = value.toUpperCase();
						break;
				}
				this.value = value;
			});
		}
		
		if ($(this).attr('autotab')!=null) {
			this.nextInput = $(this).next()[0];
			$(this).keyup(function (e) {
				if (e.keyCode==9) { // TAB Key
					return;
				}
				if (this.value.length >= this.maxLength && this.nextInput != null) {
					this.nextInput.focus();
				}
			});
		}
	});
});

/*function initSpecialAttributes (form) {
	for (var i=0; i<form.elements.length; i++) {
		var input = $(form.elements[i]);
		
		//alert( input.attr('name')+'.empty='+input.attr('empty') );
		
		if ((input.attributes['empty'] != null) && input.attributes['empty'].value.length) {
			input.emptyValue = input.attributes['empty'].value;
			input.stringValue = '';
			input.onfocus = function () {
				//trace(this.name+'.focus');
				removeClassName(this,'empty');
				if (this.value == this.emptyValue) {
					this.value = '';
				}
			}
			input.onblur = function () {
				//trace(this.name+'.blur');
				if (this.value.length && (this.value != this.emptyValue)) {
					removeClassName(this,'empty');
					this.stringValue = this.value;
				}
				else {
					addClassName(this,'empty');
					this.stringValue = '';
					this.value = this.emptyValue;
				}
			}
			input.onblur();
		}
		
		if (input.attributes['autotab'] != null) {
			if (form.elements[i+1] != null) {
				input.nextElement = form.elements[i+1];
				input.onkeyup = function (event) {
					e = event?event:window.event;
					if (e.keyCode==9) { // TAB Key
						return;
					}
					if (this.value.length >= this.maxLength) {
						this.nextElement.focus();
					}
				}
			}
		}
	}
}*/