// Yahoo Music MyYahoo Module - Jim Bumgardner
YAHOO.Modules.suid_5558234 = 
{

        	__init : function (id, el) 
        	{
                this.mylog("Got an init");
                this.id = id;
                this.el = el;
                this.curSel = 0;
                var savedTab = YAHOO.ModuleAPI.getPref(this.id, "curTab");
                this.curTab = savedTab? Number(savedTab) : 0;
                this.titleAry = [];

                this.isIE = navigator.appName.indexOf("Explorer") != -1;
                this.isIE4 = 0;
                var myHandleMusicSuccess = this.isIE? this.handleMusicSuccessIE : this.handleMusicSuccess;
                var myHandleStationSuccess = this.isIE? this.handleStationSuccessIE : this.handleStationSuccess;

                this.tabSettings = [
                   {rss:"http://rss.music.yahoo.com/charts/rssTopVideos.xml", success:myHandleMusicSuccess,
                    ftLink:"http://music.yahoo.com/musicvideos/lists/top.asp", ftLinkLabel:"View Top 100", hasPlay:true, hackVideoURL: true},
                   {rss:"http://rss.music.yahoo.com/charts/rssTopSongs.xml", success:myHandleMusicSuccess,
                    ftLink:"http://music.yahoo.com", ftLinkLabel:"More Music", hasPlay:true},
                   {rss:"http://rss.music.yahoo.com/charts/rssTopAlbums.xml", success:myHandleMusicSuccess,
                    ftLink:"http://music.yahoo.com", ftLinkLabel:"More Music", hasPlay:false},


// myyahoo_stations.asp retrieves from http://mfcache.us.music.yahoo.com/data/station/category/20.xml
// 

                   {rss:"http://music.yahoo.com/myyahoo/myyahoo_stations.asp", success:myHandleStationSuccess,
                    ftLink:"http://music.yahoo.com/launchcast/stations/default.asp", ftLinkLabel:"View Station Guide", hasPlay:true}
                ];
                var elLink = YAHOO.util.Dom.getElementsByClassName('leftbtn', 'a', this.el)[0]; // returns an array
                YAHOO.util.Event.addListener(elLink, 'click', this.myleftclick, this, true);
                elLink = YAHOO.util.Dom.getElementsByClassName('rightbtn', 'a', this.el)[0]; // returns an array
                YAHOO.util.Event.addListener(elLink, 'click', this.myrightclick, this, true);
                var tabsDiv = YAHOO.util.Dom.getElementsByClassName('tabs', 'div', this.el)[0];
                var tabs = tabsDiv.getElementsByTagName("a");
                this.mylog(tabs.length + " tabs retrieved");
                for (var i = 0; i < 4; ++i)
                {
                  var tab = tabs[i];
                  tab.idx = i;
                  // tab.setAttribute("idx", i);
                  YAHOO.util.Event.addListener(tab, 'click', this.mytabclick, this, true);
                }
                // Enable selected tab
                var liElems = tabsDiv.getElementsByTagName("li");
                liElems[this.curTab].className = (this.curTab == 0? "first " : this.curTab == 3? "last " : "") + "on";
        		// Add "pre" for li which precedes on... (use pre style to hide pipe)
        		if (this.curTab > 0)
                    liElems[this.curTab-1].className = (this.curTab == 1? "first " : "") + "pre";

                this.computeMargins();
                this.loadFeed();
        	    this.mylog("done init");
        	},

        	__edit : function (id, el) 
        	{
        	  // this.mylog("Got an edit");
        	},

        	__resize : function (id, el) 
        	{
              this.id = id;
              this.el = el;
        	  this.mylog("Got a resize");
        	  this.freeNodes();
        	  this.computeMargins();
        	  this.loadNodes();
        	},

        	__refresh : function (id, el) 
        	{
        	  // this.mylog("Got a refresh");
        	},
        	
            // debugging functions
        	mylog : function(str)
        	{
        	   if (window.console)
        	       window.console.log(str);
        	},
        	myIElog : function(str)
        	{
        	  if (this.isIE)
        	      alert(str);
        	},
            dumpItems : function(thing)
            {
               var itemStr = 'items: ';
               for (var item in thing)
               {
                 itemStr += (item + ":" + thing[item] + ", ");
               }
               return itemStr;
            },
           
        	
        	loadFeed : function()
        	{
                
                // http://api.flickr.com/services/feeds/photos_public.gne?id=94832693@N00&format=rss_200
                // http://api.flickr.com/services/rest/?method=flickr.test.echo&api_key=4dcdf65505949a235f53f7a65a73eaa2&api_sig=aa13e77df1b6c9208ed19530a269593f
                // var sUrl = "http://music.yahoo.com/myyahoo/testsongs.xml"; // This url must be registered, see previous documentation
                // var sUrl = "http://api.flickr.com/services/feeds/photos_public.gne?id=94832693@N00&format=rss_200"; // This url must be registered, see previous documentation
                this.oCallback = {
                  success: this.tabSettings[this.curTab].success,
                  failure: this.handleFailure,
                  scope: this,
                  argument: { dummy: 'dmy' }
                };
                var sUrl = this.tabSettings[this.curTab].rss;
                // this.mylog("Loading feed: " + sUrl);
                YAHOO.ModuleAPI.makeRequest( "GET", sUrl, this.oCallback); 
        	},

        	handleStationSuccessIE : function(response)
        	{
        	  var oRoot;
        	  var line = 'a';
        	  if (response.responseXML.parseError.errorCode != 0)
        	  {
        	    alert("A parse error occured: " + response.responseXML.parseError.reason);
        	    return;
        	  }
	          try {
        	     oRoot = response.responseXML.documentElement;
	          } catch (arg)
	          {
    	          alert("failure getting oRoot: " + arg.message);
	             // this.mylog("failure getting oRoot: " + arg);
	             return;
	          }
	          // alert("got station load: " + oRoot);
	          var items;
	          var nbrItems = 0;
	          try {
	            line = 'a';
        	    items = oRoot.getElementsByTagName("STATION");
	            line = 'b';
                nbrItems = Math.min(10,items.length);
	            line = 'c';
                this.mylog(nbrItems + " stations returned");
 	            line = 'd';
               this.curSel = 0;
	            line = 'e';
                this.titleAry = [];
        	  }
        	  catch (arg)
	          {
    	          alert("line " + line + " failure getting station element: " + arg + " :: " + arg.message);
	             // this.mylog("failure getting oRoot: " + arg);
	             return;
	          }
              // alert("begin loading xml");
	          for (var i = 0; i < nbrItems; ++i)
	          {
	            var item = items[i];
	            // var actionLink = "http://launchcast.launch.yahoo.com/radio/play/?p=1&m=" + item.getAttribute("id") + "&forcesplash=1";
	            var actionLink = "http://music.yahoo.com/lc/?rt=1&rp1=" + item.getAttribute("id");
	            var stationPageLink = "http://music.yahoo.com/launchcast/stations/station.asp?i=" + item.getAttribute("id");
	            this.titleAry.push( {rank: i+1, // ranks not relevent for stations?
	                                title: item.getElementsByTagName("NAME")[0].firstChild.nodeValue,
                                    artist: item.getElementsByTagName("NAME")[1].firstChild.nodeValue,
                                    imgUrl: item.getElementsByTagName("IMAGE")[0].firstChild.nodeValue,
                                    actionUrl: actionLink,
                                    artistLink: stationPageLink,
                                    imageLink: stationPageLink, 
                                    lastitem:0
                                    } );
                 var im = new Image();
                 im.src = this.titleAry[i].imgUrl;
	          }
              // alert("Done loading xml");
	          this.mylog("loading nodes");
	          this.freeNodes();
              this.loadNodes();
              // alert("Done loading stations");
        	},
        	

        	handleStationSuccess : function(response)
        	{
        	  var oRoot = response.responseXML.documentElement;
	          var items;
	          var nbrItems = 0;
	          try {
	            line = 'a';
        	    items = oRoot.getElementsByTagName("STATION");
	            line = 'b';
                nbrItems = Math.min(10,items.length);
	            line = 'c';
                this.mylog(nbrItems + " stations returned");
 	            line = 'd';
               this.curSel = 0;
	            line = 'e';
                this.titleAry = [];
        	  }
        	  catch (arg)
	          {
    	          this.mylog("line " + line + " failure getting station element: " + arg + " :: " + arg.message);
    	          this.myIElog("line " + line + " failure getting station element: " + arg + " :: " + arg.message);
	             // this.mylog("failure getting oRoot: " + arg);
	             return;
	          }
              // alert("begin loading xml");
	          for (var i = 0; i < nbrItems; ++i)
	          {
	            var item = items[i];
	            // var actionLink = "http://launchcast.launch.yahoo.com/radio/play/?p=1&m=" + item.getAttribute("id") + "&forcesplash=1";
	            var actionLink = "http://music.yahoo.com/lc/?rt=1&rp1=" + item.getAttribute("id");
	            var stationPageLink = "http://music.yahoo.com/launchcast/stations/station.asp?i=" + item.getAttribute("id");
	            this.titleAry.push( {rank: i+1, // ranks not relevent for stations?
	                                title: item.getElementsByTagName("NAME")[0].firstChild.nodeValue,
                                    artist: item.getElementsByTagName("NAME")[1].firstChild.nodeValue,
                                    imgUrl: item.getElementsByTagName("IMAGE")[0].firstChild.nodeValue,
                                    actionUrl: actionLink,
                                    artistLink: stationPageLink,
                                    imageLink: stationPageLink, 
                                    lastitem:0
                                    } );
                 var im = new Image();
                 im.src = this.titleAry[i].imgUrl;
	          }
	          this.mylog("loading nodes");
	          this.freeNodes();
              this.loadNodes();
        	},

        	handleMusicSuccessIE : function(response)
        	{
              var oRoot;
              var items;
              var n = 0;
              var nbrItems = 0;
              var line = 'a';
              try {
                  if (response.responseXML.parseError.errorCode != 0)
                  {
                    alert("A parse error occured: " + response.responseXML.parseError.reason);
                    return;
                  }
                  this.mylog("Handle makeRequest Success...");
                  oRoot = response.responseXML.documentElement;
                  items = oRoot.getElementsByTagName("item");
                  nbrItems = Math.min(10,items.length);
                  this.mylog(nbrItems + " items returned");
                  this.curSel = 0;
                  this.titleAry = [];
                  n = 0;
                  this.mylog(nbrItems + " items received");
              }
              catch (e) {
                    alert("line " + line + " problem initing load: " + e.message);
                    return;
              }
              line = 'b';
	          for (var i = 0; i < nbrItems; ++i)
	          {
	            var item = items[i];
	            // NS is needed for Safari
	            var thumbs;
	            var aLink;
	            var itsRank;
	            var itsArtist;
	            var itsActionURL;
	            var itsThumb;
	            try {
	                
                    thumbs = item.getElementsByTagName("media:thumbnail");
                    aLink = item.getElementsByTagName("ymusic:link")[0].firstChild.nodeValue;
                    if (thumbs.length <= 0)
                        itsThumb = '';
                    else
                        itsThumb = thumbs[Math.min(1,thumbs.length)].getAttribute("url");
                    itsRank = item.getElementsByTagName("ymusic:rank")[0].firstChild.nodeValue;
                    itsArtist = item.getElementsByTagName("media:credit")[0].firstChild.nodeValue;
                    itsActionURL = item.getElementsByTagName("media:player")[0].getAttribute("url");

                    var titles = item.getElementsByTagName("title");  // WORKS
                    var titleStr= '';
                    if (titles.length >= 2) {
                       titleStr = titles[1].firstChild.nodeValue;
                    } else {
                       titleStr = titles[0].firstChild.nodeValue;
                       titleStr = titleStr.split("-")[0].substr(4);
                    }
                } catch (e) {
                    this.mylog("problem parsing xml: " + e.message);
                    alert("line " + line + " problem parsing xml: " + e.message);
                    return;
                }
                this.titleAry.push( {rank: itsRank, title: titleStr, artist: itsArtist, imgUrl: itsThumb, 
                                     actionUrl: itsActionURL, artistLink: aLink, imageLink: itsActionURL,
                                     dmy:0
                                    } );
                 var im = new Image();
                 im.src = this.titleAry[i].imgUrl;
                 ++n;
	          }
	          this.mylog("loading nodes");
	          this.freeNodes();
              this.loadNodes();
        	  this.mylog("done loading nodes");
        	},        	

        	handleMusicSuccess : function(response)
        	{
              var isSafari = navigator.userAgent.indexOf("Safari") != -1;

        	  this.mylog("Handle makeRequest Success...");
        	  var oRoot = response.responseXML.documentElement;
	          var items = oRoot.getElementsByTagName("item");
	          var nbrItems = Math.min(10,items.length);
	          this.mylog(nbrItems + " items returned");
              this.curSel = 0;
              this.titleAry = [];
              var n = 0;
              this.mylog(nbrItems + " items received");
	          for (var i = 0; i < nbrItems; ++i)
	          {
	            var item = items[i];
	            // NS is needed for Safari
	            var thumbs;
	            var aLink;
	            var itsRank;
	            var itsArtist;
	            var itsActionURL;
	            var itsThumb;
	            try {
	                
                    if (isSafari) {
                       thumbs = item.getElementsByTagNameNS("*","thumbnail");
                       aLink = item.getElementsByTagNameNS("*","link")[1].firstChild.nodeValue;
                    }
                    else {
                       thumbs = item.getElementsByTagName("thumbnail");
                       // temporarily turn this off for IE testing
                       aLink = item.getElementsByTagName("link")[1].firstChild.nodeValue;
                    }
                    if (thumbs.length <= 0)
                        itsThumb = '';
                    else
                        itsThumb = thumbs[Math.min(1,thumbs.length)].getAttribute("url");
                    itsRank = item.getElementsByTagName("rank")[0].firstChild.nodeValue;
                    itsArtist = item.getElementsByTagName("credit")[0].firstChild.nodeValue;
                    itsActionURL = item.getElementsByTagName("player")[0].getAttribute("url");

                    var titles = item.getElementsByTagName("title");  // WORKS
                    var titleStr= '';
                    if (titles.length >= 2) {
                       titleStr = titles[1].firstChild.nodeValue;
                    } else {
                       titleStr = titles[0].firstChild.nodeValue;
                       titleStr = titleStr.split("-")[0].substr(4);
                    }
                } catch (e) {
                    this.mylog("problem parsing xml: " + e.message);
                    return;
                    // alert("problem getting " + lastItem + ": " + e + " isIE=" + isIE);
                }
                this.titleAry.push( {rank: itsRank, title: titleStr, artist: itsArtist, imgUrl: itsThumb, 
                                     actionUrl: itsActionURL, artistLink: aLink, imageLink: itsActionURL,
                                     dmy:0
                                    } );
                 var im = new Image();
                 im.src = this.titleAry[i].imgUrl;
                 ++n;
	          }
	          this.mylog("loading nodes");
	          this.freeNodes();
              this.loadNodes();
        	  this.mylog("done loading nodes");
        	},

            mytabclick : function(e)
            {
                // alert(this.dumpItems(e));
                var target = (e.target? e.target : e.srcElement);
        		YAHOO.util.Event.stopEvent(e); // Stop the event to prevent default behavior
                var tabsDiv = YAHOO.util.Dom.getElementsByClassName('tabs', 'div', this.el)[0];
                var liElems = tabsDiv.getElementsByTagName("li");
                liElems[this.curTab].className = (this.curTab == 0? "first" : this.curTab == 3? "last" : "");
                // Turn off "pre" style on current "pre"
        		if (this.curTab > 0)
                    liElems[this.curTab-1].className = (this.curTab == 1? "first " : "");
        		this.curTab = target.idx;
        		YAHOO.ModuleAPI.setPref(this.id, "curTab", this.curTab);
                liElems[this.curTab].className = (this.curTab == 0? "first " : this.curTab == 3? "last " : "") + "on";
        		// Add "pre" for li which precedes on... (use pre style to hide pipe)
        		if (this.curTab > 0)
                    liElems[this.curTab-1].className = (this.curTab == 1? "first " : "") + "pre";
        		this.loadFeed();
        	
        		return false;
            },

        	handleFailure : function(status)
        	{
        	  this.mylog("Handle makeRequest Failure: " + status.statusText);
        	  // alert("Handle makeRequest Failure: " + status.statusText);
        	  // for (var prop in status)
        	  // {
        	  //   this.mylog(" " + prop + " = " + status[prop]);
        	  // }
        	},

/*            getElementsByClass : function(searchClass,node,tag) 
            {
                var classElements = new Array();
                if ( node == null )
                    node = document;
                if ( tag == null )
                    tag = '*';
                var els = node.getElementsByTagName(tag);
                var elsLen = els.length;
                var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
                for (i = 0, j = 0; i < elsLen; i++) {
                    if ( pattern.test(els[i].className) ) {
                        classElements[j] = els[i];
                        j++;
                    }
                }
                return classElements;
            },
*/

            // changed to compute margins - just compute values needed, use them in loadnodes...
            computeMargins : function()
            {
              var isSafari = navigator.userAgent.indexOf("Safari") != -1;
              var mydiv = YAHOO.util.Dom.getElementsByClassName("ymusicMy_mediaList", "div", this.el)[0];
              if (!mydiv) {
                // this.mylog("Can't find div");
                return;
              }
              this.minCellWidth = 140; // was 116
              var oWidth = mydiv.offsetWidth;
              this.visObjects = Math.floor((oWidth-50)/this.minCellWidth);
              this.visObjects = Math.min(Math.max(1,this.visObjects),5);
              this.mylog("owidth = " + oWidth + ", visObjects = " + this.visObjects + ", isSafari = " + isSafari);
              // set margin of each list item to fit item into available space...
              var availSpace = oWidth;
              this.maxCellWidth = Math.floor(oWidth/this.visObjects);
              this.cellMargins = Math.floor( ((availSpace - this.visObjects*this.minCellWidth)/(this.visObjects+1))/2 );
              this.cellMargins = Math.max(0,this.cellMargins);
              this.mylog("visObjects = " + this.visObjects);
              this.mylog("minCellWidth = " + this.minCellWidth);
              this.mylog("maxCellWidth = " + this.maxCellWidth);
              this.mylog("oWidth = " + oWidth);
              this.mylog("cellMargins = " + this.cellMargins);
            },
            

            myleftclick : function(e)
            {
        		YAHOO.util.Event.stopEvent(e); // Stop the event to prevent default behavior
                return this.myclick(-1);
            },
            myrightclick : function(e)
            {
        		YAHOO.util.Event.stopEvent(e); // Stop the event to prevent default behavior
                return this.myclick(1);
            },
            
            myellipsize : function(s,len)
            {
                try {
                    if (s.length <= len)
                        return s;
                     // if (this.isIE)
                     //   return s;
                     return s.substr(0,len) + String.fromCharCode(8230);
                }
                catch (e)
                {
                   return "string";
                }
                 
            },
            
            freeNodes : function()
            {
                var myOL = YAHOO.util.Dom.getElementsByClassName("ymusicMy_mediaOL", "ol", this.el)[0];
                if (myOL) {
                    if (this.isIE4) {
                        myOL.innerHTML = "";
                    }
                    else {
                        while (myOL.hasChildNodes())
                             myOL.removeChild(myOL.firstChild);
                    }
                }
                else {
                    this.mylog("UL not found");
                }
            },
            
            addNode : function(myul, i, tElem)
            {
                var myLi = document.createElement("li");
                YAHOO.util.Dom.addClass(myLi, "ymusicMy_MediaLI");
                // myLi.setAttribute("class","ymusicMy_MediaLI");

                var iHTML = "<div class='ymusicMy_media'>";
                var actionURL = tElem.actionUrl;
                
                if  (this.tabSettings[this.curTab].hackVideoURL)
                {
                    // http://us.rd.yahoo.com/launch/ms/RSSfeeds/ymulink/evt=37894/*http://music.yahoo.com/video/35807175/?fs=1
                    // eventually: if video, use this javascript:playVideo(35807175)
                    var videoID = actionURL.substr(actionURL.indexOf("video/")+6);
                    videoID = videoID.substr(0, videoID.indexOf("/") );
                    actionURL = "http://music.yahoo.com/video/" + videoID;
                }  
                // if video, use this javascript:playVideo(35807175)
                if (this.tabSettings[this.curTab].hasPlay)
                {
                    iHTML += "<a class='imgAnchor' href='" + tElem.imageLink + "'>" +
                                     "<span><img src='" + tElem.imgUrl + "' /></span><div class='ymusicMy_pos'>" + tElem.rank + "</div>" +
                               "</a>" +
                               "<div class='TADiv'>" +
                                 "<a class='ymusicMy_title' title='" + tElem.title + "' href='" + actionURL + "'>" + 
                                 (this.isIE? "<span>i</span>" : "") + 
                                 this.myellipsize(tElem.title,16) + "</a>" +
                                 "<a class='ymusicMy_artist' title='" + tElem.artist + "' href='" + tElem.artistLink + "'>" + this.myellipsize(tElem.artist,23) + "</a>" +
                              "</div>";
                }
                else {
                    iHTML +=  "<a class='imgAnchor' href='" + tElem.imageLink + "'>" +
                                  "<span><img src='" + tElem.imgUrl + "' /></span><div class='ymusicMy_pos'>" + tElem.rank + "</div>" +
                              "</a>" +
                              "<a class='ymusicMy_titleC' title='" + tElem.title + "' href='" + actionURL + "'>" + this.myellipsize(tElem.title,23) + "</a>" +
                              "<a class='ymusicMy_artistC' title='" + tElem.artist + "' href='" + tElem.artistLink + "'>" + this.myellipsize(tElem.artist,23) + "</a>";
                }
                iHTML += "</div>";

                myLi.innerHTML = iHTML;

                try {
                  YAHOO.util.Dom.setStyle(myLi, 'width',  this.maxCellWidth + "px"); 
                  // myLi.style.width = this.maxCellWidth + "px";
                }
                catch (e)
                {
                  this.mylog("error setting style: " + e.message);
                }
                myul.appendChild(myLi);
                // this.myIElog("added node");
            },

            loadNodes : function()
            {
              // this.mylog("Loading " + this.visObjects + " nodes");
              var myOL = YAHOO.util.Dom.getElementsByClassName("ymusicMy_mediaOL", "ol", this.el)[0];
              // this.mylog("found ol: " + myOL);
              var nbrItems = Math.min(this.titleAry.length, this.visObjects);
              // this.mylog("preparing to load " + nbrItems + " items to " + myOL);
              for (var i = 0; i < nbrItems; ++i)
              {
                var tElem = this.titleAry[(this.curSel+i)%this.titleAry.length];
                try
                {
                  this.addNode(myOL, i, tElem);
                }
                catch (e)
                {
                  this.myIElog("problem adding node " + e.message);
                  return;
                }
              }
              this.mylog("done adding list elements");

              // fix the footer
              var fLink = YAHOO.util.Dom.getElementsByClassName('ymusicMy_ft', 'div', this.el)[0].firstChild;
              fLink.setAttribute("href", this.tabSettings[this.curTab].ftLink);
              fLink.firstChild.nodeValue = fLink.firstChild.nodeValue.substr(0,1) + this.tabSettings[this.curTab].ftLinkLabel;
              // adjust visibility
              var myDiv = YAHOO.util.Dom.getElementsByClassName('loading', 'div', this.el)[0]; // returns an array
              // myDiv.style.visibility = "hidden";
              if (myDiv)
                  myDiv.parentNode.removeChild(myDiv);
              myDiv = YAHOO.util.Dom.getElementsByClassName('ymusicMy_cn', 'div', this.el)[0]; // returns an array
              myDiv.style.visibility = "visible";
              myDiv = YAHOO.util.Dom.getElementsByClassName('ymusicMy_leftbtn', 'div', this.el)[0]; // returns an array
              myDiv.style.visibility = "visible";
              myDiv = YAHOO.util.Dom.getElementsByClassName('ymusicMy_rightbtn', 'div', this.el)[0]; // returns an array
              myDiv.style.visibility = "visible";
              this.mylog("done loading nodes");
              
            },

            myclick : function(delta)
            {
              this.curSel = (this.curSel + this.titleAry.length + delta) % this.titleAry.length;
        	  // this.mylog("curSel = " + this.curSel);
        	  this.freeNodes();
              this.loadNodes();
              return false;
            }

};


