diff --git a/phpgwapi/js/xajax_js/xajax.js b/phpgwapi/js/xajax_js/xajax.js new file mode 100644 index 0000000000..0dca8f5200 --- /dev/null +++ b/phpgwapi/js/xajax_js/xajax.js @@ -0,0 +1,172 @@ +/* xajax Javascript library :: version 0.2.4 */ +Array.prototype.containsValue=function(valueToCheck){for(var i=0;i 1000)text=text.substr(0,1000)+"...\n[long response]\n...";try{if(this.debugWindow==undefined||this.debugWindow.closed==true){this.debugWindow=window.open('about:blank','xajax-debug','width=800,height=600,scrollbars=1,resizable,status');this.debugWindow.document.write('Xajax debug output

Xajax debug output

');} +text=text.replace(/&/g,"&") +text=text.replace(//g,">") +debugTag=this.debugWindow.document.getElementById('debugTag');debugTag.innerHTML=(''+(new Date()).toString()+': '+text+'
')+debugTag.innerHTML;}catch(e){alert("Xajax Debug:\n "+text);} +};this.workId='xajaxWork'+new Date().getTime();this.depth=0;this.responseErrorsForAlert=["400","401","402","403","404","500","501","502","503"];this.getRequestObject=function(){if(xajaxDebug)this.DebugMessage("Initializing Request Object..");var req=null;if(typeof XMLHttpRequest!="undefined") +req=new XMLHttpRequest();if(!req&&typeof ActiveXObject!="undefined"){try{req=new ActiveXObject("Msxml2.XMLHTTP");} +catch(e){try{req=new ActiveXObject("Microsoft.XMLHTTP");} +catch(e2){try{req=new ActiveXObject("Msxml2.XMLHTTP.4.0");} +catch(e3){req=null;} +} +} +} +if(!req&&window.createRequest) +req=window.createRequest();if(!req)this.DebugMessage("Request Object Instantiation failed.");return req;} +this.$=function(sId){if(!sId){return null;} +var returnObj=document.getElementById(sId);if(!returnObj&&document.all){returnObj=document.all[sId];} +if(xajaxDebug&&!returnObj&&sId!=this.workId){this.DebugMessage("Element with the id \""+sId+"\" not found.");} +return returnObj;} +this.include=function(sFileName){var objHead=document.getElementsByTagName('head');var objScript=document.createElement('script');objScript.type='text/javascript';objScript.src=sFileName;objHead[0].appendChild(objScript);} +this.stripOnPrefix=function(sEventName){sEventName=sEventName.toLowerCase();if(sEventName.indexOf('on')==0){sEventName=sEventName.replace(/on/,'');} +return sEventName;} +this.addOnPrefix=function(sEventName){sEventName=sEventName.toLowerCase();if(sEventName.indexOf('on')!=0){sEventName='on'+sEventName;} +return sEventName;} +this.addHandler=function(sElementId,sEvent,sFunctionName){if(window.addEventListener){sEvent=this.stripOnPrefix(sEvent);eval("this.$('"+sElementId+"').addEventListener('"+sEvent+"',"+sFunctionName+",false);");} +else{sAltEvent=this.addOnPrefix(sEvent);eval("this.$('"+sElementId+"').attachEvent('"+sAltEvent+"',"+sFunctionName+",false);");} +} +this.removeHandler=function(sElementId,sEvent,sFunctionName){if(window.addEventListener){sEvent=this.stripOnPrefix(sEvent);eval("this.$('"+sElementId+"').removeEventListener('"+sEvent+"',"+sFunctionName+",false);");} +else{sAltEvent=this.addOnPrefix(sEvent);eval("this.$('"+sElementId+"').detachEvent('"+sAltEvent+"',"+sFunctionName+",false);");} +} +this.create=function(sParentId,sTag,sId){var objParent=this.$(sParentId);objElement=document.createElement(sTag);objElement.setAttribute('id',sId);if(objParent) +objParent.appendChild(objElement);} +this.insert=function(sBeforeId,sTag,sId){var objSibling=this.$(sBeforeId);objElement=document.createElement(sTag);objElement.setAttribute('id',sId);objSibling.parentNode.insertBefore(objElement,objSibling);} +this.insertAfter=function(sAfterId,sTag,sId){var objSibling=this.$(sAfterId);objElement=document.createElement(sTag);objElement.setAttribute('id',sId);objSibling.parentNode.insertBefore(objElement,objSibling.nextSibling);} +this.getInput=function(sType,sName,sId){var Obj;if(!window.addEventListener){Obj=document.createElement('');} +else{Obj=document.createElement('input');Obj.setAttribute('type',sType);Obj.setAttribute('name',sName);Obj.setAttribute('id',sId);} +return Obj;} +this.createInput=function(sParentId,sType,sName,sId){var objParent=this.$(sParentId);var objElement=this.getInput(sType,sName,sId);if(objParent&&objElement) +objParent.appendChild(objElement);} +this.insertInput=function(sBeforeId,sType,sName,sId){var objSibling=this.$(sBeforeId);var objElement=this.getInput(sType,sName,sId);if(objElement&&objSibling&&objSibling.parentNode) +objSibling.parentNode.insertBefore(objElement,objSibling);} +this.insertInputAfter=function(sAfterId,sType,sName,sId){var objSibling=this.$(sAfterId);var objElement=this.getInput(sType,sName,sId);if(objElement&&objSibling&&objSibling.parentNode){objSibling.parentNode.insertBefore(objElement,objSibling.nextSibling);} +} +this.remove=function(sId){objElement=this.$(sId);if(objElement&&objElement.parentNode&&objElement.parentNode.removeChild){objElement.parentNode.removeChild(objElement);} +} +this.replace=function(sId,sAttribute,sSearch,sReplace){var bFunction=false;if(sAttribute=="innerHTML") +sSearch=this.getBrowserHTML(sSearch);eval("var txt=this.$('"+sId+"')."+sAttribute);if(typeof txt=="function"){txt=txt.toString();bFunction=true;} +if(txt.indexOf(sSearch)>-1){var newTxt='';while(txt.indexOf(sSearch)>-1){x=txt.indexOf(sSearch)+sSearch.length+1;newTxt+=txt.substr(0,x).replace(sSearch,sReplace);txt=txt.substr(x,txt.length-x);} +newTxt+=txt;if(bFunction){eval('this.$("'+sId+'").'+sAttribute+'=newTxt;');} +else if(this.willChange(sId,sAttribute,newTxt)){eval('this.$("'+sId+'").'+sAttribute+'=newTxt;');} +} +} +this.getFormValues=function(frm){var objForm;var submitDisabledElements=false;if(arguments.length > 1&&arguments[1]==true) +submitDisabledElements=true;var prefix="";if(arguments.length > 2) +prefix=arguments[2];if(typeof(frm)=="string") +objForm=this.$(frm);else +objForm=frm;var sXml="";if(objForm&&objForm.tagName=='FORM'){var formElements=objForm.elements;for(var i=0;i < formElements.length;i++){if(!formElements[i].name) +continue;if(formElements[i].name.substring(0,prefix.length)!=prefix) +continue;if(formElements[i].type&&(formElements[i].type=='radio'||formElements[i].type=='checkbox')&&formElements[i].checked==false) +continue;if(formElements[i].disabled&&formElements[i].disabled==true&&submitDisabledElements==false) +continue;var name=formElements[i].name;if(name){if(sXml!='') +sXml+='&';if(formElements[i].type=='select-multiple'){for(var j=0;j < formElements[i].length;j++){if(formElements[i].options[j].selected==true) +sXml+=name+"="+encodeURIComponent(formElements[i].options[j].value)+"&";} +} +else{sXml+=name+"="+encodeURIComponent(formElements[i].value);} +} +} +} +sXml+="";return sXml;} +this.objectToXML=function(obj){var sXml="";for(i in obj){try{if(i=='constructor') +continue;if(obj[i]&&typeof(obj[i])=='function') +continue;var key=i;var value=obj[i];if(value&&typeof(value)=="object"&&this.depth <=50){this.depth++;value=this.objectToXML(value);this.depth--;} +sXml+=""+key+""+value+"";} +catch(e){if(xajaxDebug)this.DebugMessage(e.name+": "+e.message);} +} +sXml+="";return sXml;} +this._nodeToObject=function(node){if(node.nodeName=='#cdata-section'){var data="";for(var j=0;j"+document.getElementsByTagName("HTML")[0].innerHTML+"";} +this.processResponse=function(xml){clearTimeout(loadingTimeout);this.doneLoadingFunction();if(xajaxStatusMessages==true)window.status='Processing...';var tmpXajax=null;xml=xml.documentElement;if(xml==null) +return;var skipCommands=0;for(var i=0;i 0){skipCommands--;continue;} +if(xml.childNodes[i].nodeName=="cmd"){var cmd;var id;var property;var data;var search;var type;var before;var objElement=null;for(var j=0;j 1&&xml.childNodes[i].firstChild.nodeName=="#cdata-section"){data="";for(var j=0;j 1){for(var j=0;j 1&&xml.childNodes[i].childNodes[j].firstChild.nodeName=="#cdata-section"){var internalData="";for(var k=0;k 1000) text = text.substr(0,1000)+"...\n[long response]\n..."; + try { + if (this.debugWindow == undefined || this.debugWindow.closed == true) { + this.debugWindow = window.open('about:blank', 'xajax-debug', 'width=800,height=600,scrollbars=1,resizable,status'); + this.debugWindow.document.write('Xajax debug output

Xajax debug output

'); + } + text = text.replace(/&/g, "&") + text = text.replace(//g, ">") + debugTag = this.debugWindow.document.getElementById('debugTag'); + debugTag.innerHTML = (''+(new Date()).toString()+': ' + text + '
') + debugTag.innerHTML; + } catch (e) { + alert("Xajax Debug:\n " + text); + } + }; + + this.workId = 'xajaxWork'+ new Date().getTime(); + this.depth = 0; + this.responseErrorsForAlert = ["400","401","402","403","404","500","501","502","503"]; + + //Get the XMLHttpRequest Object + this.getRequestObject = function() + { + if (xajaxDebug) this.DebugMessage("Initializing Request Object.."); + var req = null; + if (typeof XMLHttpRequest != "undefined") + req = new XMLHttpRequest(); + if (!req && typeof ActiveXObject != "undefined") + { + try + { + req=new ActiveXObject("Msxml2.XMLHTTP"); + } + catch (e) + { + try + { + req=new ActiveXObject("Microsoft.XMLHTTP"); + } + catch (e2) + { + try { + req=new ActiveXObject("Msxml2.XMLHTTP.4.0"); + } + catch (e3) + { + req=null; + } + } + } + } + if(!req && window.createRequest) + req = window.createRequest(); + + if (!req) this.DebugMessage("Request Object Instantiation failed."); + + return req; + } + + // xajax.$() is shorthand for document.getElementById() + this.$ = function(sId) + { + if (!sId) { + return null; + } + var returnObj = document.getElementById(sId); + if (!returnObj && document.all) { + returnObj = document.all[sId]; + } + if (xajaxDebug && !returnObj && sId != this.workId) { + this.DebugMessage("Element with the id \"" + sId + "\" not found."); + } + return returnObj; + } + + // xajax.include(sFileName) dynamically includes an external javascript file + this.include = function(sFileName) + { + var objHead = document.getElementsByTagName('head'); + var objScript = document.createElement('script'); + objScript.type = 'text/javascript'; + objScript.src = sFileName; + objHead[0].appendChild(objScript); + } + + this.stripOnPrefix = function(sEventName) + { + sEventName = sEventName.toLowerCase(); + if (sEventName.indexOf('on') == 0) + { + sEventName = sEventName.replace(/on/,''); + } + + return sEventName; + } + + this.addOnPrefix = function(sEventName) + { + sEventName = sEventName.toLowerCase(); + if (sEventName.indexOf('on') != 0) + { + sEventName = 'on' + sEventName; + } + + return sEventName; + } + + // xajax.addHandler adds an event handler to an element + this.addHandler = function(sElementId, sEvent, sFunctionName) + { + if (window.addEventListener) + { + sEvent = this.stripOnPrefix(sEvent); + eval("this.$('"+sElementId+"').addEventListener('"+sEvent+"',"+sFunctionName+",false);"); + } + else + { + sAltEvent = this.addOnPrefix(sEvent); + eval("this.$('"+sElementId+"').attachEvent('"+sAltEvent+"',"+sFunctionName+",false);"); + } + } + + // xajax.removeHandler removes an event handler from an element + this.removeHandler = function(sElementId, sEvent, sFunctionName) + { + if (window.addEventListener) + { + sEvent = this.stripOnPrefix(sEvent); + eval("this.$('"+sElementId+"').removeEventListener('"+sEvent+"',"+sFunctionName+",false);"); + } + else + { + sAltEvent = this.addOnPrefix(sEvent); + eval("this.$('"+sElementId+"').detachEvent('"+sAltEvent+"',"+sFunctionName+",false);"); + } + } + + // xajax.create creates a new child node under a parent + this.create = function(sParentId, sTag, sId) + { + var objParent = this.$(sParentId); + objElement = document.createElement(sTag); + objElement.setAttribute('id',sId); + if (objParent) + objParent.appendChild(objElement); + } + + // xajax.insert inserts a new node before another node + this.insert = function(sBeforeId, sTag, sId) + { + var objSibling = this.$(sBeforeId); + objElement = document.createElement(sTag); + objElement.setAttribute('id',sId); + objSibling.parentNode.insertBefore(objElement, objSibling); + } + + // xajax.insertAfter inserts a new node after another node + this.insertAfter = function(sAfterId, sTag, sId) + { + var objSibling = this.$(sAfterId); + objElement = document.createElement(sTag); + objElement.setAttribute('id',sId); + objSibling.parentNode.insertBefore(objElement, objSibling.nextSibling); + } + + this.getInput = function(sType, sName, sId) + { + var Obj; + if (!window.addEventListener) + { + Obj = document.createElement(''); + } + else + { + Obj = document.createElement('input'); + Obj.setAttribute('type',sType); + Obj.setAttribute('name',sName); + Obj.setAttribute('id',sId); + } + return Obj; + } + + // xajax.createInput creates a new input node under a parent + this.createInput = function(sParentId, sType, sName, sId) + { + var objParent = this.$(sParentId); + var objElement = this.getInput(sType, sName, sId); + if (objParent && objElement) + objParent.appendChild(objElement); + } + + // xajax.insertInput creates a new input node before another node + this.insertInput = function(sBeforeId, sType, sName, sId) + { + var objSibling = this.$(sBeforeId); + var objElement = this.getInput(sType, sName, sId); + if (objElement && objSibling && objSibling.parentNode) + objSibling.parentNode.insertBefore(objElement, objSibling); + } + + // xajax.insertInputAfter creates a new input node after another node + this.insertInputAfter = function(sAfterId, sType, sName, sId) + { + var objSibling = this.$(sAfterId); + var objElement = this.getInput(sType, sName, sId); + if (objElement && objSibling && objSibling.parentNode) { + objSibling.parentNode.insertBefore(objElement, objSibling.nextSibling); + } + } + + // xajax.remove deletes an element + this.remove = function(sId) + { + objElement = this.$(sId); + if (objElement && objElement.parentNode && objElement.parentNode.removeChild) + { + objElement.parentNode.removeChild(objElement); + } + } + + //xajax.replace searches for text in an attribute of an element and replaces it + //with a different text + this.replace = function(sId,sAttribute,sSearch,sReplace) + { + var bFunction = false; + + if (sAttribute == "innerHTML") + sSearch = this.getBrowserHTML(sSearch); + + eval("var txt=this.$('"+sId+"')."+sAttribute); + if (typeof txt == "function") + { + txt = txt.toString(); + bFunction = true; + } + if (txt.indexOf(sSearch)>-1) + { + var newTxt = ''; + while (txt.indexOf(sSearch) > -1) + { + x = txt.indexOf(sSearch)+sSearch.length+1; + newTxt += txt.substr(0,x).replace(sSearch,sReplace); + txt = txt.substr(x,txt.length-x); + } + newTxt += txt; + if (bFunction) + { + eval('this.$("'+sId+'").'+sAttribute+'=newTxt;'); + } + else if (this.willChange(sId,sAttribute,newTxt)) + { + eval('this.$("'+sId+'").'+sAttribute+'=newTxt;'); + } + } + } + + // xajax.getFormValues() builds a query string XML message from the elements of a form object + // * The first argument is the id of the form + // * The second argument (optional) can be set to true if you want to submit disabled elements + // * The third argument (optional) allows you to specify a string prefix that a form element + // name must contain if you want that element to be submitted + this.getFormValues = function(frm) + { + var objForm; + var submitDisabledElements = false; + if (arguments.length > 1 && arguments[1] == true) + submitDisabledElements = true; + var prefix=""; + if(arguments.length > 2) + prefix = arguments[2]; + + if (typeof(frm) == "string") + objForm = this.$(frm); + else + objForm = frm; + var sXml = ""; + if (objForm && objForm.tagName == 'FORM') + { + var formElements = objForm.elements; + for( var i=0; i < formElements.length; i++) + { + if (!formElements[i].name) + continue; + if (formElements[i].name.substring(0, prefix.length) != prefix) + continue; + if (formElements[i].type && (formElements[i].type == 'radio' || formElements[i].type == 'checkbox') && formElements[i].checked == false) + continue; + if (formElements[i].disabled && formElements[i].disabled == true && submitDisabledElements == false) + continue; + var name = formElements[i].name; + if (name) + { + if (sXml != '') + sXml += '&'; + if(formElements[i].type=='select-multiple') + { + for (var j = 0; j < formElements[i].length; j++) + { + if (formElements[i].options[j].selected == true) + sXml += name+"="+encodeURIComponent(formElements[i].options[j].value)+"&"; + } + } + else + { + sXml += name+"="+encodeURIComponent(formElements[i].value); + } + } + } + } + + sXml +=""; + + return sXml; + } + + // Generates an XML message that xajax can understand from a javascript object + this.objectToXML = function(obj) + { + var sXml = ""; + for (i in obj) + { + try + { + if (i == 'constructor') + continue; + if (obj[i] && typeof(obj[i]) == 'function') + continue; + + var key = i; + var value = obj[i]; + if (value && typeof(value)=="object" && this.depth <= 50) + { + this.depth++; + value = this.objectToXML(value); + this.depth--; + } + + sXml += ""+key+""+value+""; + + } + catch(e) + { + if (xajaxDebug) this.DebugMessage(e.name+": "+e.message); + } + } + sXml += ""; + + return sXml; + } + + // unserializes data structure from xajaxResponse::_buildObjXml() + this._nodeToObject = function(node) { + // parentNode here is weird, have to tune + if (node.nodeName == '#cdata-section') { + var data = ""; + for (var j=0; j"+document.getElementsByTagName("HTML")[0].innerHTML+""; + } + + //Process XML xajaxResponses returned from the request + this.processResponse = function(xml) + { + clearTimeout(loadingTimeout); + this.doneLoadingFunction(); + if (xajaxStatusMessages == true) window.status = 'Processing...'; + var tmpXajax = null; + xml = xml.documentElement; + if (xml == null) + return; + + var skipCommands = 0; + for (var i=0; i 0) { + skipCommands--; + continue; + } + if (xml.childNodes[i].nodeName == "cmd") + { + var cmd; + var id; + var property; + var data; + var search; + var type; + var before; + var objElement = null; + + for (var j=0; j 1 && xml.childNodes[i].firstChild.nodeName == "#cdata-section") + { + data = ""; + for (var j=0; j 1) + { + for (var j=0; j 1 && xml.childNodes[i].childNodes[j].firstChild.nodeName == "#cdata-section") + { + var internalData = ""; + for (var k=0; k