From f48fbadf2218e4ad1df6909374c30bddbb7a24bb Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Fri, 19 Aug 2011 11:24:07 +0200 Subject: added missing file yeah, yeah I know... --- lib/scripts/page.js | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 lib/scripts/page.js (limited to 'lib') diff --git a/lib/scripts/page.js b/lib/scripts/page.js new file mode 100644 index 000000000..189c1f148 --- /dev/null +++ b/lib/scripts/page.js @@ -0,0 +1,115 @@ +/** + * Page behaviours + * + * This class adds various behaviours to the rendered page + */ +dw_page = { + /** + * initialize page behaviours + */ + init: function(){ + dw_page.sectionHighlight(); + jQuery('a.fn_top').mouseover(dw_page.footnoteDisplay); + }, + + /** + * Highlight the section when hovering over the appropriate section edit button + * + * @author Andreas Gohr + */ + sectionHighlight: function() { + jQuery('form.btn_secedit') + .mouseover(function(e){ + var tgt = this.parentNode; + var nr = tgt.className.match(/(\s+|^)editbutton_(\d+)(\s+|$)/)[2]; + do { + tgt = tgt.previousSibling; + } while (tgt !== null && typeof tgt.tagName === 'undefined'); + if (tgt === null) return; + while(typeof tgt.className === 'undefined' || + tgt.className.match('(\\s+|^)sectionedit' + nr + '(\\s+|$)') === null) { + if (typeof tgt.className !== 'undefined') { + jQuery(tgt).addClass('section_highlight'); + } + tgt = (tgt.previousSibling !== null) ? tgt.previousSibling : tgt.parentNode; + } + + jQuery(tgt).addClass('section_highlight'); + }) + .mouseout(function(e){ + jQuery('.section_highlight').removeClass('section_highlight'); + }); + }, + + /** + * Create/get a insitu popup used by the footnotes + * + * @param target - the DOM element at which the popup should be aligned at + * @param popup_id - the ID of the (new) DOM popup + * @return the Popup JQuery object + */ + insituPopup: function(target, popup_id) { + // get or create the popup div + var $fndiv = jQuery('#popup_id'); + + // popup doesn't exist, yet -> create it + if(!$fndiv.length){ + $fndiv = jQuery(document.createElement('div')) + .attr('id', popup_id) + .addClass('insitu-footnote JSpopup') + .mouseout(function(e){ + // autoclose on mouseout - ignoring bubbled up events + //FIXME can this made simpler in jQuery? + var p = e.relatedTarget || e.toElement; + while (p && p !== this) { + p = p.parentNode; + } + if (p === this) { + return; + } + jQuery(this).hide(); + }); + + jQuery('div.dokuwiki:first').append($fndiv); + } + + $fndiv.position({ + my: 'left top', + at: 'left center', + of: target + }); + + $fndiv.hide(); + return $fndiv; + }, + + /** + * Display an insitu footnote popup + * + * @author Andreas Gohr + * @author Chris Smith + */ + footnoteDisplay: function(e){ + var $fndiv = dw_page.insituPopup(e.target, 'insitu__fn'); + + // locate the footnote anchor element + var $a = jQuery("#fn__" + e.target.id.substr(5)); + if (!$a.length){ return; } + + // anchor parent is the footnote container, get its innerHTML + var content = new String ($a.parent().parent().html()); + + // strip the leading content anchors and their comma separators + content = content.replace(/.*<\/sup>/gi, ''); + content = content.replace(/^\s+(,\s+)+/,''); + + // prefix ids on any elements with "insitu__" to ensure they remain unique + content = content.replace(/\bid=(['"])([^"']+)\1/gi,'id="insitu__$2'); + + // now put the content into the wrapper + $fndiv.html(content); + $fndiv.show(); + } +}; + +jQuery(dw_page.init); -- cgit v1.2.3