// todo: place somewhere else
var secureCall = function(url) {
	if (typeof SERVER_DATA == 'undefined') return url;
	if (SERVER_DATA['token']) {
		for (var tokenKey in SERVER_DATA['token']);
		tokenValue = SERVER_DATA['token'][tokenKey];
		chr = (strpos(url,'?')>0) ? '&' : '?';
		securedURL = url+chr+tokenKey+''+"="+tokenValue;
		return securedURL;
	} else {
		return url;
	}
}
//


$.fn.findForm = function() {
	return $(this).closest("form");
}
$.fn.getFormValues = function() {
	var inputs = {};
	var $form = $(this);
	$(this).each(function() {
	
		var $inputs = $(this).find("[name]");
		$inputs.each(function() {
			
			var $input = $(this);
			if ($input.attr("name")!="") {
				var name = $input.attr("name");
				var type = $input.attr("type");
				if (typeof inputs[name] == 'undefined') {
					switch (type) {
						case "checkbox":
							if ($input.attr("checked")==true) inputs[name]=$input.val();
						break;
						case "radio":
							var $radios = $form.find("[name="+name+"]");
							var currentValue = $($radios[0]).val();
							$radios.each(function() {
								if ($(this).attr("checked")) {
									currentValue = $(this).val();
									return false;
								}
							});
							inputs[name] = currentValue;
						break;
						default:
							inputs[$input.attr("name")]=$input.val();
						break;
					}
				}
			}
			
			
		});
	});
	
	//console.log(inputs);
	return inputs;
};


$.fn.setFormValues = function (data,skip) {
	var data = data;
	if (typeof skip == 'undefined') skip = {};
	for (var x in data)  {
		if (skip[x]) {	
			// skip entry
		} else {
			var $input = $(this).find("[name="+x+"]");
			if ($input.length > 0) {
				switch ($input.attr("type")) {
					case "checkbox":
						$input.attr("checked",data[x]==$input.val());
					break;
					default:
						$input.val(data[x]);
					break;
				}
			}
		}
	}
}


$.fn.resetFormValues = function (data,skip) {
	var inputs = {};
	var $form = $(this);
	$(this).each(function() {
	
		var $inputs = $(this).find("[name]");
		$inputs.each(function() {
			
			var $input = $(this);
			if ($input.attr("name")!="") {
				var name = $input.attr("name");
				var type = $input.attr("type");
				
				switch (type) {
					case "checkbox":
						$input.attr("checked",false)
					break;
					case "hidden":
					break;
					case "radio":
						
					break;
					default:
						$input.val("");
					break;
				}
				
			}
			
			
		});
	});

}

$.fn.run = function(func,directlyAsObject,args) {
	if (typeof func == "function") {
		if (directlyAsObject) {
			this[0].func = func;
			return this[0].func(args);
		} else {
			this.func = func;
			return this.func(args);
		}
	}	
}


$.fn.submitForm = function(options) {
	var defaults = {
		success:function() {},
		error:function() {}
	}
	
	
	if (typeof options == 'object') {
		for (var x in options) defaults[x] = options[x];
		options = defaults;
	} else {
		options = defaults;
	}
	
	var o = options;
	var requestVars = $(this).getFormValues();
	
	var url = $(this).attr("action");
	
	
	if (typeof url=='undefined' || url=='' || url==false) {
		alert("form has no action defined!");
		return false;
	}
	
	var $form = $(this);
	
	$.post(secureCall(url),requestVars,function(response) {
		if (response) {
			if (response.error) {
				$form.run(o.error,false,response.message);
			} else {
				
				if (response.formdata) $form.setFormValues(response.formdata);
				$form.run(o.success,false,response.message);
			}
		}
		
	},'json');
}


$.fn.timeout = function(func,secToWait) {
	this[0].func = func;
	setTimeout(this[0].func,secToWait);
	return $(this);
}


$.fn.showSuccess = function(message,secToShow) {
	var secToShow = secToShow;
	var $msg = $(this);
	$msg.find(".text").html("");
	$msg.find(".text").append(message);
	$msg.removeClass("error").addClass("success").overlay("show");
	
}

$.fn.showError = function(message,secToShow) {
	var secToShow = secToShow;
	var $msg = $(this);
	$msg.find(".text").html(message);
	$msg.removeClass("success").addClass("error").overlay("show");
}
