(function(){
 
  var tagId = '';
  var ignoreTags = 'script,a,h[1-6]';
  var classNames = '';
  var ignoreClassNames = 'postmetadata,meta';
  var lid = '';
  var target = 'blank';
  var allowedClassDepth = 0;
  var ext = '?';
  var cty = 'CTY=41';
  
  if(lid) ext += lid + '&';
  ext += cty;
  
  var keywords = {
'PetCareRx' : 'buy-petcarerx.at/yeepage','Wedding Plan' : 'weddinginsurance.at/yeepage','buy.at UK Cheque payments' : 'buyatukcheque.at/yeepage','Weddingplan Wedding Insurance' : 'weddinginsurance.at/yeepage','New Product Launched - ShopCentral.' : 'shopcentral-nra.at/yeepage',
};
  
  function parseDomNode(elm, inAllowedClass, depth) 
  {
    // 1=element node, 3=text node
    if(!elm || (elm.nodeType != 1 && elm.nodeType != 3)) return;
    
    if(depth > 0 && depth == allowedClassDepth)
    {
      inAllowedClass = false;
    }
    
    // ignore elements in the exclude list
    if(elm.nodeType == 1) 
    {
      var ignore = ignoreTags.split(',');
      var i = ignore.length;
      while(i--)
      {
        if(new RegExp('^'+ignore[i]+'$','i').test(elm.tagName)) return;
      }
    }
    
    // ignore elements with class in class blacklist
    if(elm.className && elm.className != '' && ignoreClassNames != '')
    {
      var regex = new RegExp("(^|,)" + elm.className + "(,|$)", "i");
      if(regex.test(ignoreClassNames)) return;
    }
    
    // ONLY include elements with class in class whitelist
    if(classNames != '' && !inAllowedClass)
    {
      if(elm.className && elm.className != '')
      {
        var regex = new RegExp("(^|,)" + elm.className + "(,|$)", "i");
        if(regex.test(classNames)) 
        {
          // Set this flag to say we are in a child element that has a parent with an allowed class name
          inAllowedClass = true;
          allowedClassDepth = depth;
        }
      }
    }

    var replacedNodeValue = false;
    var i=elm.childNodes.length;
    while(i--)
    {      
      if(elm.childNodes[i].nodeType == 1)
      {
        parseDomNode(elm.childNodes[i], inAllowedClass, (depth + 1));
      }
      else if (elm.childNodes[i].nodeType == 3 && inAllowedClass)
      {
        theString = elm.childNodes[i].nodeValue.replace(/^\s+|\s+$/g, ''); // trim all whitespace
    
        if(theString.length >= 2) // no brand terms are less than 2 chars long
        {
          tmpString = elm.childNodes[i].nodeValue;
          
          // protect existing &gt; and &lt; entities
          tmpString = tmpString.replace(/([<>])/g, '#$1#');
      
          // set nodeValue (this auto converts < to &lt; which we undo later)
          elm.childNodes[i].nodeValue = replaceString(tmpString);
          replacedNodeValue = true;
        }
      }     
    }
    
    var tmpString = new String();
    
    if(replacedNodeValue)
    {
      tmpString = elm.innerHTML;
      
      // replace html entity angle brackets that are created by setting nodeValue above 
      tmpString = tmpString.replace(/(^|[^#])&gt;([^#]|$)/g, '$1>$2');
      tmpString = tmpString.replace(/(^|[^#])&lt;([^#]|$)/g, '$1<$2');
    }
    
    if(depth == 0)
    {          
      if(tmpString.length==0) tmpString = elm.innerHTML;
      
      // unprotect existing entities
      tmpString = tmpString.replace(/#&([gl])t;#/gi, '&$1t;');
      tmpString = tmpString.replace(/#>#/gi, '&gt;'); // safari/chrome bug 
      
      // remove suppress char '@' taking care with email addresses
      tmpString = tmpString.replace(/(^|[^\w])@(\w+)/g, '$1$2');
    }

    if(tmpString.length > 0 && elm && typeof elm == 'object' && (elm.nodeType == 1 || elm.nodeType == 3) && elm.nodeName != 'BODY' && elm.innerHTML) elm.innerHTML = tmpString;
  }
     
  function replaceString(theString) 
  {
    for(var keyword in keywords)
    {
      if(keywords.hasOwnProperty(keyword))
      {
        var rel = (target=='blank') ? ' rel="buyat"' : '';
        var regex = new RegExp('(^|[^@>\\w])' + keyword + '([^<\\w]|$)','g');
        theString = theString.replace(regex, '$1<a href="http://'+keywords[keyword]+ext+'"'+rel+'>'+keyword+'</a>$2');
      }
    }
    return theString;
  }
   
  function replaceBrands() 
  {          
    var rows = (tagId != "") ? tagId.split(',') : document.getElementsByTagName('body');
    
    var i = rows.length;
    while(i--)
    {
      var e = (tagId != "") ? document.getElementById(rows[i]) : rows[i];
      parseDomNode(e, (classNames)?false:true, 0);
    }
    
    var midTime = new Date().getTime();
    
    if(target == 'blank') 
    {
      applyOpenNewWindow();
    }
  }
    
  function applyOpenNewWindow()
  {
    var links = document.getElementsByTagName('A');
    var i = links.length;
    while(i--)
    {
      if(links[i].rel && links[i].rel == 'buyat')
      {
        links[i].removeAttribute('rel');
        links[i].onclick = function(){return!window.open(this.href)}
      }
    }
  }

  // DOM ready and event handler stuff
  startStack=function() { };
  registerOnLoad = function(func) {
   var orgOnLoad = startStack;
    startStack = function () {
      orgOnLoad();
      func();
      return;
    }
  } 

  var ranOnload=false;
  if (document.addEventListener)
  {
    document.addEventListener('DOMContentLoaded', function(){ 
      if(!ranOnload){ ranOnload=true; startStack(); }
    }, false);
  }
  else if (document.all && !window.opera)
  {
    document.write('<scr' + 'ipt id="DOMReady" defer=true ' + 'src=//:><\/scr' + 'ipt>');  
    document.getElementById('DOMReady').onreadystatechange=function(){
      if (this.readyState=='complete'&&(!ranOnload)){ ranOnload=true; startStack(); }
    }
  }
  
  registerOnLoad(replaceBrands);
  
}());
