;(function($) { 

$.extend($.expr[':'], { 
	submitable: function(a) { 
  	return !a.disabled&&(a.selected||a.checked||(a.nodeName.toUpperCase()=='TEXTAREA')||(a.nodeName.toUpperCase()=='INPUT'&&(a.type=='text'||a.type=='hidden'||a.type=='password'))); 
	}, 
	nothidden: function(a) { 
		return a.type&&a.type!='hidden'; 
	} 
})

$.fn.extend(
	{
		initForm: function(option)
		{
			this.initAccordion(option);

			try
			{
				if (this.attr("jqfocus") != "false")
				{
					this.find(":input:visible:enabled").get(0).focus();
				}
			}
			catch(e)
			{
			}

			this.initValidate(option);

			this.append("<input type=\"hidden\" name=\"jqAjax\"/>");

			this.removeAttr("notInit");
		}
		,
		initAccordion: function(option)
		{
			this.find("div[accID]").next().hide();
			for (var i = 0; i < option.acc.length; i++)
			{
				$(this.find("*[accID = '" + option.acc[i] + "']").get(0)).next().show();
			}
			this.find("div[accID]").bind("click.casper", function()
			{
				var obj = $(this);
				var aid = obj.attr("accID");
				var hidden = obj.next().is(":hidden");
				$("div[accID = '" + aid + "'][id != '" + obj.attr("id") + "']").next().hide();
				if (hidden)
				{
					obj.next().show();
					try
					{
						obj.next().find(":input:visible").get(0).focus();
					}
					catch(err){}
				}
				else
				{
					obj.next().hide();
				}
			});
		}
		,
		initValidate: function(option)
		{
			var vp = [];
			var l = this.find(":input");
			for(var i = 0; i < l.length; i++)
			{
				var o = $(l[i]);
				var p = {};
				var add = false;
				if (o.attr("jqrequired") == "true")
				{
					p.required = true;
					add = true;
				}
				var type = o.attr("jqtype");
				switch (type)
				{
					case "int":
						p.digits = true;
						add = true;
						break;
					case "date":
						if (option.dateUK)
						{
							p.dateITA = true;
						}
						else
						{
							p.date = true;
						}
						add = true;
						break;
					case "email":
						p.email = true;
						add = true;
						break;
					case "float":
						p.number = true;
						add = true;
						break;
				}
				if (add)
				{
					vp[o.attr("id")] = p;
				}
			}

			var vparam= {
				debug: false,
				rules: vp,
/*
				errorElement: "label",
				wrapper: "li",
				errorLabelContainer: "#FormGlobalError ul",
				showErrors: function(errorMap, errorList) {
					this.defaultShowErrors();
				},
*/
				onfocusout: function(element) {
					validator.element(element);
				},
				highlight: function(element, errorClass) {
					$(element).markControl();
				},
				unhighlight: function(element, errorClass) {
					$(element).unmarkControl();
				},
			};

			if (this.attr("jqno") != "true")
			{
				vparam.submitHandler = function(f) {
					var form = $(f);

					var ifv = false;
					if (form.attr("enctype") == "multipart/form-data" && form.attr("method") == "post")
						ifv = true;
					form.find("*[name='jqAjax']").val(Math.random());

					form.clearGlobalError();
					form.blockForm();

					form.attr("isSubmit", "true");

			    form.ajaxSubmit
			    ({
			    	iframe: ifv,
			    	dataType: "xml",
						success: function (responseText, statusText, xhr){
							form.unblockForm();

							if (ifv)
							{
								try
								{
									var data = "";
									if (responseText.xml != null)
									{
										data += responseText.xml;
									}
									else
									{
										data += (new XMLSerializer()).serializeToString(responseText);
									}
									data = data.replace("]]><![CDATA[", "");
									$.taconite(data);
								}
								catch(e)
								{
									form.addGlobalError(e);	
								}
							}

							form.removeAttr("isSubmit");
            },
						error: function (responseText, statusText, xhr){
							form.unblockForm();
							form.addGlobalError(statusText);	

							form.removeAttr("isSubmit");
            },
			    }); 

				};
			}

			var validator = this.validate(vparam);
		}
		,
		markControl: function()
		{
			this.parent().addClass("error");
		}
		,
		unmarkControl: function()
		{
			this.parent().removeClass("error");
		}
		,
		addGlobalError: function(err)
		{
			this.find("#FormGlobalError ul").append("<li>" + err + "</li>");
		}
		,
		clearGlobalError: function(err)
		{
			this.find("#FormGlobalError ul").html("");
		}
		,
		blockForm: function()
		{
			this.find("*:submit, *:image, button").attr("disabled", true);

//			$.fancybox.showActivity();
			if (this.attr("jqblock") == "full")
				$.blockUI();
			else
				this.block();
		}
		,
		unblockForm: function()
		{
			this.find("*:submit, *:image, button").attr("disabled", false);

//			$.fancybox.hideActivity();
			if (this.attr("jqblock") == "full")
				$.unblockUI();
			else
				this.unblock();
		}
	}
);


if ($.blockUI)
{
	$.blockUI.defaults.message = "<img src=\"/design/image/system/loading.gif\" style=\"width: 40px; height: 40	px; padding: -1px; margin: -1px;\"/>";
	$.blockUI.defaults.css.border = "0px solid #000";
	$.blockUI.defaults.css.top = "50%";
	$.blockUI.defaults.css.left = "50%";
	$.blockUI.defaults.css.padding = "0px";
	$.blockUI.defaults.css.height = "40px";
	$.blockUI.defaults.css.width = "40px";
	$.blockUI.defaults.css.textAlign = "center";
	$.blockUI.defaults.css.background = "transparent";
}

})(jQuery);


