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("h3","imgreplace/imgrep_headline.php",true);
replaceSelector("h2","imgreplace/imgrep_headline_2.php",true);
replaceSelector(".main_navigation_active","imgreplace/imgrep_navigation.php",false);
replaceSelector(".main_navigation_a","imgreplace/imgrep_navigation.php",false);


var testURL = "design/trans50.png";

var doNotPrintImages = false;
var printerCSS = "replacement-print.css";

var hideFlicker = true;
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();

