summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndreas Gohr <andi@splitbrain.org>2011-08-19 11:24:07 +0200
committerAndreas Gohr <andi@splitbrain.org>2011-08-19 11:24:52 +0200
commitf48fbadf2218e4ad1df6909374c30bddbb7a24bb (patch)
tree115d8ff661dad6314909b1e4365f0b5613b1a9e5 /lib
parentbe3813f5eab834930d26e768079e09296b106893 (diff)
downloadrpg-f48fbadf2218e4ad1df6909374c30bddbb7a24bb.tar.gz
rpg-f48fbadf2218e4ad1df6909374c30bddbb7a24bb.tar.bz2
added missing file
yeah, yeah I know...
Diffstat (limited to 'lib')
-rw-r--r--lib/scripts/page.js115
1 files changed, 115 insertions, 0 deletions
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 <andi@splitbrain.org>
+ */
+ 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 <andi@splitbrain.org>
+ * @author Chris Smith <chris@jalakai.co.uk>
+ */
+ 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>.*<\/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);