/** * JsHttpRequest: JavaScript "AJAX" data loader (form support only!) * * @license LGPL * @author Dmitry Koterov, http://en.dklab.ru/lib/JsHttpRequest/ * @version 5.x $Id$ */ // {{{ function JsHttpRequest() { // Standard properties. var t = this; t.onreadystatechange = null; t.readyState = 0; t.responseText = null; t.responseXML = null; t.status = 200; t.statusText = "OK"; // JavaScript response array/hash t.responseJS = null; // Additional properties. t.caching = false; // need to use caching? t.loader = null; // loader to use ('form', 'script', 'xml'; null - autodetect) t.session_name = "PHPSESSID"; // set to SID cookie or GET parameter name // Internals. t._ldObj = null; // used loader object t._reqHeaders = []; // collected request headers t._openArgs = null; // parameters from open() t._errors = { inv_form_el: 'Invalid FORM element detected: name=%, tag=%', must_be_single_el: 'If used,
') + // stupid IE, MUST use innerHTML assignment :-( '' if (!form) { form = th.span.firstChild; } // Insert generated form inside the document. // Be careful: don't forget to close FORM container in document body! d.body.insertBefore(s, d.body.lastChild); // Function to safely set the form attributes. Parameter attr is NOT a hash // but an array, because "for ... in" may badly iterate over derived attributes. var setAttributes = function(e, attr) { var sv = []; var form = e; // This strange algorythm is needed, because form may contain element // with name like 'action'. In IE for such attribute will be returned // form element node, not form action. Workaround: copy all attributes // to new empty form and work with it, then copy them back. This is // THE ONLY working algorythm since a lot of bugs in IE5.0 (e.g. // with e.attributes property: causes IE crash). if (e.mergeAttributes) { var form = d.createElement('form'); form.mergeAttributes(e, false); } for (var i = 0; i < attr.length; i++) { var k = attr[i][0], v = attr[i][1]; // TODO: http://forum.dklab.ru/viewtopic.php?p=129059#129059 sv[sv.length] = [k, form.getAttribute(k)]; form.setAttribute(k, v); } if (e.mergeAttributes) { e.mergeAttributes(form, false); } return sv; } // Run submit with delay - for old Opera: it needs some time to create IFRAME. var closure = function() { // Save JsHttpRequest object to new IFRAME. top.JsHttpRequestGlobal = JsHttpRequest; // Disable ALL the form elements. var savedNames = []; if (!wholeFormSending) { for (var i = 0, n = form.elements.length; i < n; i++) { savedNames[i] = form.elements[i].name; form.elements[i].name = ''; } } // Insert hidden fields to the form. var qt = th.queryText.split('&'); for (var i = qt.length - 1; i >= 0; i--) { var pair = qt[i].split('=', 2); var e = d.createElement('INPUT'); e.type = 'hidden'; e.name = unescape(pair[0]); e.value = pair[1] != null? unescape(pair[1]) : ''; form.appendChild(e); } // Change names of along user-passed form elements. for (var i = 0; i < th.queryElem.length; i++) { th.queryElem[i].e.name = th.queryElem[i].name; } // Temporary modify form attributes, submit form, restore attributes back. var sv = setAttributes( form, [ ['action', th.url], ['method', th.method], ['onsubmit', null], ['target', ifname] ] ); form.submit(); setAttributes(form, sv); // Remove generated temporary hidden elements from the top of the form. for (var i = 0; i < qt.length; i++) { // Use "form.firstChild.parentNode", not "form", or IE5 crashes! form.lastChild.parentNode.removeChild(form.lastChild); } // Enable all disabled elements back. if (!wholeFormSending) { for (var i = 0, n = form.elements.length; i < n; i++) { form.elements[i].name = savedNames[i]; } } } JsHttpRequest.setTimeout(closure, 100); // Success. return null; } }} // }}}