/*
	Copyright James Matteson 2011. All rights reserved.
*/
var mySearch = new search();

function search(){
   var oThis = this;
   var index = 1;
   var maxResults = 50;
   var allowMusicBrainzSearch = true;
   var musicBrainzFunc = '';
   var musicBrainzQuery = '';
   var musicBrainzQuery2 = '';
   var musicBrainzQuery3 = '';
   var musicBrainzCallback = '';
   
   function _search(query, startIndex, callbackFunctionName){
      var url;
      var isAll = false;
      var category = myUI.getCategory();
            
      // Textbox search
      if (category == 'All'){
         url = "http://gdata.youtube.com/feeds/api/videos?";         
         isAll = true;
      }else{
         var params = myUtils.stripNonAlphaNumeric(query).split(' ');
         
         url = "http://gdata.youtube.com/feeds/api/videos/-/" + category;
         
         for (var i = 0, len = params.length; i < len; i++){
            var item = params[i].strip().toLowerCase();
            if (item.length > 0) url += '/' + item;
         }
         
         url += '?';
      }
      
      url += "callback=" + callbackFunctionName;
		url += "&v=2";
      url += "&alt=json-in-script";
      url += "&format=5"; // values: 5=flv
      url += "&orderby=" + myUI.getOrderBy(); // values: relevance, published, viewCount, rating
      url += "&start-index=" + startIndex; // 1 based
      url += "&max-results=" + maxResults; // values: 0 - 50.  default 25
      url += "&safeSearch=none";
            
      if (isAll){
         query = encodeURIComponent(query.strip()).escapeHTML();
         
         if (query.length > 0){
            url += "&q=" + query;
         }
      }
      
      //url = "http://gdata.youtube.com/feeds/standardfeeds/" + query + '?';
      // time - only supported for the top_rated, top_favorites, most_viewed, most_popular, most_discussed, most_linked and most_responded standard feeds, 
      //url += "&time=" + myUI.getTimeFrame(); // values: today (1 day), this_week (7 days), this_month (1 month) and all_time. The default value for this parameter is all_time.
      //var author // author - limit to a specific youtube user
      //var ap = "&ap=%2526fmt%3D18";
      myUtils.attachSearchScript(url);
   }
   function canSearchMusicBrainz(f, q, q2, q3, c){
      if (allowMusicBrainzSearch){
         return true;
      }else{
         musicBrainzFunc = f;
         musicBrainzQuery = q;
         musicBrainzQuery2 = q2;
         musicBrainzQuery3 = q3;
         musicBrainzCallback = c;
         return false;
      }
   }
   
   /* Public */
   this.search = function(query, isNext, callbackFunctionName){
      if (isNext){
         index = index + maxResults;
      }else{
         index = 1;
      }
      
      _search(query, index, callbackFunctionName);
   }
   
   /* Utility */
   this.getMaxResults = function(){
      return maxResults;
   }
   this.getVideo = function(id, callbackFunctionName){
      var p_url = "http://gdata.youtube.com/feeds/api/videos/" + id + "?";
      var p_callback = "callback=" + callbackFunctionName;
      var p_alt = "&alt=json-in-script";
      
      p_url += p_callback + p_alt;
      myUtils.attachScript(p_url);
   }
   this.musicBrainzTimer = function(){
      allowMusicBrainzSearch = false;
      musicBrainzFunc = '';
      musicBrainzQuery = '';
      musicBrainzQuery2 = '';
      musicBrainzQuery3 = '';
      musicBrainzCallback = '';
      setTimeout('mySearch.resetMusicBrainz()', 1000);
   }
   this.resetMusicBrainz = function(){
      allowMusicBrainzSearch = true;
      
      if (musicBrainzQuery.length > 0 && musicBrainzCallback.length > 0){
         if (musicBrainzFunc == 'artists'){
            oThis.getArtists(musicBrainzQuery, musicBrainzCallback);
         }else if (musicBrainzFunc == 'albums'){
            oThis.getAlbums(musicBrainzQuery, musicBrainzQuery2, musicBrainzQuery3, musicBrainzCallback);
         }else if (musicBrainzFunc == 'tracks'){
            oThis.getTracks(musicBrainzQuery, musicBrainzQuery2, musicBrainzCallback);
         }
      }
   }
   this.getArtists = function(query, callbackFunctionName){
      // callbackFunctionName = 'cbArtists';
      if (canSearchMusicBrainz('artists', query, '', '', callbackFunctionName)){
         var p_url = "http://pipes.yahoo.com/pipes/pipe.run?_id=03a2180ae0fe97d9e682fbe59fbc4c64&_render=json";
         p_url += "&artist=" + encodeURIComponent(query.replace(/ /g, '+').strip()).escapeHTML();
         p_url += "&_callback=" + callbackFunctionName;
         myUtils.attachSearchScript(p_url);
         oThis.musicBrainzTimer();
      }      
   }
   this.getAlbums = function(artistID, releaseTypes, releaseFilter, callbackFunctionName){
      if (canSearchMusicBrainz('albums', artistID, releaseTypes, releaseFilter, callbackFunctionName)){
         var p_url = "http://pipes.yahoo.com/pipes/pipe.run?_id=b1d720a14713e74d30b77765bb76bfec&_render=json";
         p_url += "&releasetypes=" + releaseTypes;
         p_url += "&releasefilter=" + releaseFilter;
         p_url += "&artistid=" + artistID;
         p_url += "&_callback=" + callbackFunctionName;
         myUtils.attachSearchScript(p_url);
         oThis.musicBrainzTimer();
      }
   }
   this.getTracks = function(artistName, albumID, callbackFunctionName){
      if (canSearchMusicBrainz('tracks', artistName, albumID, '', callbackFunctionName)){
         // GetAlbumTracks
         var p_url = "http://pipes.yahoo.com/pipes/pipe.run?_id=4c91535ee16551f4f1d5b5ea7981b28f&_render=json";
         //var p_url = "http://pipes.yahoo.com/pipes/pipe.run?_id=Xjo1LX9l3RGuBGmu_g6H4A&_render=json";
         artistName = artistName.replace(/\./g, '');
         artistName = myUtils.stripNonAlphaNumeric(artistName, ' ').strip();
         while(artistName.indexOf('  ') >= 0){ artistName = artistName.replace(/  /g, ' '); }
         p_url += "&artistname=" + encodeURIComponent(artistName).escapeHTML().replace(/%20/g, ',').toLowerCase();
         p_url += "&albumid=" + albumID;
         p_url += "&orderby=" + myUI.getOrderBy();
         p_url += "&_callback=" + callbackFunctionName;
         myUtils.attachSearchScript(p_url);
         oThis.musicBrainzTimer();
      }
   }
}



//'top_rated','top_favorites','most_viewed','most_popular'
//url = "http://gdata.youtube.com/feeds/standardfeeds/" + query + '?';

//url = "http://gdata.youtube.com/feeds/api/standardfeeds/top_rated?"; // This feed contains the most highly rated YouTube videos.
//url = "http://gdata.youtube.com/feeds/api/standardfeeds/top_favorites?"; // This feed contains videos most frequently flagged as favorite videos.
//url = "http://gdata.youtube.com/feeds/api/standardfeeds/most_viewed?"; // This feed contains the most frequently watched YouTube videos.
//url = "http://gdata.youtube.com/feeds/api/standardfeeds/most_popular?"; // This feed contains the most popular YouTube videos, selected using an algorithm that combines many different signals to determine overall popularity.
//url = "http://gdata.youtube.com/feeds/api/standardfeeds/most_recent?"; // This feed contains the videos most recently submitted to YouTube.
//url = "http://gdata.youtube.com/feeds/api/standardfeeds/most_discussed?"; // This feed contains the YouTube videos that have received the most comments.
//url = "http://gdata.youtube.com/feeds/api/standardfeeds/most_linked?"; // This feed contains the YouTube videos that receive the most links from other websites.
//url = "http://gdata.youtube.com/feeds/api/standardfeeds/most_responded?"; // This feed contains YouTube videos that receive the most video responses.
//url = "http://gdata.youtube.com/feeds/api/standardfeeds/recently_featured?"; // This feed contains videos recently featured on the YouTube home page or featured videos tab.
//url = "http://gdata.youtube.com/feeds/api/standardfeeds/watch_on_mobile?"; // This feed contains videos suitable for playback on mobile devices.
//url = "http://gdata.youtube.com/feeds/api/videos/-/Music";

/*
this.prevPage = function(){
   var temp = prevStartIndex - maxResults;
   
   if (temp < 1){
      prevStartIndex = 1;
   }else{
      prevStartIndex = temp;
   }
   
   _search(prevQuery, prevCallback, true);
}
*/

/*this.search2 = function(query, callbackFunctionName, orderby, startindex, maxresults){
   var url = "http://gdata.youtube.com/feeds/api/videos?";
   var callback = "callback=" + callbackFunctionName;
   var alt = "&alt=json-in-script";
   var ap = "&ap=%2526fmt%3D18";
   var format = "&format=5"; // values: 5=embeddable
   var vq = "&vq=" + encodeURIComponent(query).escapeHTML();
   var orderby = "&orderby=rating"; // values: relevance, published, viewCount, rating
   var startindex = "&start-index=" + startindex; // 1 based
   var maxresults = "&max-results=" + maxresults; // values: 0 - 50.  default 25
   var racy = "&racy=include"; // values: include, exclude
   
   url += callback + alt + ap + format + vq + orderby + racy + startindex + maxresults;
   myUtils.attachSearchScript(url);
}*/
