From: Argiris K. <be...@us...> - 2005-11-14 18:50:55
|
Update of /cvsroot/magicajax/magicajax/Core/script In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30932/Core/script Added Files: AjaxCallObject.js Log Message: Replaced all "CallBack" references by "AjaxCall" --- NEW FILE: AjaxCallObject.js --- __AJAXCboList = new Array(); __bPageIsStored = false; __PreviousOnFormSubmit = null; __PreviousPostBack = null; __PreviousOnPageLoad = null; __PreviousOnPageBeforeUnload = null; __PreviousOnPageUnload = null; function AjaxCallObject() { this.Init(); } AjaxCallObject.prototype.Init = function() { this.XmlHttp = this.GetHttpObject(); } AjaxCallObject.prototype.GetHttpObject = function() { var xmlhttp; /*@cc_on @if (@_jscript_version >= 5) try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } } @else xmlhttp = false; @end @*/ if (!xmlhttp && typeof XMLHttpRequest != 'undefined') { try { xmlhttp = new XMLHttpRequest(); } catch (e) { xmlhttp = false; } } return xmlhttp; } AjaxCallObject.prototype.GetAjaxCallType = function(element) { if (element == null) return "none"; var attrib = element.getAttribute("AjaxCall"); if (attrib != null) return attrib.toLowerCase(); if (element.parentNode == null || element.parentNode == document.body) return "none"; else return this.GetAjaxCallType(element.parentNode); } AjaxCallObject.prototype.HookAjaxCall = function(bPageIsStored) { __PreviousOnFormSubmit = document.forms[0].onsubmit; document.forms[0].onsubmit = this.OnFormSubmit; if (typeof __doPostBack != 'undefined') { __PreviousPostBack = __doPostBack; __doPostBack = this.DoPostBack; } if (typeof(RBS_Controls) != "undefined") { for (var i=0; i < RBS_Controls.length; i++) RBS_Controls_Store[i].setAttribute("ExcludeFromPost", "true"); } __PreviousOnPageLoad = window.onload; window.onload = function() { // Restore the html of RenderedByScript controls if (typeof(RBS_Controls) != "undefined") { for (var i=0; i < RBS_Controls.length; i++) { var html = RBS_Controls_Store[i].value; if (html != "") { AJAXCbo.RestoreHtml(RBS_Controls[i], decodeURIComponent(html.substring(5, html.length))); RBS_Controls_Store[i].value = ""; } } } if (__PreviousOnPageLoad != null) return __PreviousOnPageLoad(); }; __PreviousOnPageBeforeUnload = window.onbeforeunload; window.onbeforeunload = function() { // Save the html of RenderedByScript controls, so that it can be restored for the // browser's "Back Button" if (typeof(RBS_Controls) != "undefined") { for (var i=0; i < RBS_Controls.length; i++) RBS_Controls_Store[i].value = "HTML:" + encodeURIComponent(RBS_Controls[i].innerHTML); } if (__PreviousOnPageBeforeUnload != null) return __PreviousOnPageBeforeUnload(); }; if (bPageIsStored) { __PreviousOnPageUnload = window.onunload; window.onunload = this.OnPageUnload; } __bPageIsStored = bPageIsStored; } AjaxCallObject.prototype.OnFormSubmit = function() { var target; if ("activeElement" in document) { // Internet Explorer target = document.activeElement; } else { // Firefox target = arguments[0].explicitOriginalTarget; } if (__PreviousOnFormSubmit != null) if ( __PreviousOnFormSubmit() == false ) return false; var cbType = AJAXCbo.GetAjaxCallType(target); if (cbType != "none") { AJAXCbo.DoAjaxCall(target.name, "", cbType); return false; } else { return true; } } // Replaces normal __doPostBack AjaxCallObject.prototype.DoPostBack = function(eventTarget, eventArgument) { var target; var elemUniqueID = eventTarget.split("$").join(":"); var ids = elemUniqueID.split(":"); // Checks the unique id and its parents until it finds a target element // i.e. for ajaxPanel_grid:row:field it checks // ajaxPanel_grid_row_field // ajaxPanel_grid_row // ajaxPanel_grid for (var num=ids.length; num > 0; num--) { var elemID = ""; for (var i=0; i < num; i++) elemID += (i==0 ? "" : "_") + ids[i]; target = document.getElementById(elemID); if (target != null) break; } var cbType = AJAXCbo.GetAjaxCallType(target); if (cbType != "none") { AJAXCbo.DoAjaxCall(eventTarget, eventArgument, cbType); } else { if (__PreviousPostBack != null) __PreviousPostBack(eventTarget, eventArgument); } } AjaxCallObject.prototype.OnPageUnload = function() { var thePage = document.forms[0].action; var index = thePage.indexOf("?"); if (index != -1) thePage = thePage.substring(0, index); thePage = thePage + "?__AJAX_PAGEUNLOAD=" + encodeURIComponent(document.all["__AJAX_PAGEKEY"].value); var oThis = AJAXCbo; __AJAXCboList.push(oThis); AJAXCbo = new AjaxCallObject(); if( oThis.XmlHttp ) { oThis.XmlHttp.open('GET', thePage, true); oThis.XmlHttp.onreadystatechange = function(){ }; oThis.XmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); oThis.XmlHttp.send(null); } if (__PreviousOnPageUnload != null) return __PreviousOnPageUnload(); } AjaxCallObject.prototype.DoAjaxCall = function(eventTarget, eventArgument, ajaxCallType) { var theData = ''; var theform = document.forms[0]; var thePage = theform.action; var eName = ''; theData = '__EVENTTARGET=' + escape(eventTarget.split("$").join(":")) + '&'; theData += '__EVENTARGUMENT=' + encodeURIComponent(eventArgument) + '&'; theData += '__AJAXCALL=true&'; if ( ! __bPageIsStored ) theData += '__VIEWSTATE=' + escape(theform.__VIEWSTATE.value).replace(new RegExp('\\+', 'g'), '%2b') + '&'; for( var i=0; i<theform.elements.length; i++ ) { eName = theform.elements[i].name; if( eName && eName != '') { if( eName == '__EVENTTARGET' || eName == '__EVENTARGUMENT' || eName == '__VIEWSTATE' ) { // Do Nothing } else if (theform.elements[i].getAttribute("ExcludeFromPost") == null || theform.elements[i].getAttribute("ExcludeFromPost").toLowerCase() != "true") { var type = theform.elements[i].type; var val = theform.elements[i].value; if ( type == "submit" ) continue; if ( type == "textarea" ) { // Firefox has the bad habit of altering the "\r\n" of a textarea to "\n", // so convert all single "\n" to "\r\n" val = val.split("\r\n").join("\n").split("\n").join("\r\n"); } val = encodeURIComponent(val); if ( type == "select-multiple" ) { for (var j=0; j < theform.elements[i].options.length; j++) if (theform.elements[i].options[j].selected) theData = theData + escape(eName) + '=' + encodeURIComponent(theform.elements[i].options[j].value) + '&'; } else if ( (type != "checkbox" && type != "radio") || theform.elements[i].checked ) { theData = theData + escape(eName) + '=' + val; if( i != theform.elements.length - 1 ) theData = theData + '&'; } } } } if (theData.substring(theData.length-1, theData.length) == "&") theData = theData.substring(0, theData.length-1); if( this.XmlHttp ) { if (waitElement) { waitElement.style.visibility = 'visible'; MoveWaitElement(); } var oThis = this; __AJAXCboList.push(oThis); AJAXCbo = new AjaxCallObject(); if( this.XmlHttp.readyState == 4 || this.XmlHttp.readyState == 0 ) { if ( ! ajaxCallType || ajaxCallType.toLowerCase() != "sync") { // Asynchronous this.XmlHttp.open("POST", thePage, true); this.XmlHttp.onreadystatechange = function(){ oThis.ReadyStateChange(); }; this.XmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); this.XmlHttp.send(theData); } else { // Synchronous // Use a timeout so that the screen refreshes before getting stack waiting // the AjaxCall. window.setTimeout( function() { oThis.XmlHttp.open("POST", thePage, false); oThis.XmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); oThis.XmlHttp.send(theData); if( oThis.XmlHttp.status == 200 && oThis.XmlHttp.statusText == "OK" ) oThis.OnComplete(oThis.XmlHttp.responseText, oThis.XmlHttp.responseXML); else oThis.OnError(oThis.XmlHttp.status, oThis.XmlHttp.statusText, oThis.XmlHttp.responseText); }, 1); } } } } AjaxCallObject.prototype.OnLoading = function() { // Loading } AjaxCallObject.prototype.OnLoaded = function() { // Loaded } AjaxCallObject.prototype.OnInteractive = function() { // Interactive } AjaxCallObject.prototype.OnComplete = function(responseText, responseXml) { //alert(responseText); // Checking if the data were fully loaded, without being aborted var flag = "'AJAX_LOADING_OK';\r\n"; if (responseText.substring(responseText.length - flag.length, responseText.length) != flag) return false; eval(responseText); if (waitElement) waitElement.style.visibility = 'hidden'; return true; } AjaxCallObject.prototype.OnAbort = function() { if (waitElement) waitElement.style.visibility = 'hidden'; } AjaxCallObject.prototype.OnError = function(status, statusText, responseText) { if (waitElement) waitElement.style.visibility = 'hidden'; document.body.innerHTML = responseText; } AjaxCallObject.prototype.ReadyStateChange = function() { if( this.XmlHttp.readyState == 1 ) { this.OnLoading(); } else if( this.XmlHttp.readyState == 2 ) { this.OnLoaded(); } else if( this.XmlHttp.readyState == 3 ) { this.OnInteractive(); } else if( this.XmlHttp.readyState == 4 ) { if( this.XmlHttp.status == 0 ) this.OnAbort(); else if( this.XmlHttp.status == 200 && this.XmlHttp.statusText == "OK" ) this.OnComplete(this.XmlHttp.responseText, this.XmlHttp.responseXML); else this.OnError(this.XmlHttp.status, this.XmlHttp.statusText, this.XmlHttp.responseText); // Remove this AJAXCbo from the list for (var i=0; i < __AJAXCboList.length; i++) if (__AJAXCboList[i] == this) { __AJAXCboList[i].XmlHttp = null; __AJAXCboList.splice(i, 1); break; } } } AjaxCallObject.prototype.ClockID = 0; AjaxCallObject.prototype.SetIntervalForAjaxCall = function(milliSec) { if (this.ClockID) this.ClearIntervalForAjaxCall(); this.ClockID = window.setInterval("AJAXCbo.DoAjaxCall('__AJAX_AJAXCALLTIMER','','async')", milliSec); } AjaxCallObject.prototype.ClearIntervalForAjaxCall = function() { window.clearInterval(this.ClockID); this.ClockID = 0; } AjaxCallObject.prototype.RestoreHtml = function(destElem, html) { var store = document.createElement("form"); store.innerHTML = html; var scripts = store.getElementsByTagName("script"); while (scripts.length > 0) scripts[0].parentNode.removeChild(scripts[0]); var elements = new Array(); var coll = store.getElementsByTagName("INPUT"); for (var i=0; i < coll.length; i++) elements.push(coll[i]); coll = store.getElementsByTagName("TEXTAREA"); for (var i=0; i < coll.length; i++) elements.push(coll[i]); coll = store.getElementsByTagName("SELECT"); for (var i=0; i < coll.length; i++) elements.push(coll[i]); for( var i=0; i < elements.length; i++ ) { var elem = elements[i]; eName = elem.name; if( eName && eName != '') { var type = elem.type; var docElem = document.all[elem.id]; if (docElem == null || docElem.type != type) continue; if ( type == "select-multiple" ) { if ( elem.options.length == docElem.options.length ) { for (var j=0; j < elem.options.length; j++) elem.options[j].selected = docElem.options[j].selected; } } else if ( type == "checkbox" || type == "radio" ) { elem.checked = docElem.checked; } else { elem.value = docElem.value; } } } destElem.innerHTML = store.innerHTML; for( var i=0; i < elements.length; i++ ) { var elem = elements[i]; eName = elem.name; if( eName && eName != '') { var type = elem.type; var docElem = document.all[elem.id]; if (docElem == null || docElem.type != type) continue; if ( type == "select-multiple" ) { if ( elem.options.length == docElem.options.length ) { for (var j=0; j < elem.options.length; j++) docElem.options[j].selected = elem.options[j].selected; } } else if ( type == "checkbox" || type == "radio" ) { docElem.checked = elem.checked; } else { docElem.value = elem.value; } } } } AjaxCallObject.prototype.SetAttributesOfControl = function(clientID, attributes) { var place = document.getElementById(clientID); if (place != null && attributes != "") { var attribs = attributes.split("|"); for (var i=0; i < attribs.length; i++) { var parts = attribs[i].split("="); place.setAttribute(parts[0], parts[1]) } } } AjaxCallObject.prototype.AddElementScript = function(parentID, tagName, elementID, html, beforeElemID) { var place = document.getElementById(parentID); var child = document.getElementById(elementID); if (place != null && child == null) { child = document.createElement(tagName); child.id = elementID; var before = (beforeElemID != null) ? document.getElementById(beforeElemID) : null; place.insertBefore(child, before); } this.SetHtmlOfElementScript (html, elementID); } AjaxCallObject.prototype.RemoveElementScript = function(parentID, elementID) { var place = document.getElementById(parentID); var child = document.getElementById(elementID); if (place != null && child != null) place.removeChild(child); } AjaxCallObject.prototype.SetFieldScript = function(fieldName, fieldValue) { document.all.item(fieldName).value = fieldValue; } AjaxCallObject.prototype.SetHtmlOfElementScript = function(html, elementID) { var place = document.getElementById(elementID); if (place != null) place.innerHTML=html; } AjaxCallObject.prototype.SetHtmlOfPage = function(html) { document.write(html); document.close(); } AjaxCallObject.prototype.SetVisibilityOfElement = function(elementID, visible) { var place = document.getElementById(elementID); if (place != null) place.style.display = (visible) ? "" : "none"; } AjaxCallObject.prototype.Alert = function(message) { window.alert(message); } // It's used by AjaxPanel AjaxCallObject.prototype.ExtendedSetHtmlOfElementScript = function(html, elementID) { var store = document.createElement("span"); store.innerHTML = html; var spans = store.getElementsByTagName("span"); for (var i=0; i < spans.length; i++) { var elem = spans[i]; if (elem.getAttribute("name") == "__ajax_rbs") { var elemOnPage = document.getElementById(elem.id); if (elemOnPage != null) elem.innerHTML = elemOnPage.innerHTML; } } var place=document.getElementById(elementID); if (place != null) place.innerHTML = store.innerHTML; } var AJAXCbo = new AjaxCallObject(); // wait element CreateWaitElement(); window.attachEvent("onscroll", MoveWaitElement); window.attachEvent("onresize", MoveWaitElement); var waitElement; function MoveWaitElement() { if (!waitElement) CreateWaitElement(); var width = document.body.clientWidth; waitElement.style.top = document.body.scrollTop; waitElement.style.left = width + document.body.offsetLeft - waitElement.offsetWidth; } function CreateWaitElement() { var elem = document.getElementById('__AjaxCall_Wait'); if (!elem) { elem = document.createElement("div"); elem.id = '__AjaxCall_Wait'; elem.style.position = 'absolute'; elem.style.height = 17; elem.border = "1px"; elem.style.paddingLeft = "3px"; elem.style.paddingRight = "3px"; elem.style.fontSize = "11px"; elem.style.borderColor = "#ffffff"; elem.style.borderSize = "1px"; elem.style.backgroundColor = "DimGray"; elem.style.color = "#ffffff"; elem.innerHTML = 'Loading ...'; elem.style.visibility = 'hidden'; document.body.insertBefore(elem, document.body.firstChild); } waitElement = elem; } // end wait element |