diff options
Diffstat (limited to 'vendors/dokuwiki/lib/scripts/script.js')
-rw-r--r-- | vendors/dokuwiki/lib/scripts/script.js | 561 |
1 files changed, 561 insertions, 0 deletions
diff --git a/vendors/dokuwiki/lib/scripts/script.js b/vendors/dokuwiki/lib/scripts/script.js new file mode 100644 index 000000000..491794f13 --- /dev/null +++ b/vendors/dokuwiki/lib/scripts/script.js @@ -0,0 +1,561 @@ +/** + * Some of these scripts were taken from wikipedia.org and were modified for DokuWiki + */ + +/** + * Some browser detection + */ +var clientPC = navigator.userAgent.toLowerCase(); // Get client info +var is_macos = navigator.appVersion.indexOf('Mac') != -1; +var is_gecko = ((clientPC.indexOf('gecko')!=-1) && (clientPC.indexOf('spoofer')==-1) && + (clientPC.indexOf('khtml') == -1) && (clientPC.indexOf('netscape/7.0')==-1)); +var is_safari = ((clientPC.indexOf('AppleWebKit')!=-1) && (clientPC.indexOf('spoofer')==-1)); +var is_khtml = (navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled )); +if (clientPC.indexOf('opera')!=-1) { + var is_opera = true; + var is_opera_preseven = (window.opera && !document.childNodes); + var is_opera_seven = (window.opera && document.childNodes); +} + +/** + * Handy shortcut to document.getElementById + * + * This function was taken from the prototype library + * + * @link http://prototype.conio.net/ + */ +function DOKUid() { + var elements = new Array(); + + for (var i = 0; i < arguments.length; i++) { + var element = arguments[i]; + if (typeof element == 'string') + element = document.getElementById(element); + + if (arguments.length == 1) + return element; + + elements.push(element); + } + + return elements; +} + +/** + * Simple function to check if a global var is defined + * + * @author Kae Verens + * @link http://verens.com/archives/2005/07/25/isset-for-javascript/#comment-2835 + */ +function isset(varname){ + return(typeof(window[varname])!='undefined'); +} + +/** + * Select elements by their class name + * + * @author Dustin Diaz <dustin [at] dustindiaz [dot] com> + * @link http://www.dustindiaz.com/getelementsbyclass/ + */ +function getElementsByClass(searchClass,node,tag) { + var classElements = new Array(); + if ( node == null ) + node = document; + if ( tag == null ) + tag = '*'; + var els = node.getElementsByTagName(tag); + var elsLen = els.length; + var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)"); + for (var i = 0, j = 0; i < elsLen; i++) { + if ( pattern.test(els[i].className) ) { + classElements[j] = els[i]; + j++; + } + } + return classElements; +} + +/** + * Get the X offset of the top left corner of the given object + * + * @link http://www.quirksmode.org/index.html?/js/findpos.html + */ +function findPosX(object){ + var curleft = 0; + var obj = DOKUid(object); + if (obj.offsetParent){ + while (obj.offsetParent){ + curleft += obj.offsetLeft; + obj = obj.offsetParent; + } + } + else if (obj.x){ + curleft += obj.x; + } + return curleft; +} //end findPosX function + +/** + * Get the Y offset of the top left corner of the given object + * + * @link http://www.quirksmode.org/index.html?/js/findpos.html + */ +function findPosY(object){ + var curtop = 0; + var obj = DOKUid(object); + if (obj.offsetParent){ + while (obj.offsetParent){ + curtop += obj.offsetTop; + obj = obj.offsetParent; + } + } + else if (obj.y){ + curtop += obj.y; + } + return curtop; +} //end findPosY function + +/** + * Escape special chars in JavaScript + * + * @author Andreas Gohr <andi@splitbrain.org> + */ +function jsEscape(text){ + var re=new RegExp("\\\\","g"); + text=text.replace(re,"\\\\"); + re=new RegExp("'","g"); + text=text.replace(re,"\\'"); + re=new RegExp('"',"g"); + text=text.replace(re,'"'); + re=new RegExp("\\\\\\\\n","g"); + text=text.replace(re,"\\n"); + return text; +} + +/** + * This function escapes some special chars + * @deprecated by above function + */ +function escapeQuotes(text) { + var re=new RegExp("'","g"); + text=text.replace(re,"\\'"); + re=new RegExp('"',"g"); + text=text.replace(re,'"'); + re=new RegExp("\\n","g"); + text=text.replace(re,"\\n"); + return text; +} + +/** + * Adds a node as the first childenode to the given parent + * + * @see appendChild() + */ +function prependChild(parent,element) { + if(!parent.firstChild){ + parent.appendChild(element); + }else{ + parent.insertBefore(element,parent.firstChild); + } +} + +/** + * Prints a animated gif to show the search is performed + * + * Because we need to modify the DOM here before the document is loaded + * and parsed completely we have to rely on document.write() + * + * @author Andreas Gohr <andi@splitbrain.org> + */ +function showLoadBar(){ + + document.write('<img src="'+DOKU_MEDIA+'lib/images/loading.gif" '+ + 'width="150" height="12" alt="..." />'); + + /* this does not work reliable in IE + obj = DOKUid(id); + + if(obj){ + obj.innerHTML = '<img src="'+DOKU_BASE+'lib/images/loading.gif" '+ + 'width="150" height="12" alt="..." />'; + obj.style.display="block"; + } + */ +} + +/** + * Disables the animated gif to show the search is done + * + * @author Andreas Gohr <andi@splitbrain.org> + */ +function hideLoadBar(id){ + obj = DOKUid(id); + if(obj) obj.style.display="none"; +} + +/** + * Adds the toggle switch to the TOC + */ +function addTocToggle() { + if(!document.getElementById) return; + var header = DOKUid('toc__header'); + if(!header) return; + var toc = DOKUid('toc__inside'); + + var obj = document.createElement('span'); + obj.id = 'toc__toggle'; + obj.style.cursor = 'pointer'; + if (toc && toc.style.display == 'none') { + obj.innerHTML = '<span>+</span>'; + obj.className = 'toc_open'; + } else { + obj.innerHTML = '<span>−</span>'; + obj.className = 'toc_close'; + } + + prependChild(header,obj); + obj.parentNode.onclick = toggleToc; + try { + obj.parentNode.style.cursor = 'pointer'; + obj.parentNode.style.cursor = 'hand'; + }catch(e){} +} + +/** + * This toggles the visibility of the Table of Contents + */ +function toggleToc() { + var toc = DOKUid('toc__inside'); + var obj = DOKUid('toc__toggle'); + if(toc.style.display == 'none') { + toc.style.display = ''; + obj.innerHTML = '<span>−</span>'; + obj.className = 'toc_close'; + } else { + toc.style.display = 'none'; + obj.innerHTML = '<span>+</span>'; + obj.className = 'toc_open'; + } +} + +/** + * Display an insitu footnote popup + * + * @author Andreas Gohr <andi@splitbrain.org> + * @author Chris Smith <chris@jalakai.co.uk> + */ +function footnote(e){ + var obj = e.target; + var id = obj.id.substr(5); + + // get or create the footnote popup div + var fndiv = DOKUid('insitu__fn'); + if(!fndiv){ + fndiv = document.createElement('div'); + fndiv.id = 'insitu__fn'; + fndiv.className = 'insitu-footnote JSpopup dokuwiki'; + + // autoclose on mouseout - ignoring bubbled up events + addEvent(fndiv,'mouseout',function(e){ + if(e.target != fndiv){ + e.stopPropagation(); + return; + } + // check if the element was really left + if(e.pageX){ // Mozilla + var bx1 = findPosX(fndiv); + var bx2 = bx1 + fndiv.offsetWidth; + var by1 = findPosY(fndiv); + var by2 = by1 + fndiv.offsetHeight; + var x = e.pageX; + var y = e.pageY; + if(x > bx1 && x < bx2 && y > by1 && y < by2){ + // we're still inside boundaries + e.stopPropagation(); + return; + } + }else{ // IE + if(e.offsetX > 0 && e.offsetX < fndiv.offsetWidth-1 && + e.offsetY > 0 && e.offsetY < fndiv.offsetHeight-1){ + // we're still inside boundaries + e.stopPropagation(); + return; + } + } + // okay, hide it + fndiv.style.display='none'; + }); + document.body.appendChild(fndiv); + } + + // locate the footnote anchor element + var a = DOKUid( "fn__"+id ); + if (!a){ return; } + + // anchor parent is the footnote container, get its innerHTML + var content = new String (a.parentNode.parentNode.innerHTML); + + // strip the leading content anchors and their comma separators + content = content.replace(/<sup>.*<\/sup>/gi, ''); + content = content.replace(/^\s+(,\s+)+/,''); + + // prefix ids on any elements with "insitu__" to ensure they remain unique + content = content.replace(/\bid=\"(.*?)\"/gi,'id="insitu__$1'); + + // now put the content into the wrapper + fndiv.innerHTML = content; + + // position the div and make it visible + var x; var y; + if(e.pageX){ // Mozilla + x = e.pageX; + y = e.pageY; + }else{ // IE + x = e.offsetX; + y = e.offsetY; + } + fndiv.style.position = 'absolute'; + fndiv.style.left = (x+2)+'px'; + fndiv.style.top = (y+2)+'px'; + fndiv.style.display = ''; +} + +/** + * Add the event handlers to footnotes + * + * @author Andreas Gohr <andi@splitbrain.org> + */ +addInitEvent(function(){ + var elems = getElementsByClass('fn_top',null,'a'); + for(var i=0; i<elems.length; i++){ + addEvent(elems[i],'mouseover',function(e){footnote(e);}); + } +}); + +/** + * Add the edit window size controls + */ +function initSizeCtl(ctlid,edid){ + if(!document.getElementById){ return; } + + var ctl = DOKUid(ctlid); + var textarea = DOKUid(edid); + if(!ctl || !textarea) return; + + var hgt = DokuCookie.getValue('sizeCtl'); + if(hgt){ + textarea.style.height = hgt; + }else{ + textarea.style.height = '300px'; + } + + var wrp = DokuCookie.getValue('wrapCtl'); + if(wrp){ + setWrap(textarea, wrp); + } // else use default value + + var l = document.createElement('img'); + var s = document.createElement('img'); + var w = document.createElement('img'); + l.src = DOKU_MEDIA+'lib/images/larger.gif'; + s.src = DOKU_MEDIA+'lib/images/smaller.gif'; + w.src = DOKU_MEDIA+'lib/images/wrap.gif'; + addEvent(l,'click',function(){sizeCtl(edid,100);}); + addEvent(s,'click',function(){sizeCtl(edid,-100);}); + addEvent(w,'click',function(){toggleWrap(edid);}); + ctl.appendChild(l); + ctl.appendChild(s); + ctl.appendChild(w); +} + +/** + * This sets the vertical size of the editbox + */ +function sizeCtl(edid,val){ + var textarea = DOKUid(edid); + var height = parseInt(textarea.style.height.substr(0,textarea.style.height.length-2)); + height += val; + textarea.style.height = height+'px'; + + DokuCookie.setValue('sizeCtl',textarea.style.height); +} + +/** + * Toggle the wrapping mode of a textarea + */ +function toggleWrap(edid){ + var textarea = DOKUid(edid); + var wrap = textarea.getAttribute('wrap'); + if(wrap && wrap.toLowerCase() == 'off'){ + setWrap(textarea, 'soft'); + }else{ + setWrap(textarea, 'off'); + } + + DokuCookie.setValue('wrapCtl',textarea.getAttribute('wrap')); +} + +/** + * Set the wrapping mode of a textarea + * + * @author Fluffy Convict <fluffyconvict@hotmail.com> + * @author <shutdown@flashmail.com> + * @link http://news.hping.org/comp.lang.javascript.archive/12265.html + * @link https://bugzilla.mozilla.org/show_bug.cgi?id=41464 + */ +function setWrap(textarea, wrapAttrValue){ + textarea.setAttribute('wrap', wrapAttrValue); + + // Fix display for mozilla + var parNod = textarea.parentNode; + var nxtSib = textarea.nextSibling; + parNod.removeChild(textarea); + parNod.insertBefore(textarea, nxtSib); +} + +/** + * Handler to close all open Popups + */ +function closePopups(){ + if(!document.getElementById){ return; } + + var divs = document.getElementsByTagName('div'); + for(var i=0; i < divs.length; i++){ + if(divs[i].className.indexOf('JSpopup') != -1){ + divs[i].style.display = 'none'; + } + } +} + +/** + * Looks for an element with the ID scroll__here at scrolls to it + */ +function scrollToMarker(){ + var obj = DOKUid('scroll__here'); + if(obj) obj.scrollIntoView(); +} + +/** + * Looks for an element with the ID focus__this at sets focus to it + */ +function focusMarker(){ + var obj = DOKUid('focus__this'); + if(obj) obj.focus(); +} + +/** + * Remove messages + */ +function cleanMsgArea(){ + var elems = getElementsByClass('(success|info|error)',document,'div'); + if(elems){ + for(var i=0; i<elems.length; i++){ + elems[i].style.display = 'none'; + } + } +} + +/** + * disable multiple revisions checkboxes if two are checked + * + * @author Anika Henke <anika@selfthinker.org> + */ +addInitEvent(function(){ + var revForm = DOKUid('page__revisions'); + if (!revForm) return; + var elems = revForm.elements; + var countTicks = 0; + for (var i=0; i<elems.length; i++) { + var input1 = elems[i]; + if (input1.type=='checkbox') { + addEvent(input1,'click',function(e){ + if (this.checked) countTicks++; + else countTicks--; + for (var j=0; j<elems.length; j++) { + var input2 = elems[j]; + if (countTicks >= 2) input2.disabled = (input2.type=='checkbox' && !input2.checked); + else input2.disabled = (input2.type!='checkbox'); + } + }); + input1.checked = false; // chrome reselects on back button which messes up the logic + } else if(input1.type=='submit'){ + input1.disabled = true; + } + } +}); + +/** + * Add the event handler to the actiondropdown + * + * @author Andreas Gohr <andi@splitbrain.org> + */ +addInitEvent(function(){ + var selector = DOKUid('action__selector'); + if(!selector) return; + + addEvent(selector,'change',function(e){ + this.form.submit(); + }); + + DOKUid('action__selectorbtn').style.display = 'none'; +}); + +/** + * Display error for Windows Shares on browsers other than IE + * + * @author Michael Klier <chi@chimeric.de> + */ +function checkWindowsShares() { + if(!LANG['nosmblinks']) return true; + var elems = getElementsByClass('windows',document,'a'); + if(elems){ + for(var i=0; i<elems.length; i++){ + var share = elems[i]; + addEvent(share,'click',function(){ + if(document.all == null) { + alert(LANG['nosmblinks']); + } + }); + } + } +} + +/** + * Add the event handler for the Windows Shares check + * + * @author Michael Klier <chi@chimeric.de> + */ +addInitEvent(function(){ + checkWindowsShares(); +}); + +/** + * Highlight the section when hovering over the appropriate section edit button + * + * @author Andreas Gohr <andi@splitbrain.org> + */ +addInitEvent(function(){ + var break_classes = new RegExp('secedit|toc|page'); + var btns = getElementsByClass('btn_secedit',document,'form'); + for(var i=0; i<btns.length; i++){ + addEvent(btns[i],'mouseover',function(e){ + var tgt = e.target; + if(tgt.form) tgt = tgt.form; + tgt = tgt.parentNode.previousSibling; + if(tgt.nodeName != "DIV") tgt = tgt.previousSibling; + while(!break_classes.test(tgt.className)) { + tgt.className += ' section_highlight'; + if (tgt.tagName == 'H1') break; + tgt = (tgt.previousSibling != null) ? tgt.previousSibling : tgt.parentNode; + } + }); + + addEvent(btns[i],'mouseout',function(e){ + var secs = getElementsByClass('section_highlight'); + for(var j=0; j<secs.length; j++){ + secs[j].className = secs[j].className.replace(/section_highlight/,''); + } + var secs = getElementsByClass('section_highlight'); + }); + } +}); |