Implemented password reset (albeit hackishly) into the new login API; added dummy window.console object to hopefully reduce errors when Firebug isn't around; fixed the longstanding ACL dismiss/close button bug; fixed a couple undefined variables in mailer; fixed PHP error on attempted opening of /dev/(u)random in rijndael.php; clarified documentation for PageProcessor::update_page(); fixed some logic problems in theme ACL code; disabled CAPTCHA debug
/* * The jBox menu system. Written by Dan Fuhry and licensed under the GPL. */// Cache of DOM and event objects, used in setTimeout() calls due to scope rulesvar jBoxObjCache = new Object();// Cache of "correct" heights for unordered list objects used in submenus. Helps the animation routine know what height it's aiming for.var jBoxMenuHeights = new Object();// Blocks animations from running if there's already an animation going on the same objectvar jBoxSlideBlocker = new Object();// Switch to enable or disable jBox slide animationvar jBox_slide_enable = true;// Speed at which the menus should slide open. 1 to 100 or -1 to disable.// Setting this higher than 100 will cause an infinite loop in the browser.// Default is 80 - anything higher than 90 means exponential speed increasevar slide_speed = 80;// Inertia value to start with// Default is 0var inertia_base = 0;// Value added to inertia_base on each frame - generally 1 to 3 is good, with 1 being slowest animation// Default is 1var inertia_inc = 1;// Opacity that menus should fade to. 1 to 100 or -1 to disable fades. This only works if the slide effect is also enabled.// Default is 100var jBox_opacity = 100;// Adds the jBox CSS to the HTML header. Called on window onload.var jBoxInit = function(){ setTimeout('jBoxBatchSetup();', 200);}// Initializes each menu.function jBoxBatchSetup(){ if ( KILL_SWITCH ) return false; var menus = document.getElementsByClassName('div', 'menu_nojs'); if ( menus.length > 0 ) { for ( var i in menus ) { if ( typeof(menus[i]) != 'object') continue; // toJSONString() compatibility jBoxSetup(menus[i]); } }}// Initializes a div with a jBox menu in it.function jBoxSetup(obj){ $dynano(obj).addClass('menu'); removeTextNodes(obj); for ( var i = 0; i < obj.childNodes.length; i++ ) { /* normally this would be done in about 2 lines of code, but javascript is so picky..... */ if ( obj.childNodes[i] ) { if ( obj.childNodes[i].tagName ) { if ( obj.childNodes[i].tagName == 'A' ) { // if ( is_Safari ) alert('It\'s an A: '+obj); if ( obj.childNodes[i].nextSibling ) { // alert("Next sibling: " + obj.childNodes[i].nextSibling); if ( obj.childNodes[i].nextSibling.tagName ) { if ( obj.childNodes[i].nextSibling.tagName == 'UL' || ( obj.childNodes[i].nextSibling.tagName.toLowerCase() == 'div' && obj.childNodes[i].nextSibling.className == 'submenu' ) ) { // Calculate height var ul = obj.childNodes[i].nextSibling; domObjChangeOpac(0, ul); ul.style.display = 'block'; var dim = fetch_dimensions(ul); if ( !ul.id ) ul.id = 'jBoxmenuobj_' + Math.floor(Math.random() * 10000000); jBoxMenuHeights[ul.id] = parseInt(dim['h']) - 2; // subtract 2px for border width ul.style.display = 'none'; domObjChangeOpac(100, ul); // Setup events obj.childNodes[i].onmouseover = function() { jBoxOverHandler(this); }; obj.childNodes[i].onmouseout = function(e) { jBoxOutHandler(this, e); }; obj.childNodes[i].nextSibling.onmouseout = function(e) { jBoxOutHandler(this, e); }; } } } } } } }}// Called when user hovers mouse over a submenufunction jBoxOverHandler(obj){ // if ( is_Safari ) // alert('Safari and over'); // Random ID used to track the object to perform on var seed = Math.floor(Math.random() * 1000000); jBoxObjCache[seed] = obj; // Sleep for a (little more than a tenth of a) second to see if the user really wants the menu to expand setTimeout('if(isOverObj(jBoxObjCache['+seed+'], false, false)) jBoxOverHandlerBin(jBoxObjCache['+seed+']);', 150);}// Displays a menu.function jBoxOverHandlerBin(obj){ var others = obj.parentNode.getElementsByTagName('ul'); for ( var i in others ) { if(typeof(others[i]) == 'object') { others[i].style.display = 'none'; $dynano(others[i].previousSibling).rmClass('liteselected'); } } var others = obj.parentNode.getElementsByTagName('div'); for ( var i in others ) { if(typeof(others[i]) == 'object') { if ( others[i].className == 'submenu' ) { others[i].style.display = 'none'; $dynano(others[i].previousSibling).rmClass('liteselected'); } } } if(obj.nextSibling.tagName.toLowerCase() == 'ul' || ( obj.nextSibling.tagName.toLowerCase() == 'div' && obj.nextSibling.className == 'submenu' )) { $dynano(a).addClass('liteselected'); //obj.className = 'liteselected'; var ul = obj.nextSibling; var dim = fetch_dimensions(obj); var off = fetch_offset(obj); var dimh = parseInt(dim['h']); var offtop = parseInt(off['top']); var top = dimh + offtop; left = off['left']; if ( jBox_slide_enable ) { domObjChangeOpac(0, ul); } ul.style.left = left + 'px'; ul.style.top = top + 'px'; ul.style.clip = 'rect(auto,auto,auto,auto)'; ul.style.overflow = 'visible'; ul.style.display = 'block'; if ( jBox_slide_enable ) { slideOut(ul); } else { domObjChangeOpac(100, ul); } }}function jBoxOutHandler(obj, event){ var seed = Math.floor(Math.random() * 1000000); var seed2 = Math.floor(Math.random() * 1000000); jBoxObjCache[seed] = obj; jBoxObjCache[seed2] = event; setTimeout('jBoxOutHandlerBin(jBoxObjCache['+seed+'], jBoxObjCache['+seed2+']);', 750);}function jBoxOutHandlerBin(obj, event){ var caller = obj.tagName.toLowerCase(); if(caller == 'a') { a = obj; ul = obj.nextSibling; } else if(caller == 'ul' || caller == 'div') { a = obj.previousSibling; ul = obj; } else { return false; } if (!isOverObj(a, false, event) && !isOverObj(ul, true, event)) { $dynano(a).rmClass('liteselected'); if ( jBox_slide_enable ) { slideIn(ul); } else { ul.style.display = 'none'; } } return true;}// Slide an element downwards until it is at full height.// First parameter should be a DOM object with style.display = block and opacity = 0.var sliderobj = new Object();function slideOut(obj){ if ( jBoxSlideBlocker[obj.id] ) return false; jBoxSlideBlocker[obj.id] = true; if ( slide_speed == -1 ) { obj.style.display = 'block'; return false; } var currentheight = 0; var targetheight = jBoxMenuHeights[obj.id]; var inertiabase = inertia_base; var inertiainc = inertia_inc; slideStep(obj, 0); domObjChangeOpac(100, obj); obj.style.overflow = 'hidden'; // Don't edit past here var timercnt = 0; var seed = Math.floor(Math.random() * 1000000); sliderobj[seed] = obj; var framecnt = 0; while(true) { framecnt++; timercnt += ( 100 - slide_speed ); inertiabase += inertiainc; currentheight += inertiabase; if ( currentheight > targetheight ) currentheight = targetheight; setTimeout('slideStep(sliderobj['+seed+'], '+currentheight+', '+targetheight+');', timercnt); if ( currentheight >= targetheight ) break; } timercnt = timercnt + ( 100 - slide_speed ); setTimeout('jBoxSlideBlocker[sliderobj['+seed+'].id] = false;', timercnt); var opacstep = jBox_opacity / framecnt; var opac = 0; var timerstep = 0; domObjChangeOpac(0, obj); while(true) { timerstep += ( 100 - slide_speed ); opac += opacstep; setTimeout('domObjChangeOpac('+opac+', sliderobj['+seed+']);', timerstep); if ( opac >= jBox_opacity ) break; }}function slideIn(obj){ if ( obj.style.display != 'block' ) return false; if ( jBoxSlideBlocker[obj.id] ) return false; jBoxSlideBlocker[obj.id] = true; var targetheight = 0; var dim = fetch_dimensions(obj); var currentheight = jBoxMenuHeights[obj.id]; var origheight = currentheight; var inertiabase = inertia_base; var inertiainc = inertia_inc; domObjChangeOpac(100, obj); obj.style.overflow = 'hidden'; // Don't edit past here var timercnt = 0; var seed = Math.floor(Math.random() * 1000000); sliderobj[seed] = obj; var framecnt = 0; for(var j = 0;j<100;j++) // while(true) { framecnt++; timercnt = timercnt + ( 100 - slide_speed ); inertiabase = inertiabase + inertiainc; currentheight = currentheight - inertiabase; if ( currentheight < targetheight ) currentheight = targetheight; setTimeout('slideStep(sliderobj['+seed+'], '+currentheight+');', timercnt); if ( currentheight <= targetheight ) break; } timercnt += ( 100 - slide_speed ); setTimeout('sliderobj['+seed+'].style.display="none";sliderobj['+seed+'].style.height="'+origheight+'px";jBoxSlideBlocker[sliderobj['+seed+'].id] = false;', timercnt); var opacstep = jBox_opacity / framecnt; var opac = jBox_opacity; var timerstep = 0; domObjChangeOpac(100, obj); while(true) { timerstep += ( 100 - slide_speed ); opac -= opacstep; setTimeout('domObjChangeOpac('+opac+', sliderobj['+seed+']);', timerstep); if ( opac <= 0 ) break; }}function slideStep(obj, height, maxheight){ obj.style.height = height + 'px'; //obj.style.clip = 'rect(3px,auto,'+maxheight+'px,auto)'; obj.style.overflow = 'hidden'; //obj.style.clip = 'rect('+height+'px,0px,'+maxheight+'px,auto);';}function isOverObj(obj, bias, event){ var fieldUL = new Object(); var dim = fetch_dimensions(obj); var off = fetch_offset(obj); fieldUL['top'] = off['top']; fieldUL['left'] = off['left']; fieldUL['right'] = off['left'] + dim['w']; fieldUL['bottom'] = off['top'] + dim['h']; var mouseY_local = mouseY + getScrollOffset(); // document.getElementById('debug').innerHTML = '<br />Mouse: x: '+mouseX+', y:' + mouseY + '<br />' + document.getElementById('debug').innerHTML; if(bias) { if ( ( mouseX < fieldUL['left'] + 2 || mouseX > fieldUL['right'] - 5 ) || ( mouseY_local < fieldUL['top'] - 2 || mouseY_local > fieldUL['bottom'] - 2 ) ) { return false; } } else { if ( ( mouseX < fieldUL['left'] || mouseX > fieldUL['right'] ) || ( mouseY_local < fieldUL['top'] || mouseY_local > fieldUL['bottom'] ) ) return false; } return true;}function jBoxGarbageCollection(e){ setMousePos(e); var menus = document.getElementsByClassName('div', 'menu'); if ( menus.length > 0 ) { for ( var i in menus ) { if ( typeof(menus[i]) != 'object') continue; // toJSONString() compatibility var uls = menus[i].getElementsByTagName('ul'); if ( uls.length > 0 ) { for ( var j = 0; j < uls.length; j++ ) { if ( !isOverObj(uls[j], false, e) ) { $dynano(uls[j].previousSibling).rmClass('liteselected'); //uls[j].style.display = 'none'; slideIn(uls[j]); } } } var uls = getElementsByClassName(menus[i], 'divs', 'submenu'); if ( uls.length > 0 ) { for ( var j = 0; j < uls.length; j++ ) { if ( !isOverObj(uls[j], false, e) ) { $dynano(uls[j].previousSibling).rmClass('liteselected'); //uls[j].style.display = 'none'; slideIn(uls[j]); } } } } }}document.onclick = jBoxGarbageCollection;function removeTextNodes(obj){ if(obj) { if(typeof(obj.tagName) != 'string' || ( String(obj) == '[object Text]' && is_Safari ) ) { if ( ( obj.nodeType == 3 && obj.data.match(/^([\s]*)$/ig) ) ) // || ( typeof(obj.innerHTML) == undefined && is_Safari ) ) { obj.parentNode.removeChild(obj); return; } } if(obj.firstChild) { for(var i = 0; i < obj.childNodes.length; i++) { removeTextNodes(obj.childNodes[i]); } } }}var getElementsByClassName = function(parent, type, cls) { if(!type) type = '*'; ret = new Array(); el = parent.getElementsByTagName(type); for ( var i = 0; i < el.length; i++ ) { if ( typeof(el[i]) != 'object') continue; // toJSONString() compatibility if(el[i].className) { if(el[i].className.indexOf(' ') > 0) { classes = el[i].className.split(' '); } else { classes = new Array(); classes.push(el[i].className); } if ( in_array(cls, classes) ) ret.push(el[i]); } } return ret;}document.getElementsByClassName = function(type, cls) { return getElementsByClassName(document, type, cls);}function setMousePos(event){ if(IE) { if(!event) { event = window.event; } clX = event.clientX; if ( document.body ) sL = document.body.scrollLeft; else sL = 0; mouseX = clX + sL; mouseY = event.clientY + ( document.body ? document.body.scrollTop : 0 ); return; } if( typeof(event.clientX) == 'number' ) { mouseX = event.clientX; mouseY = event.clientY; return; } else if( typeof(event.layerX) == 'number' ) { mouseX = event.layerX; mouseY = event.layerY; return; } else if( typeof(event.offsetX) == 'number' ) { mouseX = event.offsetX; mouseY = event.offsetY; return; } else if( typeof(event.screenX) == 'number' ) { mouseX = event.screenX; mouseY = event.screenY; return; } else if( typeof(event.x) == 'number' ) { mouseX = event.x; mouseY = event.y; return; }}document.onmousemove = function(e){ setMousePos(e);};function domObjChangeOpac(opacity, id) { var object = id.style; object.opacity = (opacity / 100); object.MozOpacity = (opacity / 100); object.KhtmlOpacity = (opacity / 100); object.filter = "alpha(opacity=" + opacity + ")";}function getScrollOffset(){ var position; if (self.pageYOffset) { position = self.pageYOffset; } else if (document.documentElement && document.documentElement.scrollTop) { position = document.documentElement.scrollTop; } else if (document.body) { position = document.body.scrollTop; } return position;}