/*	Insert dart banner iframe with external 'Dart' advertising content
		author: mike foskett - http://websemantics.co.uk/
		
		Version: 2.3 - 09/07/2011

			History: 
				Version: 2.3 - 09/07/2011 [Safari now gets the no JavaScript static image]
				Version: 2.2a - 07/06/2011 [removed dart insertion on Safari browser due to Flash issues]
				Version: 2.2 - 23/06/2009 [added encapsulation]
				Version: 2.1b - 23/06/2009 [BIP overwrite repair]
				Version: 2.1a - 19/05/2009 [single random number generation per page]
*/

var dartBanner = (function(){

	var randomNumber=Math.random()*10000000000000000, // Use same random number on all Dart banners on a single page.
      dcoptIST=true, // dcopt=ist is set only once on a single page.

	    getElementsByClassName2=function(className,tag,elm){
        // author: Robert Nyman - http://www.robertnyman.com/2008/05/27/the-ultimate-getelementsbyclassname-anno-2008/
        if(document.evaluate){
          getElementsByClassName2=function(className,tag,elm){
            var j,
                classes=className.split(" "),
                classesToCheck="",
                xhtmlNamespace="http://www.w3.org/1999/xhtml",
                namespaceResolver=(document.documentElement.namespaceURI===xhtmlNamespace)? xhtmlNamespace:null,
                returnElements=[],
                elements,
                node,
                jl;
            tag=tag||"*";
            elm=elm||document;
            for(j=0,jl=classes.length;j<jl;j+=1){classesToCheck+="[contains(concat(' ',@class,' '),' "+classes[j]+" ')]";}
            try	{elements=document.evaluate(".//"+tag+classesToCheck,elm,namespaceResolver,0,null);}
            catch (e){elements=document.evaluate(".//"+tag+classesToCheck,elm,null,0,null);}
            while ((node=elements.iterateNext())){returnElements.push(node);}
            return returnElements;
          };
        }else{
          getElementsByClassName2=function(className,tag,elm){
            var k,kl,l,ll,m,ml,
                classes=className.split(" "),
                classesToCheck=[],
                elements,
                current,
                returnElements=[],
                match;
            tag=tag||"*";
            elm=elm||document;
            elements=(tag==="*"&&elm.all)?elm.all:elm.getElementsByTagName(tag);
            for(k=0,kl=classes.length;k<kl;k+=1){classesToCheck.push(new RegExp("(^|\\s)"+classes[k]+"(\\s|$)"));}
            for(l=0,ll=elements.length;l<ll; l+=1){
              current=elements[l];
              match=false;
              for(m=0,ml=classesToCheck.length;m<ml;m+=1){
                match=classesToCheck[m].test(current.className);
                if (!match){break;}
              }
              if (match){returnElements.push(current);}
            }
            return returnElements;
        };}
        return getElementsByClassName2(className,tag,elm);
      };

	// author: mike foskett - http://webSemantics.co.uk/
	function $id(i){return(document.getElementById(i)||false);}
  function idExists(i){return(document.getElementById(i)!==null);}
	function replaceContent(id,content){if(idExists(id)){$id(id).innerHTML=content;}}
	// author: Simon Willisons - http://simonwillison.net/2004/May/26/addLoadEvent/
	function addLoadEvent(f){var o=window.onload;if(typeof window.onload!=='function'){window.onload=f;}else{window.onload=function(){if(o){o();}f();};}}

	function advertCode(id){
		var values=id.split("_"),
        tile,
        show=true,
        zonename,
        type,
        dcopt="",
        sz=";sz=160x600",
        width="160",
        height="600",
        ord=";ord=123456789",
        str="";
		if (values.length===6){
			// there should always be 6 items

			// Check for branding collision
			tile=values[2]; // == unique tile number (1==left,2==centre,3==right)
			if (tile==="1" && idExists('brandLeft')){$id(id).style.display="none";show=false;}
			if (tile==="2" && idExists('brandHeaderBottom')){$id(id).style.display="none";show=false;}
			if (tile==="3" && idExists('brandRight')){$id(id).style.display="none";show=false;}

			if (show){
				zonename=values[0]; // == category
				type=(values[1]==="all")?"":";kw="+values[1]; // == subcategory
				tile=";tile="+tile; // == unique tile number (1==left,2==centre,3==right)

				// dcopt=ist may only appear once on a single page
				if (dcoptIST){
					dcopt=";dcopt="+values[3];
				}

				// get the size sets, and width and height. Note: There may be more than one.
				switch(values[4]){
					case "s1":
					  sz=";sz=160x600";
					  sz+=",120x600";
					  break;    
					case "s2":
					  sz=";sz=300x250";
					  width="300";
					  height="250";
					  break;  
					case "s3":
					  sz=";sz=180x150";
					  width="180";
					  height="150";
					  break;
					case "s4":
					  sz=";sz=120x600";
					  width="120";
					  height="600";
					  break;
				}

				// ordering of banners
				switch(values[5]){
					case "o1":
					  ord=";ord="+randomNumber.toString(10);
					  break;    
					case "o2":
					  ord=";ord=123456789";
					  break;
					case "o3":
					  ord=";ord=[timestamp]"; // not implemented as yet
					  break;
				}

				str+='<iframe src="http:\/\/ad.uk.doubleclick.net\/adi\/tesco.com.direct\/'+zonename+type+tile+sz+dcopt+ord+'?" width="'+width+'" height="'+height+'" title="Advertising" frameborder="0" style="margin:0; border:0 solid; padding:0" scrolling="no">';
				str+='<script type="text\/javascript" src="http:\/\/ad.uk.doubleclick.net\/adj\/tesco.com.direct\/'+zonename+type+tile+sz+dcopt+ord+'?"><\/script>';
				str+='<\/iframe>';
        if (navigator.userAgent.indexOf("Safari")>0){ // show the noscript version to Safari to prevent it from getting any Flash inserts
          str=  '<a href="http://ad.uk.doubleclick.net/jump/tesco.com.direct/'+zonename+type+tile+sz+ord+'?">';
          str+= '<img src="http://ad.uk.doubleclick.net/ad/tesco.com.direct/'+zonename+type+tile+sz+ord+'?" style="border:0 solid" width="'+width+'" height="'+height+'" title="" alt="Advert banner" />';
          str+= '</a>';
        }
        replaceContent(id,str);
	}	}	}

	function installDart(){
    var i,
        brands=getElementsByClassName2('brand'),
        darts=getElementsByClassName2('dart');

    // is there anything with a class="brand" ?
    if (brands.length){return;}
      
    // get all objects with a class="dart"
    if (darts){
      i = darts.length;
      //for (i=0;i<darts.length;i+=1){
      while (i--) {
        advertCode(darts[i].id);
        dcoptIST=false;
	}	}	}

    return{ // public functions
			addLoadEvent:addLoadEvent,
			installDart:installDart
    };

}());

dartBanner.addLoadEvent(dartBanner.installDart);
