diff options
Diffstat (limited to 'skins/xstyle/javascript')
| -rw-r--r-- | skins/xstyle/javascript/XHConn.js | 41 | ||||
| -rw-r--r-- | skins/xstyle/javascript/cssexpr.js | 66 | ||||
| -rw-r--r-- | skins/xstyle/javascript/global.js | 187 | ||||
| -rw-r--r-- | skins/xstyle/javascript/helptip.js | 240 | ||||
| -rw-r--r-- | skins/xstyle/javascript/records.js | 26 | ||||
| -rw-r--r-- | skins/xstyle/javascript/tabpane.js | 368 | ||||
| -rw-r--r-- | skins/xstyle/javascript/tooltip.js | 210 | ||||
| -rw-r--r-- | skins/xstyle/javascript/xmenu.js | 371 | ||||
| -rw-r--r-- | skins/xstyle/javascript/xtree.js | 541 |
9 files changed, 2050 insertions, 0 deletions
diff --git a/skins/xstyle/javascript/XHConn.js b/skins/xstyle/javascript/XHConn.js new file mode 100644 index 0000000..537b555 --- /dev/null +++ b/skins/xstyle/javascript/XHConn.js @@ -0,0 +1,41 @@ +/** XHRequest based on ** + ** XHConn - Simple XMLHTTP Interface - bfults@gmail.com - 2005-04-08 ** + ** Code licensed under Creative Commons Attribution-ShareAlike License ** + ** http://creativecommons.org/licenses/by-sa/2.0/ **/ + +function XHRequest() +{ + var xmlhttp, bComplete = false; + try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } + catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } + catch (e) { try { xmlhttp = new XMLHttpRequest(); } + catch (e) { xmlhttp = false; }}} + if (!xmlhttp) + return null; + + this.connect = function(sRequest, fnDone, sData) + { + if (!xmlhttp) return false; + bComplete = false; + + try { + xmlhttp.open("GET", sRequest, true); + xmlhttp.onreadystatechange = function() + { + if (xmlhttp.readyState == 4 && !bComplete) + { + bComplete = true; + fnDone(xmlhttp, sData); + } + }; + xmlhttp.send(null); + } catch(z) { alert(z); return false; } + return true; + }; + return this; +} + +var ajaxconn = new XHRequest(); + +if (!ajaxconn) + alert("XMLHTTP not available. Try a newer/better browser."); diff --git a/skins/xstyle/javascript/cssexpr.js b/skins/xstyle/javascript/cssexpr.js new file mode 100644 index 0000000..49dacf0 --- /dev/null +++ b/skins/xstyle/javascript/cssexpr.js @@ -0,0 +1,66 @@ +function constExpression(x) { + return x; +} + +function simplifyCSSExpression() { + try { + var ss,sl, rs, rl; + ss = document.styleSheets; + sl = ss.length + + for (var i = 0; i < sl; i++) { + simplifyCSSBlock(ss[i]); + } + } + catch (exc) { + alert("Got an error while processing css. The page should still work but might be a bit slower"); + throw exc; + } +} + +function simplifyCSSBlock(ss) { + var rs, rl; + + for (var i = 0; i < ss.imports.length; i++) + simplifyCSSBlock(ss.imports[i]); + + if (ss.cssText.indexOf("expression(constExpression(") == -1) + return; + + rs = ss.rules; + rl = rs.length; + for (var j = 0; j < rl; j++) + simplifyCSSRule(rs[j]); + +} + +function simplifyCSSRule(r) { + var str = r.style.cssText; + var str2 = str; + var lastStr; + do { + lastStr = str2; + str2 = simplifyCSSRuleHelper(lastStr); + } while (str2 != lastStr) + + if (str2 != str) + r.style.cssText = str2; +} + +function simplifyCSSRuleHelper(str) { + var i, i2; + i = str.indexOf("expression(constExpression("); + if (i == -1) return str; + i2 = str.indexOf("))", i); + var hd = str.substring(0, i); + var tl = str.substring(i2 + 2); + var exp = str.substring(i + 27, i2); + var val = eval(exp) + return hd + val + tl; +} + +if (/msie/i.test(navigator.userAgent) && window.attachEvent != null) { + window.attachEvent("onload", function () { + simplifyCSSExpression(); + }); +}
\ No newline at end of file diff --git a/skins/xstyle/javascript/global.js b/skins/xstyle/javascript/global.js new file mode 100644 index 0000000..7bf2dd4 --- /dev/null +++ b/skins/xstyle/javascript/global.js @@ -0,0 +1,187 @@ +// To status frame und dann refresh der seite +function tostatus(url) { + myoldurl = location.href; + location.href = url; +} + +// Redirect +function redirect(url, wait, par) { + if(! wait) { + wait = 0.1; + } + if(par) { + window.setTimeout(par + '.location.href = "' + url + '"', wait * 1000); + } else { + window.setTimeout('location.href = "' + url + '"', wait * 1000); + } +} + +// Program choose +function di(wert, url) { + location.href = url + wert; +} + +// Question bevor delete +function sure(form, text, url, id) { + id = (id) ? id : ''; + var erg = confirm(text); + var refe = encodeURIComponent(form.referer.value); + if(erg == true) { + var callurl = url + id + '&referer=' + refe; + location.href = callurl; + } +} + +function Delete(question,warn,cmd,form) { +// test on checked Boxes + ok = new Array; + txt = new Array; + x = 0; + for(var i=0;i<form.length;++i) { + var id; + if(form.elements[i].type == 'checkbox' && form.elements[i].checked) { + id = form.elements[i].value; + ok.push(id); + txt.push(form.elements[i].name); + form.elements[i].checked = 0; + x += 1; + } + } + if(x > 0) { + if(confirm(question + '\n' + txt.join("\n"))) { + tostatus('?cmd=' + cmd + '&data=' + ok.join('_')); + } + } else { + alert(warn); + } +} + +function Toggle(warn,form) { +// test on checked Boxes + ok = new Array; + txt = new Array; + x = 0; + for(var i=0;i<form.length;++i) { + var id; + if(form.elements[i].type == 'checkbox' && form.elements[i].checked) { + id = form.elements[i].value; + ok.push(id); + txt.push(form.elements[i].name); + form.elements[i].checked = 0; + x += 1; + } + } + if(x > 0) { + tostatus('?cmd=ttoggle&data=' + ok.join('_')); + } else { + alert(warn); + } +} + +function selAll(form, type) { +// check all Boxes + for(var i=0;i<form.length;++i) { + if(form.elements[i].type == 'checkbox') { + form.elements[i].checked = type; + } + } +} + +function selSwitch(form, search) { +// switch Boxes with search in name on or off + for(var i=0;i<form.length;++i) { + if(form.elements[i].type == 'checkbox' && form.elements[i].name == search) { + if(form.elements[i].checked) { + form.elements[i].checked = 0; + } else { + form.elements[i].checked = 1; + } + } + } +} + +function reverse(form) { +// check all Boxes + for(var i=0;i<form.length;++i) { + if(form.elements[i].type == 'checkbox') { + if(form.elements[i].checked) { + form.elements[i].checked = 0; + } else { + form.elements[i].checked = 1; + } + } + } +} + +function Play(warnmsg,form) { +// test on checked Boxes + ok = new Array; + x = 0; + for(var i=0;i<form.length;++i) { + var id; + if(form.elements[i].type == 'checkbox' && form.elements[i].checked) { + id = form.elements[i].value; + ok.push(id); + x += 1; + } + } + if(x > 0) { + var url = '?cmd=mplaylist&data=' + ok.join('_'); + location.href = url; + } else { + alert(warnmsg); + } +} + +/* -------------------- Widget Routines --------------- */ + +/* +- An AjaxCall to check for right values in HTML Widget +checkValue(inputObject, msgId, perlCall, wrongMessage, goodMessage); +checkValue(this, 'id<?% param.count %?>', 'getip', 'host: %s is not exists!', 'ip address is %s') +*/ +function checkValue (valobj, msgname, cmd, wrongMsg, goodMsg) { + + var fnWhenDone = function (oXML, sData) { + var val = sData[0]; + var msg = sData[1]; + var wrongMsg = sData[2]; + var goodMsg = sData[3]; + + var o = eval("("+oXML.responseText+")");
+ if(o && o.data && typeof(o.data) == 'string' + && o.success && o.success == true) { + msg.className = 'good'; + msg.innerHTML = goodMsg.replace('%s', o.data); + } else { + msg.className = 'error'; + msg.innerHTML = wrongMsg.replace('%s', o.data); + } + }; + + var inputvalue = valobj.value; + var msgobj = document.getElementById(msgname); + msgobj.innerHTML = 'Check value ...'; + + if(inputvalue) { + var url = "?cmd=checkvalue&data=" + cmd + ":" + inputvalue + "&ajax=json"; + var aconn = new XHRequest(); + if(!aconn) + return false; + return aconn.connect(url, fnWhenDone, [valobj, msgobj, wrongMsg, goodMsg]); + } +} + +function suche(question, urls, def, last) { + var sstring = prompt(question, def); + if(!sstring || sstring.length <= 0 ) { + return + } + if(! urls) + urls = "?cmd=search&data="; + var url = urls + sstring; + if(last) { + url = url + last; + } + location.href = url; +} diff --git a/skins/xstyle/javascript/helptip.js b/skins/xstyle/javascript/helptip.js new file mode 100644 index 0000000..6c129d4 --- /dev/null +++ b/skins/xstyle/javascript/helptip.js @@ -0,0 +1,240 @@ +/*----------------------------------------------------------------------------\ +| Help Tip 1.12 | +|-----------------------------------------------------------------------------| +| Created by Erik Arvidsson | +| (http://webfx.eae.net/contact.html#erik) | +| For WebFX (http://webfx.eae.net/) | +|-----------------------------------------------------------------------------| +| A tool tip like script that can be used for context help | +|-----------------------------------------------------------------------------| +| Copyright (c) 1999 - 2002 Erik Arvidsson | +|-----------------------------------------------------------------------------| +| This software is provided "as is", without warranty of any kind, express or | +| implied, including but not limited to the warranties of merchantability, | +| fitness for a particular purpose and noninfringement. In no event shall the | +| authors or copyright holders be liable for any claim, damages or other | +| liability, whether in an action of contract, tort or otherwise, arising | +| from, out of or in connection with the software or the use or other | +| dealings in the software. | +| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | +| This software is available under the three different licenses mentioned | +| below. To use this software you must chose, and qualify, for one of those. | +| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | +| The WebFX Non-Commercial License http://webfx.eae.net/license.html | +| Permits anyone the right to use the software in a non-commercial context | +| free of charge. | +| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | +| The WebFX Commercial license http://webfx.eae.net/commercial.html | +| Permits the license holder the right to use the software in a commercial | +| context. Such license must be specifically obtained, however it's valid for | +| any number of implementations of the licensed software. | +| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | +| GPL - The GNU General Public License http://www.gnu.org/licenses/gpl.txt | +| Permits anyone the right to use and modify the software without limitations | +| as long as proper credits are given and the original and modified source | +| code are included. Requires that the final product, software derivate from | +| the original source or any software utilizing a GPL component, such as | +| this, is also licensed under the GPL license. | +|-----------------------------------------------------------------------------| +| 2002-09-27 | | +| 2001-11-25 | Added a resize to the tooltip if the document width is too | +| | small. | +| 2002-05-19 | IE50 did not recognise the JS keyword undefined so the test | +| | for scroll support was updated to be IE50 friendly. | +| 2002-07-06 | Added flag to hide selects for IE | +| 2002-10-04 | (1.1) Restructured and made code more IE garbage collector | +| | friendly. This solved the most nasty memory leaks. Also added | +| | support for hiding the tooltip if ESC is pressed. | +| 2002-10-18 | Fixed verrical position in case of scrolled document. | +| 2002-12-02 | Mozilla bug workaround related to mousedown and move. | +|-----------------------------------------------------------------------------| +| Dependencies: helptip.css (To set up the CSS of the help-tooltip class) | +|-----------------------------------------------------------------------------| +| Usage: | +| | +| <script type="text/javascript" src="helptip.js">< /script> | +| <link type="text/css" rel="StyleSheet" href="helptip.css" /> | +| | +| <a class="helpLink" href="?" onclick="showHelp(event, 'String to show'); | +| return false">Help</a> | +|-----------------------------------------------------------------------------| +| Created 2001-09-27 | All changes are in the log above. | Updated 2002-12-02 | +\----------------------------------------------------------------------------*/ + +function showHelpTip(e, sHtml, bHideSelects) { + + // find anchor element + var el = e.target || e.srcElement; + while (el.tagName != "A") + el = el.parentNode; + + // is there already a tooltip? If so, remove it + if (el._helpTip) { + helpTipHandler.hideHelpTip(el); + } + + helpTipHandler.hideSelects = Boolean(bHideSelects); + + // create element and insert last into the body + helpTipHandler.createHelpTip(el, sHtml); + + // position tooltip + helpTipHandler.positionToolTip(e); + + // add a listener to the blur event. + // When blurred remove tooltip and restore anchor + el.onblur = helpTipHandler.anchorBlur; + el.onkeydown = helpTipHandler.anchorKeyDown; +} + +var helpTipHandler = { + hideSelects: false, + + helpTip: null, + + showSelects: function (bVisible) { + if (!this.hideSelects) return; + // only IE actually do something in here + var selects = []; + if (document.all) + selects = document.all.tags("SELECT"); + var l = selects.length; + for (var i = 0; i < l; i++) + selects[i].runtimeStyle.visibility = bVisible ? "" : "hidden"; + }, + + create: function () { + var d = document.createElement("DIV"); + d.className = "help-tooltip"; + d.onmousedown = this.helpTipMouseDown; + d.onmouseup = this.helpTipMouseUp; + document.body.appendChild(d); + this.helpTip = d; + }, + + createHelpTip: function (el, sHtml) { + if (this.helpTip == null) { + this.create(); + } + + var d = this.helpTip; + d.innerHTML = sHtml; + d._boundAnchor = el; + el._helpTip = d; + return d; + }, + + // Allow clicks on A elements inside tooltip + helpTipMouseDown: function (e) { + var d = this; + var el = d._boundAnchor; + if (!e) e = event; + var t = e.target || e.srcElement; + while (t.tagName != "A" && t != d) + t = t.parentNode; + if (t == d) return; + + el._onblur = el.onblur; + el.onblur = null; + }, + + helpTipMouseUp: function () { + var d = this; + var el = d._boundAnchor; + el.onblur = el._onblur; + el._onblur = null; + el.focus(); + }, + + anchorBlur: function (e) { + var el = this; + helpTipHandler.hideHelpTip(el); + }, + + anchorKeyDown: function (e) { + if (!e) e = window.event + if (e.keyCode == 27) { // ESC + helpTipHandler.hideHelpTip(this); + } + }, + + removeHelpTip: function (d) { + d._boundAnchor = null; + d.style.filter = "none"; + d.innerHTML = ""; + d.onmousedown = null; + d.onmouseup = null; + d.parentNode.removeChild(d); + //d.style.display = "none"; + }, + + hideHelpTip: function (el) { + var d = el._helpTip; + /* Mozilla (1.2+) starts a selection session when moved + and this destroys the mouse events until reloaded + d.style.top = -el.offsetHeight - 100 + "px"; + */ + + d.style.visibility = "hidden"; + //d._boundAnchor = null; + + el.onblur = null; + el._onblur = null; + el._helpTip = null; + el.onkeydown = null; + + this.showSelects(true); + }, + + positionToolTip: function (e) { + this.showSelects(false); + var scroll = this.getScroll(); + var d = this.helpTip; + + // width + if (d.offsetWidth >= scroll.width) + d.style.width = scroll.width - 10 + "px"; + else + d.style.width = ""; + + // left + if (e.clientX > scroll.width - d.offsetWidth) + d.style.left = scroll.width - d.offsetWidth + scroll.left + "px"; + else + d.style.left = e.clientX - 2 + scroll.left + "px"; + + // top + if (e.clientY + d.offsetHeight + 18 < scroll.height) + d.style.top = e.clientY + 18 + scroll.top + "px"; + else if (e.clientY - d.offsetHeight > 0) + d.style.top = e.clientY + scroll.top - d.offsetHeight + "px"; + else + d.style.top = scroll.top + 5 + "px"; + + d.style.visibility = "visible"; + }, + + // returns the scroll left and top for the browser viewport. + getScroll: function () { + if (document.all && typeof document.body.scrollTop != "undefined") { // IE model + var ieBox = document.compatMode != "CSS1Compat"; + var cont = ieBox ? document.body : document.documentElement; + return { + left: cont.scrollLeft, + top: cont.scrollTop, + width: cont.clientWidth, + height: cont.clientHeight + }; + } + else { + return { + left: window.pageXOffset, + top: window.pageYOffset, + width: window.innerWidth, + height: window.innerHeight + }; + } + + } + +};
\ No newline at end of file diff --git a/skins/xstyle/javascript/records.js b/skins/xstyle/javascript/records.js new file mode 100644 index 0000000..3dfc59e --- /dev/null +++ b/skins/xstyle/javascript/records.js @@ -0,0 +1,26 @@ +// Search for epgevents and check for future programming +function checkrecord (name) { + var fnWhenDone = function (oXML, sData) { + if(oXML.responseText != 'ok') { + var text = oXML.responseText.split(':'); + document.getElementById(sData).src = 'images/record_red.png'; + document.getElementById(sData).title = '<?% gettext('Conflict with timer: ') %?>' + text[0]; + document.getElementById(sData).className = 'problem'; + } else { + document.getElementById(sData).src = 'images/record_green.png'; + document.getElementById(sData).className = 'noproblem'; + } + }; + + var tags = document.getElementsByName('recordlink'); + for (var i = 0; i < tags.length; i++) { + var epgid = tags[i].id; + var url = "?cmd=conflict&data=" + epgid + "&ajax=text"; + var aconn = new XHRequest(); + if(!aconn) + return false; + aconn.connect(url, fnWhenDone, epgid); + } +} + +window.onLoad = window.setTimeout("checkrecord('recordlink')", 1000); diff --git a/skins/xstyle/javascript/tabpane.js b/skins/xstyle/javascript/tabpane.js new file mode 100644 index 0000000..04b1550 --- /dev/null +++ b/skins/xstyle/javascript/tabpane.js @@ -0,0 +1,368 @@ +/*----------------------------------------------------------------------------\
+| Tab Pane 1.02 |
+|-----------------------------------------------------------------------------|
+| Created by Erik Arvidsson |
+| (http://webfx.eae.net/contact.html#erik) |
+| For WebFX (http://webfx.eae.net/) |
+|-----------------------------------------------------------------------------|
+| Copyright (c) 1998 - 2003 Erik Arvidsson |
+|-----------------------------------------------------------------------------|
+| This software is provided "as is", without warranty of any kind, express or |
+| implied, including but not limited to the warranties of merchantability, |
+| fitness for a particular purpose and noninfringement. In no event shall the |
+| authors or copyright holders be liable for any claim, damages or other |
+| liability, whether in an action of contract, tort or otherwise, arising |
+| from, out of or in connection with the software or the use or other |
+| dealings in the software. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| This software is available under the three different licenses mentioned |
+| below. To use this software you must chose, and qualify, for one of those. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| The WebFX Non-Commercial License http://webfx.eae.net/license.html |
+| Permits anyone the right to use the software in a non-commercial context |
+| free of charge. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| The WebFX Commercial license http://webfx.eae.net/commercial.html |
+| Permits the license holder the right to use the software in a commercial |
+| context. Such license must be specifically obtained, however it's valid for |
+| any number of implementations of the licensed software. |
+| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
+| GPL - The GNU General Public License http://www.gnu.org/licenses/gpl.txt |
+| Permits anyone the right to use and modify the software without limitations |
+| as long as proper credits are given and the original and modified source |
+| code are included. Requires that the final product, software derivate from |
+| the original source or any software utilizing a GPL component, such as |
+| this, is also licensed under the GPL license. |
+|-----------------------------------------------------------------------------|
+| 2002-01-?? | First working version |
+| 2002-02-17 | Cleaned up for 1.0 public version |
+| 2003-02-18 | Changed from javascript uri for anchors to return false |
+| 2003-03-03 | Added dispose methods to release IE memory |
+|-----------------------------------------------------------------------------| +| Dependencies: *.css a css file to define the layout | +|-----------------------------------------------------------------------------|
+| Created 2002-01-?? | All changes are in the log above. | Updated 2003-03-03 |
+\----------------------------------------------------------------------------*/
+
+// This function is used to define if the browser supports the needed
+// features
+function hasSupport() {
+
+ if (typeof hasSupport.support != "undefined")
+ return hasSupport.support;
+
+ var ie55 = /msie 5\.[56789]/i.test( navigator.userAgent );
+
+ hasSupport.support = ( typeof document.implementation != "undefined" &&
+ document.implementation.hasFeature( "html", "1.0" ) || ie55 )
+
+ // IE55 has a serious DOM1 bug... Patch it!
+ if ( ie55 ) {
+ document._getElementsByTagName = document.getElementsByTagName;
+ document.getElementsByTagName = function ( sTagName ) {
+ if ( sTagName == "*" )
+ return document.all;
+ else
+ return document._getElementsByTagName( sTagName );
+ };
+ }
+
+ return hasSupport.support;
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+// The constructor for tab panes
+//
+// el : HTMLElement The html element used to represent the tab pane
+// bUseCookie : Boolean Optional. Default is true. Used to determine whether to us
+// persistance using cookies or not
+//
+function WebFXTabPane( el, bUseCookie ) {
+ if ( !hasSupport() || el == null ) return;
+
+ this.element = el;
+ this.element.tabPane = this;
+ this.pages = [];
+ this.selectedIndex = null;
+ this.useCookie = bUseCookie != null ? bUseCookie : true;
+
+ // add class name tag to class name
+ this.element.className = this.classNameTag + " " + this.element.className;
+
+ // add tab row
+ this.tabRow = document.createElement( "div" );
+ this.tabRow.className = "tab-row";
+ el.insertBefore( this.tabRow, el.firstChild );
+
+ var tabIndex = 0;
+ if ( this.useCookie ) {
+ tabIndex = Number( WebFXTabPane.getCookie( "webfxtab_" + this.element.id ) );
+ if ( isNaN( tabIndex ) )
+ tabIndex = 0;
+ }
+ this.selectedIndex = tabIndex;
+
+ // loop through child nodes and add them
+ var cs = el.childNodes;
+ var n;
+ for (var i = 0; i < cs.length; i++) {
+ if (cs[i].nodeType == 1 && cs[i].className == "tab-page") {
+ this.addTabPage( cs[i] );
+ }
+ }
+}
+
+WebFXTabPane.prototype.classNameTag = "dynamic-tab-pane-control";
+
+WebFXTabPane.prototype.setSelectedIndex = function ( n ) {
+ if (this.selectedIndex != n) {
+ if (this.selectedIndex != null && this.pages[ this.selectedIndex ] != null )
+ this.pages[ this.selectedIndex ].hide();
+ this.selectedIndex = n;
+ this.pages[ this.selectedIndex ].show();
+
+ if ( this.useCookie )
+ WebFXTabPane.setCookie( "webfxtab_" + this.element.id, n ); // session cookie
+ }
+};
+
+WebFXTabPane.prototype.getSelectedIndex = function () {
+ return this.selectedIndex;
+};
+
+WebFXTabPane.prototype.addTabPage = function ( oElement ) {
+ if ( !hasSupport() ) return;
+
+ if ( oElement.tabPage == this ) // already added
+ return oElement.tabPage;
+
+ var n = this.pages.length;
+ var tp = this.pages[n] = new WebFXTabPage( oElement, this, n );
+ tp.tabPane = this;
+
+ // move the tab out of the box
+ this.tabRow.appendChild( tp.tab );
+
+ if ( n == this.selectedIndex )
+ tp.show();
+ else
+ tp.hide();
+
+ return tp;
+};
+
+WebFXTabPane.prototype.dispose = function () {
+ this.element.tabPane = null;
+ this.element = null;
+ this.tabRow = null;
+
+ for (var i = 0; i < this.pages.length; i++) {
+ this.pages[i].dispose();
+ this.pages[i] = null;
+ }
+ this.pages = null;
+};
+
+
+
+// Cookie handling
+WebFXTabPane.setCookie = function ( sName, sValue, nDays ) {
+ var expires = "";
+ if ( nDays ) { + var d = new Date(); + d.setTime( d.getTime() + nDays * 24 * 60 * 60 * 1000 ); + expires = "; expires=" + d.toGMTString(); + } + + document.cookie = sName + "=" + sValue + expires + "; path=/"; +};
+
+WebFXTabPane.getCookie = function (sName) { + var re = new RegExp( "(\;|^)[^;]*(" + sName + ")\=([^;]*)(;|$)" ); + var res = re.exec( document.cookie ); + return res != null ? res[3] : null; +}; + +WebFXTabPane.removeCookie = function ( name ) { + setCookie( name, "", -1 ); +};
+
+
+
+
+
+
+
+
+///////////////////////////////////////////////////////////////////////////////////
+// The constructor for tab pages. This one should not be used.
+// Use WebFXTabPage.addTabPage instead
+//
+// el : HTMLElement The html element used to represent the tab pane
+// tabPane : WebFXTabPane The parent tab pane
+// nindex : Number The index of the page in the parent pane page array
+//
+function WebFXTabPage( el, tabPane, nIndex ) {
+ if ( !hasSupport() || el == null ) return;
+
+ this.element = el;
+ this.element.tabPage = this;
+ this.index = nIndex;
+
+ var cs = el.childNodes;
+ for (var i = 0; i < cs.length; i++) {
+ if (cs[i].nodeType == 1 && cs[i].className == "tab") {
+ this.tab = cs[i];
+ break;
+ }
+ }
+
+ // insert a tag around content to support keyboard navigation
+
+
+ var a = document.createElement( "A" );
+ this.aElement = a;
+ a.href = "#";
+ a.onclick = function () { return false; };
+ while ( this.tab.hasChildNodes() )
+ a.appendChild( this.tab.firstChild );
+ this.tab.appendChild( a );
+
+
+ // hook up events, using DOM0
+ var oThis = this;
+ this.tab.onclick = function () { oThis.select(); };
+ this.tab.onmouseover = function () { WebFXTabPage.tabOver( oThis ); };
+ this.tab.onmouseout = function () { WebFXTabPage.tabOut( oThis ); };
+}
+
+WebFXTabPage.prototype.show = function () {
+ var el = this.tab;
+ var s = el.className + " selected";
+ s = s.replace(/ +/g, " ");
+ el.className = s;
+
+ this.element.style.display = "block";
+};
+
+WebFXTabPage.prototype.hide = function () {
+ var el = this.tab;
+ var s = el.className;
+ s = s.replace(/ selected/g, "");
+ el.className = s;
+
+ this.element.style.display = "none";
+};
+
+WebFXTabPage.prototype.select = function () {
+ this.tabPane.setSelectedIndex( this.index );
+};
+
+WebFXTabPage.prototype.dispose = function () {
+ this.aElement.onclick = null;
+ this.aElement = null;
+ this.element.tabPage = null;
+ this.tab.onclick = null;
+ this.tab.onmouseover = null;
+ this.tab.onmouseout = null;
+ this.tab = null;
+ this.tabPane = null;
+ this.element = null;
+};
+
+WebFXTabPage.tabOver = function ( tabpage ) {
+ var el = tabpage.tab;
+ var s = el.className + " hover";
+ s = s.replace(/ +/g, " ");
+ el.className = s;
+};
+
+WebFXTabPage.tabOut = function ( tabpage ) {
+ var el = tabpage.tab;
+ var s = el.className;
+ s = s.replace(/ hover/g, "");
+ el.className = s;
+};
+
+
+// This function initializes all uninitialized tab panes and tab pages
+function setupAllTabs() {
+ if ( !hasSupport() ) return;
+
+ var all = document.getElementsByTagName( "*" );
+ var l = all.length;
+ var tabPaneRe = /tab\-pane/;
+ var tabPageRe = /tab\-page/;
+ var cn, el;
+ var parentTabPane;
+
+ for ( var i = 0; i < l; i++ ) {
+ el = all[i]
+ cn = el.className;
+
+ // no className
+ if ( cn == "" ) continue;
+
+ // uninitiated tab pane
+ if ( tabPaneRe.test( cn ) && !el.tabPane )
+ new WebFXTabPane( el );
+
+ // unitiated tab page wit a valid tab pane parent
+ else if ( tabPageRe.test( cn ) && !el.tabPage &&
+ tabPaneRe.test( el.parentNode.className ) ) {
+ el.parentNode.tabPane.addTabPage( el );
+ }
+ }
+}
+
+function disposeAllTabs() {
+ if ( !hasSupport() ) return;
+
+ var all = document.getElementsByTagName( "*" );
+ var l = all.length;
+ var tabPaneRe = /tab\-pane/;
+ var cn, el;
+ var tabPanes = [];
+
+ for ( var i = 0; i < l; i++ ) {
+ el = all[i]
+ cn = el.className;
+
+ // no className
+ if ( cn == "" ) continue;
+
+ // tab pane
+ if ( tabPaneRe.test( cn ) && el.tabPane )
+ tabPanes[tabPanes.length] = el.tabPane;
+ }
+
+ for (var i = tabPanes.length - 1; i >= 0; i--) {
+ tabPanes[i].dispose();
+ tabPanes[i] = null;
+ }
+}
+
+
+// initialization hook up
+
+// DOM2
+if ( typeof window.addEventListener != "undefined" )
+ window.addEventListener( "load", setupAllTabs, false );
+
+// IE
+else if ( typeof window.attachEvent != "undefined" ) {
+ window.attachEvent( "onload", setupAllTabs );
+ window.attachEvent( "onunload", disposeAllTabs );
+}
+
+else {
+ if ( window.onload != null ) {
+ var oldOnload = window.onload;
+ window.onload = function ( e ) {
+ oldOnload( e );
+ setupAllTabs();
+ };
+ }
+ else
+ window.onload = setupAllTabs;
+}
\ No newline at end of file diff --git a/skins/xstyle/javascript/tooltip.js b/skins/xstyle/javascript/tooltip.js new file mode 100644 index 0000000..f66f4e8 --- /dev/null +++ b/skins/xstyle/javascript/tooltip.js @@ -0,0 +1,210 @@ +var ttp_content; +ttp_content = ""; + +var ttp_timer; +var ttp_x = -1; +var ttp_y = -1; +var ttp_visable = 0; +var ttp_offset_x = 0; +var ttp_x_start = -1; +var ttp_y_start = -1; +var ttp_active = 1; +var ttp_inside = 0; + +var ie5=document.all&&document.getElementById; +var ns6=document.getElementById&&!document.all; +var opera =window.opera; +var dom=(!opera && document.compatMode && document.compatMode!="BackCompat"); + +function iecompattest(){ + return dom ? document.documentElement : document.body +} + +function getScrollingPosition() { + var x = 0, y = 0; + if( ns6 || typeof( window.pageYOffset ) == 'number' ) { + y = window.pageYOffset; + x = window.pageXOffset; + } else { + y = iecompattest().scrollTop; + x = iecompattest().scrollLeft; + } + return [ x, y ]; +} + +function WindowSize () { + var width = 0, height = 0; + if( ns6 || typeof( window.innerWidth ) == 'number' ) { + width = window.innerWidth; + height = window.innerHeight; + } else { + width = iecompattest().clientWidth; + height = iecompattest().clientHeight; + } + return [ width, height ]; +} + +function ttp_update_pos(){ + var Size = WindowSize(); + + var x = ttp_x + ttp_offset_x; + var y = ttp_y; + + var ele = document.getElementById('TOOLTIP'); + var scrPos = getScrollingPosition(); + + if(x + 500 > Size[0] + scrPos[0]) { + x = Size[0] - 500; + } + if(y + 150 > Size[1] + scrPos[1]) { + y = Size[1] - (y - 10); + ele.style.top = ''; + if(ie5&&!opera) { + ele.style.removeAttribute('top'); + y += scrPos[1]; + } + ele.style.bottom = y + "px"; + } else { + ele.style.bottom = ''; + if(ie5&&!opera) { + ele.style.removeAttribute('bottom'); + } + ele.style.top = (y + 20) + "px"; + } + ele.style.left = x + "px"; +} + +var ttp_ie = document.all?true:false; +if (!ttp_ie) document.captureEvents(Event.MOUSEMOVE) +document.onmousemove = ttp_onmousemove; + +function ttp_onmousemove(e) { +if (ttp_ie) { + ttp_x = event.clientX + document.body.scrollLeft; + ttp_y = event.clientY + document.body.scrollTop; +} else { + ttp_x = e.pageX; + ttp_y = e.pageY; +} +if (ttp_x < 0) {ttp_x = 0;} +if (ttp_y < 0) {ttp_y = 0;} +if(ttp_visable) { + if(Math.abs(ttp_x_start - ttp_x) > 200 + || Math.abs(ttp_y_start - ttp_y) > 200) { + ttp_make_invisable(); + } + ttp_update_pos(); + } +} + + +function ttp_update_content(title, description){ + var utitle = unescape(title); + ttp_content = '<div id="ttwindow"><p class="topic">'; + ttp_content += utitle.substr(0,50); + if (utitle.length > 50) {ttp_content += '...';} + ttp_content += '</p><p class="description">' + if(description == 'WAIT') { + ttp_content += '<img src="images/repeat.png" alt="" />'; /* TODO => wait.gif */ + } else { + ttp_content += unescape(description); + } + ttp_content += '</p></div>'; +} + +function ttp_make_visable(title, description){ + ttp_update_pos(); + ttp_update_content(title, description); + var ele = document.getElementById('TOOLTIP'); + ele.innerHTML = ttp_content; + ele.style.visibility = "visible"; +} + +function ttp_make_invisable(){ + var ele = document.getElementById('TOOLTIP'); + + if(ttp_visable || ele.style.visibility == "visible") { + clearTimeout(ttp_timer); + ele.style.visibility = "hidden"; + } + ttp_visable = 0; + ttp_inside = 0; +} + +function ttp_enable(enable){ + ttp_make_invisable(); + ttp_active = enable +} + +function ttp_make_req_visable(title, eventid, x, y){ + + if(!eventid || eventid<=0 || ttp_inside==0 + || Math.abs(x - ttp_x) > 200 + || Math.abs(y - ttp_y) > 200) { + clearTimeout(ttp_timer); + ttp_inside = 0; + return false; + } + + ttp_x_start = ttp_x; + ttp_y_start = ttp_y; + ttp_make_visable(title,'WAIT'); + + var fnWhenDone = function (oXML, sData) { + + var description = eval('(' + oXML.responseText + ')'); + + var content; + if(description && description.data && typeof(description.data) == 'string'){ + content = description.data.replace(/\r\n/g,'<br />'); + } else { + content = '...'; + } + + ttp_make_visable(title,content); + }; + + var url = "?cmd=edescription&data=" + eventid + "&ajax=json"; + var aconn = new XHRequest(); + if(!aconn) + return false; + return aconn.connect(url, fnWhenDone, eventid); +} + + +function ttpreq(self, title, eventid, offset_x){ + if(ttp_active) { + self.onmouseout=function(){ ttp_make_invisable(); }; + if(eventid && ttp_x != -1 && ttp_y != -1){ + ttp_offset_x = offset_x; + ttp_inside = 1; + ttp_timer = setTimeout("ttp_make_req_visable('"+escape(title)+"', '"+eventid+"', '"+ttp_x+"', '"+ttp_y+"')", 750); + } + } +} + +function ttp_make_direct_visable(title, description, x, y){ + + if(ttp_inside==0 + || Math.abs(x - ttp_x) > 200 + || Math.abs(y - ttp_y) > 200) { + clearTimeout(ttp_timer); + ttp_inside = 0; + return false; + } + + ttp_x_start = ttp_x; + ttp_y_start = ttp_y; + ttp_make_visable(title,description); +} + +function ttp(self, title, description, offset_x){ + if(ttp_active) { + self.onmouseout=function(){ ttp_make_invisable(); }; + if(description && ttp_x != -1 && ttp_y != -1){ + ttp_offset_x = offset_x; + ttp_inside = 1; + ttp_timer = setTimeout("ttp_make_direct_visable('"+escape(title)+"', '"+escape(description)+"')", 750); + } + } +} diff --git a/skins/xstyle/javascript/xmenu.js b/skins/xstyle/javascript/xmenu.js new file mode 100644 index 0000000..58f6e83 --- /dev/null +++ b/skins/xstyle/javascript/xmenu.js @@ -0,0 +1,371 @@ +//<script>
/* + * This script was created by Erik Arvidsson (erik@eae.net) + * for WebFX (http://webfx.eae.net) + * Copyright 2001 + * + * For usage see license at http://webfx.eae.net/license.html + * + * Created: 2001-01-12 + * Updates: 2001-11-20 Added hover mode support and removed Opera focus hacks
* 2001-12-20 Added auto positioning and some properties to support this + * 2002-08-13 toString used ' for attributes. Changed to " to allow in args + */
+// check browsers +var ua = navigator.userAgent; +var opera = /opera [56789]|opera\/[56789]/i.test(ua);
var ie = !opera && /MSIE/.test(ua); +var ie50 = ie && /MSIE 5\.[01234]/.test(ua);
var ie6 = ie && /MSIE [6789]/.test(ua); +var ieBox = ie && (document.compatMode == null || document.compatMode != "CSS1Compat"); +var moz = !opera && /gecko/i.test(ua);
var nn6 = !opera && /netscape.*6\./i.test(ua);
// define the default values +webfxMenuDefaultWidth = 100; + +webfxMenuDefaultBorderLeft = 1;
webfxMenuDefaultBorderRight = 1;
webfxMenuDefaultBorderTop = 1;
webfxMenuDefaultBorderBottom = 1;
+webfxMenuDefaultPaddingLeft = 1;
webfxMenuDefaultPaddingRight = 1; +webfxMenuDefaultPaddingTop = 1;
webfxMenuDefaultPaddingBottom = 1; +
webfxMenuDefaultShadowLeft = 0; +webfxMenuDefaultShadowRight = ie && !ie50 && /win32/i.test(navigator.platform) ? 4 :0; +webfxMenuDefaultShadowTop = 0; +webfxMenuDefaultShadowBottom = ie && !ie50 && /win32/i.test(navigator.platform) ? 4 : 0;
+
webfxMenuItemDefaultHeight = 18; +webfxMenuItemDefaultText = "Untitled"; +webfxMenuItemDefaultHref = "javascript:void(0)"; + +webfxMenuSeparatorDefaultHeight = 6; + +webfxMenuDefaultEmptyText = "Empty"; +
webfxMenuDefaultUseAutoPosition = nn6 ? false : true;
+
+// other global constants
+webfxMenuImagePath = ""; + +webfxMenuUseHover = opera ? true : false;
webfxMenuHideTime = 500; +webfxMenuShowTime = 200;
+
+var webFXMenuHandler = { + idCounter : 0, + idPrefix : "webfx-menu-object-",
all : {},
getId : function () { return this.idPrefix + this.idCounter++; }, + overMenuItem : function (oItem) {
if (this.showTimeout != null)
window.clearTimeout(this.showTimeout); + if (this.hideTimeout != null)
window.clearTimeout(this.hideTimeout); + var jsItem = this.all[oItem.id]; + if (webfxMenuShowTime <= 0) + this._over(jsItem); + else
//this.showTimeout = window.setTimeout(function () { webFXMenuHandler._over(jsItem) ; }, webfxMenuShowTime); + // I hate IE5.0 because the piece of shit crashes when using setTimeout with a function object
this.showTimeout = window.setTimeout("webFXMenuHandler._over(webFXMenuHandler.all['" + jsItem.id + "'])", webfxMenuShowTime); + }, + outMenuItem : function (oItem) { + if (this.showTimeout != null)
window.clearTimeout(this.showTimeout); + if (this.hideTimeout != null)
window.clearTimeout(this.hideTimeout); + var jsItem = this.all[oItem.id]; + if (webfxMenuHideTime <= 0) + this._out(jsItem); + else
//this.hideTimeout = window.setTimeout(function () { webFXMenuHandler._out(jsItem) ; }, webfxMenuHideTime); + this.hideTimeout = window.setTimeout("webFXMenuHandler._out(webFXMenuHandler.all['" + jsItem.id + "'])", webfxMenuHideTime);
},
blurMenu : function (oMenuItem) { + window.setTimeout("webFXMenuHandler.all[\"" + oMenuItem.id + "\"].subMenu.hide();", webfxMenuHideTime); + }, + _over : function (jsItem) {
if (jsItem.subMenu) { + jsItem.parentMenu.hideAllSubs();
jsItem.subMenu.show(); + } + else + jsItem.parentMenu.hideAllSubs();
},
_out : function (jsItem) { + // find top most menu + var root = jsItem; + var m;
if (root instanceof WebFXMenuButton)
m = root.subMenu;
else { + m = jsItem.parentMenu; + while (m.parentMenu != null && !(m.parentMenu instanceof WebFXMenuBar))
m = m.parentMenu;
}
if (m != null) + m.hide();
},
hideMenu : function (menu) { + if (this.showTimeout != null)
window.clearTimeout(this.showTimeout); + if (this.hideTimeout != null)
window.clearTimeout(this.hideTimeout); +
this.hideTimeout = window.setTimeout("webFXMenuHandler.all['" + menu.id + "'].hide()", webfxMenuHideTime);
},
showMenu : function (menu, src, dir) {
if (this.showTimeout != null)
window.clearTimeout(this.showTimeout); + if (this.hideTimeout != null)
window.clearTimeout(this.hideTimeout);
+ if (arguments.length < 3)
dir = "vertical"; +
menu.show(src, dir); + } +}; + +function WebFXMenu() { + this._menuItems = []; + this._subMenus = []; + this.id = webFXMenuHandler.getId(); + this.top = 0; + this.left = 0; + this.shown = false;
this.parentMenu = null; + webFXMenuHandler.all[this.id] = this; +} +
WebFXMenu.prototype.width = webfxMenuDefaultWidth; +WebFXMenu.prototype.emptyText = webfxMenuDefaultEmptyText;
WebFXMenu.prototype.useAutoPosition = webfxMenuDefaultUseAutoPosition; +
WebFXMenu.prototype.borderLeft = webfxMenuDefaultBorderLeft; +WebFXMenu.prototype.borderRight = webfxMenuDefaultBorderRight; +WebFXMenu.prototype.borderTop = webfxMenuDefaultBorderTop; +WebFXMenu.prototype.borderBottom = webfxMenuDefaultBorderBottom; +
WebFXMenu.prototype.paddingLeft = webfxMenuDefaultPaddingLeft; +WebFXMenu.prototype.paddingRight = webfxMenuDefaultPaddingRight;
WebFXMenu.prototype.paddingTop = webfxMenuDefaultPaddingTop;
WebFXMenu.prototype.paddingBottom = webfxMenuDefaultPaddingBottom; + +WebFXMenu.prototype.shadowLeft = webfxMenuDefaultShadowLeft; +WebFXMenu.prototype.shadowRight = webfxMenuDefaultShadowRight; +WebFXMenu.prototype.shadowTop = webfxMenuDefaultShadowTop; +WebFXMenu.prototype.shadowBottom = webfxMenuDefaultShadowBottom;
+
+WebFXMenu.prototype.add = function (menuItem) { + this._menuItems[this._menuItems.length] = menuItem; + if (menuItem.subMenu) { + this._subMenus[this._subMenus.length] = menuItem.subMenu; + menuItem.subMenu.parentMenu = this;
} + + menuItem.parentMenu = this; +}; +
WebFXMenu.prototype.show = function (relObj, sDir) { + if (this.useAutoPosition)
this.position(relObj, sDir);
+ var divElement = document.getElementById(this.id); + divElement.style.left = opera ? this.left : this.left + "px"; + divElement.style.top = opera ? this.top : this.top + "px"; + divElement.style.visibility = "visible";
this.shown = true; + if (this.parentMenu) + this.parentMenu.show();
}; +
WebFXMenu.prototype.hide = function () { + this.hideAllSubs(); + var divElement = document.getElementById(this.id); + divElement.style.visibility = "hidden";
this.shown = false; +}; +
WebFXMenu.prototype.hideAllSubs = function () { + for (var i = 0; i < this._subMenus.length; i++) { + if (this._subMenus[i].shown) + this._subMenus[i].hide(); + } +};
+WebFXMenu.prototype.toString = function () { + var top = this.top + this.borderTop + this.paddingTop; + var str = "<div id='" + this.id + "' class='webfx-menu' style='" + + "width:" + (!ieBox ?
this.width - this.borderLeft - this.paddingLeft - this.borderRight - this.paddingRight :
this.width) + "px;" + + (this.useAutoPosition ?
"left:" + this.left + "px;" + "top:" + this.top + "px;" :
"") + + (ie50 ? "filter: none;" : "") + + "'>"; + + if (this._menuItems.length == 0) { + str += "<span class='webfx-menu-empty'>" + this.emptyText + "</span>"; + } + else { + // loop through all menuItems + for (var i = 0; i < this._menuItems.length; i++) { + var mi = this._menuItems[i]; + str += mi;
if (!this.useAutoPosition) { + if (mi.subMenu && !mi.subMenu.useAutoPosition) + mi.subMenu.top = top - mi.subMenu.borderTop - mi.subMenu.paddingTop; + top += mi.height;
} + } + + } + + str += "</div>"; + + for (var i = 0; i < this._subMenus.length; i++) { + this._subMenus[i].left = this.left + this.width - this._subMenus[i].borderLeft; + str += this._subMenus[i]; + } + + return str; +};
// WebFXMenu.prototype.position defined later
+function WebFXMenuItem(sText, sHref, sToolTip, oSubMenu) { + this.text = sText || webfxMenuItemDefaultText; + this.href = (sHref == null || sHref == "") ? webfxMenuItemDefaultHref : sHref; + this.subMenu = oSubMenu; + if (oSubMenu) + oSubMenu.parentMenuItem = this; + this.toolTip = sToolTip; + this.id = webFXMenuHandler.getId(); + webFXMenuHandler.all[this.id] = this; +}; +WebFXMenuItem.prototype.height = webfxMenuItemDefaultHeight; +WebFXMenuItem.prototype.toString = function () { + return "<a" + + " id='" + this.id + "'" + + " href=\"" + this.href + "\"" + + (this.toolTip ? " title=\"" + this.toolTip + "\"" : "") + + " onmouseover='webFXMenuHandler.overMenuItem(this)'" +
(webfxMenuUseHover ? " onmouseout='webFXMenuHandler.outMenuItem(this)'" : "") +
(this.subMenu ? " unselectable='on' tabindex='-1'" : "") + + ">" + + (this.subMenu ? "<img class='arrow' src=\"" + webfxMenuImagePath + "arrow.right.png\">" : "") + + this.text + + "</a>"; +}; + + +function WebFXMenuSeparator() { + this.id = webFXMenuHandler.getId(); + webFXMenuHandler.all[this.id] = this; +}; +WebFXMenuSeparator.prototype.height = webfxMenuSeparatorDefaultHeight; +WebFXMenuSeparator.prototype.toString = function () { + return "<div" + + " id='" + this.id + "'" +
(webfxMenuUseHover ? + " onmouseover='webFXMenuHandler.overMenuItem(this)'" +
" onmouseout='webFXMenuHandler.outMenuItem(this)'" + : + "") +
"></div>" +}; + +function WebFXMenuBar() { + this._parentConstructor = WebFXMenu; + this._parentConstructor(); +} +WebFXMenuBar.prototype = new WebFXMenu; +WebFXMenuBar.prototype.toString = function () { + var str = "<div id='" + this.id + "' class='webfx-menu-bar'>"; + + // loop through all menuButtons + for (var i = 0; i < this._menuItems.length; i++) + str += this._menuItems[i]; + + str += "</div>"; + + for (var i = 0; i < this._subMenus.length; i++) + str += this._subMenus[i]; + + return str; +}; + +function WebFXMenuButton(sText, sHref, sToolTip, oSubMenu) { + this._parentConstructor = WebFXMenuItem; + this._parentConstructor(sText, sHref, sToolTip, oSubMenu); +} +WebFXMenuButton.prototype = new WebFXMenuItem; +WebFXMenuButton.prototype.toString = function () { + return "<a" + + " id='" + this.id + "'" + + " href='" + this.href + "'" + + (this.toolTip ? " title='" + this.toolTip + "'" : "") +
(webfxMenuUseHover ?
(" onmouseover='webFXMenuHandler.overMenuItem(this)'" +
" onmouseout='webFXMenuHandler.outMenuItem(this)'") : + ( + " onfocus='webFXMenuHandler.overMenuItem(this)'" + + (this.subMenu ?
" onblur='webFXMenuHandler.blurMenu(this)'" :
""
) + )) + + ">" + + this.text + + (this.subMenu ? " <img class='arrow' src='" + webfxMenuImagePath + "arrow.down.png' align='absmiddle'>" : "") + + "</a>"; +};
+
+
+/* Position functions */ +
+function getInnerLeft(el) {
+ if (el == null) return 0;
+ if (ieBox && el == document.body || !ieBox && el == document.documentElement) return 0;
+ return getLeft(el) + getBorderLeft(el);
+}
+
+function getLeft(el) {
+ if (el == null) return 0;
+ return el.offsetLeft + getInnerLeft(el.offsetParent);
+}
+
+function getInnerTop(el) {
+ if (el == null) return 0;
+ if (ieBox && el == document.body || !ieBox && el == document.documentElement) return 0;
+ return getTop(el) + getBorderTop(el);
+}
+
+function getTop(el) {
+ if (el == null) return 0;
+ return el.offsetTop + getInnerTop(el.offsetParent);
+}
+
+function getBorderLeft(el) {
+ return ie ?
+ el.clientLeft :
+ parseInt(window.getComputedStyle(el, null).getPropertyValue("border-left-width"));
+}
+
+function getBorderTop(el) {
+ return ie ?
+ el.clientTop :
+ parseInt(window.getComputedStyle(el, null).getPropertyValue("border-top-width"));
+}
+
+function opera_getLeft(el) {
+ if (el == null) return 0;
+ return el.offsetLeft + opera_getLeft(el.offsetParent);
+}
+
+function opera_getTop(el) {
+ if (el == null) return 0;
+ return el.offsetTop + opera_getTop(el.offsetParent);
+}
+
+function getOuterRect(el) {
+ return {
+ left: (opera ? opera_getLeft(el) : getLeft(el)),
+ top: (opera ? opera_getTop(el) : getTop(el)),
+ width: el.offsetWidth,
+ height: el.offsetHeight
+ };
+}
+
+// mozilla bug! scrollbars not included in innerWidth/height
+function getDocumentRect(el) {
+ return {
+ left: 0,
+ top: 0,
+ width: (ie ?
+ (ieBox ? document.body.clientWidth : document.documentElement.clientWidth) :
+ window.innerWidth
+ ),
+ height: (ie ?
+ (ieBox ? document.body.clientHeight : document.documentElement.clientHeight) :
+ window.innerHeight
+ )
+ };
+}
+
+function getScrollPos(el) {
+ return {
+ left: (ie ?
+ (ieBox ? document.body.scrollLeft : document.documentElement.scrollLeft) :
+ window.pageXOffset
+ ),
+ top: (ie ?
+ (ieBox ? document.body.scrollTop : document.documentElement.scrollTop) :
+ window.pageYOffset
+ )
+ };
+}
+
/* end position functions */ +
WebFXMenu.prototype.position = function (relEl, sDir) { + var dir = sDir;
// find parent item rectangle, piRect + var piRect;
if (!relEl) { + var pi = this.parentMenuItem;
if (!this.parentMenuItem)
return; + + relEl = document.getElementById(pi.id);
if (dir == null)
dir = pi instanceof WebFXMenuButton ? "vertical" : "horizontal";
piRect = getOuterRect(relEl); + }
else if (relEl.left != null && relEl.top != null && relEl.width != null && relEl.height != null) { // got a rect
piRect = relEl;
}
else
piRect = getOuterRect(relEl); +
var menuEl = document.getElementById(this.id); + var menuRect = getOuterRect(menuEl); + var docRect = getDocumentRect(); + var scrollPos = getScrollPos();
var pMenu = this.parentMenu; +
if (dir == "vertical") { + if (piRect.left + menuRect.width - scrollPos.left <= docRect.width)
this.left = piRect.left;
else if (docRect.width >= menuRect.width)
this.left = docRect.width + scrollPos.left - menuRect.width;
else
this.left = scrollPos.left;
if (piRect.top + piRect.height + menuRect.height <= docRect.height + scrollPos.top)
+ this.top = piRect.top + piRect.height;
+ else if (piRect.top - menuRect.height >= scrollPos.top)
+ this.top = piRect.top - menuRect.height;
+ else if (docRect.height >= menuRect.height)
+ this.top = docRect.height + scrollPos.top - menuRect.height;
+ else
+ this.top = scrollPos.top;
} + else {
if (piRect.top + menuRect.height - this.borderTop - this.paddingTop <= docRect.height + scrollPos.top)
+ this.top = piRect.top - this.borderTop - this.paddingTop;
+ else if (piRect.top + piRect.height - menuRect.height + this.borderTop + this.paddingTop >= 0)
+ this.top = piRect.top + piRect.height - menuRect.height + this.borderBottom + this.paddingBottom + this.shadowBottom;
+ else if (docRect.height >= menuRect.height)
+ this.top = docRect.height + scrollPos.top - menuRect.height;
+ else
+ this.top = scrollPos.top;
+
+ var pMenuPaddingLeft = pMenu ? pMenu.paddingLeft : 0;
+ var pMenuBorderLeft = pMenu ? pMenu.borderLeft : 0;
+ var pMenuPaddingRight = pMenu ? pMenu.paddingRight : 0;
+ var pMenuBorderRight = pMenu ? pMenu.borderRight : 0;
+
+ if (piRect.left + piRect.width + menuRect.width + pMenuPaddingRight +
+ pMenuBorderRight - this.borderLeft + this.shadowRight <= docRect.width + scrollPos.left)
+ this.left = piRect.left + piRect.width + pMenuPaddingRight + pMenuBorderRight - this.borderLeft;
+ else if (piRect.left - menuRect.width - pMenuPaddingLeft - pMenuBorderLeft + this.borderRight + this.shadowRight >= 0)
+ this.left = piRect.left - menuRect.width - pMenuPaddingLeft - pMenuBorderLeft + this.borderRight + this.shadowRight;
+ else if (docRect.width >= menuRect.width)
+ this.left = docRect.width + scrollPos.left - menuRect.width;
+ else
+ this.left = scrollPos.left; + } +};
\ No newline at end of file diff --git a/skins/xstyle/javascript/xtree.js b/skins/xstyle/javascript/xtree.js new file mode 100644 index 0000000..a6652b0 --- /dev/null +++ b/skins/xstyle/javascript/xtree.js @@ -0,0 +1,541 @@ +/*----------------------------------------------------------------------------\ +| Cross Browser Tree Widget 1.17 | +|-----------------------------------------------------------------------------| +| Created by Emil A Eklund | +| (http://webfx.eae.net/contact.html#emil) | +| For WebFX (http://webfx.eae.net/) | +|-----------------------------------------------------------------------------| +| An object based tree widget, emulating the one found in microsoft windows, | +| with persistence using cookies. Works in IE 5+, Mozilla and konqueror 3. | +|-----------------------------------------------------------------------------| +| Copyright (c) 1999 - 2002 Emil A Eklund | +|-----------------------------------------------------------------------------| +| This software is provided "as is", without warranty of any kind, express or | +| implied, including but not limited to the warranties of merchantability, | +| fitness for a particular purpose and noninfringement. In no event shall the | +| authors or copyright holders be liable for any claim, damages or other | +| liability, whether in an action of contract, tort or otherwise, arising | +| from, out of or in connection with the software or the use or other | +| dealings in the software. | +| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | +| This software is available under the three different licenses mentioned | +| below. To use this software you must chose, and qualify, for one of those. | +| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | +| The WebFX Non-Commercial License http://webfx.eae.net/license.html | +| Permits anyone the right to use the software in a non-commercial context | +| free of charge. | +| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | +| The WebFX Commercial license http://webfx.eae.net/commercial.html | +| Permits the license holder the right to use the software in a commercial | +| context. Such license must be specifically obtained, however it's valid for | +| any number of implementations of the licensed software. | +| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | +| GPL - The GNU General Public License http://www.gnu.org/licenses/gpl.txt | +| Permits anyone the right to use and modify the software without limitations | +| as long as proper credits are given and the original and modified source | +| code are included. Requires that the final product, software derivate from | +| the original source or any software utilizing a GPL component, such as | +| this, is also licensed under the GPL license. | +|-----------------------------------------------------------------------------| +| Dependencies: xtree.css (To set up the CSS of the tree classes) | +|-----------------------------------------------------------------------------| +| 2001-01-10 | Original Version Posted. | +| 2001-03-18 | Added getSelected and get/setBehavior that can make it behave | +| | more like windows explorer, check usage for more information. | +| 2001-09-23 | Version 1.1 - New features included keyboard navigation (ie) | +| | and the ability to add and remove nodes dynamically and some | +| | other small tweaks and fixes. | +| 2002-01-27 | Version 1.11 - Bug fixes and improved mozilla support. | +| 2002-06-11 | Version 1.12 - Fixed a bug that prevented the indentation line | +| | from updating correctly under some circumstances. This bug | +| | happened when removing the last item in a subtree and items in | +| | siblings to the remove subtree where not correctly updated. | +| 2002-06-13 | Fixed a few minor bugs cased by the 1.12 bug-fix. | +| 2002-08-20 | Added usePersistence flag to allow disable of cookies. | +| 2002-10-23 | (1.14) Fixed a plus icon issue | +| 2002-10-29 | (1.15) Last changes broke more than they fixed. This version | +| | is based on 1.13 and fixes the bugs 1.14 fixed withou breaking | +| | lots of other things. | +| 2003-02-15 | The selected node can now be made visible even when the tree | +| | control loses focus. It uses a new class declaration in the | +| | css file '.webfx-tree-item a.selected-inactive', by default it | +| | puts a light-gray rectangle around the selected node. | +| 2003-03-16 | Adding target support after lots of lobbying... | +|-----------------------------------------------------------------------------| +| Created 2000-12-11 | All changes are in the log above. | Updated 2003-03-16 | +\----------------------------------------------------------------------------*/ + +var webFXTreeConfig = { + rootIcon : 'images/foldericon.png', + openRootIcon : 'images/openfoldericon.png', + folderIcon : 'images/foldericon.png', + openFolderIcon : 'images/openfoldericon.png', + fileIcon : 'images/file.png', + iIcon : 'images/I.png', + lIcon : 'images/L.png', + lMinusIcon : 'images/Lminus.png', + lPlusIcon : 'images/Lplus.png', + tIcon : 'images/T.png', + tMinusIcon : 'images/Tminus.png', + tPlusIcon : 'images/Tplus.png', + blankIcon : 'images/trans.gif', + defaultText : 'Tree Item', + defaultAction : 'javascript:void(0);', + defaultBehavior : 'classic', + usePersistence : true +}; + +var webFXTreeHandler = { + idCounter : 0, + idPrefix : "webfx-tree-object-", + all : {}, + behavior : null, + selected : null, + onSelect : null, /* should be part of tree, not handler */ + getId : function() { return this.idPrefix + this.idCounter++; }, + toggle : function (oItem) { this.all[oItem.id.replace('-plus','')].toggle(); }, + select : function (oItem) { this.all[oItem.id.replace('-icon','')].select(); }, + focus : function (oItem) { this.all[oItem.id.replace('-anchor','')].focus(); }, + blur : function (oItem) { this.all[oItem.id.replace('-anchor','')].blur(); }, + keydown : function (oItem, e) { return this.all[oItem.id].keydown(e.keyCode); }, + cookies : new WebFXCookie(), + insertHTMLBeforeEnd : function (oElement, sHTML) { + if (oElement.insertAdjacentHTML != null) { + oElement.insertAdjacentHTML("BeforeEnd", sHTML) + return; + } + var df; // DocumentFragment + var r = oElement.ownerDocument.createRange(); + r.selectNodeContents(oElement); + r.collapse(false); + df = r.createContextualFragment(sHTML); + oElement.appendChild(df); + } +}; + +/* + * WebFXCookie class + */ + +function WebFXCookie() { + if (document.cookie.length) { this.cookies = ' ' + document.cookie; } +} + +WebFXCookie.prototype.setCookie = function (key, value) { + document.cookie = key + "=" + escape(value); +} + +WebFXCookie.prototype.getCookie = function (key) { + if (this.cookies) { + var start = this.cookies.indexOf(' ' + key + '='); + if (start == -1) { return null; } + var end = this.cookies.indexOf(";", start); + if (end == -1) { end = this.cookies.length; } + end -= start; + var cookie = this.cookies.substr(start,end); + return unescape(cookie.substr(cookie.indexOf('=') + 1, cookie.length - cookie.indexOf('=') + 1)); + } + else { return null; } +} + +/* + * WebFXTreeAbstractNode class + */ + +function WebFXTreeAbstractNode(sText, sAction) { + this.childNodes = []; + this.id = webFXTreeHandler.getId(); + this.text = sText || webFXTreeConfig.defaultText; + this.action = sAction || webFXTreeConfig.defaultAction; + this._last = false; + webFXTreeHandler.all[this.id] = this; +} + +/* + * To speed thing up if you're adding multiple nodes at once (after load) + * use the bNoIdent parameter to prevent automatic re-indentation and call + * the obj.ident() method manually once all nodes has been added. + */ + +WebFXTreeAbstractNode.prototype.add = function (node, bNoIdent) { + node.parentNode = this; + this.childNodes[this.childNodes.length] = node; + var root = this; + if (this.childNodes.length >= 2) { + this.childNodes[this.childNodes.length - 2]._last = false; + } + while (root.parentNode) { root = root.parentNode; } + if (root.rendered) { + if (this.childNodes.length >= 2) { + document.getElementById(this.childNodes[this.childNodes.length - 2].id + '-plus').src = ((this.childNodes[this.childNodes.length -2].folder)?((this.childNodes[this.childNodes.length -2].open)?webFXTreeConfig.tMinusIcon:webFXTreeConfig.tPlusIcon):webFXTreeConfig.tIcon); + this.childNodes[this.childNodes.length - 2].plusIcon = webFXTreeConfig.tPlusIcon; + this.childNodes[this.childNodes.length - 2].minusIcon = webFXTreeConfig.tMinusIcon; + this.childNodes[this.childNodes.length - 2]._last = false; + } + this._last = true; + var foo = this; + while (foo.parentNode) { + for (var i = 0; i < foo.parentNode.childNodes.length; i++) { + if (foo.id == foo.parentNode.childNodes[i].id) { break; } + } + if (i == foo.parentNode.childNodes.length - 1) { foo.parentNode._last = true; } + else { foo.parentNode._last = false; } + foo = foo.parentNode; + } + webFXTreeHandler.insertHTMLBeforeEnd(document.getElementById(this.id + '-cont'), node.toString()); + if ((!this.folder) && (!this.openIcon)) { + this.icon = webFXTreeConfig.folderIcon; + this.openIcon = webFXTreeConfig.openFolderIcon; + } + if (!this.folder) { this.folder = true; this.collapse(true); } + if (!bNoIdent) { this.indent(); } + } + return node; +} + +WebFXTreeAbstractNode.prototype.toggle = function() { + if (this.folder) { + if (this.open) { this.collapse(); } + else { this.expand(); } +} } + +WebFXTreeAbstractNode.prototype.select = function() { + document.getElementById(this.id + '-anchor').focus(); +} + +WebFXTreeAbstractNode.prototype.deSelect = function() { + document.getElementById(this.id + '-anchor').className = ''; + webFXTreeHandler.selected = null; +} + +WebFXTreeAbstractNode.prototype.focus = function() { + if ((webFXTreeHandler.selected) && (webFXTreeHandler.selected != this)) { webFXTreeHandler.selected.deSelect(); } + webFXTreeHandler.selected = this; + if ((this.openIcon) && (webFXTreeHandler.behavior != 'classic')) { document.getElementById(this.id + '-icon').src = this.openIcon; } + document.getElementById(this.id + '-anchor').className = 'selected'; + document.getElementById(this.id + '-anchor').focus(); + if (webFXTreeHandler.onSelect) { webFXTreeHandler.onSelect(this); } +} + +WebFXTreeAbstractNode.prototype.blur = function() { + if ((this.openIcon) && (webFXTreeHandler.behavior != 'classic')) { document.getElementById(this.id + '-icon').src = this.icon; } + document.getElementById(this.id + '-anchor').className = 'selected-inactive'; +} + +WebFXTreeAbstractNode.prototype.doExpand = function() { + if (webFXTreeHandler.behavior == 'classic') { document.getElementById(this.id + '-icon').src = this.openIcon; } + if (this.childNodes.length) { document.getElementById(this.id + '-cont').style.display = 'block'; } + this.open = true; + if (webFXTreeConfig.usePersistence) { + webFXTreeHandler.cookies.setCookie(this.id.substr(18,this.id.length - 18), '1'); +} } + +WebFXTreeAbstractNode.prototype.doCollapse = function() { + if (webFXTreeHandler.behavior == 'classic') { document.getElementById(this.id + '-icon').src = this.icon; } + if (this.childNodes.length) { document.getElementById(this.id + '-cont').style.display = 'none'; } + this.open = false; + if (webFXTreeConfig.usePersistence) { + webFXTreeHandler.cookies.setCookie(this.id.substr(18,this.id.length - 18), '0'); +} } + +WebFXTreeAbstractNode.prototype.expandAll = function() { + this.expandChildren(); + if ((this.folder) && (!this.open)) { this.expand(); } +} + +WebFXTreeAbstractNode.prototype.expandChildren = function() { + for (var i = 0; i < this.childNodes.length; i++) { + this.childNodes[i].expandAll(); +} } + +WebFXTreeAbstractNode.prototype.collapseAll = function() { + this.collapseChildren(); + if ((this.folder) && (this.open)) { this.collapse(true); } +} + +WebFXTreeAbstractNode.prototype.collapseChildren = function() { + for (var i = 0; i < this.childNodes.length; i++) { + this.childNodes[i].collapseAll(); +} } + +WebFXTreeAbstractNode.prototype.indent = function(lvl, del, last, level, nodesLeft) { + /* + * Since we only want to modify items one level below ourself, + * and since the rightmost indentation position is occupied by + * the plus icon we set this to -2 + */ + if (lvl == null) { lvl = -2; } + var state = 0; + for (var i = this.childNodes.length - 1; i >= 0 ; i--) { + state = this.childNodes[i].indent(lvl + 1, del, last, level); + if (state) { return; } + } + if (del) { + if ((level >= this._level) && (document.getElementById(this.id + '-plus'))) { + if (this.folder) { + document.getElementById(this.id + '-plus').src = (this.open)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.lPlusIcon; + this.plusIcon = webFXTreeConfig.lPlusIcon; + this.minusIcon = webFXTreeConfig.lMinusIcon; + } + else if (nodesLeft) { document.getElementById(this.id + '-plus').src = webFXTreeConfig.lIcon; } + return 1; + } } + var foo = document.getElementById(this.id + '-indent-' + lvl); + if (foo) { + if ((foo._last) || ((del) && (last))) { foo.src = webFXTreeConfig.blankIcon; } + else { foo.src = webFXTreeConfig.iIcon; } + } + return 0; +} + +/* + * WebFXTree class + */ + +function WebFXTree(sText, sAction, sBehavior, sIcon, sOpenIcon) { + this.base = WebFXTreeAbstractNode; + this.base(sText, sAction); + this.icon = sIcon || webFXTreeConfig.rootIcon; + this.openIcon = sOpenIcon || webFXTreeConfig.openRootIcon; + /* Defaults to open */ + if (webFXTreeConfig.usePersistence) { + this.open = (webFXTreeHandler.cookies.getCookie(this.id.substr(18,this.id.length - 18)) == '0')?false:true; + } else { this.open = true; } + this.folder = true; + this.rendered = false; + this.onSelect = null; + if (!webFXTreeHandler.behavior) { webFXTreeHandler.behavior = sBehavior || webFXTreeConfig.defaultBehavior; } +} + +WebFXTree.prototype = new WebFXTreeAbstractNode; + +WebFXTree.prototype.setBehavior = function (sBehavior) { + webFXTreeHandler.behavior = sBehavior; +}; + +WebFXTree.prototype.getBehavior = function (sBehavior) { + return webFXTreeHandler.behavior; +}; + +WebFXTree.prototype.getSelected = function() { + if (webFXTreeHandler.selected) { return webFXTreeHandler.selected; } + else { return null; } +} + +WebFXTree.prototype.remove = function() { } + +WebFXTree.prototype.expand = function() { + this.doExpand(); +} + +WebFXTree.prototype.collapse = function(b) { + if (!b) { this.focus(); } + this.doCollapse(); +} + +WebFXTree.prototype.getFirst = function() { + return null; +} + +WebFXTree.prototype.getLast = function() { + return null; +} + +WebFXTree.prototype.getNextSibling = function() { + return null; +} + +WebFXTree.prototype.getPreviousSibling = function() { + return null; +} + +WebFXTree.prototype.keydown = function(key) { + if (key == 39) { + if (!this.open) { this.expand(); } + else if (this.childNodes.length) { this.childNodes[0].select(); } + return false; + } + if (key == 37) { this.collapse(); return false; } + if ((key == 40) && (this.open) && (this.childNodes.length)) { this.childNodes[0].select(); return false; } + return true; +} + +WebFXTree.prototype.toString = function() { + var str = "<div id=\"" + this.id + "\" ondblclick=\"webFXTreeHandler.toggle(this);\" class=\"webfx-tree-item\" onkeydown=\"return webFXTreeHandler.keydown(this, event)\">" + + "<img id=\"" + this.id + "-icon\" class=\"webfx-tree-icon\" src=\"" + ((webFXTreeHandler.behavior == 'classic' && this.open)?this.openIcon:this.icon) + "\" onclick=\"webFXTreeHandler.select(this);\">" + + "<a href=\"" + this.action + "\" id=\"" + this.id + "-anchor\" onfocus=\"webFXTreeHandler.focus(this);\" onblur=\"webFXTreeHandler.blur(this);\"" + + (this.target ? " target=\"" + this.target + "\"" : "") + + ">" + this.text + "</a></div>" + + "<div id=\"" + this.id + "-cont\" class=\"webfx-tree-container\" style=\"display: " + ((this.open)?'block':'none') + ";\">"; + var sb = []; + for (var i = 0; i < this.childNodes.length; i++) { + sb[i] = this.childNodes[i].toString(i, this.childNodes.length); + } + this.rendered = true; + return str + sb.join("") + "</div>"; +}; + +/* + * WebFXTreeItem class + */ + +function WebFXTreeItem(sText, sAction, eParent, sIcon, sOpenIcon) { + this.base = WebFXTreeAbstractNode; + this.base(sText, sAction); + /* Defaults to close */ + if (webFXTreeConfig.usePersistence) { + this.open = (webFXTreeHandler.cookies.getCookie(this.id.substr(18,this.id.length - 18)) == '1')?true:false; + } else { this.open = false; } + if (sIcon) { this.icon = sIcon; } + if (sOpenIcon) { this.openIcon = sOpenIcon; } + if (eParent) { eParent.add(this); } +} + +WebFXTreeItem.prototype = new WebFXTreeAbstractNode; + +WebFXTreeItem.prototype.remove = function() { + var iconSrc = document.getElementById(this.id + '-plus').src; + var parentNode = this.parentNode; + var prevSibling = this.getPreviousSibling(true); + var nextSibling = this.getNextSibling(true); + var folder = this.parentNode.folder; + var last = ((nextSibling) && (nextSibling.parentNode) && (nextSibling.parentNode.id == parentNode.id))?false:true; + this.getPreviousSibling().focus(); + this._remove(); + if (parentNode.childNodes.length == 0) { + document.getElementById(parentNode.id + '-cont').style.display = 'none'; + parentNode.doCollapse(); + parentNode.folder = false; + parentNode.open = false; + } + if (!nextSibling || last) { parentNode.indent(null, true, last, this._level, parentNode.childNodes.length); } + if ((prevSibling == parentNode) && !(parentNode.childNodes.length)) { + prevSibling.folder = false; + prevSibling.open = false; + iconSrc = document.getElementById(prevSibling.id + '-plus').src; + iconSrc = iconSrc.replace('minus', '').replace('plus', ''); + document.getElementById(prevSibling.id + '-plus').src = iconSrc; + document.getElementById(prevSibling.id + '-icon').src = webFXTreeConfig.fileIcon; + } + if (document.getElementById(prevSibling.id + '-plus')) { + if (parentNode == prevSibling.parentNode) { + iconSrc = iconSrc.replace('minus', '').replace('plus', ''); + document.getElementById(prevSibling.id + '-plus').src = iconSrc; +} } } + +WebFXTreeItem.prototype._remove = function() { + for (var i = this.childNodes.length - 1; i >= 0; i--) { + this.childNodes[i]._remove(); + } + for (var i = 0; i < this.parentNode.childNodes.length; i++) { + if (this == this.parentNode.childNodes[i]) { + for (var j = i; j < this.parentNode.childNodes.length; j++) { + this.parentNode.childNodes[j] = this.parentNode.childNodes[j+1]; + } + this.parentNode.childNodes.length -= 1; + if (i + 1 == this.parentNode.childNodes.length) { this.parentNode._last = true; } + break; + } } + webFXTreeHandler.all[this.id] = null; + var tmp = document.getElementById(this.id); + if (tmp) { tmp.parentNode.removeChild(tmp); } + tmp = document.getElementById(this.id + '-cont'); + if (tmp) { tmp.parentNode.removeChild(tmp); } +} + +WebFXTreeItem.prototype.expand = function() { + this.doExpand(); + document.getElementById(this.id + '-plus').src = this.minusIcon; +} + +WebFXTreeItem.prototype.collapse = function(b) { + if (!b) { this.focus(); } + this.doCollapse(); + document.getElementById(this.id + '-plus').src = this.plusIcon; +} + +WebFXTreeItem.prototype.getFirst = function() { + return this.childNodes[0]; +} + +WebFXTreeItem.prototype.getLast = function() { + if (this.childNodes[this.childNodes.length - 1].open) { return this.childNodes[this.childNodes.length - 1].getLast(); } + else { return this.childNodes[this.childNodes.length - 1]; } +} + +WebFXTreeItem.prototype.getNextSibling = function() { + for (var i = 0; i < this.parentNode.childNodes.length; i++) { + if (this == this.parentNode.childNodes[i]) { break; } + } + if (++i == this.parentNode.childNodes.length) { return this.parentNode.getNextSibling(); } + else { return this.parentNode.childNodes[i]; } +} + +WebFXTreeItem.prototype.getPreviousSibling = function(b) { + for (var i = 0; i < this.parentNode.childNodes.length; i++) { + if (this == this.parentNode.childNodes[i]) { break; } + } + if (i == 0) { return this.parentNode; } + else { + if ((this.parentNode.childNodes[--i].open) || (b && this.parentNode.childNodes[i].folder)) { return this.parentNode.childNodes[i].getLast(); } + else { return this.parentNode.childNodes[i]; } +} } + +WebFXTreeItem.prototype.keydown = function(key) { + if ((key == 39) && (this.folder)) { + if (!this.open) { this.expand(); } + else { this.getFirst().select(); } + return false; + } + else if (key == 37) { + if (this.open) { this.collapse(); } + else { this.parentNode.select(); } + return false; + } + else if (key == 40) { + if (this.open) { this.getFirst().select(); } + else { + var sib = this.getNextSibling(); + if (sib) { sib.select(); } + } + return false; + } + else if (key == 38) { this.getPreviousSibling().select(); return false; } + return true; +} + +WebFXTreeItem.prototype.toString = function (nItem, nItemCount) { + var foo = this.parentNode; + var indent = ''; + if (nItem + 1 == nItemCount) { this.parentNode._last = true; } + var i = 0; + while (foo.parentNode) { + foo = foo.parentNode; + indent = "<img id=\"" + this.id + "-indent-" + i + "\" src=\"" + ((foo._last)?webFXTreeConfig.blankIcon:webFXTreeConfig.iIcon) + "\">" + indent; + i++; + } + this._level = i; + if (this.childNodes.length) { this.folder = 1; } + else { this.open = false; } + if ((this.folder) || (webFXTreeHandler.behavior != 'classic')) { + if (!this.icon) { this.icon = webFXTreeConfig.folderIcon; } + if (!this.openIcon) { this.openIcon = webFXTreeConfig.openFolderIcon; } + } + else if (!this.icon) { this.icon = webFXTreeConfig.fileIcon; } + var label = this.text.replace(/</g, '<').replace(/>/g, '>'); + var str = "<div id=\"" + this.id + "\" ondblclick=\"webFXTreeHandler.toggle(this);\" class=\"webfx-tree-item\" onkeydown=\"return webFXTreeHandler.keydown(this, event)\">" + + indent + + "<img id=\"" + this.id + "-plus\" src=\"" + ((this.folder)?((this.open)?((this.parentNode._last)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.tMinusIcon):((this.parentNode._last)?webFXTreeConfig.lPlusIcon:webFXTreeConfig.tPlusIcon)):((this.parentNode._last)?webFXTreeConfig.lIcon:webFXTreeConfig.tIcon)) + "\" onclick=\"webFXTreeHandler.toggle(this);\">" + + "<img id=\"" + this.id + "-icon\" class=\"webfx-tree-icon\" src=\"" + ((webFXTreeHandler.behavior == 'classic' && this.open)?this.openIcon:this.icon) + "\" onclick=\"webFXTreeHandler.select(this);\">" + + "<a href=\"" + this.action + "\" id=\"" + this.id + "-anchor\" onfocus=\"webFXTreeHandler.focus(this);\" onblur=\"webFXTreeHandler.blur(this);\"" + + (this.target ? " target=\"" + this.target + "\"" : "") + + ">" + label + "</a></div>" + + "<div id=\"" + this.id + "-cont\" class=\"webfx-tree-container\" style=\"display: " + ((this.open)?'block':'none') + ";\">"; + var sb = []; + for (var i = 0; i < this.childNodes.length; i++) { + sb[i] = this.childNodes[i].toString(i,this.childNodes.length); + } + this.plusIcon = ((this.parentNode._last)?webFXTreeConfig.lPlusIcon:webFXTreeConfig.tPlusIcon); + this.minusIcon = ((this.parentNode._last)?webFXTreeConfig.lMinusIcon:webFXTreeConfig.tMinusIcon); + return str + sb.join("") + "</div>"; +} |
