From: Argiris K. <be...@us...> - 2005-11-11 06:17:59
|
Update of /cvsroot/magicajax/magicajax/Core/script In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6302/Core/script Added Files: CallBackObject.js Log Message: Put source files to module 'magicajax' divided in directories Core, Examples, and CustomControls. --- NEW FILE: CallBackObject.js --- __AJAXCboList = new Array(); __bPageIsStored = false; __PreviousOnFormSubmit = null; __PreviousPostBack = null; __PreviousOnPageLoad = null; __PreviousOnPageBeforeUnload = null; __PreviousOnPageUnload = null; function CallBackObject() { this.Init(); } CallBackObject.prototype.Init = function() { this.XmlHttp = this.GetHttpObject(); } CallBackObject.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; } CallBackObject.prototype.GetCallBackType = function(element) { if (element == null) return "none"; var attrib = element.getAttribute("CallBack"); if (attrib != null) return attrib.toLowerCase(); if (element.parentNode == null || element.parentNode == document.body) return "none"; else return this.GetCallBackType(element.parentNode); } CallBackObject.prototype.HookCallBack = 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; } CallBackObject.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.GetCallBackType(target); if (cbType != "none") { AJAXCbo.DoCallBack(target.name, "", cbType); return false; } else { return true; } } // Replaces normal __doPostBack CallBackObject.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:_ctl1:_ctl0 it checks // ajaxPanel_grid:_ctl1:_ctl0 // ajaxPanel_grid:_ctl1 // ajaxPanel_grid // ajaxPanel for (var num=ids.length; num > 0; num--) { var elemID = ""; for (var i=0; i < num; i++) elemID += "_" + ids[i]; elemID = elemID.substring(1, elemID.length); target = document.getElementById(elemID); if (target != null) break; } var cbType = AJAXCbo.GetCallBackType(target); if (cbType != "none") { AJAXCbo.DoCallBack(eventTarget, eventArgument, cbType); } else { if (__PreviousPostBack != null) __PreviousPostBack(eventTarget, eventArgument); } } CallBackObject.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 CallBackObject(); 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(); } CallBackObject.prototype.DoCallBack = function(eventTarget, eventArgument, callBackType) { var theData = ''; var theform = document.forms[0]; var thePage = theform.action; var eName = ''; theData = '__EVENTTARGET=' + escape(eventTarget.split("$").join(":")) + '&'; theData += '__EVENTARGUMENT=' + encodeURIComponent(eventArgument) + '&'; theData += '__AJAX_CALLBACK=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.split("$").join(":")) + '=' + encodeURIComponent(theform.elements[i].options[j].value) + '&'; } else if ( (type != "checkbox" && type != "radio") || theform.elements[i].checked ) { theData = theData + escape(eName.split("$").join(":")) + '=' + 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 CallBackObject(); if( this.XmlHttp.readyState == 4 || this.XmlHttp.readyState == 0 ) { if ( ! callBackType || callBackType.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 callback. 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); } } } } CallBackObject.prototype.OnLoading = function() { // Loading } CallBackObject.prototype.OnLoaded = function() { // Loaded } CallBackObject.prototype.OnInteractive = function() { // Interactive } CallBackObject.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; } CallBackObject.prototype.OnAbort = function() { if (waitElement) waitElement.style.visibility = 'hidden'; } CallBackObject.prototype.OnError = function(status, statusText, responseText) { if (waitElement) waitElement.style.visibility = 'hidden'; document.body.innerHTML = responseText; } CallBackObject.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; } } } CallBackObject.prototype.ClockID = 0; CallBackObject.prototype.SetIntervalForCallBack = function(milliSec) { if (this.ClockID) this.ClearIntervalForCallBack(); this.ClockID = window.setInterval("AJAXCbo.DoCallBack('__AJAX_CALLBACKTIMER','','async')", milliSec); } CallBackObject.prototype.ClearIntervalForCallBack = function() { window.clearInterval(this.ClockID); this.ClockID = 0; } CallBackObject.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; } } } } CallBackObject.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]) } } } CallBackObject.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); } CallBackObject.prototype.RemoveElementScript = function(parentID, elementID) { var place = document.getElementById(parentID); var child = document.getElementById(elementID); if (place != null && child != null) place.removeChild(child); } CallBackObject.prototype.SetFieldScript = function(fieldName, fieldValue) { document.all.item(fieldName).value = fieldValue; } CallBackObject.prototype.SetHtmlOfElementScript = function(html, elementID) { var place = document.getElementById(elementID); if (place != null) place.innerHTML=html; } CallBackObject.prototype.SetHtmlOfPage = function(html) { document.write(html); document.close(); } CallBackObject.prototype.SetVisibilityOfElement = function(elementID, visible) { var place = document.getElementById(elementID); if (place != null) place.style.display = (visible) ? "" : "none"; } CallBackObject.prototype.Alert = function(message) { window.alert(message); } // It's used by AjaxPanel CallBackObject.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 CallBackObject(); // 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('__Callback_Wait'); if (!elem) { elem = document.createElement("div"); elem.id = '__Callback_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 |