$.fn.extend({
	/**
	 * Vai subindo o nível até encontrar um parent que encaixa com o seletor.
	 * 
	 * @param selector Seletor no qual o parent deve encaixar.
	 */
	parentIs: function (selector) {
		var parent = this;
		var iso = (typeof selector == 'object');
		while (parent.length != 0) {
			if ((iso && (parent[0] == selector)) || (parent.is(selector))) {
				return parent;
			}
			parent = parent.parent();
		}
		return $('#asdfghjklqwertyuiop'); // Para retornar um jquery vazio.
	},
	/**
	 * Funciona análogo ao bind. Porém o primeiro parametro é o escopo que a função vai receber.
	 * 
	 * @param obj Objeto que será o this da função
	 * @param event Objeto do evento. Foi adicionada a propriedade originalThis para obter o mesmo "this" que o bind forneceria.
	 * @param fnc Função que será chamada
	 */
	on: function (obj, event, fnc) {
		if (event instanceof Function) {
			fnc = event;
			delete event;
		}
		if (typeof obj == 'string') {
			event = obj;
			delete obj;
		}
		this.bind(event, function (e) {
			e.originalThis = this;
			fnc.apply(obj || this, arguments);
		});
		return this;
	}
});

function EditorMusica(editormusicas, container, nome, artista) {
	this.editormusicas = editormusicas;
	var inicializar = false;
	if (typeof container == 'string') {
		this.$container = $('<li />').appendTo(this.editormusicas.$container);
		inicializar = true;
	} else {
		this.$container = $(container);
	}
	if (this.$container.find('> input').length == 0) {
		this.$container.append('<input type="hidden" name="idmusica[]" value="" /><div><a href="javascript:;"></a></div>');
	}
	this.initControl();
	if (inicializar) {
		this.setIdmusica(container);
		this.setNome(nome);
		this.setArtista(artista);
	}
	this.editormusicas.adicionar(this);
}

EditorMusica.prototype = {
	initControl: function () {
		this.$input = this.$container.find('input');
		this.$a = this.$container.find('a');
		this.$container.draggable({
			appendTo: 'body',
			revert: 'invalid',
			helper: 'clone',
			connectToSortable: '#suaplaylist ul',
			start: function (a, b) {
				b.helper.addClass('musicasMusicaHelper');
			}
		});
	},
	setIdmusica: function (aidmusica) {
		this.idmusica = aidmusica;
		this.$input.val(aidmusica);
	},
	setNome: function (anome) {
		this.nome = anome;
		this.atualizarNome();
	},
	setArtista: function (aartista) {
		this.artista = aartista;
		this.atualizarNome();
	},
	setSelecionada: function (aselecionada) {
		if (aselecionada) {
			$playlist.append(this.$container);
		}
	},
	atualizarNome: function () {
		this.$a.html(this.nome + ' / ' + this.artista);
	}
};

function EditorMusicas() {
	this.$container = $('#musicas ul');
	this.musicas = [];
	this.initControl();
}

EditorMusicas.prototype = {
	initControl: function () {
		var me = this;
		this.$container.find('> li').each(function () {
			var tmp = new EditorMusica(me, this);
		});
		this.$container.parentIs('form').find('select').on(this, 'change', this.selectChangeHandler);
		this.installScroll();
	},
	installScroll: function () {
		try {
			$('.scroll').jScrollPane();
		} catch (e) {
		}
	},
	selectChangeHandler: function (e) {
		var me = this;
		this.$container.addClass('carregando');
		$.getJSON(DOMINIO + '/ajax', { pagina: 'musicas', acao: 'listar', idgenero: e.target.value }, function (data) {
			me.$container.removeClass('carregando');
			me.limpar();
			if (data.length > 0) {
				for (var i = 0; i < data.length; i++) {
					me.adicionar(data[i]);
				}
			} else {
				// Informar ao internauta que não tem nenhuma
			}
			me.installScroll();
		});
	},
	playlistDrop: function (event, ui) {
		// alert('asdadas');
	},
	adicionar: function (obj) {
		if (obj instanceof EditorMusica) {
			this.musicas.push(obj);
			if (this.musicas.length == 1) {
				this.musicas[0].$container.addClass('first');
			}
		} else if (obj instanceof Array) {
			for (var i = 0; i < obj.length; i++) {
				this.adicionar(obj);
			}
		} else if (obj instanceof Object) {
			new EditorMusica(this, obj.idmusica, obj.nome, obj.artista);
		}
	},
	limpar: function () {
		this.$container.empty();
		this.musicas.splice(0, this.musicas.length);
	}
};

function EditorPlaylist() {
	this.$container = $('#suaplaylist ul');
	this.musicas = [];
	this.initControl();
}

EditorPlaylist.prototype = {
	initControl: function () {
		var me = this;
		this.$container.sortable({
			containment: 'parent',
			axis: 'y',
			helper: 'clone',
			placeholder: 'placeholder',
			receive: function (e, ui) {
				me.received = true;
				if ($(this).find('input[value='+ui.item.find('input').val()+']').length > 1) {
					e.stopPropagation();
					e.preventDefault();
					me.rejected = true;
				} else {
					me.rejected = false;
				}
			},
			update: function (e, ui) {
				var $itens = $(this).find('> li');
				if (me.received) {
					me.receivedIndex = $itens.index(ui.item);
				}
			},
			stop: function (e, ui) {
				var $itens = $(this).find('> li');
				if (me.received) {
					me.received = false;
					if (me.rejected) {
						ui.item.remove();
					} else {
						var i;
						if (me.receivedIndex+1 >= $itens.length) {
							i = me.receivedIndex-1;
						} else {
							i = me.receivedIndex+1;
						}
						var o = $($itens.get(i));
						var idmusica = o.find('input').val();
						if (idmusica == '') {
							o.remove();
						} else {
							$($itens.get($itens.length-1)).remove();
						}
					}
					$itens = $(this).find('> li');
				}
				if (me.totalMusicas()==2) {
					seguirPasso3();
				}
			},
			change: function (e, ui) {
				var o = ui.placeholder.next();
				var idmusica = o.find('input').val();
				if (idmusica == '') {
					ui.placeholder.css('height', o[0].offsetHeight);
				} else {
					ui.placeholder.css('height', 0);
				}
			}
		});
	
	},
	totalMusicas: function () {
		var tot = 0;
		$itens = this.$container.find('> li');
		$itens.each(function (i) {
			this.className = 'item' + (i+1) + (i == 0?' first':'');
			if ($(this).find('input').val() != '') {
				tot++;
			}
		});
		return tot;
	},
	adicionar: function (obj) {
	},
	limpar: function () {
	}
};

function Editor() {
	this.musicas = new EditorMusicas();
	this.playlist = new EditorPlaylist();
}

var editor;
$(function () {
	editor = new Editor();
});

