var MAX_DUMP_DEPTH = 20;
function dumpObj(obj, name, indent, depth) {
      if (typeof obj == "object") {
             var child = null;
             var output = indent + name + "\n";
             indent += "\t";
             for (var item in obj)
             {
                   try {
                          child = obj[item];
                   } catch (e) {
                          child = "<Unable to Evaluate>";
                   }
                   if (typeof child == "object") {
                          output += dumpObj(child, item, indent, depth + 1);
                   } else {
                          output += indent + item + ": " + child + "\n";
                   }
             }
             return output;
      } else {
             return obj;
      }
}

//convert duration to miliseconds
function convertToMili(data)
{
	var time = data.split(':');
	if ( time.length == '3' )
	{
		var hr = time[0] * 60 * 60 * 1000;
		var min = time[1] * 60 * 1000;
		var sec = time[2] * 1000;
	}
	else
	{
		var hr = 0;
		var min = time[0] * 60 * 1000;
		var sec = time[1] * 1000 + 1000;
	}
	return ( Math.floor ( hr + min + sec ) );
}


//Limit characters
function charLimit(text,limit)
{
	var string  = '';
		
		if(text.length>limit){
			text = text.substring(0,limit)
			string =  text+"...";
		}else{
			string =  text;
		}
		return string;
}

// base64 function used on song id
var base64 = {
	keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
	encode : function(input){
		input = escape(input);
		var output = "";
		var chr1, chr2, chr3 = "";
		var enc1, enc2, enc3, enc4 = "";
		var i = 0;
		
		do {
		 chr1 = input.charCodeAt(i++);
		 chr2 = input.charCodeAt(i++);
		 chr3 = input.charCodeAt(i++);
		
		 enc1 = chr1 >> 2;
		 enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
		 enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
		 enc4 = chr3 & 63;
		
		 if (isNaN(chr2)) {
		    enc3 = enc4 = 64;
		 } else if (isNaN(chr3)) {
		    enc4 = 64;
		 }
		
		 output = output +
		    base64.keyStr.charAt(enc1) +
		    base64.keyStr.charAt(enc2) +
		    base64.keyStr.charAt(enc3) +
		    base64.keyStr.charAt(enc4);
		 chr1 = chr2 = chr3 = "";
		 enc1 = enc2 = enc3 = enc4 = "";
		} while (i < input.length);
		
		return output;	
	},
	decode : function(input){
		var output = "";
		var chr1, chr2, chr3 = "";
		var enc1, enc2, enc3, enc4 = "";
		var i = 0;
		
		// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
		var base64test = /[^A-Za-z0-9\+\/\=]/g;
		if (base64test.exec(input)) {
		 alert("There were invalid base64 characters in the input text.\n" +
		       "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" +
		       "Expect errors in decoding.");
		}
		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
		
		do {
		 enc1 = base64.keyStr.indexOf(input.charAt(i++));
		 enc2 = base64.keyStr.indexOf(input.charAt(i++));
		 enc3 = base64.keyStr.indexOf(input.charAt(i++));
		 enc4 = base64.keyStr.indexOf(input.charAt(i++));
		
		 chr1 = (enc1 << 2) | (enc2 >> 4);
		 chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
		 chr3 = ((enc3 & 3) << 6) | enc4;
		
		 output = output + String.fromCharCode(chr1);
		
		 if (enc3 != 64) {
		    output = output + String.fromCharCode(chr2);
		 }
		 if (enc4 != 64) {
		    output = output + String.fromCharCode(chr3);
		 }
		
		 chr1 = chr2 = chr3 = "";
		 enc1 = enc2 = enc3 = enc4 = "";
		
		} while (i < input.length);
		
		return unescape(output);
	}
}  

var tracks = {
	play	: {
		location : null,
		page	: null,
		order	: null,
		status	: null
	},
	view	:{
		location : null,
		page	: null
	},
	extend : function( loc, page, tracklist ) {
		tracks = $.extend(true, tracks, $.parseJSON(tracklist));
		tracks.view.location = loc;
		tracks.view.page = page;
	}
}

var crave = {
	duration: 0,
	vol		: 50,
	init	:	function(order,click){
						
					if ( click )
					{	
						if ( tracks[currController][tracks.view.page] == null )
						{
							alert('nothing to play');
							return false;
						}
						
						var mp3id = tracks[currController][tracks.view.page]['order'][order];
						var mp3idbase64 = base64.encode(mp3id);
						
						if ( tracks[currController][tracks.view.page][mp3id].Mp3File.status != "approved" )
						{
							var url = crave.getUrl(mp3id,"temp",'click');
						}
						else
						{
							var url = crave.getUrl(mp3id,null,'click');
						}
						
					
						//check mySound b4 play
						if ( typeof mySound != "object" )
						{
							var info = crave.details(mp3id,'click');
							crave.play(mp3idbase64,url, info)
							tracks.play.order = order;
						}
						else
						{
							if ( mySound.sID == mp3idbase64 && tracks.play.page == tracks.view.page && order == tracks.play.order)
							{
								mySound.togglePause();
							}
							else
							{
								mySound.stop();
								var info = crave.details(mp3id,'click');
								crave.play(mp3idbase64,url,info);
								tracks.play.order = order;
							}
						}
						
						//set current playing vars
						tracks.play.status = '';
						tracks.play.location = tracks.view.location;
						tracks.play.page = tracks.view.page;
						
						crave.play.location = currController;
						crave.play.order = tracks[currController][tracks.play.page][mp3id].order
					}
					else
					{
						var mp3id = tracks[tracks.play.location][tracks.play.page]['order'][order];
						var mp3idbase64 = base64.encode(mp3id);
					
						if ( mySound.sID == mp3idbase64 && order == tracks.play.order )
						{
							mySound.togglePause();
						}
						else
						{
							if ( tracks[tracks.play.location][tracks.play.page][mp3id].Mp3File.status != "approved" )
							{
								var url = crave.getUrl(mp3id,"temp");
							}
							else
							{
								var url = crave.getUrl(mp3id,null);
							}
							
							mySound.stop();
							var info = crave.details(mp3id);
							crave.play(mp3idbase64,url,info);
							tracks.play.order = order;
						}
					}
					
									
				},
	details :	function(id,click){
					if ( click == "click")
					{
						if ( tracks[currController][tracks.view.page][id].Album.artwork == null )
						{
							var thisArtwork = "/files/avatar/100/"+tracks[currController][tracks.view.page][id].Artist.avatar;
						}
						else
						{
							var thisArtwork = "/files/album-artwork/100/"+tracks[currController][tracks.view.page][id].Album.artwork;
						}
						var info = $.parseJSON('{"artwork":"'+thisArtwork+'",' +
												 '"url"		: "'+tracks[currController][tracks.view.page][id].Mp3File.filename+'",'+
												 '"artist"	: "'+tracks[currController][tracks.view.page][id].Artist.band_name+'",'+
												 '"artistUrl": "'+tracks[currController][tracks.view.page][id].Artist.url+'",'+
												 '"craves"	: "'+tracks[currController][tracks.view.page][id].Mp3Stat.count+'",'+
												 '"title"	: "'+tracks[currController][tracks.view.page][id].Mp3Db.mp3_title+'"}');
						crave.duration = convertToMili(tracks[currController][tracks.view.page][id].Mp3Db.mp3_duration);
					}
					else
					{
						if ( tracks[tracks.play.location][tracks.play.page][id].Album.artwork == null )
						{
							var thisArtwork = "/files/avatar/100/"+tracks[tracks.play.location][tracks.play.page][id].Artist.avatar;
						}
						else
						{
							var thisArtwork = "/files/album-artwork/100/"+tracks[tracks.play.location][tracks.play.page][id].Album.artwork;
						}
						var info = $.parseJSON('{"artwork":"'+thisArtwork+'",' +
												 '"url"		: "'+tracks[tracks.play.location][tracks.play.page][id].Mp3File.filename+'",'+
												 '"artist"	: "'+tracks[tracks.play.location][tracks.play.page][id].Artist.band_name+'",'+
												 '"artistUrl": "'+tracks[tracks.play.location][tracks.play.page][id].Artist.url+'",'+
												 '"craves"	: "'+tracks[tracks.play.location][tracks.play.page][id].Mp3Stat.count+'",'+
												 '"title"	: "'+tracks[tracks.play.location][tracks.play.page][id].Mp3Db.mp3_title+'"}');
						crave.duration = convertToMili(tracks[tracks.play.location][tracks.play.page][id].Mp3Db.mp3_duration);
					}
					return info;
				},
	getUrl	:	function(id,status,click){
					if ( click )
					{
						if (status != null)
						{
							return "/tracks/play/temp/"+tracks[currController][tracks.view.page][id].Artist.id+"/"+tracks[currController][tracks.view.page][id].Mp3File.filename;
						}
						else
						{
							return "/tracks/play/128/"+tracks[currController][tracks.view.page][id].Artist.id+"/"+tracks[currController][tracks.view.page][id].Mp3File.filename;
						}
					}
					else
					{
						if (status != null)
						{
							return "/tracks/play/temp/"+tracks[tracks.play.location][tracks.play.page][id].Artist.id+"/"+tracks[tracks.play.location][tracks.play.page][id].Mp3File.filename;
						}
						else
						{
							return "/tracks/play/128/"+tracks[tracks.play.location][tracks.play.page][id].Artist.id+"/"+tracks[tracks.play.location][tracks.play.page][id].Mp3File.filename;
						}
					}
				},
	finish	:	function(){
					var mp3id = base64.decode(mySound.sID);
					
	},
	play	: 	function(soundId,url,info,el){

					var ii = 0;
					mySound = soundManager.createSound({
						id			: soundId,
						url			: url,
						multiShot	: false,
						stream		: true,
						volume		: crave.vol,
						whileloading: function(){
											totalBytes = this.bytesTotal;
											curBytes = (this.bytesLoaded / totalBytes) * 100;
											$('#cravePlayerBuffer').css('width',curBytes+'%');
										},
										
						onload: function(){
											$('#cravePlayerBuffer').css('width','100%');
											
										},
										
						onplay		:function(){
											ii = 0;
											$('a.playerControl').removeClass("cravePlayerControlPlay").addClass("cravePlayerControlPause");
											//$(el).parents('.listHolder').find('.song_listCravePlay').show();
			
										},
						onpause		: function(){
											$('a.playerControl').removeClass("cravePlayerControlPause").addClass("cravePlayerControlPlay");
										},
						onresume	: function(){
											$('a.playerControl').removeClass("cravePlayerControlPlay").addClass("cravePlayerControlPause");
											//$('.song_listCravePlay').fadeOut(function(){
											//	$('.song_listCravePlay#'+thisId).show()
											//})
											//$('#btnPlay').css('background-position','bottom left');
										},
						whileplaying: function(){
											//totalDur = this.durationEstimate;
											//var curPos = (this.position / crave.duration) * 100;
											//$('#posProgress').css('width',curPos+'%');
										
											if ( this.position >= Math.floor ( 0.70 * crave.duration) && ii == 0)
											{
												$.ajax({
													type	: 'POST',
													url		: "/stats/update",
													data	: 'val1='+base64.decode(soundId),//,
													success	: function(data){
																	$('#songBox_'+base64.decode(soundId)).find('.songListensHolder').html(data);
																	$('#cravePlayerDetails').find('.songListensHolder').html(data);
																	tracks[currController][tracks.play.page][base64.decode(soundId)].Mp3Stat.count = tracks[currController][tracks.play.page][base64.decode(soundId)].Mp3Stat.count + 1;
																}
												})
												ii = 1;
											}
			
											var sec = Math.floor(((crave.duration - this.position)/1000)%60);
											var min = Math.floor(((crave.duration - this.position)/(1000*60))%60);
											
											if ( sec < 10 )
											{
												sec = '0'+sec;
											}
											$('#cravePlayerDetails').find('div.timeSongHolder').html(min + ":" + sec);
											
										},
						onfinish		:	function(){										
												if ( tracks.play.location == "listener" || tracks.play.status == "play")
												{
													ctrl.Next();
												}
												else
												{
													$('a#btnPlay').removeClass("cravePlayerControlPause").addClass("cravePlayerControlPlay");
													mySound = "";
												}
												
												$('#cravePlayerDetails').find('div.timeSongHolder').html("00:00");
												//tracks.play.status = null;
												//$(el).parents('.listHolder').find('.song_listCravePlay').hide();
											},
						onstop			: function(){
												mySound = "";
												$('a.playerControl').removeClass("cravePlayerControlPause").addClass("cravePlayerControlPlay");
												//$(el).parents('.listHolder').find('.song_listCravePlay').hide();
											}
					})
					
					mySound.play();
					var playerEl = "<div id=\"songBox_"+base64.decode(soundId)+"\" class=\"songBoxDefault songBoxPlayer\" style=\"background-color:transparent;\">" +
									"<div class=\"songAlbumCover\">"+
 														"<img width=\"48px\" height=\"48px\" src=\""+info.artwork+"\">"+
												"</div>"+							
									"<div class=\"songNameAddedSongHolder\">"+
										"<a id=\""+soundId+"\" title=\""+info.title+"\" class=\"songNameHolder\">"+charLimit(info.title,15)+"</a> "+
										"<div class=\"bySpan\"> by </div>"+
										"<a title=\""+info.artist+"\" href=\"/#/"+info.artistUrl+"\" class=\"songArtistNameHolder blueLink\">"+charLimit(info.artist,15)+"</a>"+
										"<div class=\"timeSongHolder\"> loading </div>"+
										"<div class=\"clearDiv\"></div>"+
									"</div>"+
									"<div class=\"songListensTabsHolder\">"+
										"<div class=\"songListensHolder\">"+info.craves+" Listens </div>"+
										/*
										"<div class=\"songTabsHolder\" style=\"display: none;\">"+
											"<a id=\"add_27\" class=\"songTabs addToPlaylistTabs\"></a>"+
											"<a id=\"info_27\" class=\"songTabs infoTabs\">Info</a>"+
											"<a id=\"download_27\" class=\"songTabs downloadTabs\">Download</a>"+				
											"<a id=\"share_27\" class=\"songTabs shareTabs\">Share</a>"+
											"<a id=\"comments_27\" class=\"songTabs commentsTabs\">Comments</a>"+
											"<div class=\"clearDiv\"></div>"+
										"</div>"+
										*/
										"<div class=\"clearDiv\"></div>"+
									"</div>"+
									"<div class=\"clearDiv\">&nbsp;</div>"+
									"<div id=\"songBox_27\" class=\"songTabsContentsHolder\"></div>"+
									"<div class=\"clearDiv\">&nbsp;</div>"+
								"</div>";
 
					$('#cravePlayerDetails').html( playerEl );
	}
}

var ctrl = {
	Play	:	function()
				{
					if ( typeof mySound != "object" )
					{
						crave.init('0','click');
					}
					else
					{
						crave.init(tracks.play.order);
					}
					tracks.play.status = 'play';
					return false;
				},
	autoPlay:	function(id)
				{
					var song = base64.decode(id);
					//alert(song);
					var el = $("#songBox_"+song).find('a.songNameHolder').parents('.songBoxDefault');
					//alert(el);
					var order = $('div#content').find('div.songBoxDefault').index($(el));	
					//alert(order)
					crave.init(order,'click');
					tracks.play.status = 'play';
				},
	Prev	:	function()
				{
					if ( typeof mySound != "object" )
					{
						crave.init('0',null);
					}
					else
					{
						if ( tracks.play.order != 0 )
						{
							var o = parseInt(tracks.play.order) - 1;
							crave.init(o);
						}
						else
						{
							return false;
						}
					}
					tracks.play.status = 'play';
					return false;
				},
	Next	:	function()
				{
					if ( typeof mySound != "object" )
					{
						crave.init('0','click');
						return false;
					}
					else
					{
						if ( tracks.play.order != ( tracks[tracks.play.location][tracks.play.page]['order'].length - 1 ) )
						{
							var o = parseInt(tracks.play.order) + 1;
							crave.init(o);
							return false;
						}
						else
						{
							return false;
						}
					}
					tracks.play.status = 'play';
					return false;
				}
}


$('.songNameHolder').live('click',function(){
	
	var order = $('div#content').find('div.songBoxDefault').index($(this).parents('.songBoxDefault'));	
	crave.init(order,'click');
	return false;
})

$('a.playerControl').live('click',function(){
	var action = $(this).attr('id');
	switch (action)
	{
		case 'btnPlay':
			ctrl.Play();
			break;
		case 'btnPrev':
			ctrl.Prev();
			break;
		case 'btnNext':
			ctrl.Next();
			break;			
	}
	return false;
})

var search = {
	keyCode: {
				ALT: 18,
				BACKSPACE: 8,
				CAPS_LOCK: 20,
				COMMA: 188,
				CONTROL: 17,
				COMMAND: 224,
				DELETE: 46,
				DOWN: 40,
				END: 35,
				ENTER: 13,
				ESCAPE: 27,
				HOME: 36,
				INSERT: 45,
				LEFT: 37,
				NUMPAD_ADD: 107,
				NUMPAD_DECIMAL: 110,
				NUMPAD_DIVIDE: 111,
				NUMPAD_ENTER: 108,
				NUMPAD_MULTIPLY: 106,
				NUMPAD_SUBTRACT: 109,
				PAGE_DOWN: 34,
				PAGE_UP: 33,
				PERIOD: 190,
				RIGHT: 39,
				SHIFT: 16,
				SPACE: 32,
				TAB: 9,
				UP: 38
	},
	maxlength	:	2,
	query		:	"",
	source		:	'/searches/livequery/',
	init		:	function(el){
						var self = this;
						$(el).keyup(function(e){
							switch(e.keyCode){
								case self.keyCode.DOWN:
									self._next();
									return false;
									break;
								case self.keyCode.UP:
									self._previous();
									return false;
									break;
								case self.keyCode.ESCAPE:
									self._close();
									return false;
									break;
								case self.keyCode.ENTER:
									self._enter();
									return false;
									break;
								case self.keyCode.LEFT:
								case self.keyCode.RIGHT:
								case self.keyCode.SHIFT:
								case self.keyCode.CONTROL:
								case self.keyCode.ALT:
								case self.keyCode.COMMAND:
									// ignore metakeys (shift, ctrl, alt)
									return false;
									break;
							}
							if ($(el).val().length >= self.maxlength)
							{
								self.search($(el).val());
								self.query = $(el).val();
							}
						});
						$('li.searchtd').live('hover',function(){
							$(this).parents('#searchSuggest').find('li').removeClass('active');
							$(this).addClass('active');
							$(".searchItem").address()
							return true;
						})
						$(el).blur(function(){
							self._close();
						})
					},
	search		:	function(query){
						var self = this;
						$('input#searchGlass').removeClass('searchGlass').addClass('searchAjax');
						$.ajax({
							type	: 'get',
							url		: self.source+encodeURIComponent(query),
							success	: function(data)
							{
								self.result(data);
							}
						})
					},
	result		:	function(data)
					{
						if ( data == "" )
						{
							data = "<p style='font-size:13px;margin-left:10px;'>No Matching Results</p>";
						}
						
						var box = $('#searchSuggest')
						$(box).html(data)
						if( $(box).not(':visible') )
						{
							$(box).show();
						}
						$('input#searchGlass').removeClass('searchAjax').addClass('searchGlass');
					},
	_next		: 	function()
					{
						if ( $('#searchSuggest').is(':hidden') )
						{
							$($('#searchSuggest').show());
							return false;
						}
						
						var self = this;						
						var selected = $('#searchSuggest').find('li.active');
						if ( $(selected).length != 0 )
						{
							if ( $(selected).attr('data') == ( parseInt($('#searchSuggest').find('li').length) - 1 ) )
							{
								self._activate('0');
							}
							else
							{
								self._activate( parseInt($(selected).attr('data'))+1 );
							}
						}
						else
						{
							self._activate('0');
						}
					},
	_previous	:	function(){
						var self = this;
						$('#searchSuggest').show();
						var selected = $('#searchSuggest').find('li.active');
						if ( $(selected).length != 0 )
						{
							self._activate(parseInt($(selected).attr('data'))-1);
						}
						else
						{
							self._activate($('#searchSuggest').find('li').length - 1);
						}
					},
	_activate	:	function(eq)
					{
						var self = this;
						$('#searchSuggest').find('li').removeClass('active');
						$('#searchSuggest').find('a.searchItem').removeClass('selected');
						var li = $('#searchSuggest').find('li').eq(eq);
						$(li).addClass('active');
						$(li).find('a.searchItem').addClass('selected');
						$("input#searchInput").val($(li).find('span.searchValue').text())
						//alert(self.value)
						return false;
					},
	_close		:	function()
					{
						var self = this;
						$("input#searchInput").val(self.query);
						$('#searchSuggest').fadeOut().find('li').removeClass('active');
						$('#searchSuggest').find('a.searchItem').removeClass('selected');
					},
	_enter		:	function()
					{
						var self = this;
						var sel = $('#searchSuggest').find('a.selected');
						if ( sel.length != 0 )
						{
							var href = $(sel).attr('href');
							self._close();
							$.address.value(href)
						}
						else
						{
							var q = encodeURIComponent($('input#searchInput').val());
							//alert(q);
							self._close();
							$.address.value('/searches/query/'+q)
							return false;
							//$.address.value(href)
						}
					}
}

$("ul#searchFilter > li > a").live('click',function(){
	var filter = $(this).attr('id');
	var searchContainer = $('div#searchResultContainer');
	//var active = $("ul#searchFilter > li.active").find('a');
	
	switch (filter){
		case "searchall":
			$(searchContainer).find('div.searchResultHolder').show();
			break;
		case "searchsong":
			$(searchContainer).find('div.searchResultHolder').not('#searchSongs').hide();
			$('#searchSongs').show()
			break;
		case "searchartist":
			$(searchContainer).find('div.searchResultHolder').not('#searchArtists').hide();
			$('#searchArtists').show()
			break;
		case "searchuser":
			$(searchContainer).find('div.searchResultHolder').not('#searchUsers').hide();
			$('#searchUsers').show()
			break;
	}
	
	$('ul#searchFilter > li.active').removeClass('active');
	$(this).parent('li').addClass('active')
	return false;
})

$("#searchPageForm").live('submit',function(){
	var query = $('#searchDiv input[type=text]').val();
	if ( query == "" || query == " " )
	{
		return false;
	}
	else
	{
		$("div#loadingIndicator").show();
		var filter = $("ul#searchFilter > li.active").find('a').attr('id');
		$('span#tracksCount').html('Search Results for "'+query+'"')
		$('div#searchResultContainer').load('/searches/searchquery/'+filter+'/'+encodeURIComponent(query));
		$("div#loadingIndicator").hide();
		return false;
	}
})

//the function to enlarge the album art. Start.
var clicked = false;

	$('img.albumCoverImg').live("mouseover",function(){
		var img = $(this);
		var overlay = $(img).parent().find(".albumCoverOverlay")
		if(!clicked)$(overlay).show();
	})
	
	$("img.albumCoverOverlay").live("mouseout",function(){
		var overlay = $(this);
		if(!clicked)$(overlay).hide();
	})
	
	$("img.albumCoverOverlay").live("click",function(){
		clicked = true
		var overlay = $(this)
		var img = $(this).parent().find("img.albumCoverImg")
		$(overlay).hide();
		
		var src = $(img).attr("src")
		var newSrc = src.replace("100", "400");
		$(img).attr("src",newSrc)
		$(img).css({'width':'250px','height':'250px','z-index':'45','left':'-1','top':'-1','border':'1px solid #999999','position':'relative'})
	})
	
	$('img.albumCoverImg').live("mouseout",function(){
		var img = $(this);
		//alert(clicked)
		if(clicked){
			var src = $(img).attr("src")
			var newSrc = src.replace("400", "100");
			$(img).attr("src",newSrc)
			$(img).css({'width':'100px','height':'100px','z-index':'40'})
			clicked = false;
		}
	})

//the function to enlarge the album art. Ends.