/**************************************** XMLParser ***************************************************/

var XMLParser = new Object();
XMLParser.parseFromString = function(str) {
    if (typeof DOMParser != "undefined") {
        var parser = new DOMParser();
        return parser.parseFromString(str, "application/xml");
    }
	
    if (typeof ActiveXObject != "undefined") {
        var d = new ActiveXObject("MSXML.DomDocument");
        d.loadXML(str);
        return d;
    } 
    
    if (typeof XMLHttpRequest != "undefined") {
        var req = new XMLHttpRequest();
        req.open("GET", "data:application/xml" +
                     ";charset=utf-8," + encodeURIComponent(str), false);
        if (req.overrideMimeType) {
            req.overrideMimeType("application/xml");
        }
        req.send(null);
        return req.responseXML;
    }
}

XMLParser.getText = function(node) {
    try {
        return node.firstChild.nodeValue;
    } catch (e) {
        //alert(node.childNodes.length);
        return "";
    }
}

XMLParser.listNodes = function(parent, name, ns) {
    // deal with the difference between IE and FF when it comes to elements with a namespace
    if (!parent.getElementsByTagNameNS && ns) {
        return parent.getElementsByTagName(ns + ':' + name);
    } else {
        return parent.getElementsByTagName(name)
    }
},

XMLParser.parseTabs = function(xmlStr) 
{     
    var lowerCaseStr = xmlStr.toLowerCase();
    
    var out = new Array();
    
    //not lower case string
    var dom = XMLParser.parseFromString(xmlStr);
    //var dom = XMLParser.parseFromString(lowerCaseStr);
   
    var rss = this.listNodes(dom, "rss");
    var channel = this.listNodes(rss[0], "channel");
    var tabs = this.listNodes(channel[0], "tab");
    
    for (var k = 0; k < tabs.length; k++) {
            
        var tabName = this.getText(this.listNodes(tabs[k], "tabName")[0]);
        var xmlUrl = this.getText(this.listNodes(tabs[k], "xmlUrl")[0]);
        var dataMsg = this.getText(this.listNodes(tabs[k], "dataMsg")[0]);
        
        
        //make new tab Object Here
        out.push(new ctv.ca.TabList(tabName, xmlUrl, dataMsg));
    }
    
    return out;
    
},
  
// returns an array of hrefs
XMLParser.parseASX = function(xmlStr) 
{
    var out = new Array();
    var dom = XMLParser.parseFromString(xmlStr);
    
    var refs = this.listNodes(dom, "ref");
    for (var i = 0; i < refs.length; i++) {   
        out.push(refs[i].getAttribute("href"));
    }
    return out;
}

// returns an array of hrefs
XMLParser.parseMediaUrls = function(xmlStr, parentClip) 
{
    if (xmlStr.indexOf('entry') > 0)
        return XMLParser.parseMediaUrlsStandard(xmlStr, parentClip);
    else 
        return XMLParser.parseMediaUrlsLowerCase(xmlStr, parentClip);
}

XMLParser.parseMediaUrlsLowerCase = function(xmlStr, parentClip) 
{
    var lowerCaseStr = xmlStr.toLowerCase();
    
    var out = new Array();
    var dom = XMLParser.parseFromString(lowerCaseStr);
    
    var entryArr = this.listNodes(dom, "entry");
    
    for (var k = 0; k < entryArr.length; k++) {
        var ref = this.listNodes(entryArr[k], "ref");
        var url = "";
        var mediaType = "wmv";
        var coAd = "";
        var startUrl = "";
        var endUrl = "";
        var vid = 0;
        
        if (ref != null) 
            url = ref[0].getAttribute("href"); 
        
        var params = this.listNodes(entryArr[k], "param");
        for (var i = 0; i < params.length; i++) {            
            var name = params[i].getAttribute("name"); 
            if (name == "mediatype") { 
                mediaType = params[i].getAttribute("value");
            } else if (name == "coad") {
                coAd = params[i].getAttribute("value");
            } else if (name == "starturl") {
                startUrl = params[i].getAttribute("value");
            } else if (name == "endurl") {
                endUrl = params[i].getAttribute("value");
            } else if (name == "vid") {
                vid = params[i].getAttribute("value");
            }   
        }
        
        var isAd = false;
        var clipTitle = "";
        var showTypeId = 0;
        var showTypeName = "";
        var season = 0;
        var episode = 0;
        var clipCat = "";
        if (parentClip == null)
            isAd = true;
        else
        {
            clipTitle = parentClip.clipTitle;
            showTypeId = parentClip.showTypeId;
            showTypeName = parentClip.showTypeName;
            season = parentClip.season;
            episode = parentClip.episode;
            clipCat = parentClip.clipCat;       
        }
        
        if (url != "")
        {
            var pos = lowerCaseStr.indexOf(url);
            url = xmlStr.substr(pos, url.length);
            out.push(new ctv.ca.MediaUrl(url, mediaType, coAd, startUrl, endUrl, vid, clipTitle, showTypeId, showTypeName, season, episode, clipCat, isAd));
        }
    }
    return out;
}

XMLParser.parseMediaUrlsStandard = function(xmlStr, parentClip) 
{
    var out = new Array();
    var dom = XMLParser.parseFromString(xmlStr);
    
    var entryArr = this.listNodes(dom, "entry");
    
    for (var k = 0; k < entryArr.length; k++) {
        var ref = this.listNodes(entryArr[k], "ref");
        var url = "";
        var mediaType = "wmv";
        var coAd = "";
        var startUrl = "";
        var endUrl = "";
        var vid = 0;

        
        if (ref != null) 
            url = ref[0].getAttribute("href"); 
        
        var params = this.listNodes(entryArr[k], "param");
        for (var i = 0; i < params.length; i++) {            
            var name = params[i].getAttribute("name"); 
            if (name == "mediaType") { 
                mediaType = params[i].getAttribute("value");
            } else if (name == "coAd") {
                coAd = params[i].getAttribute("value");
            } else if (name == "startUrl") {
                startUrl = params[i].getAttribute("value");
            } else if (name == "endUrl") {
                endUrl = params[i].getAttribute("value");
            } else if (name == "vid") {
                vid = params[i].getAttribute("value");
            }               
        }
        
        var isAd = false;
        var clipTitle = "";
        var showTypeId = 0;
        var showTypeName = "";
        var season = 0;
        var episode = 0;
        var clipCat = "";
        if (parentClip == null)
            isAd = true;
        else
        {
            clipTitle = parentClip.clipTitle;
            showTypeId = parentClip.showTypeId;
            showTypeName = parentClip.showTypeName;
            season = parentClip.season;
            episode = parentClip.episode;
            clipCat = parentClip.clipCat;       
        }
        
        out.push(new ctv.ca.MediaUrl(url, mediaType, coAd, startUrl, endUrl, vid, clipTitle, showTypeId, showTypeName, season, episode, clipCat, isAd));
    }
    return out;
}

XMLParser.parsePlayList = function(playList, xmlStr) 
{
    var dom = XMLParser.parseFromString(xmlStr);
    var od = this.listNodes(dom, "overdrive");
    var gateway = this.listNodes(od[0], "gateway");
    var content = this.listNodes(gateway[0], "content");
    
    //debug(content.length);
    
    var videoIdx = 0;
    for (var i = 0; i < content.length; i++) {
	    //deter if there is a playlist
        var pl = this.listNodes(content[i], "playlist");
        var elements = this.listNodes(pl[0], "element");
		
		if (elements.length == 0)
			continue;
	
        var meta = this.listNodes(content[i], "meta");
        var image = this.getText(this.listNodes(meta[0], "image")[0]);
        var title = this.getText(this.listNodes(meta[0], "headline")[0]);
        var desc = this.getText(this.listNodes(meta[0], "subhead")[0]);
        var video = new ctv.ca.VideoObject(playList.index, videoIdx, content[i].getAttribute("id"), content[i].getAttribute("typeid"), content[i].getAttribute("type"),
                                            image, title, desc, new Array());
        playList.videos.push(video);
        videoIdx++;
              
        var clipIdx = 0;
        for (var j=0; j<elements.length; j++) {
            var vid = elements[j].getAttribute("id");
            var vTypeId = elements[j].getAttribute("vidtype");
            var imageUrl = this.getText(this.listNodes(elements[j], "imageurl")[0]);
            var title = this.getText(this.listNodes(elements[j], "title")[0]);
            var description = this.getText(this.listNodes(elements[j], "description")[0]);
			var streamUrl = this.getText(this.listNodes(elements[j], "videourl")[0]);
            
            var vidTypeName = elements[j].getAttribute("vidtypename");
            var arr = vidTypeName.split("|");
            var showTypeId = 0;
            var showTypeName = "";
            var season = "";
            var episode = "";
            var clipCat = "";

            if (arr.length == 5)
            {
                showTypeId = arr[0];
                showTypeName = arr[1];
                season = arr[2];
                episode = arr[3];
                clipCat = arr[4];
            }
            
            video.clips.push(new ctv.ca.ClipObject(playList.index, video.videoIndex, clipIdx, vid, vTypeId, imageUrl, title, description,
                                                    showTypeId, showTypeName, season, episode, clipCat, streamUrl));
            clipIdx++;
        }
    }    
  
}



