(function(){
 
  var tagId = '';
  var ignoreTags = 'script,a,h[1-6]';
  var classNames = '';
  var ignoreClassNames = 'postmetadata,meta';
  var lid = 'LID=allbabesctl';
  var target = 'blank';
  var allowedClassDepth = 0;
  var ext = '?';
  var cty = 'CTY=41';
  
  if(lid) ext += lid + '&';
  ext += cty;
  
  var domains = ["reunionsubscriptions.at/samishra","lendingexchange.at/samishra","ticketsus.at/samishra","buy-marketnews.at/samishra","ticketsus.at/samishra","shopcentral-nra.at/samishra"];
  var keywords = ["MyLife.com","LendingTree","Ticketmaster","TheStreet.com","Ticketmaster US","New Product Launched - ShopCentral."];
  
	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) 
	{
    var i = keywords.length;
    while(i--)
	  {      
      var rel = (target=='blank') ? ' rel="buyat"' : ''; // this will be removed later
      // replace keyword with affiliate link if not prefixed by suppress char '@' (or already indside <a> tag)
	    var regex = new RegExp('(^|[^@>\\w])' + keywords[i] + '([^<\\w]|$)','g');
      theString = theString.replace(regex, '$1<a href="http://'+domains[i]+ext+'"'+rel+'>'+keywords[i]+'</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);
  
}());