var $ = function(id) { return document.getElementById(id); }; var nClickCount = 0; var blit_objUrlMap = []; var buildUI = function() { } var mangleURL = function(sURL) { sURL=sURL.replace(/^\s+|\s+$/,''); var nFirstColon = sURL.indexOf(':'); var nFirstSpace = sURL.indexOf(' '); if(nFirstSpace < 0) return; // if colon is before space, exchange spaces and return if(nFirstColon > 0 && nFirstColon < nFirstSpace) { return sURL.replace(/%20| /, '+'); } var sKeyword = sURL.substring(0, nFirstSpace); var sToken = sURL.substring(nFirstSpace+1); var s = _doKeyword(sKeyword, sToken); if(s) return s; return sURL; } var _doKeyword = function(sKeyword, sToken) { if(sKeyword == 's') { return 'http://bohmian.org/disc/' + escape(sToken); } else if(sKeyword == 'g') { return 'http://www.google.com/search?hl=en&source=hp&ie=UTF-8&q=' + escape(sToken); } else if(sKeyword == 'b') { return 'http://bing.com/search?q=' + escape(sToken); } else if(sKeyword == 'wpo') { return 'http://en.wikipedia.org/wiki/' + escape(sToken); } else if(sKeyword == 'wd') { return 'http://en.wiktionary.org/wiki/' + escape(sToken); } return null; } var navigateToLocationFromForm = function(sURL) { var sMangled = mangleURL(sURL); if(sMangled) sURL = sMangled; sURL=sURL.replace(/%20| /g, '+'); navigateTo(sURL, false, false); return false; } var navigateTo = function(sURL, bForce, bReload) { sURL=sURL.replace(/%20| /g, '+'); var sProtocol, sDomain, sPath; var nFirstColon = sURL.indexOf(':'); if(nFirstColon == -1) { sProtocol = 'http'; } else { sProtocol = sURL.substring(0, nFirstColon); } var ndx = nFirstColon; var ndx2; sDomain = ''; while(!sDomain && (ndx2 = sURL.indexOf('/', ndx+1)) ) { if(ndx2>ndx+1) { sDomain = sURL.substring(ndx+1, ndx2); } else if(ndx2 < 0) { break; } else { ndx = ndx2+1; } } if(ndx2 < 0) { sDomain = sURL; sPath = '/'; } else { sPath = sURL.substring(ndx2); } var blitDomain = '.blit.li'; if(sDomain.indexOf('.beta'+blitDomain) > 0) { blitDomain = '.beta'+blitDomain; } if(sDomain.indexOf(blitDomain)) { var n = sDomain.lastIndexOf(blitDomain); if(n+blitDomain.length == sDomain.length) { sDomain = sDomain.substr(0, n); } } var sBlitUrl = sProtocol + '://' + sDomain + blitDomain + sPath; var sCleanUrl = sProtocol + '://' + sDomain + sPath; var sCleanRequestUrl = escape(sProtocol + '://' + sDomain + sPath); var sAjaxBlitUrl = '/?ajax=1&location=' + sCleanRequestUrl + (bForce?"&force=1":''); var request = new XMLHttpRequest(); request.onreadystatechange = function() { if(this.readyState == 3 && this.status >=400) { var sUrl = (unescape(sCleanRequestUrl)); sendClosePage(sUrl); } else if(this.readyState == 4 && this.status ==200) { if(!this.responseXML) { var sUrl = (unescape(sCleanRequestUrl)); sendClosePage(sUrl); return; } if(bReload) // move to the normal page { document.location.replace("http://blit.li/"); } var body = this.responseXML.getElementsByTagName('body')[0]; var mybody = document.body; if(!body || !body.childNodes) { sendClosePage(sUrl); return; } var nodes = body.childNodes; var myID = 'blitbli_page_' + (''+Math.random()).substr(2); blit_objUrlMap[myID] = sCleanUrl.replace(/%20| /g, '+'); //alert("Added " + myID + " " + blit_objUrlMap[myID]); var mydiv = document.createElement('div'); var myContent = document.createElement('div'); var widgetBar = _createWidgetBar(myID, sCleanUrl); mydiv.setAttribute('class', 'blitbli_page'); myContent.setAttribute('class', 'blitbli_content'); mydiv.setAttribute('id', myID); myContent.setAttribute('id', myID+'_c'); // add widget bar to beginning mydiv.appendChild(widgetBar); mydiv.appendChild(myContent); for(var i=0; i< nodes.length; ++i) { var n = nodes[i]; //n = document.importNode(n, true); n = _copyNode(n); myContent.appendChild(n); } // add widget bar to end mydiv.appendChild(_copyNode(widgetBar)); mybody.insertBefore(mydiv, mybody.lastChild); // update tabs addToTabBar(myID); // update advert var navert = $('NAVERT'); if(navert) { /* if(++nClickCount > 5) { var vurl ='http://' + blitDomain.substring(1) + '/google?url=' + sCleanRequestUrl; navert.src=vurl; nClickCount = 0; } */ } } else if(this.readyState == 4) { sendClosePage(unescape(sCleanRequestUrl)); alert('Error fetching page. ' + unescape(sCleanRequestUrl)); } }; window.clearTimeout(); try { request.open("POST", sAjaxBlitUrl); request.send(''); } catch(e) { alert("Exception: " + e); } window.setTimeout('_ping()', 300000 ); } var _copyNode = function(node) { if(node.nodeName == '#text') { return document.importNode(node, false); } var r = document.createElement(node.nodeName); _copyAttrs(r, node); var children = node.childNodes; if(children) for(var i = 0; i < children.length; ++i) { var child = _copyNode(children[i]); r.appendChild(child); } return r; } var _copyAttrs = function(newNode, oldNode) { var attrs = oldNode.attributes; if(attrs) for(var i = 0; i < attrs.length; ++i) { var name = attrs[i].nodeName; var value = attrs[i].nodeValue; newNode.setAttribute(name, value); } } var clearScreen = function() { var divs = document.body.childNodes; var ui = $('BLITLI_UI'); for(var i = divs.length; --i >=0 ; ) { if(ui != divs[i]) { try { document.body.removeChild(divs[i]); } catch(e) {} } } } var stop = function(e) { if(!e) { if(window.event) { window.event.cancelBubble = true; } } else { if(e.stopPropagation) e.stopPropagation(); if(e.preventDefault) e.preventDefault(); } } var showImage = function(elmnt, e) { if(elmnt.nodeName.toLowerCase() == 'img') { return true; } var r = document.createElement('img'); _copyAttrs(r, elmnt); elmnt.parentNode.replaceChild(r, elmnt); stop(e); return false; } var stealLink = function(elmnt, e) { var href = elmnt.getAttribute('href'); navigateTo(href, false, false); return false; } var addDoubleClickListeners = function() { var hrefs = document.getElementsByTagName("a"); } var _getEventChar = function(e) { if(!e) e = window.event; return ((window.event) ? window.event.keyCode : e.which); } var _ping = function() { // heartbeat to keep session active window.clearTimeout(); try { var request = new XMLHttpRequest(); request.open("GET", '/ping.xhtml'); request.send(''); } catch(e) { ; } window.setTimeout('_ping()', 300000 ); } var gKeyboardModifiers = 0; var KEY_CTRL = 0x04; var _mapCtrlMask = function(e, code) { switch(code) { case 17: // ctrl case 91: // L Windows or L Apple Command case 93: // Menu or R Apple Command case 224: // Apple Command return KEY_CTRL; } if(e.ctrlKey) return KEY_CTRL; return 0; } var handleKeyDown = function(e) { var code = _mapCtrlMask(e, _getEventChar(e)); gKeyboardModifiers |= code; return true; } var handleKeyUp = function(e) { var code = _mapCtrlMask(_getEventChar(e)); gKeyboardModifiers &= ~code; return true; } var handleHotKeys = function(e) { var code = _getEventChar(e); if(!code) return true; var modifiers = gKeyboardModifiers; gKeyboardModifiers = 0; // clear modifiers because ... things are buggy. var char = String.fromCharCode(code); var isCtrl = (modifiers&KEY_CTRL) > 0; if(isCtrl && char == 'l') { $('BLITLI_LOCATION').focus(); return false; } else if(isCtrl && char == 'r') { clearScreen(); return false; } return true; } var _createWidgetBar = function (objName, url) { var widgetBar = document.createElement('div'); widgetBar.setAttribute('class', 'blitbli_pagebar'); widgetBar.setAttribute('ondblclick', 'javascript:doubleClickBarHandler("' + objName + '")'); var closePageText = document.createTextNode("close"); var pageTitleText = document.createTextNode(url); var normalLinkText= document.createTextNode("heavy"); var closePage = document.createElement('a'); var normalLink= document.createElement('a'); var pageTitle = document.createElement('span'); // close page closePage.setAttribute('onclick', 'javascript:closePage("' + objName + '")'); closePage.setAttribute('class', 'close'); closePage.appendChild(closePageText); widgetBar.appendChild(closePage); // page title pageTitle.setAttribute('class', 'title'); pageTitle.appendChild(pageTitleText); widgetBar.appendChild(pageTitle); // full link normalLink.setAttribute('id', objName + '_h'); normalLink.setAttribute('href', url); normalLink.setAttribute('class', 'heavy'); normalLink.setAttribute('target', '_blank'); normalLink.setAttribute('onclick', 'javascript:return replacePage("' + objName + '")'); normalLink.appendChild(normalLinkText); widgetBar.appendChild(normalLink); return widgetBar; } var doubleClickBarHandler = function(object) { var node = $(object); if(!node) return; document.location.hash = object; var content = node.getElementsByTagName('div')[1]; var topBar = node.getElementsByTagName('div')[0]; if(content.style.display == 'none') { content.style.display = 'block'; topBar.style.display = 'block'; } else { content.style.display = 'none'; topBar.style.display = 'none'; } } var addToTabBar = function(myID) { } var closePage = function(object) { var node = $(object); if(!node) return; document.location.hash = object; var parent = node.parentNode; parent.removeChild(node); // clean-up history var sUrl = blit_objUrlMap[object]; blit_objUrlMap[object] = ''; sendClosePage(sUrl); } var sendClosePage = function(sUrl) { if(!sUrl) return false; sUrl = sUrl.replace(/%20| /g, '+'); var request = new XMLHttpRequest(); var sAjaxCloseUrl = '/?ajax=1&close=1&location=' + escape(sUrl); window.clearTimeout(); try { request.open("POST", sAjaxCloseUrl); request.send(''); } catch(e) { alert("Exception: " + e); } window.setTimeout('_ping()', 300000 ); } var showHistory = function(methodToCall) { var request = new XMLHttpRequest(); var sAjaxHistoryUrl = '/?ajax=1&history=1'; request.onreadystatechange = function() { if(this.readyState == 4 && this.status == 200) { var history = JSON.parse( request.responseText ); _showHistory(methodToCall, history); } }; window.clearTimeout(); try { request.open("GET", sAjaxHistoryUrl); request.send(''); } catch(e) { alert("Exception: " + e); } window.setTimeout('_ping()', 1500000 ); } var _showHistory = function(method, history) { var menuItems = []; history.forEach( function(h) { var item = []; item.text = h; //item.onclick = "_menuClosePage"; item.onclick = method; menuItems.push(item); } ); showSubMenu(menuItems); } var _menuClosePage = function(elmnt) { var sUrl = elmnt.innerHTML; sendClosePage(sUrl); elmnt.parentNode.removeChild(elmnt); // clean-up current page for(var obj in blit_objUrlMap) { if(blit_objUrlMap[obj]==sUrl) { var node = $(obj); if(!node) continue; node.parentNode.removeChild(node); } } } var _jumpToPage = function(elmnt) { var sUrl = elmnt.innerHTML; // clean-up current page for(var obj in blit_objUrlMap) { if(blit_objUrlMap[obj]==sUrl) { document.location.hash = obj; } } } var replacePage = function(object) { var node = $(object); if(!node) return; var nodeC = $(object+'_c'); if(!nodeC) return; var hvy = $(object + '_h'); if(!hvy) return; var href = hvy.getAttribute('href'); var iframe = document.createElement("iframe"); iframe.setAttribute('src', href); iframe.setAttribute('width', '100%'); iframe.setAttribute('height', screen.height); node.replaceChild(iframe, nodeC); return false; } var addKeyHandlers = function() { document.onkeydown = handleKeyDown; document.onkeyup = handleKeyUp; document.onkeypress = handleHotKeys; } var initUI = function() { addDoubleClickListeners(); addKeyHandlers(); if(window.restore) { window.restore(); } } var showSessions = function() { } var showMenu = function() { var menu = $('BLITLI_MENU'); if(menu) { var sub = $('BLITLI_SUBMENU'); if(sub) menu.removeChild(sub); menu.style.display="block"; var lst = $('BLITLI_MENU_LIST'); if(lst) lst.style.display="block"; } } var _menuLink = function() { var item=[]; item.onclick='showMenu'; item.text='Menu'; return item; } var showSubMenu = function(menuItems) { var lst = $('BLITLI_MENU_LIST'); if(lst) { lst.style.display="none"; } var menu = $('BLITLI_MENU'); if(menu) { var ul = document.createElement("ul"); ul.setAttribute('id', 'BLITLI_SUBMENU'); menuItems.push( _menuLink() ); menuItems.forEach(function(item) { var li = document.createElement("li"); var f = 'javascript:' + item.onclick + '(this)'; li.setAttribute('onclick', f); li.innerHTML = item.text; ul.appendChild(li); }); menu.appendChild(ul); ul.style.display='block'; } } var toggleFooter = function() { var COLLAPSED_HEIGHT = "10"; var foot = $('BLITLI_FOOTER'); if(foot) { if(typeof toggleFooter.NORMAL_HEIGHT == 'undefined') { toggleFooter.NORMAL_HEIGHT = foot.clientHeight; } if(foot.clientHeight == COLLAPSED_HEIGHT) { foot.style.height = toggleFooter.NORMAL_HEIGHT; } else foot.style.height = COLLAPSED_HEIGHT; } } var hideParent = function(elmnt) { elmnt.parentNode.style.display="none"; } var correctLocation = function() { if('blit.li' != document.location.host) { //navigateTo(document.location.href, true, true); document.location.replace("http://blit.li/?location="+escape(document.location.href)); } else if(document.location.search.substr(0,10)=='?location=') { var q=unescape(document.location.search.substr(10)); navigateTo(q, true); } } correctLocation(); if(document.addEventListener) document.addEventListener("DOMContentLoaded", initUI, false); else document.onload = initUI;