/**
 * 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

	// track number of vids viewed, used as counter for ad refresh functionality
	var numViewed = 0;

    // 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);
		
		// Grab videoplayer module & use it for detecting media change (ad refresh related)
		vidModule = player.getModule(APIModules.VIDEO_PLAYER);
		vidModule.addEventListener("mediaChange", onVideoChange);


		// Get references to the player modules
		contentMod = player.getModule(APIModules.CONTENT);
		menuMod 	= player.getModule(APIModules.MENU);
		socialMod 	= player.getModule(APIModules.SOCIAL);
		

		// Normally, the getLink button only returns oln.ca without vars
		// but when refresh page for ads, vid & playlist ids specified in URL vars. The GetLInk button picks up these vars & ALWAYS uses them 
		// afterwards even if the user subsequently views other vids. We don't want that (since link to wrong vid)
		// SO we reset the GetLInk URL each time the page loads (ie, to oln.ca w/ no vars), ensuring no erroneous url vars left when user clicks GetLink
		var currentLink = socialMod.getLink();
		if(currentLink.indexOf("?") != -1) {
			currentLink = currentLink.substring(0,currentLink.indexOf("?"));
		}
		socialMod.setLink(currentLink);
		
    }

	// refreshes the right ad panel
	// supposed to be used after every video change as users may stay on the same main page watching multiple videos
	function onVideoChange(evt) {

		numViewed++;
		
		if (numViewed > 4) {
			numViewed = 0;

			tabBar = expMod.getElementByID("playlistTabs");
			playlistId = tabBar.getSelectedData().id;
			videoId = vidModule.getCurrentVideo().id;

			// Get the current page URL remove any existing URL parameter
			var fullURL = document.location.toString();
			if (fullURL.indexOf("?") != -1) {
				var urlPath = fullURL.substring(0,fullURL.indexOf("?"));
			} else { 
				var urlPath = fullURL; 
			}
			
			// Refresh the page adding the current playlist/lineup and  video ids to the URL
			document.location = urlPath + "?bclid=" + playlistId +"&bctid=" + videoId;
	
		}
		/*
		// refresh just the right rail ad bar
		var origcontent = document.getElementById('rightpanel').innerHTML;
		document.getElementById('rightpanel').innerHTML = origcontent;
		*/
	}


	// 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;        
    }
