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.
*/

/*
Customised by Ben Jones / e-motion design 2007
*/

/*
Add in your list of style replacements here:

replaceSelector( CSS-SELECTOR , URL-TO-GENERATOR , BREAK-WORDS );

CSS-SELECTOR : This is the CSS selector which will be matched and have its contents replaced with an image
URL-TO-GENERATOR : This is the path to the PHP image generation script. Note that you should append parameters as required, these parameters are detailed in the font_generator.php source.
BREAK-WORDS: If true then the output will be broken into separate words. Recommended off for layout purposes.

OPTIONS (passed as GET parameters via URL)

PARAMETER = EXAMPLE ; DESCRIPTION

fontfile = arial.ttf ; The font file to use for generation, string
fontsize = 12 ; The font size in pixels to generate, integer
fontcolour = ff0088 ; The colour of the text to generate, hex without leading hash
background = 00ff00 ; The background colour of the generated image, hex without leading hash
transparent = true ; Make the background transparent? true or false
kerning = 3.3 ; Extra kerning to apply between characters, float
case = upper ; Convert text to uppercase/lowercase or leave as entered? upper, lower or empty
notrim = true ; Trim leading and trailing whitespace? true or false

TEMPORARY

endspaces = 3 ; The number of spaces to append to end of string to fix bounding box problems

*/

replaceSelector("#bottom h3","fonts/font_generator.php?fontfile=Angelina.TTF&fontsize=35&fontcolour=006E76&background=FFFFFF&kerning=0.5&endspaces=0",false);
replaceSelector("#right .module-database h3","fonts/font_generator.php?fontfile=Angelina.TTF&fontsize=35&fontcolour=006E76&background=FFFFFF&kerning=0.5&endspaces=0",false);
//replaceSelector("#content h3","fonts/font_generator.php?fontfile=Angelina.TTF&fontsize=27&fontcolour=006E76&background=FFFFFF&kerning=0.5&endspaces=0",false);

var testURL = "images/blank.png" ;

var doNotPrintImages = false;
var printerCSS = "replacement-print.css";

var hideFlicker = false;
var hideFlickerTimeout = 5000;




/* ---------------------------------------------------------------------------
    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('<style type="text/css" id="hide-flicker">');             
        for(var i=0;i<items.length;i++) {
			document.write( items[i].selector );
			if ( i < items.length-1 ) document.write( ',' );
		}
		document.write( '{ visibility: hidden; }' );
        document.write('</style>');             
        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 ;
                        if(elements[j].firstChild.className == "replacement")
                        	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 urlJoiner = '';
                                if ( items[i].url.indexOf( '?' ) >= 0 ) {
                                        urlJoiner = '&';
                                } else {
                                        urlJoiner = '?';
                                }
                                var url = items[i].url + urlJoiner + "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);
        alert("Disable invisibility" + enabled);
        if(sheet) {
        	sheet.disabled = (!enabled);
        	sheet.parentNode.removeChild(sheet);
        } 
}

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 (!element || (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('(\\s|^)'+className+'(\\s|$)')))
                                        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('(\\s|^)'+attrValue+'(\\s|$)'))); };
                                        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();
