// JavaScript Document
/*
 * playlist.js
 * Copyright (c) 2009 Martin Kapp
 * $sDate: 2/27/09 
 */
 
function playlist(){
	this.pid = generateID();
	this.play = 0;
	this.type = "private";
	this.description = "";
	this.loeschplay = false;
	this.lastSelect = 0;
	this.ended = false;
	this.itemHeight = 20;
	this.pressed = false;
	this.playitem = false;
	this.hist = [];
	this.hPos = 0;

	var self = this;
	$(".playlist-filter").keyup(function(event){
		event.stopPropagation();
		self.filter();								 
	});
	this.list = $("#playlist");
	this.nav = $("#playlist-nav")
	this.menuBtn = $("playlist-menu-btn");
	this.controlBtns = $(".controlbtn", "#playlist-nav");
	
	this.playI = function(i){
		window.clearTimeout(lta.timer.video);
		if(player_is("playing")) pc.listen(pc.zeit / pc.duration * 100);
		if(pc.shuffle) this.play = this.getShuffle(i); else
		if(i == "next") this.play++;
		else if(i == "pre") this.play--; 
		else if(i == "play") {
			if(!this.ended) {
				player.playVideo(); return;
			}
		}
		else {this.play = i;}
		if(lta.loaded.page && lta.loaded.video && player) { player.stopVideo(); player.clearVideo(); }
		var it = this.getItem(this.play);
		if(this.play >= this.anzahl() || this.play < 0) {
			if(this.anzahl() == 0) return;
			if(this.play < 0) this.play = this.anzahl() - 1; else this.play = 0;
			this.ended = true;
			if(!player) return;
			player.stopVideo();
			player.clearVideo(); 
			lta.loaded.listen = false;
			this.unPlay();
			if(!pc.repeat) return; else
			it = this.getItem(this.play);
		} else this.ended = false;
		this.setPlay(it);
		var p = {};
		
		p.track = it.attr("track");
		p.artist = it.attr("artist");
		var is_video = !p.artist;
		if(is_video) p.query = p.track; else
		p.query = p.artist + ' - ' + p.track; 
	
		lta.loaded.lyrics = false; 
		lta.loaded.infos = false;
		lta.loaded.listen = false;
		
		p.video = it.attr("video");
		if(p.video) echoVideo(p.video);
		if(!is_video) {
			var vids = it.attr("hasVideos");
			if(vids && vids != "no") {
				pc.videos.searched = true;
				pc.videos.it = it;
				pc.videos.results(this.videos.v[vids]);
			} else
			if(vids == "no"){
				this.playI("next");
				return;
			} else
			pc.videos.getVids(p.query, it);
			$(".hate").show();
			lta.videolist.show();
		} else {
			lta.videolist.hide();
		}
		lta.playinfo.show();
		getPlayInfos(p);
		if(i != "pre") { this.hist.push(p); this.hPos = this.hist.length - 1; }
		lta.nowplaying.html(p.query);
		document.title = p.query + " | ListenToAll";
		this.scrollTo(it);
		pc.addtolisten = true;
	}
	
	this.playIt = function(it){
		this.playI(this.getIndex(it));
	}

	this.deleteI = pl_deleteI;
	this.deleteIt = pl_deleteIt;
	
	this.getItem = function(i, attr){
		if(!attr) attr = "";
		return $(".pl_item"+attr, this.list).eq(i);
	}
	
	this.getItems = function(more){
		if(!more) more = "";
		return $("#playlist > .pl_item"+more);
	}

	this.anzahl = function(){
		return this.getItems().length;
	}
	this.getItemAttr = get_pl_attr; 
	this.setItemAttr = set_pl_attr; 
	
	this.setPlay = function(it){
		var alle = this.getItems();
		var items = $(".pl_item[played='playing']");
		var sels = $(".ui-selected[played='playing']");
		items.attr("played", "true");
		alle.removeClass("playing");
	
		this.playitem = it;
		if(!it) return;
		it.attr("played", "playing");
		it.addClass("playing");
	}
	
	this.unPlay = function(){
		$(".pl_item[played!='playing']").attr("played", "");
		this.setPlay();
		lta.nowplaying.html("");
		pc.timelabel.html("0:00/0:00");
	}
	
	this.getIndex = function(it, visible){
		if(!visible) visible = "";
		if(it.className)
		var c = it.className.replace(/ .*/, ""); else
		if(it.attr("class"))
		var c = it.attr("class").replace(/ .*/, ""); else return -1;
		return $("."+c+visible, this.list).index(it);
	}
	this.getShuffle = getShuffle;
	this.scrollTo = function(it){
		var offset = this.getIndex(it, ":visible") * this.itemHeight;
		if(offset > this.list.scrollTop() && offset < this.list.scrollTop() + this.list.height() - this.itemHeight) return;
		this.list.animate({scrollTop: offset}, 500);
	}
	this.rename = renamePlaylist;
	this.save = function(a){
		if(this.getItems().length == 0) return;
		var p = {};
		p.a = "save";
		p.m = "playlist";
		if(a == "c") {
			p.pid = this.pid;
			p.name = this.name;
			p.description = this.description;
			p.type = this.type;		
			p.x = "changes"; 
		} else 	
		if(a == "n") { 
			p.oldpid = this.pid;
			var name = $("#plname").val();
			p.description = $("#pldesc").val();
			p.type = $("input:radio[name='pltype']:checked").val();
			if(name.search(/[^a-zA-Z0-9\s\.\-]/) != -1 || trim(name) == "") return;
			p.name = name;
		}
		p.tracks = this.toJson();
		requestP(p);
	}
	this.saved = playlist_saved;
	this.saveAs = function(){
		this.save("n")
		dialogs.close("plSave");
	};
	this.saveChanges = function(){this.save("c")};
	
	this.videoLinks = playlist_videolinks;
	this.selectAll = function(){
		this.list.selectable('select', '*');
	}
	this.selectI = selectI;
	this.selCount = function(){
		return $(".ui-selected", this.list).length;
	}
	this.last_tracks = $("#last-playlist");
	this.firstPlay = function(){
		if(this.last_tracks.find(".pl_item").length > 0) {
			this.list.html(__("last-playlist"));
			lta.showLeft();
		}
	}
	
	this.loadLast = function(){
		this.addTracks(this.last_tracks.html(), "add");
	}
	
	this.update = function(){ 
		var a = {};
		a.m = "playlist";
		a.a = "update";
		a.tracks = this.toJson();
		requestP(a);
	}
	
	//VIDEOSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
	//VIDEOSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
	//VIDEOSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
	this.videos = new function() {
		this.it = false;
		this.searched = false;
		this.entries = []; //für Eingabe von Youtube
		this.v = []; //Liste aller Video-listen der Playlist
		this.vids = []; //Videos für einen Track(Eintrag in der Playlist)
		this.checking = false;
		this.check = function(){
			if(this.checking || pc.checking) return;
			var it = $(".pl_item:not([hasVideos])[artist]:first", pls.list);
			if(it.length == 0) return;
			this.checking = true;
			this.it = it;
			this.getVids();
		}
		
		this.getVids = function(q){
			if(!q) q = this.it.attr("title").replace(/\&/, "%26");
			this.searched = false;
			var url = "http://gdata.youtube.com/feeds/api/videos?q=" + q +"&alt=json-in-script&orderby=relevance&format=5&callback=pls.videos.results";
			var head = document.getElementsByTagName('head')[0]
			script = document.createElement("script");
			script.setAttribute("type", "text/javascript");
			script.setAttribute("src", url);
			head.appendChild(script);
		}
		
		this.results = function(data){
			var feed = data.feed;
			var video_entries = feed.entry || [];
			var found = false;
			var it = this.it;
			if(!this.searched && it.attr("title").search(/(\[|\(|\")/) != -1) {
				var q = it.attr("title").replace(/[\s]*(\([^\)]*\)|\[[^\]]*\]|\')/g, "");
				this.entries = video_entries;
				this.getVids(q);
				this.searched = true;
				return;
			} else {
			    var track = this.it.attr("track").replace(/[\s]*(\([^\)]*\)|\[[^\]]*\])/g, "").toLowerCase();
				var s1 = track.split(" ");
				//var s1 = this.it.attr("track").replace(/(\(|\[|\]|\'|\")/g, "").toLowerCase().split(" ");
				var limit = 0.7;
				if(s1.length < 3) limit = 0.5;
				if(!this.entries) this.entries = [];			
				this.entries = this.entries.concat(video_entries);
				for(var i = 0; i < this.entries.length; i++) {
					found = 0;
					for(var k in s1){
						if(this.entries[i].title.$t.toLowerCase().indexOf(s1[k]) != -1) {
							found++;
						}
					}
					if(found / s1.length < limit){
						this.entries.splice(i, 1);
						i--;
					} else {
					//Remove Duplicate Entries
						this.entries[i].viewCount = 0;
						if(this.entries[i].yt$statistics) this.entries.viewCount = this.entries[i].yt$statistics.viewCount;
						for(var j = i + 1; j < this.entries.length; j++)
							if(this.entries[i].id.$t == this.entries[j].id.$t) {
								this.entries.splice(j, 1);
								j--;
							}
					}
				}
			}
			if(this.entries.length == 0) {
				return this.noVids();
			}
			
			this.vids = [];
			var id = "";
			
			var video_play = 0;
			found = true;
			var raus = false;
			do {
				if(video_play == this.entries.length) { found = false; raus = true; }
				id = this.entries[video_play].id.$t.split('/');
				id = id[id.length-1];
				video_play++;
			} while(user.hates.indexOf(id) !== -1 && !raus) 
			if(!found) {
				return this.noVids();
			}
			
			var videos_id = generateID();
			this.v[videos_id] = copyArray(this.entries);
			this.it.attr("hasVideos", videos_id);
			this.searched = false;
			this.entries = [];
			this.checking = false;
			this.check();
		}
		
		this.noVids = function(){
			this.it.attr("hasVideos", "no");
			this.it.addClass("no-video");
			this.checking = false;
			this.check();
		}
	}
	
	//ADDTRACKSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS-ADD-TRACKS-SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
	//ADDTRACKSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS-ADD-TRACKS-SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
	//ADDTRACKSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS-ADD-TRACKS-SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
	
	this.addTracks = function (tracks, a, p){
		var abspieln = 0;
		var update = 0;
		if(this.anzahl() == 0) {
			update++;
		} else abspieln = false;
		if(tracks) {
			update++;
			if(this.last_tracks) {
				this.last_tracks.remove();
				this.last_tracks = false;
				$(".playlist-info", this.list).remove();
			}
			if(a == "play"){
				if(this.playitem) {
					this.playitem.after(tracks);
					this.playI(this.play + 1);
					abspieln = false;
				} else {
					this.list.prepend(tracks);
					abspieln = 0;
				}
			} else {
				var anz = this.anzahl();
				this.list.append(tracks);
				this.scrollTo(this.getItem(anz));
			}
		}
		if(this.anzahl() != 0) {
			this.controlBtns.show();
			if(abspieln !== false) this.playI(abspieln);
		} else this.controlBtns.hide();
		if(update == 2) this.update();
		this.videos.check();
		this.makeSelectable();
	}
	
	this.selectedItems = function(more){
		var m = "";
		if(more != undefined) m = more;
		return $(".ui-selected"+m);
	}
	
	this.getPlay = function(){
		var it = $(".pl_item[played='playing']");
		if(it.length == 0) return this.play - 1;
		return this.getIndex(it);
	}
	
	this.filter = function(){
		var items = this.getItems();
		var f = this.filter_field.val();
		if(f == "" || f == "Filter") { $(".pl_item").show(); return; }
		f = f.toLowerCase();
		items.each(function(i){
			if($(this).attr("title").toLowerCase().indexOf(f) == -1) $(this).hide(); else { $(this).show(); }						
		});
	}
	
	this.showPlay = function(){
		self.scrollTo(self.getItem(self.getPlay())); 
	};
	
	this.makeSelectable = function(){
		this.list.selectable( 'destroy' );
		$(".pl_item", this.list).removeClass("ui-selected");
		this.list.selectable({
				cancel: ".pl_playbtn,.pl_deletebtn,.ui-selected,.cancel-select",
				filter:"li",
				start:function(event, ui){
					$(".pl_item_title").removeClass("cancel-select");
					/*var t = event.target;
					if (event.pageX > t.offsetWidth + t.offsetLeft + document.body.offsetLeft) {
						//alert(event.pageX +"="+ t.offsetWidth +"+"+ t.offsetLeft +"+"+document.getElementById("main").offsetLeft);
						return false;
					}*/
				},
				stop:function(event, ui){
					$(".ui-selected > .pl_item_title").addClass("cancel-select");
					pls.pressed = false;
				}
		});
	
		this.list.disableTextSelect();  
	};
	
	this.getEntries = function(){
		var items = this.getItems();
		if(items.length == 0) return [];
		var tracks = [];
		var attrs = ["artist", "track", "albums", "tags", "image", "own", "video"];
		var atr = "";
		items.each(function(i){
			for(var at in attrs) {
				atr = attrs[at];
				if(!$(this).attr(atr)) $(this).attr(atr, "");
			}
			tracks.push({
				"artist": $(this).attr("artist"),
				"name": $(this).attr("track"),
				"albums": $(this).attr("albums"),
				"tags": $(this).attr("tags"),
				"image": $(this).attr("image"),
				"own": $(this).attr("own"),
				"video": $(this).attr("video")
			});
		});
		return tracks;
	};
	
	this.toJson = function(){
		return array2json(this.getEntries());
	}
	this.setKeyEvents = playlist_keyEvents;
	this.undoDeletion = playlist_undo_deletion;

	this.deleteDoppelte = function(){
		var items = this.getItems();
		var sels = "";
		var komma = "";
		items.each(function(i){				
			var such = $(this).attr("title").replace(/ ?\(.*/, "").replace(/ ?\[.*/, "").toLowerCase();
			for(var j = i + 1; j < items.length; j++){
				var it = items.eq(j).attr("title").replace(/ ?\(.*/, "").replace(/ ?\[.*/, "").toLowerCase();
				if(such == it) {
					sels += komma+".pl_item:eq("+j+")";
					komma = ",";
				}
			}
		});
		this.list.selectable("select", sels);
		this.deleteSelection();
	}
	
	this.deleteSelection = function(){
		var it = $('.ui-selected', this.list);
		it.remove();
		this.makeSelectable();
		this.update();
		this.play = this.getPlay();
		if(this.anzahl() == 0) this.controlBtns.hide();
	}
	
	this.deleteWithoutVideos = function(){
		var it = $(".pl_item[hasVideos='no']", this.list);
		if(it.length == 0) return;
		this.list.selectable("select", it);
		this.deleteSelection();
	}
	
	this.invertSelection = function(){
		var sels = $("");
		var komma = "";
		this.getItems().each(function(i){
			if(!$(this).hasClass("ui-selected")) sels += komma+".pl_item:eq("+i+")";
			komma = ",";
		});
		this.list.selectable("select", sels);
	}

	
	this.clearlist = function(){
		this.list.html("");
		this.update();
		this.controlBtns.hide();
	}
	
	this.sort = function(by){
		switch(by) {
			case "title":
				var func = function(a,b){
					a = $(a).attr("track").toLowerCase();
					b = $(b).attr("track").toLowerCase();
					return (a < b) ? -1 : 1;
				}
			break;
			case "artist":
				var func = function(a,b){
		
					a = $(a).attr("artist");
					if(!a) a = ""; else a = a.toLowerCase();
					b = $(b).attr("artist");
					if(!b) b = ""; else b = b.toLowerCase();
					return (a < b) ? -1 : 1;
				}
			break;
			case "random":
				var func = function(a,b){
					return (Math.random() < Math.random()) ? -1 : 1;
				}
			break;
		}
		var sorted = $.makeArray($('.pl_item', this.list)).sort(func);
		
		this.list.html(sorted);
		this.makeSelectable();
	}
	
	this.filter_field = $(".playlist-filter");
	
	this.makeSelectable();
	this.setKeyEvents();
}

function playlist_keyEvents(){
	var self = this;
	this.list.keydown(function(event){
	switch(event.keyCode){
			case 13: key.enter = true; break;
			case 16: key.shift = true; break;
			case 46: key.entf = true;  
			break;
		}
		if(key.entf) self.deleteSelection();
	});
	this.list.keyup(function(event){
		switch(event.keyCode){
			case 13: key.enter = false; break;
			case 16: key.shift = false; break;
			case 46: key.entf = false;
			break;
		}
	});

}

function renamePlaylist(newname){
	newname = String(trim(newname));
	if(newname.match(/[\|;\/\\<>\"\']/)) return;
	if(newname.length == 0) return;
	this.name = newname;
	$(".pl-name", this.pod.self).html(newname);
}



function playlist_videolinks(){
	var p = {};
	var items = this.getItems();
	if(items.length == 0) return;
	p.a = "playlist_videolinks";
	p.m = "video";
	p.tracks = [];
	var attrs = ["artist", "track", "video"];
	var atr = "";
	items.each(function(i){
		for(var at in attrs) {
			atr = attrs[at];
			if(!$(this).attr(atr)) $(this).attr(atr, "");
		}
		p.tracks.push({
			"artist": $(this).attr("artist"),
			"name": $(this).attr("track"),
			"video": $(this).attr("video")
		});
	});
	p.tracks = array2json(p.tracks);
	makeIt(p, Plink(p));
}

function playlist_saved(p){
	var q = pls[p.oldpid];
	pls[p.oldpid] = null;
	pls[p.pid] = q;
}


function set_pl_attr(name, value, it){
	it.attr(name, value);
}
function get_pl_attr(name, it){
	return it.attr(name);
}


function pl_deleteIt(it){
	var ind = this.getIndex(it);
	this.deleteI(ind, it);
}
function pl_deleteI(i, it){
	if(it) makejq(it).remove(); else
	this.getItem(i).remove();
	this.play = this.getPlay();
}

function getShuffle(i){
	var items = $(".pl_item[played!='true']", this.list); 
	var it = this.getItem(Math.floor(Math.random() * items.length), "[played!='true']");
	var ran = this.getIndex(it);
	if(i == "next"){
		 if(items.length == 0){
			this.unPlay(); 
			items = $(".pl_item");
			if(!repeat) return -1;
			ran = Math.floor(Math.random() * items.length);
		 }
		 //Falls mehrmals abgespielt
		 if(this.hPos < this.hist.length - 1) {
			var c = 0;
			while(c <= 0){
				this.hPos++;
				if(this.hPos == this.hist.length) { this.hist.push(this.getItem(ran).attr("track")); return ran; }
				c = 0;
				var it = $(".pl_item[track='"+this.hist[this.hPos]+"']:first");
				c = it.length;
				if(c == 0) { this.hist.splice(this.hPos, 1); c = -1 
			}
		  }
		}
		return ran;
	} else
	if(i == "pre"){
		if(this.hPos == 0) { this.hist = new Array(); return this.getShuffle("next"); }
		var c = 0;
		while(c <= 0){ 
			if(this.hPos == 0) { this.hist = new Array(); return this.getShuffle("next"); }
			if(c == 0) this.hPos--;
			var it = $(".pl_item[track='"+this.hist[this.hPos]+"']:first");
			c = it.length; 
			if(c == 0) { this.hist.splice(this.hPos, 1); c = -1; };
		}
		return this.getIndex(it);
	} else return i; 
}

function playlist_undo_deletion(html){
	this.list.html(html);
	this.makeSelectable();
}



//LISTFUNCTIONS***********************************LISTFUNCTIONS**********************************************
//LISTFUNCTIONS***********************************LISTFUNCTIONS**********************************************


function selectIt(value, it){
	if(value)
	it.addClass("ui-selected"); else
	it.removeClass("ui-selected"); 
}

function selectI(value, i){
	if(value)
	this.list.selectable('select', i); else
	this.list.selectable("deselect", i);
}

function isSelected(it){
	return it.hasClass("ui-selected");
}


//LISTFUNCTIONS***********************************ENDE**********************************************
//LISTFUNCTIONS***********************************ENDE**********************************************
//LISTFUNCTIONS***********************************ENDE**********************************************


