/**
 * @author Nikolay Borisov ( nikolay@borisov.me | http://nikolay.borisov.me/ )
 * @copyright Notamedia ( http://notamedia.ru/ )
 * @version 0.1
 * @required jQuery
 * @date 2010/02/26
 */

if(window.top != window){
	var url = "/index/";
	if (window.opera) {
		window.location = url;
	} else {
		window.location.replace(url);
	}
}


var application = {};

application.model = {};

var curId = 0;

application.COMPLETED = 'completed';
application.BUFFERING = 'buffering';
application.PLAYING = 'playing';
application.IDLE = 'idle';
application.PAUSED = 'paused';

application.state = application.IDLE;
application.playlist = new Array();
application.id = 0;

application.showLogo = function()
{
	$('#logo2').fadeIn();
//	$('#header').css('background', 'black');
}

application.hideLogo = function()
{
	$('#logo2').hide();
	//$('#header').css('background', 'transparent');
}

application.updateCurrentPlaylist = function() {
	application.$CurrentTracks.jsonUpdate();
}

application.hideCurrentPlaylist = function()
{
	application.$CurrentTracks.hide();
}

application.initCurrentPlaylist = function() {

	application.$CurrentTracks = $('#current_tracks');
	
	$('.playlistBtn').click( function()
	{
		application.$CurrentTracks.toggle();
	});

	application.$CurrentTracks.jsonControl({
		'update_url': '/ajax/getPlaylist',
		'populateItem':
		function(_obj, _data, _index) {
			$res =  $('<div rel="' + _data.id + '">' + _data.title + '</div>');
			$res.text(_data.title);
			if(_data.id == application.id)
			{
				application.setTrackInfo(_data);
				$res.addClass('played');
				$res.addClass('selected');
			}
			
			if(!application.id)
			{
				application.id = _data.id;
				application.setTrackInfo(_data);
			}
			return $res;
		},
		'rebind': function(_obj)
		{
			$tracks = $(_obj).find('div');
			
			$tracks.click( function()
			{
				$this = $(this);
//				if($this.hasClass('_delete')) alert('aaa');
				$this.parent().find('.selected').removeClass('selected');
				$this.addClass('selected');

				//		    $this.parent().find('.played').removeClass('played');
				//		    $this.addClass('played');
				application.play($this.attr('rel'));
			});

		}
	});
}

application.deleteCurrentTrack = function (_obj){
	$.ajax({
		url: '/ajax/remove_track_from_current_playlist/' + $(_obj).attr('rel'),
		dataType: 'text',
		success: function(data){
			//application.$CurrentTracks.jsonUpdate();
		}
	});
}

application.enqueueObject = function(rel) {
	hidePopups();
	$.ajax({
		url: '/ajax/enqueue_track',
		type: 'get',
		dataType: 'json',
		data: {
			"id": rel
		},
		success: function(data){
			application.updateCurrentPlaylist();
		}
	});
}

application.play = function(track_id){
	if (application.model) {
		if (track_id && track_id != application.track_id) {
			application.track_id = track_id;
			$.ajax({
				url: '/ajax/play_track',
				type: 'get',
				dataType: 'json',
				data: {
					"id": application.track_id
				},
				success: function(data){
					playAJAX(data);
					application.updateCurrentPlaylist();
				}
			});
		} else
		if(application.track_id)
		{
			application.model.playMe();
		}
		else
		if(!track_id)
		{
			$firstPlaylistTrack = application.$CurrentTracks.children('div').first();
			if($firstPlaylistTrack.length)
			{
				track_id = $firstPlaylistTrack.attr('rel');
				application.play(track_id);
			}
		}
	}
}
    
	
application.prevNext = function(dir){
	if (application.model) {
				
		var $selected = application.$CurrentTracks.find('.selected').first();

		if($selected.length == 0)
		{
			$selected = application.$CurrentTracks.find('div').first();
		}
		$change = dir ? $selected.next('div') : $selected.prev('div');
		
		if( $change.length == 0)
		{

			$change = application.$CurrentTracks.find('div').first();
		}
		if($change.length)
		{
			//alert($change.attr('rel'));
			application.play($change.attr('rel'));
		}
		
	}
}
	
function playAJAX(data){
	if (data.result) {

		application.track_id = data.result.track_id;
		application.id = data.result.id;
		application.setTrackInfo(data.result);
		application.model.playMe(data.result.track_uri);

		return true;
	} else {
		application.track_id = null;
		//application.id = null;
		application.setTrackInfo(null);
		application.model.stopMe();
		application.clear();
		return false;
	}
}
	
application.navigateToBand = function(_obj)
{
	id = $(_obj).attr('rel');
	if(id) getUrl('/artist/' + id);
}

application.navigateToSong = function(_obj)
{
	id = $(_obj).attr('rel');
	if(id) getUrl('/catalog/music/album/' + id);
}


application.pause = function(){
	if (application.model) {
		application.model.pauseMe();
	}
}
	
application.seek = function(position){
	if (application.model && application.track_id) {
		application.model.seekMe(position);
	}
}
	
application.volume = function(level){
	if (application.model) {
		if (level >= 0) {
			application.model.setVolume(level);
			$.cookie('volume', level, '/');
		}else{
			return application.model.getVolume();
		}
	}
}


domLoaded = function(){
	application.storedLocation = "";
	application.contentFrame = document.getElementById('contentFrame');
	initLocation();
    
}

function initLocation(){
	
	locationListener();
	// HAXX
	window.setInterval(locationListener, 500);
	
	function locationListener(){

		var loc = window.location.href.toString();
		
//			alert(application.storedLocation);
		//loc = loc.replace('#/index/', '')
		//alert(loc);
		//loc = loc.replace('#/index/', '');
		if(application.storedLocation != loc){
			application.storedLocation = loc;
			
			if( loc.indexOf('#/index') != -1)
			{
				return;
			}
			var url = hash(application.storedLocation);
			getUrl(url);
		}
	}
	
	function hash(loc){
		var a = loc.match(/^(.+?)#(.*)$/);
		if (a && a[2]) {
			return a[2];
		}else{
			return "";
		}
	}
	
}

function getUrl(url){
	if (!url || url == "/") {
		url = "/index/";
	}
	if (window.opera) {
		// application.location = url;
	} else {
	
//		alert(application.contentFrame.contentWindow.location);
//		alert(url);
		// application.location.replace(url);
	}
}


function initPlayer(){

	application.flashContainer = document.getElementById('flashContainer');
	application.flashContainer.innerHTML = flashHTML();

	
	function flashHTML() {
		var dt = new Date(),
		id = 'flashPlayer',
		url = '/static/swf/audio.swf',
		width = '1',
		height = '1',
		wmode = 'transparent',
		flashVars = "apiReady=apiReady";
	
		var html =
		'<object id="' + id + '" type="application/x-shockwave-flash" data="' + url + '" width="' + width + '" height="' + height + '" class="uploader">' +
		'<param name="wmode" value="' + wmode + '" />' +
		'<param name="movie" value="' + url + '" />' +
		'<param name="quality" value="high" />' +
		'<param name="menu" value="false" />' +
		'<param name="allowScriptAccess" value="always" />' +
		'<param name="flashvars" value="' + flashVars + '" />' +
		'</object>';
			
		return html;
	};
}

function initApi()
{
	application.model = document.getElementById('flashPlayer');

	var $window = $(window);
	var $document = $(document);
	var $body = $('body');
	var $frame = $('#contentFrame');

	
	var Player = $body.find('#player');
	$Player = $(Player);
		
	var $PlayBtn = $Player.find('.playBtn');
	var $PauseBtn = $Player.find('.pauseBtn');
	var $PrevBtn = $Player.find('.prevBtn');
	var $NextBtn = $Player.find('.nextBtn');
	var $MuteBtn = $Player.find('.muteBtn');
	var $Progress = $Player.find('.progressBar');
	var $Band = $Player.find('._band');
	var $Song = $Player.find('._song');

	var $CurTime = $Progress.find('.curTime');
	var $TotalTime = $Progress.find('.totalTime');

	application.clear = function()
	{
		$CurTime.html('');
		$TotalTime.html('');
		file.position = 0;
		file.duration = 0;

		upPosition();
	}

	var $Position = $Progress.find('.position');
	var $Buffer = $Progress.find('.buffer');
	var $Title = $Player.find('.title');
	
	var $Volume = $Player.find('.volume');
	var $VolumeLevel = $Volume.find('.level');
	
	var barWidth = $Progress.width();
	var barLeftOffset = 0; //$Progress.offset() ? $Progress.offset().left : 0;
	
	var cacheVolume;
	

	var file = {
		duration:0,
		position:0,
		loaded:0,
		total:0
	};

	if (application.state == application.PLAYING || application.state == application.BUFFERING) {
		$PlayBtn.hide();
		$PauseBtn.show();
	} else {
		$PlayBtn.show();
		$PauseBtn.hide();
	}
	
	application.setTitle = function(title){
		$Title.text(title);
	}
	
	application.setTrackInfo = function(info)
	{
		if(info)
		{
			$Band.attr('rel', info.artist_id);
			$Band.text(info.artist_name);
			$Song.attr('rel', info.album_id);
		    $Song.html(val);			
			var val = (info.duration + ' ' + info.title);

			application.setTitle(val);
		}
		else
		{
			$Band.attr('rel', null);
			$Band.text('');
			$Song.attr('rel', null);
			$Song.text('');
			application.setTitle('');

		}
	}
	
	
	application.stateHandler = function(state){
		if(state == application.state) return;
		application.state = state;
		if (state == application.PLAYING || state == application.BUFFERING) {
//			window.$Plays.find("a[rel='" + application.id + "']").hide();
//			window.$Pauses.show();
			$PlayBtn.fadeOut(100);
			$PauseBtn.fadeIn(100);
			(
			function() {
			if(application.playCallback){
				application.playCallback();
			}
			})();
			
		} else
		if(state == application.COMPLETED)
		{
			application.prevNext(true);
		}
		else
		{
			$PlayBtn.fadeIn(100);
			$PauseBtn.fadeOut(100);
			
                          			(
			function() {
			if(application.stopCallback){
				application.stopCallback();
			}
			})();
		}
		if (application.childState) {
			application.childState();
		}
	}


	application.timeHandler = function(data){
		$CurTime.html(data.curTime);
		$TotalTime.html(data.totalTime );
		file.position = data.position;
		file.duration = data.duration;

		upPosition();
	}
	
	application.loadedHandler = function(data){
		file.loaded = data.loaded;
		file.total = data.total;
		upBuffer();
	}


	// load volume
	
	var vol;
/*	if ( ($.cookie('volume')) && ($.cookie('volume') >= 0)) {
		vol = parseInt($.cookie('volume'));
		application.volume(vol);
	} else { */
		vol = application.volume();
	//}
	$VolumeLevel.css('width', '100%');
	if(vol == 0){
		$MuteBtn.addClass('unmuteBtn');
	}

	// end load volume
	
	$window.bind('resize', resizeHandler);
	$Progress.bind('mousedown', seekHandler);
	$PlayBtn.bind('click', playHandler);
	$NextBtn.bind('click', nextHandler);
	$PrevBtn.bind('click', prevHandler);
	$PauseBtn.bind('click', pauseHandler);
	$Volume.bind('mousedown', volumeHandler);
	$MuteBtn.bind('click', muteHandler);
	
	$frame.show();
	$frame.attr('display', 'block');
	
	//$Player.show();


	function resizeHandler(e){
		barWidth = $Progress.width();
		barLeftOffset = 0; //$Progress.offset().left;
		upBuffer();
		upPosition();
	}
	
	function volumeHandler(e){

		var leftOffset = $Volume.offset().left;
		
		$document.bind('mousemove', mouseMove);
		$document.bind('mouseup', mouseUp);
		
		unselectable();
		
		mouseMove(e);
		
		function mouseMove(e){
			var x = e.clientX - leftOffset;
			
			var w = $Volume.width();
			if (x <= 0) {
				x = 0;
				$MuteBtn.addClass('unmuteBtn');
			} else if(x > 57) {
				x = 57;
				$MuteBtn.removeClass('unmuteBtn');
			} else {
				$MuteBtn.removeClass('unmuteBtn');
			}
			var val = Math.floor(x * 100/ w);
			application.volume(x*4);
			$VolumeLevel.css({
				width: val + '%'
			});
		}
		
		function mouseUp(e){
			$document.unbind('mouseup', mouseUp);
			$document.unbind('mousemove', mouseMove);
			selectable();
		}
	}
	
	function muteHandler(e){
		var curVolume = application.volume();
		if(curVolume == 0 && cacheVolume > 0){
			$MuteBtn.removeClass('unmuteBtn');
			application.volume(cacheVolume);
			$VolumeLevel.css({
				left:cacheVolume/2-1
			});
			cacheVolume = 0;
		}else{
			$MuteBtn.addClass('unmuteBtn');
			cacheVolume = curVolume;
			application.volume(0);
			$VolumeLevel.css({
				left:-1
			});
		}
	}
		
	function seekHandler(e){
		var x = e.clientX - barLeftOffset;
		var position = parseInt(x*file.duration/barWidth);
		application.seek(position);
	}
	
	function playHandler(e){
		application.play();
	}
	
	function pauseHandler(e){
		application.pause();
	}
	
	function nextHandler(e){
		application.prevNext(true);
	}
	
	function prevHandler(e){
		application.prevNext(false);
	}
	
	function unselectable(){
		$document.bind('dragstart', cancelEvent);
		$body.bind('selectstart', cancelEvent);
		
		document.body.unselectable = "on";
		document.body.onselectstart = function(){
			return false;
		};
		if (document.body.style)
			document.body.style.MozUserSelect = "none";
	};
		
	function selectable(){
		$document.unbind('dragstart', cancelEvent);
		$body.unbind('selectstart', cancelEvent);
		
		document.body.unselectable = "off";
		document.body.onselectstart = function(){
			return true;
		};
		if (document.body.style) {
			document.body.style.MozUserSelect = "";
		}
	};
	
	function cancelEvent(e){
		return false;
	}
	
	function upBuffer(){
		var loadedWidth = (file.loaded / (file.total + 0.001))*barWidth;
		$Buffer.css({
			width:loadedWidth
		});
	}
	
	function upPosition(){
		var positionWidth = (file.position / (file.duration + 0.001))*barWidth;
		$Position.css({
			width:positionWidth
		});
	}	
	
	application.initCurrentPlaylist();
	application.updateCurrentPlaylist();
	
}

function apiReady(){
    //
//    window.setTimeout( function() { alert('aaa')}, 10  );    
//	alert('ff');
	window.setTimeout( initApi, 1000  );
}



