(function($){
    $.fn.extend({
        AjaxForm: function () {
            this.live("reload", function (e, opts) {
                var $this = $(this),
				opts = $.extend({
				    removeForm: true,
				    throb: true
				}, $this.ParseClass(), opts),
				url = (opts.url) ? opts.url : $this.attr("action");
                if (!url) return;
                if (url.indexOf("FormDialog=true") === -1) {
                    url += ((url.indexOf("?") === -1) ? "?" : "&") + "FormDialog=true";
                }

                var data = (opts.sendFormValues !== false) ? $this.find("input, textarea, select").serializeArray() : {};

                if (opts.additional) {
                    for (var key in opts.additional) {
                        data.push({
                            name: key,
                            value: opts.additional[key]
                        });
                    }
                }
                if(opts.throb === true) {
					$this.trigger("throb");
				}
				$.post(url, data, function(data) {
                    if (data && !data.action) {
						try
						{
                            var obj = $.parseJSON(data);
						} catch(e){};
                    }
                    if (data && data.action) {
                        var obj = data;
                    }
                    if (!obj || !obj.action) {
                        var div = document.createElement("div");
                        div.innerHTML = data;
                        var formEl = $(div.firstChild);
                        obj = formEl.ParseClass(true);


						var span = formEl.find("span.actionsJSON");
						try
						{
							var spanObj = $.parseJSON(span.html());
							if (spanObj != null) {
								for(var key in spanObj) {
									obj[key] = spanObj[key];
								}
							}
						} catch(e){};
                    }
					if (obj && obj.i2aTrackingTag)
					{
						var i2aImg = new Image();
						i2aImg.src = obj.i2aTrackingTag + escape(document.referrer);
					}
                    if (obj && obj.action) {
						switch(obj.action) {
                            case "redirect":
								var loc = obj.location;
								// forceSecure is only for URLs that start with ?. It removes the current query off the url and
								// redirects to the same page secure and with the new query parameter
								if (obj.forceSecure === true && loc.substring(0,1) == "?") {
									loc = String(window.location).replace(/^([^\?]*).*$/, function($0, $1) { return $1; }).replace("http:","https:") + loc;
								}
                                window.location = loc;
                                return;
                            case "reloadContainer":
                                $(obj.reloadContainerSelector).trigger("reload");
                                break;
                            case "showElements":
                                $(obj.showSelector).show();
                                if(obj.hideSelector) {
									$(obj.hideSelector).hide();
								}
                                break;
                            
                            case "reloadEvent":
                                {
                                    $(formEl).trigger(obj.reloadTriggerEvent);
                                    break;
                                }
                            case "formDialog":
                                var fd = document.createElement("a");
                                fd.href = obj.formDialogOpts.FormDialogURL;
                                $fd = $(fd);
                                $fd.FormDialog();
                                var event = jQuery.Event("ajaxInit");
                                event.exts = obj.formDialogOpts;
                                $fd.trigger(event);
                                break;
                        }
                    }
                    if(opts.throb === true) {
						$this.trigger("unthrob");
					}
					
					//if we are firing a form dialog skip the replacement step
					//this could probably be more flexible
					if(obj.action != "formDialog" || obj.replaceForm === true) {
						if (opts.removeForm) {
							$this.html(formEl.html());
						} else {
							$this.html("").append(formEl);
						}
					}
					$this.find("a.loadInAjaxForm").click(function(e) {
						$this.trigger("reload", {url:$(this).attr("href"),sendFormValues: false});
                        $(this).parents(".ui-dialog-content").dialog("destroy");
                        return false;
                    });

                    $this.find("input[name='__VIEWSTATE']").attr("name", "__VIEWSTATEAjaxForm");
                    $this.find("input[name='__EVENTVALIDATION']").attr("name", "__EVENTVALIDATIONAjaxForm");

					$this.find("input[type='submit']").click(function(e) {
                        $this.find("input[name='__VIEWSTATEAjaxForm']").attr("name", "__VIEWSTATE");
                        $this.find("input[name='__EVENTVALIDATIONAjaxForm']").attr("name", "__EVENTVALIDATION");
                        var ele = $(e.target),
						params = {};
                        if (ele.parents("span.disabled").length) return false;
                        params[ele.attr("name")] = ele.val();
						$this.trigger("reload", {url: formEl.attr("action"),additional: params});
                        $(this).parents(".ui-dialog-content").dialog("destroy");
                        return false;
                    });

					$this.find("div.autoDialog").each(function() {
                        var $this = $(this),
						obj = $this.ParseClass();
						$this.dialog({
							width: obj.width || 440,
							minHeight: 0,
							autoOpen: true,
							modal: true
						});
					});
					

					$this.trigger("DOMupdated");
					
					if ($.RoundBox && $.RoundBox.init) {
						$.RoundBox.init();
					}
					
					if ($.datepicker && $.datepicker.init) {
						$.datepicker.init();
					}
					
					if ($.ClearDefaultText && $.ClearDefaultText.init) {
						$.ClearDefaultText.init();
					}
					
					if ($.ReloadContent && $.ReloadContent.init) {
						$.ReloadContent.init();
					}

                    if ($.datepicker && $.datepicker.init) {
                        $.datepicker.init();
                    }

                    if ($.ClearDefaultText && $.ClearDefaultText.init) {
                        $.ClearDefaultText.init();
                    }

                    if ($.ReloadContent && $.ReloadContent.init) {
                        $.ReloadContent.init();
                    }

					if ($.BillComparison && $.BillComparison.init) {
						$.BillComparison.init();
					}

					if ($.TXU && $.TXU.ShowMoreFuncInit) {
						$.TXU.ShowMoreFuncInit();
					}

                    if ($.ColumnEqualizer && $.ColumnEqualizer.init) {
                        $.ColumnEqualizer.init();
                    }

                    if ($.ShoppingAutoComplete && $.ShoppingAutoComplete.init) {
                        $.ShoppingAutoComplete.init();
                    }

                    if ($.StyledSelect && $.StyledSelect.init) {
                        $.StyledSelect.init();
                    }
                    
                    $this.find('input.inputShowMore:checked').trigger("click");
                });
                return false;
            });
            return this;
        }
    });
    $("div.ajaxForm").AjaxForm();
	$(function() {
		$("div.ajaxForm.lazyLoad").each(function() {
            $(this).trigger("reload");
        });
		$("a.ajaxFormLink").click(function() {
            var ele = $(this),
			obj = ele.ParseClass(true);
			$(obj.ajaxFormSelector).trigger("reload", {url:obj.ajaxFormURL,sendFormValues: false});
        });
    });
})(jQuery);

