var RedirectHttp = { submit_request: false, keep_content: false, name: 'request', /* Returns the target uri for redirection */ redirect_uri: function() { return '<%= redirect_action %>/' + escape(RedirectHttp.name) + "/" + RedirectHttp.keep_content; }, /* Redirects forms and then submits the form if submit is true. */ redirect_form: function(form, submit) { if(typeof submit == 'undefined') { submit = true }; if(submit) { // form.submit() raises an error if an input is named submit // (note you're hosed if the input is not type=submit) var submit_inputs = []; var inputs = document.getElementsByTagName('input'); for(i=0; isubmit'); submit_inputs.push(input); } } // this works without recursing to redirect_form because the onsubmit // event handler is not executed when a form is submitted by Javascript form.setAttribute('action', RedirectHttp.redirect_uri()); form.submit(); if(RedirectHttp.submit_request) { this.revert(); form.submit(); }; // reset the submit inputs for(i=0; ioriginal_href'); location.href = RedirectHttp.redirect_uri() + '?<%= redirect_parameter %>=' + escape(original_href); if(RedirectHttp.submit_request) { this.revert(); location.href = link.getAttribute("href"); }; }; }, /* Wraps the current onX event so that it may be called without interfering * with the redirection (ie wrapper). */ wrap: function(current, wrapper) { return "try {" + " var <%= prefix %>result = function(<%= prefix %>this) { " + current.replace(/(\W)this(?=\W)/g, "$1<%= prefix %>this") + " }(this);" + " RedirectHttp." + wrapper + "(this, <%= prefix %>result);" + "} catch(ex) {" + "alert('Error during redirection: ' + ex.message + '\\nOriginal onsubmit: " + current.replace(/'/g, "\\'") + "');" + "}; return false;" }, /* Redirects forms and links to '<%= redirect_action %>' */ redirect: function() { try { // redirect forms to the redirect_action var forms = document.getElementsByTagName('form'); for(i=0; i if(form.getAttribute("class") != "<%= prefix %>form") { // store the original action var input = document.createElement("input"); input.setAttribute("id", '<%= redirect_parameter %>_' + i); input.setAttribute("name", '<%= redirect_parameter %>'); input.setAttribute("type", 'hidden'); input.setAttribute("value", form.getAttribute('action')); form.setAttribute('<%= prefix %>index', i); form.appendChild(input); // redirect onSubmit var current_on_submit = ''; if(form.hasAttribute("onSubmit")) current_on_submit = form.getAttribute("onSubmit"); var on_submit = RedirectHttp.wrap(current_on_submit, 'redirect_form'); form.setAttribute("onSubmit", on_submit); form.setAttribute("<%= prefix %>original_callback", current_on_submit); } } // redirect links to the redirect_action var links = document.getElementsByTagName('a'); for(i=0; i if(link.getAttribute("class") != "<%= prefix %>link") { // store the original href link.setAttribute("<%= prefix %>original_href", link.getAttribute("href")); // redirect onClick var current_on_click = ''; if(link.hasAttribute("onClick")) current_on_click = link.getAttribute("onClick"); var on_click = RedirectHttp.wrap(current_on_click, 'redirect_link'); link.setAttribute("onClick", on_click); link.setAttribute("<%= prefix %>original_callback", current_on_click); }; } } catch(ex) { alert_error(ex); } }, /* Reverts redirection and removes the redirection div */ revert: function() { try { // redirect forms back to original actions var forms = document.getElementsByTagName('form'); for(i=0; iindex')) { var index = form.getAttribute('<%= prefix %>index'); var input = document.getElementById("<%= redirect_parameter %>_" + index); form.setAttribute('action', input.value); form.removeAttribute('<%= prefix %>index'); form.removeChild(input); form.setAttribute('onSubmit', form.getAttribute('<%= prefix %>original_callback')); form.removeAttribute('<%= prefix %>original_callback'); } } // redirect links back to original hrefs var links = document.getElementsByTagName('a'); for(i=0; ioriginal_href')) { link.setAttribute('href', link.getAttribute('<%= prefix %>original_href')); link.removeAttribute('<%= prefix %>original_href'); link.setAttribute('onClick', link.getAttribute('<%= prefix %>original_callback')); link.removeAttribute('<%= prefix %>original_callback'); } } } catch(ex) { alert_error(ex); } // remove self var redirect_http = document.getElementById("<%= prefix %>") if(redirect_http) document.body.removeChild(redirect_http); }, // Alerts of errors due to RedirectHttp alert_error: function(ex) { alert("Redirect HTTP Error: " + ex.message + "\n\n The webpage may have been corrupted; be sure to refresh."); } };