var External_Ad = function (pXML) {
    //private variables
    var xml = "";
    var expandedBannerURL = "";
    var expandedBannerClickURL = "";
    var collapsedBannerURL = "";
    var collapsedBannerClickURL = "";
    var ad = new Object();
    ad.type = "videoAd";
    
    if(pXML == undefined) 
        throw new Error('An External Ad requires the ad XML and type of ad to return');
    
    //private method
    function getXML() {
        if (window.ActiveXObject) {
            //parses the XML for IE browsers
            var adXML = new ActiveXObject("Microsoft.XMLDOM");
            adXML.async = false;
            adXML.loadXML(xml);
        } else if (window.XMLHttpRequest) {
            var adXML = (new DOMParser()).parseFromString(xml, "text/xml"); //parses the XML for Mozilla browsers
        }
        return adXML;
    }
    
    function createSWF(pURL, pClickThrough) {
        var objectTag = '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="300" height="250" align="middle">\n';
        objectTag += '\t<param name="allowScriptAccess" value="always" />\n';
        objectTag += '\t<param name="movie" value="' + pURL + '" />\n';
        objectTag += '\t<param name="quality" value="high" />\n';
        objectTag += '\t<param name="bgcolor" value="#ffffff" />\n';
        objectTag += '\t<param name="wmode" value="transparent" />\n'; 
        objectTag += '\t<param name="FlashVars" value="clickTag=' + pClickThrough + '" />\n';
        objectTag += '\t<embed src="' + pURL + '" quality="high" bgcolor="#ffffff" width="300" height="250" name="expandedBanner" align="middle" allowScriptAccess="always" wmode="transparent" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" FlashVars="clickTag='+pClickThrough+'" />\n';
        objectTag += '</object>\n';
        
        return objectTag;
    }
    
    function createImage(pURL, pClickThrough) {
        var HTML = "<a href='" + pClickThrough + "' target='_blank' ><img src='" + pURL + "' /></a>\n";
        return HTML;
    }
    
    //protected method
    this.setXMLString = function(mXML) {
        xml = mXML;
        this.parse();
    };
    
    
    //protected method
    this.setType = function(mType) {
        type = mType;
    };
    
    //protected method
    this.getType = function() {
        return type;
    };
    
    //protected method
    this.getExpandedBannerHTML = function() {
        return (expandedBannerURL.indexOf('.swf') !== -1) ? createSWF(expandedBannerURL, expandedBannerClickURL) : createImage(expandedBannerURL, expandedBannerClickURL);  
    }
    
    //protected method
    this.getCollapsedAd = function() {
        return (collapsedBannerURL.indexOf('.swf') !== -1) ? createSWF(collapsedBannerURL, collapsedBannerClickURL) : createImage(collapsedBannerURL, collapsedBannerClickURL);
    }
    
    //protected method
    this.getVideoAd = function() {
        return ad;
    }
    
    //protected method
    this.parse = function() {
        var xmlDoc = getXML();
        
        var nodeItems = xmlDoc.firstChild.childNodes.length;
        var currentNode = xmlDoc.firstChild.firstChild;
        ad.duration = (xmlDoc.firstChild.getAttribute("duration") !== "") ? Number(xmlDoc.firstChild.getAttribute("duration")) : 15;
        if(xmlDoc.firstChild.getAttribute("trackStartURLs") !== "") ad.trackStartURLs = xmlDoc.firstChild.getAttribute("trackStartURLs").split(",");
        if(xmlDoc.firstChild.getAttribute("trackMidURLs") !== "") ad.trackMidURLs = xmlDoc.firstChild.getAttribute("trackMidURLs").split(",");
        if(xmlDoc.firstChild.getAttribute("trackEndURLs") !== "") ad.trackEndURLs = xmlDoc.firstChild.getAttribute("trackEndURLs").split(",");
        if(xmlDoc.firstChild.getAttribute("trackPointURLs") && (xmlDoc.firstChild.getAttribute("trackPointURLs") !== "")) ad.trackPointURLs = xmlDoc.firstChild.getAttribute("trackPointURLs").split(",");
        ad.trackPointTime = (xmlDoc.firstChild.getAttribute("trackPointTime") && (xmlDoc.firstChild.getAttribute("trackPointTime") !== "")) ? Number(xmlDoc.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) {
                ad.videoURL = currentNode.firstChild.nodeValue; 
            } else if(currentNode.nodeName == "videoClickURL" && currentNode.firstChild) {
                ad.videoClickURL = currentNode.firstChild.nodeValue;
            } else if(currentNode.nodeName.toLowerCase() == "expandedbannerurl" && currentNode.firstChild) {
                expandedBannerURL = currentNode.firstChild.nodeValue;
            } else if(currentNode.nodeName.toLowerCase() == "expandedbannerclickurl" && currentNode.firstChild) {
                expandedBannerClickURL = currentNode.firstChild.nodeValue;
            } else if(currentNode.nodeName.toLowerCase() == "collapsedbannerurl" && currentNode.firstChild) {
                collapsedBannerURL = currentNode.firstChild.nodeValue;
            } else if(currentNode.nodeName.toLowerCase() == "collapsedbannerclickurl" && currentNode.firstChild) {
                collapsedBannerClickURL = currentNode.firstChild.nodeValue;
            }
            
            currentNode = currentNode.nextSibling;
        }
    };
    
    //Constructor code
    this.setXMLString(pXML);
};

External_Ad.prototype = {

    getExpandedAd: function() {
        return this.getExpandedBannerHTML();
    },
    
    getCollapsedAd: function() {
        return this.getCollapsedAd();
    },
    
    getVideoAd: function() {
        return this.getVideoAd();
    }
};

