var PageTracker = new (function() {
    var _pageName = "";
    var _trackerCallback = null;
    var _formFields = [];
    var _formActionAliases = [];

    function getFieldsFromForm(form, key) {
        var fieldMap = {};
        $(form.elements).each(function(i) {
            if (this.value != "") {
                fieldMap[this[key]] = this.value;
            }
        });
        return fieldMap;
    }

    function getSubmittedFields(form) {
        var fields = [];
        var fieldMap = getFieldsFromForm(form, 'id');
        jQuery.each(_formFields, function() {
            if ($(form).find("input[name='" + this.id + "']").length ||
                $(form).find("#" + this.id.replace("/", "\\/") + ":visible").length) {
                fields.push(this);
            }
        });
        return fields;
    }

    function getTrackedFields(form, excludeNulls) {
        var f = [];
        var fields = {};
        var fieldMap = getFieldsFromForm(form, 'id');

        jQuery.each(_formActionAliases, function() {
            if (form.action.toLowerCase().indexOf(this.action.toLowerCase()) >= 0) {
                fields["action"] = this.alias;
            }
        });

        jQuery.each(getSubmittedFields(form), function() {
            var name = this.alias ? this.alias : this.id;
            var e = $(form).find("#" + this.id.replace("/", "\\/"));
            if (e.length) {
                var value = e.get(0).value ? e.get(0).value : e.get(0).innerHTML;
                if (value == "" && excludeNulls) {
                    return true;
                }
                fields[name] = value;
            }
        });
        return fields;
    }

    function getElements(form, excludeNulls) {
        var f = [];
        var fields = {};
        jQuery.each(form.elements, function() {
            var name = this.name;
            if (this.value == "" && excludeNulls) {
                return true;
            }
            fields[name] = this.value;
        });
        return fields;
    }

    function setSubmitHandler(form) {
        if (typeof (form.onsubmit) == "undefined" || !form.onsubmit || form.onsubmit == "") {
            form.onsubmit = function() { return true; }
        }

        var submitHandler = form.onsubmit;
        $(form).removeAttr("onsubmit");
        $(form).submit(function() {
            var result = submitHandler.call(form);
            if (typeof (result) == 'undefined' || result) { // Assumes an undefined result is a successful submit
                if (_trackerCallback) {
                    var trackerInfo = _pageName + "?" + jQuery.param(getTrackedFields($(form).get(0), true));
                    _trackerCallback(trackerInfo);
                }
                return true;
            }
            return false;
        });
    }

    this.init = function(config) {
        _formFields = [];
        jQuery.each(config, function() {
            if (this.id) _formFields.push(this);
            if (this.action) _formActionAliases.push(this);
            if (this.pageName) _pageName = this.pageName;
            if (this.tracker) _trackerCallback = this.tracker;
        });

        $("form").each(function() {
            setSubmitHandler(this);
        });
    }
})();

