// jQuery library is required

function Form(){
	this.inputExpr = new Array();
	this.inputVer = new Array();
	this.postVer = true;
	this.autoFilled = new Array();
	this.submitFunc = null;
};

var Form = new Form();

Form.inputExpr['string']	= /^\S+.*$/i;
Form.inputExpr['email']		= /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.(\w{2,7})$/i;
Form.inputExpr['password']	= /^.{6,}$/i;
Form.inputExpr['phone']		= /^[0-9]{8,15}$/i;
Form.inputExpr['zip']		= /^\S+.*$/i;
Form.inputExpr['number']	= /^\d+$/i;

Form.select = function(p,val){
	if (!p) return false;
	$(p).each(function(){
		switch ($(this).get(0).tagName)
		{
			case 'INPUT':
				this.checked = false
			break;
			
			case 'SELECT':
				this.selectedIndex = 0;
			break;
		}
	});
	$(p).each(function(){
		switch ($(this).get(0).tagName)
		{
			case 'INPUT':
				if ($(this).attr('type')=='checkbox'){
					if (typeof val != 'number' && typeof val != 'string') {
						for (var i=0,len=val.length; i<len; i++){
							if ($(this).val()==val[i]) this.checked = true;
						}
					} else {
						if ($(this).val()==val) this.checked = true;
					}
				}
				if ($(this).attr('type')=='radio'){
					if ($(this).val()==val) this.checked = true;
				}
			break;
			
			case 'SELECT':
				var s = -1;
				for(i=0;i<this.options.length;i++) if (this.options[i].value==val) s = i;
				this.selectedIndex = s;	
			break;
		}
	});
}

Form.init = function(){
	Form.update();
	$('form.required').submit(function(){
		var r = true;
		var i = 0;
		$(this).find('input,select,textarea').each(function(){
			r = Form.checkField(this) && r;
			if (Form.inputVer[$(this).attr('name')]){
				var a = Form.inputVer[$(this).attr('name')];
				r = r && a.func(this,r); 
			}
			i++;
		});
		if (!Form.postVer) alert('AJaX query in process...');
		r = r && Form.postVer;
		if (Form.submitFunc) r = r && submitFunc(this,r);
		return r;
	});
}

Form.update = function(){
	$('form input,form select, form textarea').blur(function(){
		if ($(this).hasClass('required')||$(this).hasClass('formatted')){
			var r = Form.checkField(this);
			if (Form.inputVer[$(this).attr('name')]){
				var a = Form.inputVer[$(this).attr('name')];
				if (a.act=='*'||a.act=='blur') a.func(this,r);
			}
		}
		if (Form.autoFilled[$(this).attr('name')]){
			var a = Form.autoFilled[$(this).attr('name')];
			for (var i=0;i<a.length;i++){
				switch ($(this).get(0).tagName)
				{
					case 'INPUT':
						var field = $('input[name="'+a[i]+'"]');
						if ($(this).attr('type')=='checkbox'||$(this).attr('type')=='radio'){
							Form.select('input[name="'+a[i]+'"]',$(this).val());							
						} else {
							if (field.val()=='') field.val($(this).val());
						}
					break;
					
					case 'TEXTAREA':
						var field = $('input[name="'+a[i]+'"]');
						if (field.val()=='') field.val($(this).val());
					break;
				}
			}
		}
		return true;
	});
	$('form select').change(function(){
		if ($(this).hasClass('required')||$(this).hasClass('formatted')){
			var r = Form.checkField(this);
			if (Form.inputVer[$(this).attr('name')]){
				var a = Form.inputVer[$(this).attr('name')];
				if (a.act=='*'||a.act=='change') a.func(this,r);
			}
		}
		return true;
	});
	$('form select').blur(function(){
		if (Form.autoFilled[$(this).attr('name')]){
			var a = Form.autoFilled[$(this).attr('name')];
			for (var i=0;i<a.length;i++){
				var field = $('select[name="'+a[i]+'"]');
				if (field.val()==0||field.val()=='') Form.select('select[name="'+a[i]+'"]',$(this).val())	
			}
		}
		return true;
	});
	$('form input, form textarea').keyup(function(){
		if ($(this).hasClass('required')||$(this).hasClass('formatted')){
			var r = Form.checkField(this);
			if (Form.inputVer[$(this).attr('name')]){
				var a = Form.inputVer[$(this).attr('name')];
				if (a.act=='*'||a.act=='change') a.func(this,r);
			}
		}
		return true;
	});
}

Form.checkField = function(ctrl){
	var o = $(ctrl);
	if (o.hasClass('hidden')) return true;
	if (!o.hasClass('required')&&!o.hasClass('formatted')) return true;
	var expr = o.attr('alt');
	var r = true;
	if (!expr&&o.hasClass('required')) r = false;	
	if (o.val()==''&&o.hasClass('formatted')){
		r = true;	
	} else {
		switch (o.get(0).tagName){
			case 'INPUT':
			case 'TEXTAREA':
				if (!Form.inputExpr[expr]) r = true; else r = Form.inputExpr[expr].test(o.val());
			break;
			
			case 'SELECT':
				if (Form.inputExpr[expr]){
					r = Form.inputExpr[expr].test(o.val());
				} else {
					r =o.val()!=0?true:false;
				}
			break;
		}
	}
	var id = o.attr('name').replace(/[\[\]]/gi,'_');
	Form.clear(id);
	if (!r) Form.mark(id);
	return r;
}

Form.ajaxForms = function(){
	$('form.ajax').submit(function(){
		var u = $(this).attr('action');
		var a = new Object();
		a.ajax = 1;
		$(this).find('input,textarea,select').each(function(){
			a[$(this).attr('name')]	= $(this).val();
		});
		var f = $(this).addClass('inproccess');
		var n = $(this).find('input[type="submit"]').attr('disabled','disabled');
		$.post(u,a,function(data){
			var a = eval(data);
			f.removeClass('inprocess');
			n.attr('disabled','');
			for (var key in a.data){
				W.setValue(f.find('input[name="'+key+'"]'),a.data[key]);
			}
			if (a.msg) $.prompt(a.msg);
		})
		return false;	
	});
}

Form.addVerification = function(name,fn,actions){
	if (!actions) actions = '*'; 
	Form.inputVer[name] = {act:actions,func:fn};
}

Form.clear = function(id){
	$('#valid_'+id).removeClass('error');
	$('#'+id).removeClass('error');	
}

Form.mark = function(id){
	$('#valid_'+id).addClass('error');
	$('#'+id).addClass('error');
}

Form.autoFill = function(name){
	var arr = new Array();
	for(var i=1;i<arguments.length;i++) arr[i-1] = arguments[i];
	Form.autoFilled[name] = arr; 
}