/**
 * formsManager manager
 * 
 * @author eSlider@gmail.com
 * @version 0.2 2011.02.28
 */

$(document).ready(function() {
	
	window.formsManager = new function()
	{
		var $this = this;
		
		this.query = function(manager, act, request, onComplete){
			$.ajax({
				url: 		'/'+ window.ABS_PATH +'api.php?dataType=json&manager='+manager+'&act='+act,
				data: 		request,
				success: 	function(r){
					onComplete(r.responce);
				},
				dataType: "json"
			})
		};
		
		
		this.getFormData= function(formID){
			var values = {};
			$.each($(formID).serializeArray(), function(i, field) {
			    values[field.name] = field.value;
			});
			return values;
		}
		
		this.getFullFormData = function(formID)
		{
			var $inputs = $(formID +' :input');
			var values = {};
			
			$inputs.each(function() {
				var type = this.type;
			    var tag = this.tagName.toLowerCase();

			    if (type == 'checkbox' || type == 'radio')
			    {
			        if(this.checked){
			             values[this.name] = $(this).val();
			        }else if(!this.checked  && !values.hasOwnProperty(this.name)){
			            values[this.name] = "";
			        }
			    }else
			        values[this.name] = $(this).val();
			});
			
			values["formName"] = $(formID).attr("id");
			return values;
		};
		
		this.fillForm = function(formID,data)
		{
			var $inputs = $(formID +' :input');
			var values = {};
			$inputs.each(function() {
				var type = this.type;
			    var tag = this.tagName.toLowerCase();
			    
				if (type == 'text' || type == 'password' || tag == 'textarea'){
			    	this.value = data.hasOwnProperty(this.name)?data[this.name]:"";
			    }else if (type == 'checkbox' || type == 'radio'){
			    	this.checked = data.hasOwnProperty(this.name) && (data[this.name] == 1 || data[this.name] == "true" || data[this.name] == true);
			    }else if (tag == 'select'){ // (this works for both single and multiple select elements)
			    	if(data.hasOwnProperty(this.name)){
			    		this.selectedIndex = this.values.indexOf(data[this.name]);
			    	}
			    	
			    }
			});
		}
		
		this.checkForErrors = function(formID, r){
			var hasErrors = r.hasOwnProperty("errors");
			var elements = $(formID +' :input');
			
			elements.each(function(){
				var type 	= this.type;
			    var tag 	= this.tagName.toLowerCase();
			    
				if(hasErrors 
						&& r.errors.hasOwnProperty(this.name)
						&& !r.errors[this.name]
						){

					$(this).parents("tr").addClass("error");
				}else{
					
					$(this).parents("tr").removeClass("error");
				}
			});
			return hasErrors;
		}
		
		this.queryAndCheckForm = function(args)
		{
			if(!args.hasOwnProperty("manager"))
				args.manager = "Users";
			
			var postData = $this.getFullFormData(args.formId);
			postData.formName = $(args.formId).attr("name");
			if(!postData.formName)
				postData.formName = $(args.formId).attr("id");
			
			// merge custom data with form data
			if(args.hasOwnProperty("getData"))
			{
				var customData = args.getData();
				for(var k in customData){
					postData[k] = customData[k];
				}
			}
			
			$this.query(args.manager,args.act,postData,function(r){
				if($this.checkForErrors(args.formId,r)){
					if(args.hasOwnProperty("onError"))
						args.onError(r.errors);
				}else{
					if(args.hasOwnProperty("onReady"))
						args.onReady(r);					
				}
			});
		}
	}
});

