diff options
Diffstat (limited to 'emacs.d/nxhtml/nxhtml/html-wtoc/html-wtoc.js')
-rw-r--r-- | emacs.d/nxhtml/nxhtml/html-wtoc/html-wtoc.js | 361 |
1 files changed, 361 insertions, 0 deletions
diff --git a/emacs.d/nxhtml/nxhtml/html-wtoc/html-wtoc.js b/emacs.d/nxhtml/nxhtml/html-wtoc/html-wtoc.js new file mode 100644 index 0000000..7f22db7 --- /dev/null +++ b/emacs.d/nxhtml/nxhtml/html-wtoc/html-wtoc.js @@ -0,0 +1,361 @@ + +// © Copyright 2006 Lennart Borgman, http://www.OurComments.org/. All rights reserved. +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 3, or (at +// your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; see the file COPYING. If not, write to +// the Free Software Foundation, Inc., 51 Franklin Street, Fifth +// Floor, Boston, MA 02110-1301, USA. + + +var HTML_WTOC_NS_sCurrTocId; + + +HTML_WTOC_NS = { + + ///////////////////////////// + //// Basic event functions + ///////////////////////////// + + getEventObject : function (ev) { + var o; + if (window.event) + o = window.event.srcElement; + else if (null != ev) + o = ( ev.target ); + return o; + }, + getEvent : function (ev) { + if (window.event) { + return window.event; + } else if (null != ev) { + return ev; + } + }, + + eventStopPropagation : function (e) { + if (e.stopPropagation) + e.stopPropagation(); + else + e.cancelBubble=true; + }, + + eventPreventDefault : function (e) { + if (e.preventDefault) + e.preventDefault(); + else + e.returnValue=false; + }, + + ///////////////////////////// + //// TOC hide + ///////////////////////////// + + show_content : function (on) { + var toc = document.getElementById("html-wtoc-id-toccol").style; + var tdv = document.getElementById("html-wtoc-id-tocdiv").style; + var shw = document.getElementById("html-wtoc-id-showtoc").style; + var hid = document.getElementById("html-wtoc-id-hidetoc").style; + if (on) { + toc.display = ""; + tdv.display = ""; + shw.display = "none"; + hid.display = ""; + HTML_WTOC_NS.focus_page_link(0); + } else { + toc.display = "none"; + tdv.display = "none"; + shw.display = ""; + hid.display = "none"; + } + }, + + + + + + ///////////////////////////// + //// Open-Close + ///////////////////////////// + onblur_action : function(ev) { + HTML_WTOC_NS_sCurrTocId = null; + }, + onfocus_action : function(ev) { + var o = HTML_WTOC_NS.getEventObject(ev); + if (!o) return; + + HTML_WTOC_NS_sCurrTocId = o.id; + }, + onclick_action : function(ev) { + var o = HTML_WTOC_NS.getEventObject(ev); + var e = HTML_WTOC_NS.getEvent(ev); + if (13 == e.keyCode) return true; + if (!o) return true; + if ("IMG" == o.tagName) o = o.parentNode; + var iId = HTML_WTOC_NS.getIdnumFromId(o.id); + var sChildId = "toc_child_"+iId; + var sOldCurrTocId = HTML_WTOC_NS_sCurrTocId; + HTML_WTOC_NS.toggle_open(sChildId, o); + HTML_WTOC_NS_sCurrTocId = sOldCurrTocId; + return false; + }, + + toggle_open : function (id, parent) { + var child = document.getElementById(id).style; + var sInner = parent.innerHTML; + var re = new RegExp("[^/]*\.gif", "i"); + if ("none" == child.display) { + child.display = ""; + parent.innerHTML = sInner.replace(re, "down.gif")+""; + } else { + child.display = "none"; + parent.innerHTML = sInner.replace(re, "right.gif")+""; + } + }, + + + + ///////////////////////////// + //// Load + ///////////////////////////// + + onload_actions : function (iPageNum) { + document.body.onkeydown = HTML_WTOC_NS.onkeydown_action; + document.body.onmouseover = HTML_WTOC_NS.onmouseover_action; + var aATags = document.getElementsByTagName("a"); + for(var i = 0; i < aATags.length; i++) { + var o = aATags[i]; + if (null != HTML_WTOC_NS.getIdnumFromId(o.id)) { + o.onfocus = HTML_WTOC_NS.onfocus_action; + o.onblur = HTML_WTOC_NS.onblur_action; + if (o.id.substr(0, 12) == "opener_text_") { + o.onclick = HTML_WTOC_NS.onclick_action; + o.title = "Open/Close"; + } else if (o.id.substr(0, 7) == "opener_") { + o.onclick = HTML_WTOC_NS.onclick_action; + o.className = "html-wtoc-mark"; + o.title = "Open/Close"; + } + } + } + HTML_WTOC_NS.focus_page_link(iPageNum); + }, + focus_page_link : function (iPageNum) { + // Element might be hidden + try { + document.getElementById("toc_link_"+iPageNum).focus(); + } catch (exc) { + } + }, + + + + + + + + ///////////////////// + //// Mouse + ///////////////////// + + onmouseover_action : function (ev) { + if (null == HTML_WTOC_NS_sCurrTocId) return true; + var o = HTML_WTOC_NS.getEventObject(ev); + var iId = HTML_WTOC_NS.getIdnumFromId(o.id); + if (null == iId) return true; + o.focus(); + }, + + + + ///////////////////// + //// Key + ///////////////////// + + onkeydown_action: function (ev) { + var keyDown = 40; + var keyUp = 38; + var keyLeft = 37; + var keyRight = 39; + var keyReturn = 13; + var keyF2 = 113; + var keyInsert = 45; + // Opera + var keyOperaDown = 57386; + var keyOperaUp = 57385; + var keyOperaLeft = 57387; + var keyOperaRight = 57388; + var keyOperaF2 = 57346; + var keyOperaInsert = 57394; + + var SwitchKey = keyInsert; + var SwitchKeyOpera = keyOperaInsert; + + var bUp; + var e = HTML_WTOC_NS.getEvent(ev); + if (null == HTML_WTOC_NS_sCurrTocId) { + switch (e.keyCode) { + case SwitchKey: + case SwitchKeyOpera: + HTML_WTOC_NS.focus_page_link(0); + HTML_WTOC_NS.eventStopPropagation(e); + HTML_WTOC_NS.eventPreventDefault(e); + return false; + } + return true; + } + switch (e.keyCode) { + case keyLeft: + case keyOperaLeft: + case keyRight: + case keyOperaRight: + HTML_WTOC_NS.handle_leftright_keys(e); + HTML_WTOC_NS.eventStopPropagation(e); + HTML_WTOC_NS.eventPreventDefault(e); + return false; + case keyDown: + case keyOperaDown: + bUp = false; + break; + case keyUp: + case keyOperaUp: + bUp = true; + break; + case SwitchKey: + case SwitchKeyOpera: + if (null != HTML_WTOC_NS_sCurrTocId) { + var o = document.getElementById(HTML_WTOC_NS_sCurrTocId); + if (o) o.blur(); + HTML_WTOC_NS_sCurrTocId = null; + } + HTML_WTOC_NS.eventStopPropagation(e); + HTML_WTOC_NS.eventPreventDefault(e); + return false; + default: + //alert(e.keyCode); + return true; + } + var oOpener; + oOpener = HTML_WTOC_NS.getNextVisOpener(HTML_WTOC_NS_sCurrTocId, bUp); + oOpener.focus(); + HTML_WTOC_NS.eventStopPropagation(e); + HTML_WTOC_NS.eventPreventDefault(e); + return false; + }, + + handle_leftright_keys: function (e) { + var keyLeft = 37; + var keyRight = 39; + var keyOperaLeft = 57387; + var keyOperaRight = 57388; + var iId = HTML_WTOC_NS.getIdnumFromId(HTML_WTOC_NS_sCurrTocId); + if (null == iId) return; + var sId = "opener_" + iId; + var oOpener = document.getElementById(sId); + var sId = HTML_WTOC_NS_sCurrTocId; // It will be cleared before getNextVis + + var bOpenAction; + var bOpened; + var bUp; + var oChild = document.getElementById("toc_child_"+iId); + if (null == oChild) { + } else { + bOpened = (oChild.style.display != "none"); + } + switch (e.keyCode) { + case keyLeft: + case keyOperaLeft: + bUp = true; + bOpenAction = (null != bOpened) && (bOpened); + break; + case keyRight: + case keyOperaRight: + bUp = false; + bOpenAction = (null != bOpened) && (!bOpened); + break; + default: + alert("bad key handling..."); + } + if (bOpenAction) { + oOpener.click(); + HTML_WTOC_NS_sCurrTocId = sId; + } else { + var oPrev = HTML_WTOC_NS.getNextVisOpener(sId, bUp); + oPrev.focus(); + } + }, + + + + + + + ////////////////////// + //// Util + ////////////////////// + getNameFromId: function (sId) { + var re = new RegExp("(.*?_)(\\d+)", "i"); + if (!re.test(sId)) return null; + var iId = sId.replace(re, "$1"); + return iId; + }, + getIdnumFromId: function (sId) { + var re = new RegExp("(.*?_)(\\d+)", "i"); + if (!re.test(sId)) return null; + var iId = sId.replace(re, "$2"); + return iId; + }, + + + getNextVisOpener: function (sId, bUp, bTrace) { + if (bTrace) alert("getNextVisOpener("+sId+","+bUp+")"); + var iId = HTML_WTOC_NS.getIdnumFromId(sId); + if (null == iId) { + alert("getNextVisOpener err iId==null"); + return; + } + var sIdName = HTML_WTOC_NS.getNameFromId(sId); + if (null == sIdName) { + alert("getNextVisOpener err sIdName==null"); + return; + } + var oOpener; + var iLoop = -2; + while (oOpener == null) { + if (bTrace) alert(iId); + if (iLoop++ > iMaxChildNum) { alert("Child num error"); return; } + if (!bUp) { + iId++; + } else { + iId--; + } + if (iId > iMaxChildNum) { iId = 0; } + if (iId < 0) { iId = iMaxChildNum; } + var s = sIdName+iId; + oOpener = document.getElementById(s); + if (oOpener != null) { + if (bTrace) alert(oOpener.offsetLeft); + if (oOpener.style.display == "none") { // All + oOpener = null; + } else if (oOpener.offsetLeft < 0) { // IE + oOpener = null; + } else if (0 == oOpener.scrollWidth) { // Opera + oOpener = null; + } + } + } + return oOpener; + } + + + +}; //HTML_WTOC_NS |