// ----------------------------------------------------- // xxAPI // ----------------------------------------------------- // Copyright � 2009, knx-user-forum e.V, All rights reserved. // // This program is free software; you can redistribute it and/or modify it under the terms // of the GNU General Public License as published by the Free Software Foundation; either // version 3 of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along with this program; // if not, see <http://www.gnu.de/documents/gpl-3.0.de.html>. xxAPI.VERSION = "1.05"; //////////////// Globale Variablen //// Variable f�r XXLINK xxAPI.XXLINKURL = ""; //// Variablen f�r XXINACTIV xxAPI.XXIAD = 0; // Zeit in ms bis Inaktiv xxAPI.XXIAObj = null; // Auszuf�hrendes item objekt xxAPI.XXIATimer = null; // window timer f�r Inactivit�t xxAPI.XXTRTimer = new Array(); // Array f�r Trigger Timer //// Variablen f�r XXLONGPRESS xxAPI.XXMDObj = null; // Item das die Aktion f�r den Longpress enth�llt xxAPI.XXMDTimer = null; // window timer f�r mouse down xxAPI.XXLMD = 0; // Letztes Mouse Down //// Arrays xxAPI.cleanUPobj = new Array(); // Array f�r Objekte die bei Masken ausgeblendet werden m�ssen // Nur beim ersten aufruf Initialisieren if(typeof(xxAPI.XXMids)==="undefined") { xxAPI.XXMids = new Array(); // Array f�r XXMARKS } if(typeof(xxAPI.ICOids)==="undefined") { xxAPI.ICOids = new Array(); // Array f�r XXREGICON } if(typeof(xxAPI.extChecks)==="undefined") { xxAPI.extChecks = new Array(); // Array f�r Extensions (APPid's) } // Version checker return true wenn gr��er oder gleich version (v) xxAPI.aVercheck = function(v) { try { return (parseFloat(xxAPI.ajaxVersion)>=v); } catch(e) {}}; xxAPI.load = function() { xxAPI.goToPage = ''; var lP = location.href; xxAPI.LoginPage = lP; // Queryparameter ist die goToPage if(lP.indexOf("?") >0 ) { xxAPI.goToPage = lP.substr(lP.indexOf("?")+1,lP.length); xxAPI.LoginPage = lP.substr(0,lP.indexOf("?")); } }; xxAPI.run = function() { // Durchsucht alle Visuelemente nach dem Text aus xxAPI.goToPage for(i=0;i<aVisu.length;i++) { if((aVisu[i].txt == xxAPI.goToPage) && (aVisu[i].BS == 1)){ // Verkn�pften Befehl ausf�hren doCmd(aVisu[i]); break; } } }; xxAPI.loadImg = function(id) { try { var image = eval("document.images.XXIMG_"+id+"I"); if(typeof(image.osrc) == "undefined") { image.osrc = image.src; } // der Bildurl das aktuelle Datum in Sekunden anh�ngen um das cachen zu vermeiden image.src = image.osrc + "?lid="+(new Date()).getTime(); } catch(e) {} }; xxAPI.checkICO = function(item) { if(this.ICOids[item.icoid] != null) { item.txt = this.ICOids[item.icoid]; item = xxAPI.check(item); } return item; }; xxAPI.extXMLreq = function(_url,_f,id) { var xh = new XMLHttpRequest(); xh.open("GET", _url, true); xh.onreadystatechange = function() { if (xh.readyState==4){ if (xh.status==200) { _f(xh,id); } } }; xh.send(null); }; xxAPI.toggleModul = function(m,s) { var o = document.getElementsByName(m)[0].parentNode.parentNode; var f = this.getModul(m); if(s==0) { o.style.visibility='hidden'; // Refreshzeit auf 10Sekunden f.RefVisu=10000; } else { o.style.visibility='visible'; // Refreshzeit wieder zur�ck f.RefVisu=f.RefMaxVisu; } }; xxAPI.getModul = function(m) { try { var f=top; // Modulnamen in allen Frames suchen for(var i=0;i<top.frames.length;i++) { if(top.frames[i].name == m) { f = top.frames[i]; break; } } } catch(e) {} return f; }; xxAPI.modulClick = function(m,l) { try { // Die markierte Schaltfl�che in der Modulseite suchen var f = this.getModul(m); if(top.xxAPI.XXMids[l]) { f.setTimeout("callCmd(2,"+top.xxAPI.XXMids[l]+");",5); } else { for(var i=0;i<xxframe.aVisu.length;i++) { if(typeof(f.aVisu[i].XXMARK) != "undefined") { if(f.aVisu[i].XXMARK == l) { // Die Schaltfl�che in der Modulseite dr�cken f.setTimeout("doCmd(aVisu["+i+"]);",5); break; } } } } } catch(e) {} }; // Hauptroutine zum suchen nach Funktionen xxAPI.check = function(item) { // Wenn der Text mit XX anf�ngt und * irgendwo hat gehts weiter if(item.txt.match(/^XX.*\*/) != null) { this.checkItem = item.txt.split("*"); switch (this.checkItem[0]) { case "XXHTTP": // *********************************************************************************** // XXHTTP*KNX-USER_FORUM*http://knx-user-forum.de: // oeffnet einen Link im neuen Fenster // Die URL kann auch in der Form HSLIST:archivname erfolgen // um ein Archiv anzuzeigen // *********************************************************************************** case "XXLINK": // *********************************************************************************** // XXLINK*KNX-USER_FORUM*http://knx-user-forum.de // oeffnet einen Link in einem vorher definierten XXIFRAME // Die URL kann auch in der Form HSLIST:archivname erfolgen // um ein Archiv anzuzeigen // *********************************************************************************** if(this.checkItem[2].match(/^HSLIST:.*/) != null) { //FIXME /shslist w�re sch�ner this.checkItem[2] = "/hslist?lst=" + this.cutString(7,this.checkItem[2]) + "&user=" + loginData.user + "&pw=" + loginData.pw; } if(this.checkItem[0] == "XXHTTP") { item.code = "XXEXECUTE*window.open('" + this.checkItem[2] + "','XXHTTP');"; } else { item.code = "XXEXECUTE*xxAPI.XXLINKURL='" + this.checkItem[2] + "';"; } item.txt = this.checkItem[1]; item.click=1; break; case "XXMODUL": // *********************************************************************************** // XXMODUL*SeitenElement // Oeffnet eine von der Startseite aus verlinkte Visuseite in einem IFRAME // XXIFRAME*TOPRIGHT_START // *********************************************************************************** item.txt="<iframe name=\"" + this.checkItem[1] + "\" src=\"" + this.LoginPage + "?" + this.checkItem[1] + "\" width=" + item.w + " height=" + item.h + " frameborder=\"0\" border=\"0\" scrolling=\"auto\" style=\"overflow:hidden;display:none; border: 0;\" allowtransparency=\"true\" onload=\"this.style.display='block';\">"; break; case "XXIFRAME": // *********************************************************************************** // XXIFRAME* // Ein Textelement dessen Groesse als iframe f�r den XXLINK genutzt wird. // Optional kann ein Link angegben werden. // XXIFRAME*http://somewhere/maybe/an/activexapl...n/an/html/page // *********************************************************************************** if(this.checkItem[1] != "") { item.txt="<iframe src=\"" + this.checkItem[1] +"\" width=" + item.w + " height=" + item.h + " allowtransparency=\"true\">"; } else { item.txt="<iframe src=\"" + xxAPI.XXLINKURL + "\" width=" + item.w + " height=" + item.h + " allowtransparency=\"true\">"; } break; case "XXIMG": // *********************************************************************************** // XXIMG*url*image refreshzeit (optional) // Zeigt ein beliebiges Bild in der Groesse des Textfeldes dar. // kann auch dynamisch sein // *********************************************************************************** item.txt="<img"; var imgref = (parseInt(this.checkItem[2]) * 1000); if(imgref > 0) { item.txt += " onLoad=\"setTimeout('xxAPI.loadImg("+item.id+");',"+ imgref +");\""; // damits auch weiter geht wenn ein Netzwerkfehler oder so war, haupts�chlich IE item.txt += " onerror=\"setTimeout('xxAPI.loadImg("+item.id+");',"+ imgref +");\""; } item.txt+=" src=\"" + this.checkItem[1] + "\" alt=\"IMAGE\" style='width:" + item.w + "px; height:" + item.h + "px;' name='XXIMG_" +item.id+"I' >"; break; case "XXICON": // *********************************************************************************** // XXICON*url*Text // Zeigt ein beliebiges Bild im Text // *********************************************************************************** item.txt="<img src=\"" + this.checkItem[1] + "\" alt=\"IMAGE\">" + this.checkItem[2]; break; case "XXEHTML": // *********************************************************************************** // XXEHTML*Base64 Codierter HTML Code // *********************************************************************************** item.txt = decode64(this.checkItem[1]); break; case "XXEEXECUTE": // *********************************************************************************** // XXEEXECUTE*Base64 Codierter Javascript // *********************************************************************************** try { item.txt = ""; eval((decode64(this.checkItem[1]))); } catch(e) { item.txt = "Error:"+e.toString(); } break; case "XXHTML": // *********************************************************************************** // XXHTML*<span style="color: red;">some red Text</span> // Darstellung von beliebigem HTML Code // *********************************************************************************** // Wiederherstellen des vom HS verst�mmelten HTML // Regular Expression in Local Var var tRE=this.checkItem[1].replace(/\[/g, "<"); tRE=tRE.replace(/\?\?/g, "\""); tRE=tRE.replace(/=\?/g, "=\""); tRE=tRE.replace(/\? /g, "\" "); tRE=tRE.replace(/\?\]/g, "\">"); item.txt=tRE.replace(/\]/g, ">"); break; case "XXEXECUTE": // *********************************************************************************** // XXEXECUTE* // f�hrt Javascript Code aus // z.B. zum steuern von Playern die mit XXHTML eingebunden wurden // Das TEXTobjekt irgendwo auf der seite plazieren.(Wird nicht angezeigt) // dyanmischen Text mit Prefix XXEXCUTE* versehen und dann z.B. alert("TEST"); // *********************************************************************************** // Wiederherstellen des vom HS verst�mmelten JS (noch schlimmer) ? kann ",' aber auch ein ? sein :( // Regular Expression in Local Var var tRE=this.checkItem[1].replace(/\[/g, "<"); tRE=tRE.replace(/\(\?/g, "\(\""); tRE=tRE.replace(/=\?/g, "=\""); tRE=tRE.replace(/\? /g, "\" "); tRE=tRE.replace(/\?[,]/g, "\","); tRE=tRE.replace(/\?[;]/g, "\";"); tRE=tRE.replace(/\?[\+]/g, "\"\+"); tRE=tRE.replace(/[\+]\?/g, "\+\""); tRE=tRE.replace(/[,]\?/g, ",\""); tRE=tRE.replace(/\?\)/g, "\"\)"); this.checkItem[1]=tRE.replace(/\]/g, ">"); // Text erstmal l�schen item.txt = ""; try { eval(this.checkItem[1]); } catch(e) { item.txt = "Error:"+this.checkItem[1]+e.toString(); } break; case "XXINACTIVE": case "XXINACTIV": // *********************************************************************************** // XXINACTIVE*120 // fuehrt die Aktion(z.B.: Seite aufrufen) nach 120sec inaktivitaet aus // XXINACTIVE*0 deaktiviert es // *********************************************************************************** this.XXIAD = parseInt(this.checkItem[1]) * 1000; item.txt=""; // Alten Timer loeschen if(this.XXIATimer != null) { window.clearTimeout(this.XXIATimer); } if(this.XXIAD > 0) { this.XXIAObj = item; this.XXIATimer = window.setTimeout("doCmd(xxAPI.XXIAObj)", this.XXIAD); } else { this.XXIAObj = null; } break; case "XXTRIGGER": // *********************************************************************************** // XXTRIGGER*timeout in ms (optional) // loest automatisch beim aufbau der seite aus. // Ideal als Counter f�r Seiten ;-) einfach als Befehl iko schritt+ // und das TEXTobjekt irgendwo auf der seite plazieren.(Wird nicht angezeigt) // *********************************************************************************** item.txt=""; var tO = parseInt(this.checkItem[1]); if(tO <50) { tO = 50; } this.XXTRTimer.push(window.setTimeout("doCmd(aVisu[" + (item.id-1) + "]);",tO)); break; case "XXLONGPRESS": // ******************************************************************************************* // XXLONGPRESS*zeit in ms fuer langen klick*Bitshift(optional)*xxAPI Funktion(optional) // ******************************************************************************************* var lpt = parseInt(this.checkItem[1]); if(lpt <50) { lpt = 1000; } if(this.checkItem.length>2) { item.XXLPbit=parseInt(this.checkItem[2]); } if(this.checkItem.length>3) { item.XXLPcode = this.cutString((14+this.checkItem[1].length+this.checkItem[2].length),item.txt); } item.XXLPT = lpt; item.txt=""; break; case "XXMARK": // *********************************************************************************** // XXMARK*Name*Text // *********************************************************************************** item.XXMARK = this.checkItem[1]; if(this.checkItem.length>2) { item.txt=this.checkItem[2]; } if(item.pid >0) { top.xxAPI.XXMids[this.checkItem[1]]=item.pid; } break; case "XXREGICON": // *********************************************************************************** // XXREGICON*Icon ID*xxAPI FUnktion // legt xxAPI Funktionen auf ein Icon // *********************************************************************************** xxAPI.ICOids[this.checkItem[1]]=this.cutString((11+this.checkItem[1].length),item.txt); item.txt=""; break; case "XXMODULCLICK": // *********************************************************************************** // XXMODULCLICK*Text*Modulname*XXMARK-Name*Modulname*XXMARK-Name*....... // *********************************************************************************** item.code = "XXEXECUTE*"; for(var i=2;i+1<this.checkItem.length;i=i+2) { item.code +="this.modulClick(?" + this.checkItem[i] + "?,?" + this.checkItem[i+1] + "?);"; } case "XXCLICK": // *********************************************************************************** // XXCLICK*Text*xxAPI Funktion // *********************************************************************************** if(this.checkItem[0] == "XXCLICK") { item.code = this.cutString((9+this.checkItem[1].length),item.txt); } item.txt = this.checkItem[1]; item.click=1; case "XXSCRIPT": // Beim reload der xxAPI evtl. sp�ter Browser-reload �ber Parameter break; default: var extXX=false; for(var key in top.xxAPI.extChecks) { if(key == this.checkItem[0]) { try { item=top.xxAPI.extChecks[key](item,this.checkItem); } catch(e) {} extXX=true; } } if(!extXX) {item.txt = "n.a.";} break; } } return item; }; xxAPI.cutString = function(f,t) { return t.substr(f,t.length); }; xxAPI.MouseMove = function(_event){ if(xxAPI.XXIAObj != null) { if(xxAPI.XXIATimer != null) { window.clearTimeout(xxAPI.XXIATimer); } xxAPI.XXIATimer = window.setTimeout("doCmd(xxAPI.XXIAObj)", xxAPI.XXIAD); } }; xxAPI.callCmd = function(_item,val) { if(_item.typ == "9") { var bitshift=(_item.XXLPbit == null)?0:_item.XXLPbit; callCmd(10,"id=" + String(_item.id) + "&val=" + (val<<bitshift)); } }; xxAPI.XXLPclick = function(_item,akt) { if(akt == 0) { if(xxAPI.XXMDTimer) { window.clearTimeout(xxAPI.XXMDTimer); } if((new Date().getTime() - xxAPI.XXLMD) > _item.XXLPT) { this.callCmd(_item,4); } else { hidePointer(); showPointerByClick(_item); this.callCmd(_item,1); } } if(akt == 1) { xxAPI.XXLMD = new Date().getTime(); } if(akt == 2) { hidePointer(); showPointerByClick(_item); if(_item.XXLPcode) { _item.txt = _item.XXLPcode; xxAPI.check(_item); } this.callCmd(_item,2); } }; // Key Events abfangen xxAPI.addMoveEvent = function() { var ua = navigator.userAgent; if(ua.indexOf("MSIE") >=0) { document.getElementsByTagName("body")[0].onmousemove=xxAPI.MouseMove; } else { if (window.addEventListener) { window.addEventListener("mousemove", xxAPI.MouseMove ,false); } else if (document.attachEvent) { document.attachEvent("onmousemove",xxAPI.MouseMove); } } }; visuMousedown = function(_event){ var _item=aVisu[parseInt(this.name,10)]; if(typeof(_item.XXLPT) != "undefined") { this.onclick = null; xxAPI.XXLPclick(_item,1); xxAPI.XXMDObj = _item; xxAPI.XXMDTimer = window.setTimeout("xxAPI.XXLPclick(xxAPI.XXMDObj,2)",_item.XXLPT); } if(typeof(this.onmouseup) != "function") { this.onmouseup = visuMouseup; } }; visuMouseup = function(_event) { try { var _item=aVisu[parseInt(this.name,10)]; if(typeof(_item.XXLPT) != "undefined") { xxAPI.XXLPclick(_item,0); } } catch(e) {} }; // ersetzt die original visuClick aus der ajax.js visuClick = function(_event){ hidePointer(); var _item=aVisu[parseInt(this.name,10)]; showPointerByClick(_item); mouseClickItem = _item; if(_item.code) { _item.txt = _item.code; xxAPI.check(_item); } doCmd(_item); }; xxAPI.hideObj = function(hide) { if(hide) { var visible = "hidden"; } else { var visible = "visible"; } for(var i=0;i<this.cleanUPobj.length;i++) { if(typeof(this.cleanUPobj[i]) == 'function') { try { this.cleanUPobj[i](hide); } catch(e) {} } else { try { document.getElementById(this.cleanUPobj[i]).style.visibility = visible; if(hide ==2) { document.getElementById(this.cleanUPobj[i]).parentNode.removeChild(document.getElementById(this.cleanUPobj[i])); } } catch(e) {} } } if(hide ==2) { this.cleanUPobj = new Array(); // bestehende XXTRIGGER Timer l�schen for(var i=0;i<this.XXTRTimer.length;i++) { try { window.clearTimeout(this.XXTRTimer[i]); }catch(e){} } this.XXTRTimer = new Array(); //stop Iframes and Modules // var f=document.getElementsByTagName("IFRAME"); // for (var i=0;i<f.length;i++) { // try { // f[i].parentNode.parentNode.style.visibility = 'hidden'; // //if(this.aVercheck(1)) { f[i].src='about:blank';} // f[i].parentNode.parentNode.style.visibility = 'visible'; // }catch(e){} // } } }; xxAPI.refunc = function(f) { try { eval("if(typeof(__"+f+")!='function') { __"+f+"="+f+";}"); }catch(e) {} }; xxAPI.refunc("clearVisu"); clearVisu = function() { xxAPI.hideObj(2); __clearVisu(); }; xxAPI.refunc("removeMaske"); removeMaske = function(_update) { xxAPI.hideObj(0); __removeMaske(_update); }; xxAPI.refunc("hideVisu"); hideVisu = function() { xxAPI.hideObj(1); __hideVisu(); }; xxAPI.load(); xxAPI.addMoveEvent();