var APP = {};

//Copyright (c) 2010 Nicholas C. Zakas. All rights reserved.
//MIT License

function EventTarget()
{
	this._listeners = {};
}

EventTarget.prototype = {

	constructor:EventTarget,

	addListener:function (type, listener)
	{
		if (typeof this._listeners[type] == "undefined") {
			this._listeners[type] = [];
		}

		this._listeners[type].push(listener);
	},

	fire:function (event)
	{
		if (typeof event == "string") {
			event = { type:event };
		}
		if (!event.target) {
			event.target = this;
		}

		if (!event.type) {  //falsy
			throw new Error("Event object missing 'type' property.");
		}

		if (this._listeners[event.type] instanceof Array) {
			var listeners = this._listeners[event.type];
			for (var i = 0, len = listeners.length; i < len; i++) {
				listeners[i].call(this, event);
			}
		}
	},

	removeListener:function (type, listener)
	{
		if (this._listeners[type] instanceof Array) {
			var listeners = this._listeners[type];
			for (var i = 0, len = listeners.length; i < len; i++) {
				if (listeners[i] === listener) {
					listeners.splice(i, 1);
					break;
				}
			}
		}
	}
};

APP.eventTarget = new EventTarget();

APP.logout = function ()
{
	APP.eraseCookie('siteRememberAuth');
	APP.eraseCookie(cookieField);

	jQuery.get(web_path + 'ajax/login/logout', function ()
	{

		if (inSecuredArea) {
			window.location.assign("/");
		}

		APP.getUserInfo();
		APP.getActions();
	});

	return false;
}

APP.getUserInfo = function ()
{
	new Request.JSON({
		url:web_path + "ajax/home/getUserInfo",
		data:{uri:document.location.pathname },
		onRequest:function ()
		{
		},
		onSuccess:function (response)
		{
			if (!response['completed']) {
				APP.getUserInfo();
				return;
			}
			document.getElementById('dynamicUserMenu').innerHTML = response['dynamicUserMenu'];
			isLoggedIn = response['isLoggedIn'];
			APP.eventTarget.fire("loginInfoReceived");
		},
		onFailure:function ()
		{
			APP.getUserInfo();
		}
	}).send();
}

APP.loginRedirect = function ()
{
	new Request.JSON({
		url:web_path + "ajax/home/loginRedirect",
		data:{
			location:window.location.href
		},
		onRequest:function ()
		{
		},
		onSuccess:function (response)
		{
			window.location = response['url'];
		}
	}).send();
}

APP.newWindow = function ()
{
	playerPlaying = false;
	var width = 442;
	var height = 285;
	window.open('/player/p/', 'hnhhPlayer', 'width=' + width + ',height=' + height + ',menubar=no,toolbar=no,location=no,directories=yes,copyhistory=no,resizable=no');
}

APP.addItemToFavorites = function ()
{
	new Request.JSON({
		url:web_path + "ajax/player/addToFavorites",
		data:{
			mediaType:jQuery('#mediaType').val(),
			mediaId:jQuery('#mediaId').val()
		},
		onSuccess:function (response)
		{
			var m = response.msg;
			if (m.length > 0) {
				if (response.success) {
					jQuery("a#favouritesButton")
							.unbind('click')
							.click(APP.deleteItemFromFavorites)
							.text('favorited');
				}
			}
		}
	}).send();
}

APP.deleteItemFromFavorites = function ()
{
	new Request.JSON({
		url:web_path + "ajax/player/deleteFromFavorites",
		data:{
			mediaType:jQuery('#mediaType').val(),
			mediaId:jQuery('#mediaId').val()
		},
		onSuccess:function (response)
		{
			var m = response.msg;
			if (m.length > 0) {
				if (response.success) {
					jQuery("a#favouritesButton")
							.unbind('click')
							.click(APP.addItemToFavorites)
							.text('add to favorites');
				}
			}
		}
	}).send();
}

APP.addFromAlbumToPlaylist = function (song)
{
	new Request.JSON({
		url:web_path + "ajax/player/addToPlaylist",
		data:{
			mediaType:'s',
			mediaId:song
		},
		onSuccess:function (response)
		{
			var m = response.msg;
			if (m.length > 0) {
				APP.showModal({
					modal:true,
					title:response.err ? 'Error' : 'Info',
					msg:response.msg
				});
			}
		}
	}).send();
}

APP.addItemToPlayList = function ()
{
	new Request.JSON({
		url:web_path + "ajax/player/addToPlaylist",
		data:{
			mediaType:jQuery('#mediaType').val(),
			mediaId:jQuery('#mediaId').val()
		},
		onRequest:function ()
		{
		},
		onSuccess:function (response)
		{
			var m = response.msg;
			if (m.length > 0) {
				if (response.success) {
					jQuery("a#playlistButton")
							.unbind('click')
							.click(APP.removeItemFromPlayList);
					APP.changeToMinus(jQuery("a#playlistButton"));
				}
			}
		}
	}).send();
}

APP.removeItemFromPlayList = function ()
{
	new Request.JSON({
		url:web_path + "ajax/player/removeFromPlaylist",
		data:{
			mediaType:jQuery('#mediaType').val(),
			mediaId:jQuery('#mediaId').val()
		},
		onRequest:function ()
		{
		},
		onSuccess:function (response)
		{
			var m = response.msg;
			if (m.length > 0) {
				if (response.success) {
					jQuery("a#playlistButton")
							.unbind('click')
							.click(APP.addItemToPlayList);
					APP.changeToPlus(jQuery("a#playlistButton"));
				}
			}
		}
	}).send();
}

APP.requestDeleteAccount = function ()
{
	APP.showModal({
		modal:true,
		isConfirm:true,
		title:'Confirm',
		msg:'Would you like to delete your account?',
		fnYes:'APP.processDeleteAccount()'
	});
}

APP.processDeleteAccount = function ()
{
	var req = new Request.JSON({
		method:'post',
		url:web_path + 'ajax/editProfile/deleteAccount/',
		data:{},
		onRequest:function ()
		{
		},
		onComplete:function (response)
		{
			if (response['err']) {
				APP.showModal({
					modal:true,
					title:'Info',
					msg:response['msg']
				});
			} else {
				APP.showModal({
					modal:true,
					title:'Info',
					msg:'Your account has been deleted'
				});
				setTimeout(function ()
				{
					APP.logout();
					window.location.href = web_path;
				}, 300);
			}
		}
	}).send();
}

/**
 * Cookies functions
 */
APP.createCookie = function (name, value, days)
{
	if (days) {
		var date = new Date();
		date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
		var expires = "; expires=" + date.toGMTString();
	}
	else var expires = "";
	document.cookie = name + "=" + value + expires + "; path=/";
}

APP.readCookie = function (name)
{
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for (var i = 0; i < ca.length; i++) {
		var c = ca[i];
		while (c.charAt(0) == ' ') c = c.substring(1, c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
	}
	return null;
}

APP.eraseCookie = function (name)
{
	APP.createCookie(name, "", -1);
}
/**
 * End cookies functions
 */

// OVERLAY HELPERS

APP.getDocHeight = function ()
{
	var D = document;
	return Math.max(
			Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
			Math.max(D.body.offsetHeight, D.documentElement.offsetHeight),
			Math.max(D.body.clientHeight, D.documentElement.clientHeight)
	);
}

APP.showOverlay = function ()
{
	var overlay = new Element('div', {'id':'overlay', 'class':'overlay', 'style':'width:100%; height:' + APP.getDocHeight() + 'px'});
	overlay.inject(window.document.body, 'inside');
}

APP.showModal = function (config)
{

	if (config.modal) {
		APP.showOverlay();
	}

	var title = config.title;
	var msg = config.msg ? config.msg : '';
	var extraClass = config.extraClass ? ' ' + config.extraClass : '';
	var fnYes = config.fnYes;

	var buttons = '';
	if (config.isConfirm) {
		buttons =
				'<p>' +
						'<a onclick="' + fnYes + ';APP.closeModal();" class="button" href="javascript:;">' +
						'<input type="button" value="Yes" onfocus="this.blur()"/>' +
						'</a>' +
						'<a onclick="APP.closeModal();" class="button" href="javascript:;">' +
						'<input type="button" value="No" onfocus="this.blur()"/>' +
						'</a>' +
						'</p>';
	} else {
		buttons =
				'<p align="center">' +
						'<a onclick="APP.closeModal();" class="button" href="javascript:;">' +
						'<input type="button" value="Close" class="pointer" onfocus="this.blur()"/>' +
						'</a>' +
						'</p>';
	}

	var htmlContent =
			'<div class="popup-box' + extraClass + '">' +
					'<div class="close-modal" onclick="APP.closeModal();"></div>' +
					'<h3 onclick="APP.closeModal();" class="pointer">' + title + '</h3><p>' + msg + '</p>' +
					buttons +
					'</div>';

	var modalWin = new Element('div', {'id':'modalBox', 'class':'modal-box', 'html':htmlContent});

	modalWin.inject(window.document.body, 'inside');
}

APP.closeModal = function ()
{
	window.document.body.removeChild(document.getElementById('overlay'));
	window.document.body.removeChild(document.getElementById('modalBox'));
}

APP.doShareLink = function (link)
{
	window.open(link, '_blank');
}

APP.getKeyPressed = function (e)
{
	if (!e) {
		e = window.event;
	}

	var keyCode;

	if (e.keyCode) {
		keyCode = e.keyCode;
	} else if (e.which) {
		keyCode = e.which;
	}

	return keyCode;
}

APP.searchOnEnter = function (elem, event, searchCategory, defaultText)
{
	var key = APP.getKeyPressed(event);
	if (key == 13) {
		searchBtn(searchCategory, defaultText);
	}
}

APP.changeToMinus = function (element)
{
	jQuery(element)
			.removeClass("jp-info")
			.addClass("jp-minus")
			.parent("li")
			.simpletip()
			.update("Off playlist");
}

APP.changeToPlus = function (element)
{
	jQuery(element)
			.removeClass("jp-minus")
			.addClass("jp-info")
			.parent("li")
			.removeClass("hnhh-2")
			.addClass("hnhh")
			.simpletip()
			.update("Add to playlist");
}

APP.getActions = function ()
{
	if (jQuery("#mediaId").length > 0) {
		jQuery.getJSON(
				web_path + 'ajax/info/getActions', {
					mediaType:jQuery('#mediaType').val(),
					mediaId:jQuery('#mediaId').val(),
					performerId:(jQuery("#performerId").length > 0 ? jQuery('#performerId').val() : 0)
				},
				function (response)
				{
					enableComments();

					if (response.isRateble) {
						enableRating();
					}
					if (response.isVisitable && response.updatedCounter != "-1") {
						jQuery("#itemViews").text(response.updatedCounter);
					}
					if (response.isFavoritable) {
						jQuery("a#favouritesButton").click(
								function ()
								{
									eval(response.favoriteFunction);
								}).text(response.favoriteText);
					}
					if (response.isPlaylistable) {
						if (jQuery("a#playlistButton").length > 0) {
							if (!response.inPlaylist) {

								jQuery("a#playlistButton").click(
										function ()
										{
											APP.changeToMinus(jQuery("a#playlistButton"));
											APP.addItemToPlayList();
											_gaq.push(['_trackEvent', response.mediaTitle, 'Playlisted', jQuery('#mediaId').val()]);
										}).text(response.playlistText);
							} else {
								APP.changeToMinus(jQuery("a#playlistButton"));
								jQuery("a#playlistButton")
										.click(function ()
										{
											APP.removeItemFromPlayList();
											APP.changeToPlus(jQuery("a#playlistButton"));
											_gaq.push(['_trackEvent', response.mediaTitle, 'Unplaylisted', jQuery('#mediaId').val()]);
										});
							}
						}
					}
				}
		);
	}
}

APP.showPanel = function (elem, pane)
{
	document.getElementById('myFiles').style.display = 'none';
	document.getElementById('settings').style.display = 'none';
	document.getElementById('siteAdmin').style.display = 'none';
	document.getElementById(pane).style.display = 'block';

	if (document.getElementById('MenuSiteAdmin')) {
		document.getElementById('MenuSiteAdmin').className = '';
	}
	if (document.getElementById('MenuSettings')) {
		document.getElementById('MenuSettings').className = '';
	}
	if (document.getElementById('MenuMyFiles')) {
		document.getElementById('MenuMyFiles').className = '';
	}
	elem.className = 'active';
}

APP.requestBecomeFan = function ()
{
	APP.showModal({
		modal:true,
		isConfirm:true,
		title:'Confirm',
		msg:'All the Songs & Mixtapes uploaded to your Artist account will be deleted permanently (but Comments you posted on the site will be kept). Continue to Become Fan?',
		fnYes:'APP.processBecomeFan()'
	});
}

APP.processBecomeFan = function ()
{
	new Request.JSON({
		method:'post',
		url:web_path + 'ajax/editProfile/becomeFan/',
		data:{},
		onComplete:function (response)
		{
			if (response['err']) {
				APP.showModal({
					modal:true,
					title:'Info',
					msg:response['errMsg']
				});
			} else {
				APP.showModal({
					modal:true,
					title:'Info',
					msg:'Your account type has been changed to fan'
				});
				setTimeout(function ()
				{
					APP.logout();
					window.location.href = web_path;
				}, 300);
			}

		}
	}).send();
}

APP.doLogin = function ()
{
	var updater = jQuery('.contact-form .note');

	jQuery.ajax({

		url:"/ajax/login",
		type:"POST",
		data:{
			email:jQuery("input.email").val(),
			password:jQuery("input.password").val(),
			rememberme:jQuery("input#rememberme").attr('checked')
		},

		beforeSend:function ()
		{
			updater.html("loading...");
		},
		dataType:'json',
		success:function (response, textStatus, jqXHR)
		{
			if (!response) {
				return;
			}
			var elements = jQuery('.contact-form label, .contact-form input[type=text], .contact-form input[type=password]')
			elements.each(function (index, element)
			{
				try {
					element.removeClass('errorClass');
				} catch (e) { /* Do nothing*/
				}
			});

			jQuery('label.errorClass').each(function (index, element)
			{
				element.removeClass('errorClass');
			});

			if (response['cookie_value'] != '') {
				APP.createCookie(response['cookie_name'], response['cookie_value'], 365);
			}

			if (response['cookie_valueX'] != 0) {
				APP.createCookie(response['cookie_nameX'], response['cookie_valueX'], 365);
			} else {
				APP.eraseCookie(response['cookie_nameX']);
			}

			var err_campurri = response["msg"] + "<br /><ul>";
			if (response['err']) {
				updater.show();
				var fields = response['errFields'];
				if (fields) {
					for (var i = 0; i < fields.length; i++) {
						jQuery("input[name=" + fields[i] + "]").addClass('errorClass');
						jQuery("label[for=" + fields[i] + "]").addClass('errorClass');
						err_campurri += "<li>" + jQuery("label[for=" + fields[i] + "]").html() + "</li>";
					}

					if (fields.length > 1) {
						jQuery('input.email').focus();
					}
					else {
						jQuery("input[name=" + fields[0] + "]").focus();
					}
				}
				updater.html(err_campurri + "</ul>");
			}
			//In the case that the activation link needs to be displayed, cancel everything we're doing, redirect there.
			else if (response['url']) {
				setTimeout(function ()
				{
					window.location = response['url'];
				}, 300);
			}
			else {
				APP.eventTarget.fire('loginCompleted');
			}
		}
	});
}

jQuery(document).ready(function ()
{
	jQuery(".avertissement .close-small a").live("click", function ()
	{
		jQuery(this).parents(".avertissement").fadeOut();
	});

	jQuery(".text .expand a").live("click", function ()
	{
		var siblingDescription = jQuery(this).parent().siblings(".description-summary");
		var realHeight = siblingDescription[0].scrollHeight;

		if (!jQuery(this).hasClass("rotated-180")) {
			siblingDescription.animate({height:realHeight});
			jQuery(this).addClass("rotated-180");
		} else {
			siblingDescription.animate({height:70});
			jQuery(this).removeClass("rotated-180");
		}
	});

	var solution;

	if (navigator.userAgent.toLowerCase().indexOf("opera") != -1) {
		solution = "html, flash";
	} else {
		solution = 'flash, html';
	}

	if (jQuery("body#viewAlbum #jquery_jplayer_1, body#viewArtist #jquery_jplayer_1, body.playerWindow, body#viewEmbeddedMixtape").length > 0) {
		new jPlayerPlaylist({
			jPlayer:"#jquery_jplayer_1",
			cssSelectorAncestor:"#jp_container_1"
		},
		existingPlaylist,
		{
			playlistOptions:	{
				autoPlay: autoPlay
			},
			swfPath: web_root + "js/frameworks/jplayer",
			supplied: "mp3",
			wmode: "window",
			volumechange: APP.persistVolumeChange,
			volume: (APP.readCookie("jplayer-volume") == null ? 0.5 : APP.readCookie("jplayer-volume")),
			muted: (APP.readCookie("jplayer-muted") == null ? false : (APP.readCookie("jplayer-muted") == "false" ? false : true)),
			solution: solution

		});
	}

	if (jQuery("body#viewSong #jquery_jplayer_1, body#viewEmbeddedSong").length > 0) {
		jQuery("#jquery_jplayer_1").jPlayer({
			ready:function (event)
			{
				jQuery(this).jPlayer("setMedia", {
					mp3:songPath
				});
				if (autoPlay) {
					jQuery(this).jPlayer("play");
				}
			},
			swfPath: web_root + "js/frameworks/jplayer",
			supplied: "mp3",
			wmode: "window",
			volumechange: APP.persistVolumeChange,
			volume: (APP.readCookie("jplayer-volume") == null ? 0.5 : APP.readCookie("jplayer-volume")),
			muted: (APP.readCookie("jplayer-muted") == null ? false : (APP.readCookie("jplayer-muted") == "false" ? false : true)),
			solution: solution
		});
	}


	jQuery(".jp-share").click(function ()
	{
		jQuery('.share-form').slideToggle('slow', function ()
		{
			if (!jQuery('.share-form').is(':hidden')) {
				jQuery(".share-link").select();
			}
			jQuery(".share-form .button a").zclip({
				path: web_root + 'js/frameworks/zclip/ZeroClipboard.swf',
				copy:jQuery('.share-form .share-link').val()
			});
		});
	});

	jQuery(".share-form .close-small a").click(function ()
	{
		jQuery('.share-form').slideUp();
	});

	if (jQuery("a.jp-download").parent(".download-btn").length > 0) {
		jQuery("a.jp-download").parent(".download-btn").simpletip({
			// Configuration properties
			content:'Download',
			//position: "bottom",
			position:["-33", "35"]
		});
	}

	if (jQuery("a.jp-info").parent(".plus-btn").length > 0) {
		jQuery("a.jp-info").parent(".plus-btn").simpletip({
			// Configuration properties
			content:'Add to playlist',
			//position: "bottom",
			position:["-35", "35"]
		});
	}

	if (jQuery("a.jp-share").not("#viewEmbeddedSong a.jp-share").not("#viewEmbeddedMixtape a.jp-share").parent(".share-btn").length > 0) {
		jQuery("a.jp-share")
				.not("#viewEmbeddedSong a.jp-share")
				.not("#viewEmbeddedMixtape a.jp-share")
				.parent(".share-btn")
				.simpletip({
					// Configuration properties
					content:'Share',
					//position: "bottom",
					position:["-35", "35"]
				});
	}

	jQuery("#viewEmbeddedMixtape .view-song-details").live('click', function ()
	{
		window.open(this.href, 'newwin');
	});

	//Login link for some pages? Redirect to home page after login
	if (jQuery("body#register, body#login, body#forgotPassword").length > 0) {
		jQuery(".login-link a").live("click", function ()
		{
			APP.loginAndDo(function ()
			{
				window.location.assign("/")
			});
			return false;
		});
		//Otherwise, just do nothing special
	} else {
		jQuery(".login-link a").live("click", function ()
		{
			APP.loginAndDo(function ()
			{
			});
			return false;
		});
	}

	jQuery(".upload-link a").live("click", function ()
	{
		if (!isLoggedIn) {
			APP.loginAndDo(function ()
			{
				window.location.assign("/create-artist.html")
			});
			return false;
		}
	});

	//addComment not always is imported, let's define it as a stub, in case
	if (typeof addComment == "function") {
		APP.addComment = addComment;
	}
	else {
		APP.addComment = function ()
		{
		};
	}

	if (typeof postComment == "function") {
		APP.postComment = postComment;
	}
	else {
		APP.postComment = function ()
		{
		};
	}

	APP.loginAndDo = function (callback)
	{
		APP.eventTarget.addListener('loginCompleted', function ()
		{
			//if success
			closeLoginBox();
			APP.getUserInfo();
			APP.getActions();
			APP.removeLoginFunctionWrapper();
			callback();
		});
		jQuery(".overlay-login, .overlay-box-login").show();
		jQuery(".overlay-box-login .contact-form .note").html("");
		jQuery(".overlay-box-login .email, .overlay-box-login .password").val("");

		jQuery(document).keydown(function (e)
		{
			if (e.which == 27) {
				closeLoginBox();
			}
		});

		jQuery("input.email").keydown(function (event)
		{
			if (event.keyCode == 13) jQuery("#overlay-login-form").trigger("submit");
		});
		jQuery("input.password").keydown(function (event)
		{
			if (event.keyCode == 13) jQuery("#overlay-login-form").trigger("submit");
		});

		jQuery("input.email").focus();

		jQuery(".overlay-box-login .submit-button-login").click(function()	{
			jQuery("#overlay-login-form").trigger("submit");
		});
		jQuery("#overlay-login-form").submit(function()	{
			APP.doLogin();
			return false;
		})
		jQuery(".overlay-box-login .submit-button-cancel-login, .overlay-box-login .close").click(closeLoginBox);

		function closeLoginBox()
		{
			jQuery(".overlay-login, .overlay-box-login").hide();
			jQuery('body').unbind("keypress");
		}
	}

	APP.removeLoginFunctionWrapper = function ()
	{
		APP.addItemToFavorites = APP.addItemToFavoritesNoLogin;
		APP.addFromAlbumToPlaylist = APP.addFromAlbumToPlaylistNoLogin;
		APP.addItemToPlayList = APP.addItemToPlayListNoLogin;
		APP.deleteItemFromFavorites = APP.deleteItemFromFavoritesNoLogin;
		APP.removeItemFromPlayList = APP.removeItemFromPlayListNoLogin;
		APP.addComment = APP.addCommentNoLogin;
		APP.postComment = APP.postCommentNoLogin;
		if (typeof enableComments == "function") {
			enableComments();
		}
	}

	APP.eventTarget.addListener('loginInfoReceived', function ()
	{
		if (!isLoggedIn) {
			APP.addItemToFavoritesNoLogin = APP.addItemToFavorites;
			APP.addItemToFavorites = function ()
			{
				APP.loginAndDo(APP.addItemToFavoritesNoLogin);
			}

			APP.addFromAlbumToPlaylistNoLogin = APP.addFromAlbumToPlaylist;
			APP.addFromAlbumToPlaylist = function (song)
			{
				APP.loginAndDo(function ()
				{
					APP.addFromAlbumToPlaylistNoLogin(song);
				});
			}

			APP.addItemToPlayListNoLogin = APP.addItemToPlayList;
			APP.addItemToPlayList = function ()
			{
				APP.loginAndDo(APP.addItemToPlayListNoLogin);
			}

			APP.deleteItemFromFavoritesNoLogin = APP.deleteItemFromFavorites;
			APP.deleteItemFromFavorites = function ()
			{
				APP.loginAndDo(APP.deleteItemFromFavoritesNoLogin);
			}

			APP.removeItemFromPlayListNoLogin = APP.removeItemFromPlayList;
			APP.removeItemFromPlayList = function ()
			{
				APP.loginAndDo(APP.removeItemFromPlayListNoLogin);
			}

			APP.addCommentNoLogin = APP.addComment;
			APP.addComment = function ()
			{
				APP.loginAndDo(APP.addCommentNoLogin);
			}

			APP.postCommentNoLogin = APP.postComment;
			APP.postComment = function ()
			{
				APP.loginAndDo(APP.postCommentNoLogin);
			}
		}
	})
});

APP.persistVolumeChange = function (e)
{
	APP.createCookie("jplayer-volume", e.jPlayer.options.volume, 5);
	APP.createCookie("jplayer-muted", e.jPlayer.options.muted, 5);
}

function getDictio(item)
{
	if (typeof (dictio[item]) != 'undefined') {
		return dictio[item] ? dictio[item] : "[" + item + "]";
	} else {
		return "[" + item + "]";
	}
}
