aboutsummaryrefslogtreecommitdiff
path: root/vendors/dokuwiki/lib/scripts/script.js
diff options
context:
space:
mode:
Diffstat (limited to 'vendors/dokuwiki/lib/scripts/script.js')
-rw-r--r--vendors/dokuwiki/lib/scripts/script.js561
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,'&quot;');
+ 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,'&quot;');
+ 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>&minus;</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>&minus;</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');
+ });
+ }
+});