/*
  $Id: general.js,v 1.3 2003/02/10 22:30:55 hpdl Exp $

  osCommerce, Open Source E-Commerce Solutions
  http://www.oscommerce.com

  Copyright (c) 2003 osCommerce

  Released under the GNU General Public License

  Modified and Enhanced by Create Studios
  http://www.create.net.au
*/

function com_stewartspeak_replacement() {

/*
    Dynamic Heading Generator
    By Stewart Rosenberger
    http://www.stewartspeak.com/headings/
 
            This script searches through a web page for specific or general elements
            and replaces them with dynamically generated images, in conjunction with
            a server-side script.
*/

replaceSelector("h1","/text-replacement_1.php",false);
replaceSelector("h2","/text-replacement_2.php",false);
replaceSelector("h3","/text-replacement_1a.php",false);
replaceSelector("h4","/text-replacement_4.php",false);
replaceSelector("h5","/text-replacement_5.php",false);

var testURL = "/images/test.png" ;
 
var doNotPrintImages = false;
var printerCSS = "replacement-print.css";

 

var hideFlicker = false;
var hideFlickerCSS = "replacement-screen.css";
var hideFlickerTimeout = 1000;


 

/* ---------------------------------------------------------------------------

    For basic usage, you should not need to edit anything below this comment.

    If you need to further customize this script's abilities, make sure

            you're familiar with Javascript. And grab a soda or something.

*/

 

var items;

var imageLoaded = false;

var documentLoaded = false;

 

function replaceSelector(selector,url,wordwrap)

{

            if(typeof items == "undefined")

                        items = new Array();

 

            items[items.length] = {selector: selector, url: url, wordwrap: wordwrap};

}

 

if(hideFlicker)

{                      

            document.write('<link id="hide-flicker" rel="stylesheet" media="screen" href="' + hideFlickerCSS + '" />');                

            window.flickerCheck = function()

            {

                        if(!imageLoaded)

                                    setStyleSheetState('hide-flicker',false);

            };

            setTimeout('window.flickerCheck();',hideFlickerTimeout)

}

 

if(doNotPrintImages)

            document.write('<link id="print-text" rel="stylesheet" media="print" href="' + printerCSS + '" />');

 

var test = new Image();

test.onload = function() { imageLoaded = true; if(documentLoaded) replacement(); };

test.src = testURL + "?date=" + (new Date()).getTime();

 

addLoadHandler(function(){ documentLoaded = true; if(imageLoaded) replacement(); });

 

 

function documentLoad()

{

            documentLoaded = true;

            if(imageLoaded)

                        replacement();

}

 

function replacement()

{

            for(var i=0;i<items.length;i++)

            {

                        var elements = getElementsBySelector(items[i].selector);

                        if(elements.length > 0) for(var j=0;j<elements.length;j++)

                        {

                                    if(!elements[j])

                                                continue ;

                       

                                    var text = extractText(elements[j]);

                        while(elements[j].hasChildNodes())

                                                elements[j].removeChild(elements[j].firstChild);

 

                                    var tokens = items[i].wordwrap ? text.split(' ') : [text] ;

                                    for(var k=0;k<tokens.length;k++)

                                    {

                                                var url = items[i].url + "?text="+escape(tokens[k]+' ')+"&selector="+escape(items[i].selector);

                                                var image = document.createElement("img");

                                                image.className = "replacement";

                                                image.alt = tokens[k] ;

                                                image.src = url;
																
                                                elements[j].appendChild(image);
																
                                    }

 

                                    if(doNotPrintImages)

                                    {

                                                var span = document.createElement("span");

                                                span.style.display = 'none';

                                                span.className = "print-text";

                                                span.appendChild(document.createTextNode(text));

                                                elements[j].appendChild(span);

                                    }

                        }

            }

 

            if(hideFlicker)

                        setStyleSheetState('hide-flicker',false);

}

 

function addLoadHandler(handler)

{

            if(window.addEventListener)

            {

                        window.addEventListener("load",handler,false);

            }

            else if(window.attachEvent)

            {

                        window.attachEvent("onload",handler);

            }

            else if(window.onload)

            {

                        var oldHandler = window.onload;

                        window.onload = function piggyback()

                        {

                                    oldHandler();

                                    handler();

                        };

            }

            else

            {

                        window.onload = handler;

            }

}

 

function setStyleSheetState(id,enabled)

{

            var sheet = document.getElementById(id);

            if(sheet)

                        sheet.disabled = (!enabled);

}

 

function extractText(element)

{

            if(typeof element == "string")

                        return element;

            else if(typeof element == "undefined")

                        return element;

            else if(element.innerText)

                        return element.innerText;

 

            var text = "";

            var kids = element.childNodes;

            for(var i=0;i<kids.length;i++)

            {

                        if(kids[i].nodeType == 1)

                        text += extractText(kids[i]);

                        else if(kids[i].nodeType == 3)

                        text += kids[i].nodeValue;

            }

 

            return text;

}

 

/*

            Finds elements on page that match a given CSS selector rule. Some

            complicated rules are not compatible.

            Based on Simon Willison's excellent "getElementsBySelector" function.

            Original code (with comments and description):

                        http://simon.incutio.com/archive/2003/03/25/getElementsBySelector

*/

function getElementsBySelector(selector)

{

            var tokens = selector.split(' ');

            var currentContext = new Array(document);

            for(var i=0;i<tokens.length;i++)

            {

                        token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');

                        if(token.indexOf('#') > -1)

                        {

                                    var bits = token.split('#');

                                    var tagName = bits[0];

                                    var id = bits[1];

                                    var element = document.getElementById(id);

                                    if(tagName && element.nodeName.toLowerCase() != tagName)

                                                return new Array();

                                    currentContext = new Array(element);

                                    continue;

                        }

 

                        if(token.indexOf('.') > -1)

                        {

                                    var bits = token.split('.');

                                    var tagName = bits[0];

                                    var className = bits[1];

                                    if(!tagName)

                                                tagName = '*';

 

                                    var found = new Array;

                                    var foundCount = 0;

                                    for(var h=0;h<currentContext.length;h++)

                                    {

                                                var elements;

                                                if(tagName == '*')

                                                            elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');

                                                else

                                                            elements = currentContext[h].getElementsByTagName(tagName);

 

                                                for(var j=0;j<elements.length;j++)

                                                            found[foundCount++] = elements[j];

                                    }

 

                                    currentContext = new Array;

                                    var currentContextIndex = 0;

                                    for(var k=0;k<found.length;k++)

                                    {

                                                if(found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b')))

                                                            currentContext[currentContextIndex++] = found[k];

                                    }

 

                                    continue;

                }

 

                        if(token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/))

                        {

                                    var tagName = RegExp.$1;

                                    var attrName = RegExp.$2;

                                    var attrOperator = RegExp.$3;

                                    var attrValue = RegExp.$4;

                                    if(!tagName)

                                                tagName = '*';

 

                                    var found = new Array;

                                    var foundCount = 0;

                                    for(var h=0;h<currentContext.length;h++)

                                    {

                                                var elements;

                        if(tagName == '*')

                                                            elements = currentContext[h].all ? currentContext[h].all : currentContext[h].getElementsByTagName('*');

                                                else

                                                            elements = currentContext[h].getElementsByTagName(tagName);

 

                                                for(var j=0;j<elements.length;j++)

                                                            found[foundCount++] = elements[j];

                                    }

 

                                    currentContext = new Array;

                                    var currentContextIndex = 0;

                                    var checkFunction;

                                    switch(attrOperator)

                                    {

                                                case '=':

                                                            checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };

                                                            break;

                                                case '~':

                                                            checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };

                                                            break;

                                                case '|':

                                                            checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };

                                                            break;

                                                case '^':

                                                            checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };

                                                            break;

                                                case '$':

                                                            checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };

                                                            break;

                                                case '*':

                                                            checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };

                                                            break;

                                                default :

                                                            checkFunction = function(e) { return e.getAttribute(attrName); };

                                    }

 

                                    currentContext = new Array;

                                    var currentContextIndex = 0;

                                    for(var k=0;k<found.length;k++)

                                    {

                                                if(checkFunction(found[k]))

                                                            currentContext[currentContextIndex++] = found[k];

                                    }

 

                                    continue;

                        }

 

                        tagName = token;

                        var found = new Array;

                        var foundCount = 0;

                        for(var h=0;h<currentContext.length;h++)

                        {

                                    var elements = currentContext[h].getElementsByTagName(tagName);

                                    for(var j=0;j<elements.length; j++)

                                                found[foundCount++] = elements[j];

                        }

 

                        currentContext = found;

            }

 

            return currentContext;

}

 

 

}// end of scope, execute code

if(document.createElement && document.getElementsByTagName && !navigator.userAgent.match(/opera\/?6/i))

            com_stewartspeak_replacement();

 
