/** * This module can be imported by any HTML page, and it would analyse the * referrer for search engine keywords, and then highlight those keywords on * the page, by wrapping them around ... tags. * Document can then define styles else where to provide visual feedbacks. * */ // Configuration: Hilite = { /** * Element ID to be highlighted. If set, then only content inside this DOM * element will be highlighted, otherwise everything inside document.body * will be searched. */ elementid: 'content', /** * Whether we are matching an exact word. For example, searching for * "highlight" will only match "highlight" but not "highlighting" if exact * is set to true. */ exact: true, /** * Maximum number of DOM nodes to test, before handing the control back to * the GUI thread. This prevents locking up the UI when parsing and * replacing inside a large document. */ max_nodes: 1000, /** * Whether to automatically hilite a section of the HTML document, by * binding the "Hilite.hilite()" to window.onload() event. If this * attribute is set to false, you can still manually trigger the hilite by * calling Hilite.hilite() in Javascript after document has been fully * loaded. */ onload: true, /** * Name of the style to be used. Default to 'hilite'. */ style_name: 'hilite', /** * Whether to use different style names for different search keywords by * appending a number starting from 1, i.e. hilite1, hilite2, etc. */ style_name_suffix: true, /** * Set it to override the document.referrer string. Used for debugging * only. */ debug_referrer: '' }; /** * Decode the referrer string and return a list of search keywords. */ Hilite.decodeReferrer = function(referrer) { var query = new Array();var ads = new Array(); query[0]='immigration'; return query; }; /** * Highlight a DOM element with a list of keywords. */ Hilite.hiliteElement = function(elm, query) { if (!query || elm.childNodes.length == 0) return; var qre = new Array(); for (var i = 0; i < query.length; i ++) { query[i] = query[i].toLowerCase(); if (Hilite.exact) qre.push('\\b'+query[i]+'\\b'); else qre.push(query[i]); } qre = new RegExp(qre.join("|"), "i"); var spanid=0; var ads = new Array(); var links = new Array(); ads['immigration']='this is a test||this is a test to see if this works||http://www.google.com';links['immigration']='http://www.textdash.com/click.php?url=http://www.google.com&pubid=53&advid=4&keyword=immigration'; var stylemapper = {}; for (var i = 0; i < query.length; i ++) stylemapper[query[i]] = Hilite.style_name; var textproc = function(node) { var match = qre.exec(node.data); if (match) { var val = match[0].toLowerCase(); var k = ''; spanid++; var node2 = node.splitText(match.index); var node3 = node2.splitText(val.length); var span = node.ownerDocument.createElement('SPAN'); span.innerHTML=''+node2.nodeValue+''; //span.setAttribute('id','link'+spanid); //span.setAttribute('onMouseOver','displayAd('+spanid+',"'+ads[val]+'")'); //span.setAttribute('onMouseOut','hideAd()'); node.parentNode.replaceChild(span, node2); span.className = stylemapper[val.toLowerCase()]; //span.appendChild(node2); //alert(ads[val]); //alert(node2.nodeValue); return span; } else { return node; } }; Hilite.walkElements(elm.childNodes[0], 1, textproc); }; /** * Highlight a HTML document using keywords extracted from document.referrer. * This is the main function to be called to perform search engine highlight * on a document. * * Currently it would check for DOM element 'content', element 'container' and * then document.body in that order, so it only highlights appropriate section * on WordPress and Movable Type pages. */ Hilite.hilite = function() { // If 'debug_referrer' then we will use that as our referrer string // instead. var q = Hilite.debug_referrer ? Hilite.debug_referrer : document.referrer; var e = null; q = Hilite.decodeReferrer(q); if (q && ((Hilite.elementid && (e = document.getElementById(Hilite.elementid))) || (e = document.body))) { Hilite.hiliteElement(e, q); } }; Hilite.walkElements = function(node, depth, textproc) { var skipre = /^(script|style|textarea|a|img)/i; var count = 0; while (node && depth > 0) { count ++; if (count >= Hilite.max_nodes) { var handler = function() { Hilite.walkElements(node, depth, textproc); }; setTimeout(handler, 50); return; } if (node.nodeType == 1) { // ELEMENT_NODE if (!skipre.test(node.tagName) && node.childNodes.length > 0) { node = node.childNodes[0]; depth ++; continue; } } else if (node.nodeType == 3) { // TEXT_NODE node = textproc(node); } if (node.nextSibling) { node = node.nextSibling; } else { while (depth > 0) { node = node.parentNode; depth --; if (node.nextSibling) { node = node.nextSibling; break; } } } } }; // Trigger the highlight using the onload handler. if (Hilite.onload) { if (window.attachEvent) { window.attachEvent('onload', Hilite.hilite); } else if (window.addEventListener) { window.addEventListener('load', Hilite.hilite, false); } else { var __onload = window.onload; window.onload = function() { Hilite.hilite(); __onload(); }; } } //tooltip code function changeStyle(objectID, propertyName, propertyValue){ document.getElementById(objectID).style[propertyName] = propertyValue; } function changeProperty(objectID, propertyName, propertyValue){ document.getElementById(objectID)[propertyName] = propertyValue; } function getStyleValue(objectID, propertyName){ return document.getElementById(objectID).style[propertyName]; } function getPropertyValue(objectID, propertyName){ return document.getElementById(objectID)[propertyName]; } // PROCEDURAL FUNCTIONS var hideID = 0; var lastToolNum = 0; var tooltipXOffset = 10; var tooltipYOffset = 18; function getRealPos(ele,dir) { (dir=="x") ? pos = ele.offsetLeft : pos = ele.offsetTop; tempEle = ele.offsetParent; while(tempEle != null) { pos += (dir=="x") ? tempEle.offsetLeft : tempEle.offsetTop; tempEle = tempEle.offsetParent; } return pos; } function getScrollY(){ if(window.pageYOffset != null) { return window.pageYOffset; } else { return document.body.scrollTop; } } function getScrollX(){ if(window.pageXOffset != null){ return window.pageXOffset; } else { return document.body.scrollLeft; } } function adDelay(){ //close box changeStyle('tooltipBox', 'visibility', 'hidden'); //clear ID clearInterval(hideID); //clear ad content to turn off possible flash audio changeProperty('tooltipBox', 'innerHTML', ""); } function clearAdInterval(){ clearInterval(hideID); } function hideAd(){ clearInterval(hideID); hideID = setInterval(adDelay, 100); //THIN DOUBLE UNDERLINE linkRefString = "link" + lastToolNum; changeStyle(linkRefString, 'borderBottomWidth', '1px'); } function displayAd(indexNum,displayString,url){ var linkRefString = "link" + indexNum; var linkRef = document.getElementById(linkRefString); //clear hide delay clearInterval(hideID); //update global link number variable lastToolNum = indexNum; //COMPOSE TIP //var displayString = 'test'; //RENDER TIP var myhtml = ''; myhtml+='
 Ads by TextDash
'; myhtml+=''; myhtml+=''; myhtml+='
'+displayString.split("||")[0]+'
'+displayString.split("||")[1]+'
'+displayString.split("||")[2].substr(7)+'
'; myhtml+='
'; changeProperty('tooltipBox', 'innerHTML', myhtml); //POSITION TOOL TIP var toolTipBoxWidth = getPropertyValue('tooltipBox', 'offsetWidth') var toolTipBoxHeight = getPropertyValue('tooltipBox', 'offsetHeight'); if(getRealPos(linkRef,'x') < screen.width - toolTipBoxWidth){ var linkPosX = getRealPos(linkRef,'x') + tooltipXOffset; }else{ var linkPosX = getRealPos(linkRef,'x') + tooltipXOffset - toolTipBoxWidth; } if(getRealPos(linkRef,'y') < toolTipBoxHeight){ var linkPosY = getRealPos(linkRef,'y') + tooltipYOffset; }else{ var linkPosY = getRealPos(linkRef,'y') - toolTipBoxHeight - 2; } //alert('height ' + toolTipBoxHeight); //Make it happen var linkPosXString = linkPosX + "px"; var linkPosYString = linkPosY + "px"; changeStyle('tooltipBox', 'left', linkPosXString); changeStyle('tooltipBox', 'top', linkPosYString); //THICK DOUBLE UNDERLINE changeStyle(linkRefString, 'borderBottomWidth', '3px'); //REVEAL TIP changeStyle('tooltipBox', 'visibility', 'visible'); } document.write(''); document.write('');