window.AjaxPanel = AjaxPanel = {
    init: function(panel) {
        if (panel.filterId == null) {
            panel.filterId = panel.id;
        }
        panel.location = window.location.toString();
    },

    reload: function(panel) {
        var requestUrl = panel.location;
        requestUrl = AjaxPanel._addParam(requestUrl, "FormFilter", panel.filterId);
        AjaxPanel._showProgress();
        new Ajax.Request(requestUrl, {
            method: 'get',
            onSuccess: function(transport) {
                panel.location = requestUrl;
                AjaxPanel._update(panel, transport.responseText);
                AjaxPanel._hideProgress();
            }
        });
    },

    _bind: function(panel) {
        var links = $$("#" + panel.id + " a");
        var inputs = $$("#" + panel.id + " input");
        var forms = $$("#" + panel.id + " form");
        for (var i = 0; i < links.length; i++) {
            var link = links[i];
            if (AjaxPanel._matchPages(document.location.href, link.href)) {
                link.panel = panel;
                link.onclick = function() { return false; }
                link.observe("click", AjaxPanel._linkClick);
            }
        }
        for (var i = 0; i < forms.length; i++) {
            var currentForm = forms[i];
            currentForm.panel = panel;
            currentForm.firstInput = null;
            var inputs = currentForm.getElementsByTagName('input');
            for (var j = 0; j < inputs.length; j++) {
                var input = inputs[j];
                if (input.type != null && (input.type.toLowerCase() == "submit" || input.type.toLowerCase() == "image")) {
                    if (currentForm.firstInput == null) {
                        currentForm.firstInput = input;
                    }
                    input.panel = panel;
                    input.observe("click", AjaxPanel._inputClick);
                }
            }
            currentForm.onsubmit = function() {
                AjaxPanel._submitForm(this);
                return false;
            }
        }
        if(panel.onrefresh) {
            panel.onrefresh.apply(panel);
        }
    },

    _inputClick: function(event) {
        var sender = Event.element(event);
        sender.form.lastClick = sender;
    },

    _submitForm: function(form) {
        if (form != null) {
            AjaxPanel._showProgress();
            var submitButton = false;
            if (form.lastClick) {
                submitButton = form.lastClick.name;
            } else if (form.firstInput){
                submitButton = form.firstInput.name;
            }
            var action = form.readAttribute('action') || '';
            if (action.blank()) action = window.location.href;
            action = AjaxPanel._addParam(action, "FormFilter", form.panel.filterId);
            var formInputs = $A($(form).getElementsByTagName('*')).inject([],
                function(elements, child) {
                    if (Form.Element.Serializers[child.tagName.toLowerCase()]) {
                        if (!child.type || (child.type != "image" && child.type != "submit") || submitButton == child.name) {
                            elements.push(Element.extend(child));
                        }
                    }
                    return elements;
                }
            );
            var parameters = Form.serializeElements(formInputs, {submit: submitButton});
            var method = "post";
            if (form.hasAttribute('method')) {
              method = form.method;
            }
            new Ajax.Request(action, {
                method: method,
                parameters: parameters,
                onSuccess: function(transport) {
                    form.panel.location = action;
                    AjaxPanel._update(form.panel, transport.responseText);
                    AjaxPanel._hideProgress();
                }
            });
        }
        return false;
    },

    _linkClick: function(event) {
        var sender = Event.element(event);
        while (!sender.panel) sender = sender.parentNode;
        if (sender.href.indexOf("javascript:") == 0)
            return false;
        var getUrl = AjaxPanel._addParam(sender.href, "FormFilter", sender.panel.filterId);
        AjaxPanel._showProgress();
        new Ajax.Request(getUrl, {
            method: "get",
            onSuccess: function(transport) {
                sender.panel.location = getUrl;
                AjaxPanel._update(sender.panel, transport.responseText);
                AjaxPanel._hideProgress();
            }
        });
        return false;
    },

    _update: function(panel, content) {
        $(panel.id).innerHTML = content;
        var scrs = $(panel.id).getElementsByTagName('script');
        for(var i = 0; i < scrs.length; i++){
             eval(scrs[i].innerHTML);
        }
        AjaxPanel._bind(panel);
        try {
            eval(panel.id + "_bind();");
        } catch(e) {};
    },

    _matchPages: function(pageUrl, linkUrl) {
        if (linkUrl == null || linkUrl == "#" || linkUrl == "") { return false; }
        if (AjaxPanel._getScriptPath(pageUrl).toLowerCase() == AjaxPanel._getScriptPath(linkUrl).toLowerCase()) {
            return true;
        }
        return false;
    },

    _getScriptPath: function(fullUrl) {
        var questPos = fullUrl.indexOf("?");
        if (questPos == -1) { return fullUrl };
        return fullUrl.substring(0, questPos);
    },

    _showProgress: function() {
        if ($("AjaxPanelProgress") != null) {
            return false;
        }
        var progressSpan = document.createElement("div");
        progressSpan.style.position = "absolute";
        progressSpan.style.zIndex = 1000;
        progressSpan.style.top = "3px";
        progressSpan.style.right = "3px";
        progressSpan.id = "AjaxPanelProgress";
        progressSpan.innerHTML = "<div style=\"background-color: #D33333; font-family: Tahoma; font-size: 8pt; padding:1px; color: #FFFFFF;\">&nbsp;Loading...&nbsp;</div>";
        document.body.appendChild(progressSpan);
    },

    _hideProgress: function() {
        if ($("AjaxPanelProgress") == null) {
            return false;
        }
        document.body.removeChild($("AjaxPanelProgress"));
    },

    _addParam: function(queryStr, paramName, paramValue) {
        queryStr = unescape(queryStr);
        queryStr = queryStr.replace(/\+/g, " ");
        var queryParts = queryStr.split("?");
        var params = new Hash();
        if (queryParts.length > 1) {
            params = new Hash(queryStr.toQueryParams());
        }
        params.set(paramName, paramValue);
        return queryParts[0] + "?" + params.toQueryString();
    },

    _removeParam: function(queryStr, paramName) {
        var queryParts = queryStr.split("?");
        var params = new Hash();
        if (queryParts.length > 1) {
            params = new Hash(queryStr.toQueryParams());
            params.unset(paramName);
        }
        return queryParts[0] + "?" + params.toQueryString();
    }
}
