/* * AdvancedAJAX 1.1.2 * (c) 2005-2006 Lukasz Lach * mail: anakin@php5.pl * www: http://advajax.anakin.us/ * http://anakin.us/ * http://creativecommons.org/licenses/LGPL/2.1/ * */ function advAJAX() { var obj = new Object(); obj.url = window.location.href; obj.method = "GET"; obj.parameters = new Object(); obj.jsonParameters = new Object(); obj.headers = new Object(); obj.async = true; obj.mimeType = "text/xml"; obj.username = null; obj.password = null; obj.form = null; obj.disableForm = true; obj.unique = true; obj.uniqueParameter = "_uniqid"; obj.requestDone = false; obj.queryString = ""; obj.responseText = null; obj.responseXML = null; obj.status = null; obj.statusText = null; obj.aborted = false; obj.timeout = 0; obj.retryCount = 0; obj.retryDelay = 1000; obj.tag = null; obj.group = null; obj.progressTimerInterval = 50; obj.xmlHttpRequest = null; obj.onInitialization = null; obj.onFinalization = null; obj.onReadyStateChange = null; obj.onLoading = null; obj.onLoaded = null; obj.onInteractive = null; obj.onComplete = null; obj.onProgress = null; obj.onSuccess = null; obj.onFatalError = null; obj.onError = null; obj.onTimeout = null; obj.onRetryDelay = null; obj.onRetry = null; obj.onGroupEnter = null; obj.onGroupLeave = null; obj.createXmlHttpRequest = function() { if (typeof XMLHttpRequest != "undefined") return new XMLHttpRequest(); var xhrVersion = [ "MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp","Microsoft.XMLHttp" ]; for (var i = 0; i < xhrVersion.length; i++) { try { var xhrObj = new ActiveXObject(xhrVersion[i]); return xhrObj; } catch (e) { } } obj.raiseEvent("FatalError"); return null; }; obj._oldResponseLength = null; obj._progressTimer = null; obj._progressStarted = navigator.userAgent.indexOf('Opera') == -1; obj._onProgress = function() { if (typeof obj.onProgress == "function" && typeof obj.xmlHttpRequest.getResponseHeader == "function") { var contentLength = obj.xmlHttpRequest.getResponseHeader("Content-length"); if (contentLength != null && contentLength != '') { var responseLength = obj.xmlHttpRequest.responseText.length; if (responseLength != obj._oldResponseLength) { obj.raiseEvent("Progress", obj, responseLength, contentLength); obj._oldResponseLength = obj.xmlHttpRequest.responseText.length; } } } if (obj._progressStarted) return; obj._progressStarted = true; var _obj = this; this.__onProgress = function() { obj._onProgress(); obj._progressTimer = window.setTimeout(_obj.__onProgress, obj.progressTimerInterval); } _obj.__onProgress(); } obj._onInitializationHandled = false; obj._initObject = function() { if (obj.xmlHttpRequest != null) { delete obj.xmlHttpRequest["onreadystatechange"]; obj.xmlHttpRequest = null; } if ((obj.xmlHttpRequest = obj.createXmlHttpRequest()) == null) return null; if (typeof obj.xmlHttpRequest.overrideMimeType != "undefined") obj.xmlHttpRequest.overrideMimeType(obj.mimeType); obj.xmlHttpRequest.onreadystatechange = function() { if (obj == null || obj.xmlHttpRequest == null) return; obj.raiseEvent("ReadyStateChange", obj, obj.xmlHttpRequest.readyState); obj._onProgress(); switch (obj.xmlHttpRequest.readyState) { case 1: obj._onLoading(); break; case 2: obj._onLoaded(); break; case 3: obj._onInteractive(); break; case 4: obj._onComplete(); break; } }; obj._onLoadingHandled = obj._onLoadedHandled = obj._onInteractiveHandled = obj._onCompleteHandled = false; }; obj._onLoading = function() { if (obj._onLoadingHandled) return; if (!obj._retry && obj.group != null) { if (typeof advAJAX._groupData[obj.group] == "undefined") advAJAX._groupData[obj.group] = 0; advAJAX._groupData[obj.group]++; if (typeof obj.onGroupEnter == "function" && advAJAX._groupData[obj.group] == 1) obj.onGroupEnter(obj); } obj.raiseEvent("Loading", obj); obj._onLoadingHandled = true; }; obj._onLoaded = function() { if (obj._onLoadedHandled) return; obj.raiseEvent("Loaded", obj); obj._onLoadedHandled = true; }; obj._onInteractive = function() { if (obj._onInteractiveHandled) return; obj.raiseEvent("Interactive", obj); obj._onInteractiveHandled = true; if (!obj._progressStarted) obj._onProgress(); }; obj._onComplete = function() { if (obj._onCompleteHandled || obj.aborted) return; if (obj._progressStarted) { window.clearInterval(obj._progressTimer); obj._progressStarted = false; } obj.requestDone = true; with (obj.xmlHttpRequest) { obj.responseText = responseText; obj.responseXML = responseXML; if (typeof status != "undefined") obj.status = status; if (typeof statusText != "undefined") obj.statusText = statusText; } obj.raiseEvent("Complete", obj); obj._onCompleteHandled = true; if (obj.status == 200) obj.raiseEvent("Success", obj); else obj.raiseEvent("Error", obj); delete obj.xmlHttpRequest['onreadystatechange']; obj.xmlHttpRequest = null; if (obj.disableForm) obj.switchForm(true); obj._groupLeave(); obj.raiseEvent("Finalization", obj); }; obj._groupLeave = function() { if (obj.group != null) { advAJAX._groupData[obj.group]--; if (advAJAX._groupData[obj.group] == 0) obj.raiseEvent("GroupLeave", obj); } }; obj._retry = false; obj._retryNo = 0; obj._onTimeout = function() { if (obj == null || obj.xmlHttpRequest == null || obj._onCompleteHandled) return; obj.aborted = true; obj.xmlHttpRequest.abort(); obj.raiseEvent("Timeout", obj); obj._retry = true; if (obj._retryNo != obj.retryCount) { obj._initObject(); if (obj.retryDelay > 0) { obj.raiseEvent("RetryDelay", obj); startTime = new Date().getTime(); while (new Date().getTime() - startTime < obj.retryDelay); } obj._retryNo++; obj.raiseEvent("Retry", obj, obj._retryNo); obj.run(); } else { delete obj.xmlHttpRequest["onreadystatechange"]; obj.xmlHttpRequest = null; if (obj.disableForm) obj.switchForm(true); obj._groupLeave(); obj.raiseEvent("Finalization", obj); } }; obj.run = function() { obj._initObject(); if (obj.xmlHttpRequest == null) return false; obj.aborted = false; if (!obj._onInitializationHandled) { obj.raiseEvent("Initialization", obj); obj._onInitializationHandled = true; } if (obj.method == "GET" && obj.unique) obj.parameters[encodeURIComponent(obj.uniqueParameter)] = new Date().getTime().toString().substr(5) + Math.floor(Math.random() * 100).toString(); if (!obj._retry) { for (var a in obj.parameters) { if (obj.queryString.length > 0) obj.queryString += "&"; if (typeof obj.parameters[a] != "object") obj.queryString += encodeURIComponent(a) + "=" + encodeURIComponent(obj.parameters[a]); else { for (var i = 0; i < obj.parameters[a].length; i++) obj.queryString += encodeURIComponent(a) + "=" + encodeURIComponent(obj.parameters[a][i]) + "&"; obj.queryString = obj.queryString.slice(0, -1); } } for (var a in obj.jsonParameters) { var useJson = typeof [].toJSONString == 'function'; if (obj.queryString.length > 0) obj.queryString += "&"; obj.queryString += encodeURIComponent(a) + "="; if (useJson) obj.queryString += encodeURIComponent(obj.jsonParameters[a].toJSONString()); else obj.queryString += encodeURIComponent(obj.jsonParameters[a]); } if (obj.method == "GET" && obj.queryString.length > 0) obj.url += (obj.url.indexOf("?") != -1 ? "&" : "?") + obj.queryString; } if (obj.disableForm) obj.switchForm(false); try { obj.xmlHttpRequest.open(obj.method, obj.url, obj.async, obj.username || '', obj.password || ''); } catch (e) { obj.raiseEvent("FatalError", obj, e); return; } if (obj.timeout > 0) setTimeout(obj._onTimeout, obj.timeout); if (typeof obj.xmlHttpRequest.setRequestHeader != "undefined") for (var a in obj.headers) obj.xmlHttpRequest.setRequestHeader(encodeURIComponent(a), encodeURIComponent(obj.headers[a])); if (obj.method == "POST" && typeof obj.xmlHttpRequest.setRequestHeader != "undefined") { obj.xmlHttpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); obj.xmlHttpRequest.send(obj.queryString); } else if (obj.method == "GET") obj.xmlHttpRequest.send(''); }; obj.handleArguments = function(args) { if (typeof args.form == "object" && args.form != null) { obj.form = args.form; obj.appendForm(); } for (a in args) { if (typeof obj[a] == "undefined") obj.parameters[a] = args[a]; else { if (a != "parameters" && a != "headers") obj[a] = args[a]; else for (b in args[a]) obj[a][b] = args[a][b]; } } obj.method = obj.method.toUpperCase(); }; obj.switchForm = function(enable) { if (typeof obj.form != "object" || obj.form == null) return; with (obj.form) for (var nr = 0; nr < elements.length; nr++) if (!enable) { if (elements[nr]["disabled"]) elements[nr]["_disabled"] = true; else elements[nr]["disabled"] = "disabled"; } else if (typeof elements[nr]["_disabled"] == "undefined") elements[nr].removeAttribute("disabled"); }; obj.appendForm = function() { with (obj.form) { obj.method = getAttribute("method").toUpperCase(); obj.url = getAttribute("action"); for (var nr = 0; nr < elements.length; nr++) { var e = elements[nr]; if (e.disabled) continue; switch (e.type) { case "text": case "password": case "hidden": case "textarea": obj.addParameter(e.name, e.value); break; case "select-one": if (e.selectedIndex >= 0) obj.addParameter(e.name, e.options[e.selectedIndex].value); break; case "select-multiple": for (var nr2 = 0; nr2 < e.options.length; nr2++) if (e.options[nr2].selected) obj.addParameter(e.name, e.options[nr2].value); break; case "checkbox": case "radio": if (e.checked) obj.addParameter(e.name, e.value); break; } } } }; obj.addParameter = function(name, value) { if (typeof obj.parameters[name] == "undefined") obj.parameters[name] = value; else if (typeof obj.parameters[name] != "object") obj.parameters[name] = [ obj.parameters[name], value ]; else obj.parameters[name][obj.parameters[name].length] = value; }; obj.delParameter = function(name) { delete obj.parameters[name]; }; obj.raiseEvent = function(name) { var args = []; for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); if (typeof obj["on" + name] == "function") obj["on" + name].apply(null, args); if (name == "FatalError") obj.raiseEvent("Finalization", obj); } if (typeof advAJAX._defaultParameters != "undefined") obj.handleArguments(advAJAX._defaultParameters); return obj; } advAJAX.get = function(args) { return advAJAX.handleRequest("GET", args); }; advAJAX.post = function(args) { return advAJAX.handleRequest("POST", args); }; advAJAX.head = function(args) { return advAJAX.handleRequest("HEAD", args); }; advAJAX.submit = function(form, args) { if (typeof args == "undefined" || args == null) return -1; if (typeof form != "object" || form == null) return -2; var request = new advAJAX(); args["form"] = form; request.handleArguments(args); return request.run(); }; advAJAX.assign = function(form, args) { if (typeof args == "undefined" || args == null) return -1; if (typeof form != "object" || form == null) return -2; if (typeof form["onsubmit"] == "function") form["_onsubmit"] = form["onsubmit"]; form["advajax_args"] = args; form["onsubmit"] = function() { if (typeof this["_onsubmit"] != "undefined" && this["_onsubmit"]() === false) return false; if (advAJAX.submit(this, this["advajax_args"]) == false) return true; return false; } return true; }; advAJAX.download = function(targetObj, url) { if (typeof targetObj == "string") targetObj = document.getElementById(targetObj); if (!targetObj) return -1; advAJAX.get({ url: url, onSuccess : function(obj) { targetObj.innerHTML = obj.responseText; } }); }; advAJAX.scan = function() { var obj = document.getElementsByTagName("a"); for (var i = 0; i < obj.length;) { if (obj[i].getAttribute("rel") == "advancedajax" && obj[i].getAttribute("href") !== null) { var url = obj[i].getAttribute("href"); var div = document.createElement("div"); div.innerHTML = obj[i].innerHTML; div.className = obj[i].className; var parent = obj[i].parentNode; parent.insertBefore(div, obj[i]); parent.removeChild(obj[i]); advAJAX.download(div, url); } else i++; } }; advAJAX.handleRequest = function(requestType, args) { if (typeof args == "undefined" || args == null) return -1; var request = new advAJAX(); window.advajax_obj = request; request.method = requestType; request.handleArguments(args); return request.run(); }; advAJAX._defaultParameters = new Object(); advAJAX.setDefaultParameters = function(args) { advAJAX._defaultParameters = new Object(); for (a in args) advAJAX._defaultParameters[a] = args[a]; }; advAJAX._groupData = new Object();