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", "heading.php", false);
var testURL = "test.png" ;

var doNotPrintImages = false;
var printerCSS = "replacement-print.css";

var hideFlicker = true;
if (navigator.appName.indexOf("Explorer") > -1) hideFlicker = false;
var hideFlickerCSS = "flicker.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();

