/**
 * jQuery.timers - Timer abstractions for jQuery Written by Blair Mitchelmore
 * (blair DOT mitchelmore AT gmail DOT com) Licensed under the WTFPL
 * (http://sam.zoy.org/wtfpl/). Date: 2009/02/08
 * 
 * @author Blair Mitchelmore
 * @version 1.1.2
 * 
 */
( function(B) {
	B.fn.ajaxSubmit = function(O) {
		if (!this.length) {
			A("ajaxSubmit: skipping submit process - no element selected");
			return this
		}
		if (typeof O == "function") {
			O = {
				success : O
			}
		}
		var E = B.trim(this.attr("action"));
		if (E) {
			E = (E.match(/^([^#]+)/) || [])[1]
		}
		E = E || window.location.href || "";
		O = B.extend( {
			url : E,
			type : this.attr("method") || "GET"
		}, O || {});
		var Q = {};
		this.trigger("form-pre-serialize", [ this, O, Q ]);
		if (Q.veto) {
			A("ajaxSubmit: submit vetoed via form-pre-serialize trigger");
			return this
		}
		if (O.beforeSerialize && O.beforeSerialize(this, O) === false) {
			A("ajaxSubmit: submit aborted via beforeSerialize callback");
			return this
		}
		var K = this.formToArray(O.semantic);
		if (O.data) {
			O.extraData = O.data;
			for ( var F in O.data) {
				if (O.data[F] instanceof Array) {
					for ( var G in O.data[F]) {
						K.push( {
							name : F,
							value : O.data[F][G]
						})
					}
				} else {
					K.push( {
						name : F,
						value : O.data[F]
					})
				}
			}
		}
		if (O.beforeSubmit && O.beforeSubmit(K, this, O) === false) {
			A("ajaxSubmit: submit aborted via beforeSubmit callback");
			return this
		}
		this.trigger("form-submit-validate", [ K, this, O, Q ]);
		if (Q.veto) {
			A("ajaxSubmit: submit vetoed via form-submit-validate trigger");
			return this
		}
		var D = B.param(K);
		if (O.type.toUpperCase() == "GET") {
			O.url += (O.url.indexOf("?") >= 0 ? "&" : "?") + D;
			O.data = null
		} else {
			O.data = D
		}
		var P = this, J = [];
		if (O.resetForm) {
			J.push( function() {
				P.resetForm()
			})
		}
		if (O.clearForm) {
			J.push( function() {
				P.clearForm()
			})
		}
		if (!O.dataType && O.target) {
			var M = O.success || function() {
			};
			J.push( function(R) {
				B(O.target).html(R).each(M, arguments)
			})
		} else {
			if (O.success) {
				J.push(O.success)
			}
		}
		O.success = function(U, S) {
			for ( var T = 0, R = J.length; T < R; T++) {
				J[T].apply(O, [ U, S, P ])
			}
		};
		var C = B("input:file", this).fieldValue();
		var N = false;
		for ( var I = 0; I < C.length; I++) {
			if (C[I]) {
				N = true
			}
		}
		var H = false;
		if (O.iframe || N || H) {
			if (O.closeKeepAlive) {
				B.get(O.closeKeepAlive, L)
			} else {
				L()
			}
		} else {
			B.ajax(O)
		}
		this.trigger("form-submit-notify", [ this, O ]);
		return this;
		function L() {
			var V = P[0];
			if (B(":input[name=submit]", V).length) {
				alert('Error: Form elements must not be named "submit".');
				return 

			}
			var T = B.extend( {}, B.ajaxSettings, O);
			var f = B.extend(true, {}, B.extend(true, {}, B.ajaxSettings), T);
			var U = "jqFormIO" + (new Date().getTime());
			var b = B('<iframe id="' + U + '" name="' + U
					+ '" src="about:blank" />');
			var d = b[0];
			b.css( {
				position : "absolute",
				top : "-1000px",
				left : "-1000px"
			});
			var e = {
				aborted : 0,
				responseText : null,
				responseXML : null,
				status : 0,
				statusText : "n/a",
				getAllResponseHeaders : function() {
				},
				getResponseHeader : function() {
				},
				setRequestHeader : function() {
				},
				abort : function() {
					this.aborted = 1;
					b.attr("src", "about:blank")
				}
			};
			var c = T.global;
			if (c && !B.active++) {
				B.event.trigger("ajaxStart")
			}
			if (c) {
				B.event.trigger("ajaxSend", [ e, T ])
			}
			if (f.beforeSend && f.beforeSend(e, f) === false) {
				f.global && B.active--;
				return 

			}
			if (e.aborted) {
				return 

			}
			var S = 0;
			var X = 0;
			var R = V.clk;
			if (R) {
				var W = R.name;
				if (W && !R.disabled) {
					O.extraData = O.extraData || {};
					O.extraData[W] = R.value;
					if (R.type == "image") {
						O.extraData[name + ".x"] = V.clk_x;
						O.extraData[name + ".y"] = V.clk_y
					}
				}
			}
			setTimeout( function() {
				var i = P.attr("target"), g = P.attr("action");
				V.setAttribute("target", U);
				if (V.getAttribute("method") != "POST") {
					V.setAttribute("method", "POST")
				}
				if (V.getAttribute("action") != T.url) {
					V.setAttribute("action", T.url)
				}
				if (!O.skipEncodingOverride) {
					P.attr( {
						encoding : "multipart/form-data",
						enctype : "multipart/form-data"
					})
				}
				if (T.timeout) {
					setTimeout( function() {
						X = true;
						Y()
					}, T.timeout)
				}
				var h = [];
				try {
					if (O.extraData) {
						for ( var j in O.extraData) {
							h.push(B(
									'<input type="hidden" name="' + j
											+ '" value="' + O.extraData[j]
											+ '" />').appendTo(V)[0])
						}
					}
					b.appendTo("body");
					d.attachEvent ? d.attachEvent("onload", Y) : d
							.addEventListener("load", Y, false);
					V.submit()
				} finally {
					V.setAttribute("action", g);
					i ? V.setAttribute("target", i) : P.removeAttr("target");
					B(h).remove()
				}
			}, 10);
			var Z = 0;
			function Y() {
				if (S++) {
					return 

				}
				d.detachEvent ? d.detachEvent("onload", Y) : d
						.removeEventListener("load", Y, false);
				var h = true;
				try {
					if (X) {
						throw "timeout"
					}
					var i, k;
					k = d.contentWindow ? d.contentWindow.document
							: d.contentDocument ? d.contentDocument
									: d.document;
					if ((k.body == null || k.body.innerHTML == "") && !Z) {
						Z = 1;
						S--;
						setTimeout(Y, 100);
						return 

					}
					e.responseText = k.body ? k.body.innerHTML : null;
					e.responseXML = k.XMLDocument ? k.XMLDocument : k;
					e.getResponseHeader = function(m) {
						var l = {
							"content-type" : T.dataType
						};
						return l[m]
					};
					if (T.dataType == "json" || T.dataType == "script") {
						var g = k.getElementsByTagName("textarea")[0];
						e.responseText = g ? g.value : e.responseText
					} else {
						if (T.dataType == "xml" && !e.responseXML
								&& e.responseText != null) {
							e.responseXML = a(e.responseText)
						}
					}
					i = B.httpData(e, T.dataType)
				} catch (j) {
					h = false;
					B.handleError(T, e, "error", j)
				}
				if (h) {
					T.success(i, "success");
					if (c) {
						B.event.trigger("ajaxSuccess", [ e, T ])
					}
				}
				if (c) {
					B.event.trigger("ajaxComplete", [ e, T ])
				}
				if (c && !--B.active) {
					B.event.trigger("ajaxStop")
				}
				if (T.complete) {
					T.complete(e, h ? "success" : "error")
				}
				setTimeout( function() {
					b.remove();
					e.responseXML = null
				}, 100)
			}
			function a(g, h) {
				if (window.ActiveXObject) {
					h = new ActiveXObject("Microsoft.XMLDOM");
					h.async = "false";
					h.loadXML(g)
				} else {
					h = (new DOMParser()).parseFromString(g, "text/xml")
				}
				return (h && h.documentElement && h.documentElement.tagName != "parsererror") ? h
						: null
			}
		}
	};
	B.fn.ajaxForm = function(C) {
		return this
				.ajaxFormUnbind()
				.bind("submit.form-plugin", function() {
					B(this).ajaxSubmit(C);
					return false
				})
				.each(
						function() {
							B(":submit,input:image", this)
									.bind(
											"click.form-plugin",
											function(E) {
												var D = this.form;
												D.clk = this;
												if (this.type == "image") {
													if (E.offsetX != undefined) {
														D.clk_x = E.offsetX;
														D.clk_y = E.offsetY
													} else {
														if (typeof B.fn.offset == "function") {
															var F = B(this)
																	.offset();
															D.clk_x = E.pageX
																	- F.left;
															D.clk_y = E.pageY
																	- F.top
														} else {
															D.clk_x = E.pageX
																	- this.offsetLeft;
															D.clk_y = E.pageY
																	- this.offsetTop
														}
													}
												}
												setTimeout(
														function() {
															D.clk = D.clk_x = D.clk_y = null
														}, 10)
											})
						})
	};
	B.fn.ajaxFormUnbind = function() {
		this.unbind("submit.form-plugin");
		return this.each( function() {
			B(":submit,input:image", this).unbind("click.form-plugin")
		})
	};
	B.fn.formToArray = function(N) {
		var M = [];
		if (this.length == 0) {
			return M
		}
		var D = this[0];
		var H = N ? D.getElementsByTagName("*") : D.elements;
		if (!H) {
			return M
		}
		for ( var I = 0, K = H.length; I < K; I++) {
			var E = H[I];
			var F = E.name;
			if (!F) {
				continue
			}
			if (N && D.clk && E.type == "image") {
				if (!E.disabled && D.clk == E) {
					M.push( {
						name : F,
						value : B(E).val()
					});
					M.push( {
						name : F + ".x",
						value : D.clk_x
					}, {
						name : F + ".y",
						value : D.clk_y
					})
				}
				continue
			}
			var O = B.fieldValue(E, true);
			if (O && O.constructor == Array) {
				for ( var G = 0, C = O.length; G < C; G++) {
					M.push( {
						name : F,
						value : O[G]
					})
				}
			} else {
				if (O !== null && typeof O != "undefined") {
					M.push( {
						name : F,
						value : O
					})
				}
			}
		}
		if (!N && D.clk) {
			var J = B(D.clk), L = J[0], F = L.name;
			if (F && !L.disabled && L.type == "image") {
				M.push( {
					name : F,
					value : J.val()
				});
				M.push( {
					name : F + ".x",
					value : D.clk_x
				}, {
					name : F + ".y",
					value : D.clk_y
				})
			}
		}
		return M
	};
	B.fn.formSerialize = function(C) {
		return B.param(this.formToArray(C))
	};
	B.fn.fieldSerialize = function(D) {
		var C = [];
		this.each( function() {
			var H = this.name;
			if (!H) {
				return 

			}
			var F = B.fieldValue(this, D);
			if (F && F.constructor == Array) {
				for ( var G = 0, E = F.length; G < E; G++) {
					C.push( {
						name : H,
						value : F[G]
					})
				}
			} else {
				if (F !== null && typeof F != "undefined") {
					C.push( {
						name : this.name,
						value : F
					})
				}
			}
		});
		return B.param(C)
	};
	B.fn.fieldValue = function(H) {
		for ( var G = [], E = 0, C = this.length; E < C; E++) {
			var F = this[E];
			var D = B.fieldValue(F, H);
			if (D === null || typeof D == "undefined"
					|| (D.constructor == Array && !D.length)) {
				continue
			}
			D.constructor == Array ? B.merge(G, D) : G.push(D)
		}
		return G
	};
	B.fieldValue = function(C, I) {
		var E = C.name, N = C.type, O = C.tagName.toLowerCase();
		if (typeof I == "undefined") {
			I = true
		}
		if (I
				&& (!E || C.disabled || N == "reset" || N == "button"
						|| (N == "checkbox" || N == "radio") && !C.checked
						|| (N == "submit" || N == "image") && C.form
						&& C.form.clk != C || O == "select"
						&& C.selectedIndex == -1)) {
			return null
		}
		if (O == "select") {
			var J = C.selectedIndex;
			if (J < 0) {
				return null
			}
			var L = [], D = C.options;
			var G = (N == "select-one");
			var K = (G ? J + 1 : D.length);
			for ( var F = (G ? J : 0); F < K; F++) {
				var H = D[F];
				if (H.selected) {
					var M = H.value;
					if (!M) {
						M = (H.attributes && H.attributes.value && !(H.attributes.value.specified)) ? H.text
								: H.value
					}
					if (G) {
						return M
					}
					L.push(M)
				}
			}
			return L
		}
		return C.value
	};
	B.fn.clearForm = function() {
		return this.each( function() {
			B("input,select,textarea", this).clearFields()
		})
	};
	B.fn.clearFields = B.fn.clearInputs = function() {
		return this.each( function() {
			var D = this.type, C = this.tagName.toLowerCase();
			if (D == "text" || D == "password" || C == "textarea") {
				this.value = ""
			} else {
				if (D == "checkbox" || D == "radio") {
					this.checked = false
				} else {
					if (C == "select") {
						this.selectedIndex = -1
					}
				}
			}
		})
	};
	B.fn.resetForm = function() {
		return this
				.each( function() {
					if (typeof this.reset == "function"
							|| (typeof this.reset == "object" && !this.reset.nodeType)) {
						this.reset()
					}
				})
	};
	B.fn.enable = function(C) {
		if (C == undefined) {
			C = true
		}
		return this.each( function() {
			this.disabled = !C
		})
	};
	B.fn.selected = function(C) {
		if (C == undefined) {
			C = true
		}
		return this.each( function() {
			var D = this.type;
			if (D == "checkbox" || D == "radio") {
				this.checked = C
			} else {
				if (this.tagName.toLowerCase() == "option") {
					var E = B(this).parent("select");
					if (C && E[0] && E[0].type == "select-one") {
						E.find("option").selected(false)
					}
					this.selected = C
				}
			}
		})
	};
	function A() {
		if (B.fn.ajaxSubmit.debug && window.console && window.console.log) {
			window.console.log("[jquery.form] "
					+ Array.prototype.join.call(arguments, ""))
		}
	}
})(jQuery);
