/**
 * Copyright (C) 2008 Brightcove, Inc.  All Rights Reserved.  No
 * use, copying or distribution of this work may be made except in
 * accordance with a valid license agreement from Brightcove, Inc.
 * This notice must be included on all copies, modifications and
 * derivatives of this work.
 *  
 * Brightcove, Inc MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT
 * THE SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED,
 * INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
 * NON-INFRINGEMENT. BRIGHTCOVE SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED
 * BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS
 * SOFTWARE OR ITS DERIVATIVES.
 * 
 *
 * "Brightcove" is a trademark of Brightcove, Inc.
 * 
 * @description JS Example on how to play external Ads
 **/

    var player;
    var adModule;
	var expMod;
	
	var externalBannerOrig = ""; // store contents of banner that may be temporarily replaced by companion ads

    // called when template loads, we use this to store a reference to the player and modules
    // and add event listeners for external Ads
    function onTemplateLoaded(experienceID) {

		// 'experienceID' is equivalent to the html object id (ie: "myExperience")
		player = brightcove.getExperience(experienceID);
		// Get a reference to the Ad Module API
		adModule = player.getModule(APIModules.ADVERTISING);
		//Enabled External Ads
		adModule.enableExternalAds(true);
		
		// mainly for debug messages
		expMod = player.getModule(APIModules.EXPERIENCE);
		 expMod.debug("exp module is loaded in externalad.js");
		 
		// Add a callback function for the external Ads    event
		adModule.addEventListener(BCAdvertisingEvent.EXTERNAL_AD, onExternalAd);
		adModule.addEventListener(BCAdvertisingEvent.AD_COMPLETE, onAdComplete);    
    }


	// This is only called when the ad encountered is not handled automatically 
	// by the player (determined in the player's BEML template)
	// This is designed specifically to handle ad types that contain video ad and
	// a banner (eg, synchedBanner aka Videopod ad type) - see BC documentation on ad types
    function onExternalAd(evt) {

        // We expect evt.ad contains the synchedBanner XML
            
          // Create an XML doc with externalAd XML sent by the player
        var adXML = getXMLDoc(evt.ad);
        
        //Extract specific XML nodes for a video Ad
        var videoAd = getVideoAd(adXML);
        //Extract specific XML nodes for a Banner
        var bannerAd = getCollapsedBanner(adXML);
        
        // Render a video Ad using the Adverstising module
        adModule.showAd(videoAd); 
        
        // Add an external banner to the HTML page using JS
        var externalBanner = document.getElementById("externalBanner");
		externalBannerOrig = externalBanner.innerHTML; // store original contents
		
		if (bannerAd.collapsedBannerURL.lastIndexOf('.swf') > -1) {
			// swf animation - assume the url is already embedded in the swf
			
			/* Note below we use a var named collapseBanner just cuz that's what was in original code; we're actually using the expandedBanner info tho.
				(recall in the videoPod aka synchedBanner ad xml, there are both expandedBanner & collapsedBanner objects; 
				it seems Rogers uses the expandedBanner only as the companion banner)
			*/
			externalBannerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" ';
			externalBannerHTML += 'codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="300" height="250" title="ad"';
			externalBannerHTML += ' style="z-index: -2;"><param name="movie" value="' + bannerAd.collapsedBannerURL;
			externalBannerHTML += '"><param name="quality" value="high"><param name="wmode" value="transparent"><embed src="';
			externalBannerHTML += bannerAd.collapsedBannerURL + '" quality="high"';
			externalBannerHTML += ' pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash"';
			externalBannerHTML += ' type="application/x-shockwave-flash"></embed></object>';

			externalBanner.innerHTML = externalBannerHTML;
			
		/* } else if (bannerAd.collapsedBannerURL.lastIndexOf('.jpg') > -1){
			// jpg & url
	        //writes out the regular anchor/tag to the externalBanner div
			var externalBannerHTML = "<a href='" + bannerAd.collapsedBannerClickURL + "' target='_blank' ><img src='" + bannerAd.collapsedBannerURL + "' /></a>";
			externalBanner.innerHTML = externalBannerHTML;
			*/
		} else {
			// Sometimes the URL has .jpg extension but not always.  So just treat as image URL and display it accordingly
			var externalBannerHTML = "<a href='" + bannerAd.collapsedBannerClickURL + "' target='_blank' ><img src='" + bannerAd.collapsedBannerURL + "' /></a>";
			externalBanner.innerHTML = externalBannerHTML;
		}


    }

    function onAdComplete(evt) {
        // Remove the banner on Ad Complete    
        var externalBanner = document.getElementById("externalBanner");        
        externalBanner.innerHTML = externalBannerOrig;
    }
    
    // Parses a synchedBanner ad XML and creates a video Ad 
    // Change accordingly to the XML that you are trafficking as external ad.
    function getVideoAd(adXML){
        var videoAd = new Object();
       
        videoAd.type = "videoAd";
        
		expMod.debug("name of first node in adXML: " + adXML.firstChild.nodeName);
					 
        var nodeItems = adXML.firstChild.childNodes.length;
        var currentNode = adXML.firstChild.firstChild;
        
        //get the root node attributes
        videoAd.duration = (adXML.firstChild.getAttribute("duration")) ? adXML.firstChild.getAttribute("duration") : 15;
        if(adXML.firstChild.getAttribute("trackStartURLs")) videoAd.trackStartURLs = adXML.firstChild.getAttribute("trackStartURLs").split(",");
        if(adXML.firstChild.getAttribute("trackMidURLs") ) videoAd.trackMidURLs = adXML.firstChild.getAttribute("trackMidURLs").split(",");
        if(adXML.firstChild.getAttribute("trackEndURLs") ) videoAd.trackEndURLs = adXML.firstChild.getAttribute("trackEndURLs").split(",");
        if(adXML.firstChild.getAttribute("trackPointURLs") ) videoAd.trackPointURLs = adXML.firstChild.getAttribute("trackPointURLs").split(",");
        videoAd.trackPointTime = (adXML.firstChild.getAttribute("trackPointTime") ) ? adXML.firstChild.getAttribute("trackPointTime") : 0;
    
        for(var i = 0; i < nodeItems; i++)
        {
            //checks to see if the current nodes are in our Rich Media Templates and assigns them if they exist
            if(currentNode.nodeName == "videoURL" && currentNode.firstChild) videoAd.videoURL = currentNode.firstChild.nodeValue; 
            if(currentNode.nodeName == "videoClickURL" && currentNode.firstChild) videoAd.videoClickURL = currentNode.firstChild.nodeValue;            
            currentNode = currentNode.nextSibling;
        }
        
        return videoAd;
    }    

    // Parses a synchedBanner ad XML and returns an object with the collapse banner URL and click URL
    // Change accordingly to the XML format that you traffic as external ad
	// UPDATE: We get the expandedBanner info now, instead of collapsebanner
    function getCollapsedBanner(adXML){
        var collapsedAd = new Object(); 
        
        var nodeItems = adXML.firstChild.childNodes.length;
        var currentNode = adXML.firstChild.firstChild;
            
        for(var i = 0; i < nodeItems; i++)
        {
            // Get only the expandedBanner attributes from the ad XML - this is the banner info
			if (currentNode.nodeName == "expandedBannerURL" && currentNode.firstChild) {
				collapsedAd.collapsedBannerURL = currentNode.firstChild.nodeValue;
			}
			if (currentNode.nodeName == "expandedBannerClickURL" && currentNode.firstChild) {
				collapsedAd.collapsedBannerClickURL = currentNode.firstChild.nodeValue;
			}
			/*
			// Original code from Brightcove
            if(currentNode.nodeName == "collapsedBannerURL" && currentNode.firstChild) collapsedAd.collapsedBannerURL = currentNode.firstChild.nodeValue;
            if(currentNode.nodeName == "collapsedBannerClickURL" && currentNode.firstChild) collapsedAd.collapsedBannerClickURL = currentNode.firstChild.nodeValue;
            */
			
            currentNode = currentNode.nextSibling;
        }
                
        return collapsedAd;
    }    
    function getXMLDoc(pXML){
    
        var adXML;
        if (window.ActiveXObject) {
            //parses the XML for IE browsers
            adXML = new ActiveXObject("Microsoft.XMLDOM");
            adXML.async = false;
            adXML.loadXML(pXML);
        }
        else //parses the XML for Mozilla browsers
            if (window.XMLHttpRequest) {
                adXML = (new DOMParser()).parseFromString(pXML, "text/xml"); 
            }
    return adXML;        
    }
