function Track(id, src, audiotype)
{
	this.id=id;
	this.src=src;
	this.audiotype=audiotype;	
}

function Mix(id, mixer, title, tracks, artists_ref, date, figure, tags)
{
	this.id=id;
	this.mixer=mixer;
	this.title=title;
	this.tracks=tracks;
	this.artists_ref=artists_ref;
	this.date=date;
	this.figure=figure;
	this.tags=tags;
}

function Artist(id,nickname,firstname,lastname,figure,links)
{
	this.id=id;
	this.nickname=nickname;
	this.firstname=firstname;
	this.lastname=lastname;
	this.figure=figure;
	this.links=links;
}

function Artist_ref(id_ref,role)
{
	this.id_ref=id_ref;
	this.role=role;
}
Artist_ref.prototype.get_links = function()
{
	var called_artist= artists_array[this.id_ref];
	ref_artist_internal_link = "<a href=\"javascript:href('artist'," + this.id_ref + ')">' + called_artist.nickname + '</a>';
	switch (called_artist.links.length)
	{
		case 0 : 
			ref_artist_extrenal_link ="";
			break;
		case 1 : 
		default : 
			ref_artist_extrenal_link = "<a target=\"_blank\" href=\"" + called_artist.links[0].href + '">' + called_artist.links[0].title + "</a>";
	}
	return(ref_artist_internal_link + ref_artist_extrenal_link);
}

function Figure(id,src,width,height,alt)
{
	this.id=id;
	this.src=src;
	this.width=width;
	this.height=height;
	this.alt=alt;
}

function Link(href,title)
{
	this.href=href;
	this.title=title;
}

/*****************  playlist  ******************/
function Tune(id, src, title, id_mix, position) {
	this.id=id;
	this.src=src;
	this.title=title;
	this.id_mix=id_mix;
	this.position=position;	
}

function Playlist() {
	this.html_data = new Array();
	this.html_data['id'] = PLAYLIST_ID;
	this.html_data['selected_mix_class'] = PLAYLIST_SELECTED_MIX_CLASS;
	this.html_data['selected_tune_class'] = PLAYLIST_SELECTED_TUNE_CLASS;
	this.stateDisplay = true;
	this.selected_tune = null;
	this.mixes = new Array();

	// reset playlist
	this.reset = function() {
		this.stateDisplay = true;
		this.selected_tune = null;
		this.mixes = new Array();
		playlistUl = document.getElementById(PLAYLIST_ID);
		while (playlistUl.childNodes.length > 0) {
			playlistUl.removeChild(playlistUl.firstChild);
		}
	}
	
	// shuffle ul_playlist
	this.shuffle_ul_playlist= function(){
		new_ul_mixes_array = new Array();
		remaining_mixes_indexes_array=new Array();
		shuffle_length=this.mixes.length
		for(i=0;i<shuffle_length;i++)
		{
			remaining_mixes_indexes_array[i]=i;
		}
		for(i=0;i<shuffle_length;i++){
			var index_to_push=Math.floor(remaining_mixes_indexes_array.length*Math.random());
			//debug(remaining_mixes_indexes_array[index_to_push]);
			new_ul_mixes_array[i]=this.mixes[remaining_mixes_indexes_array[index_to_push]]['mix'];
			remaining_mixes_indexes_array.splice(index_to_push,1);
		}
		this.reset();
		this.add_music(new_ul_mixes_array);
	}
	
	// add music in playlist (array of Mix | Mix)
	this.add_music = function (music) {
		if (music instanceof Array) {
			for (key in music) {
				this.add_music(music[key]);
			}
		} else if (music instanceof Mix) {
			this.add_mix(music);
		} else if ((typeof music == 'string' || typeof music == 'number') && mixes_array[music]) {
			this.add_mix(mixes_array[music]);
		}
	}
	// get a mix in the playlist (id of Mix)
	this.get_mix = function (id) {
		for (i=0; i<this.mixes.length; i++) {
			if (id == this.mixes[i]["mix"].id) {
				return this.mixes[i];
			}
		}
		return null;
	}
	// add a mix in the playlist (Mix)
	this.add_mix = function (mix) {
		if (!this.get_mix(mix.id)) {
			var new_pl_mix = new Array();
			new_pl_mix["mix"] = mix;
			new_pl_mix["tunes"] = new Array();
			var number_of_tracks = mix.tracks.length;
			this.add_html_element(mix, number_of_tracks);
			for (track_pos in mix.tracks) {
				var track_pos = parseInt(track_pos);
				var tune_id = mix.id+"_"+mix.tracks[track_pos].id;
				var tune_src = mix.tracks[track_pos].src;
				var tune_title = mix.title+" ("+(1+track_pos)+"/"+number_of_tracks+")";
				var tune = new Tune(tune_id, tune_src, tune_title, mix.id,  track_pos);
				new_pl_mix["tunes"].push(tune);
				if (number_of_tracks != 1) this.add_html_element(tune, number_of_tracks);
			}
			this.mixes.push(new_pl_mix);
			if (this.mixes.length == 1) this.select(this.mixes[0]["mix"], 0);
		}
	}
	// add an html element (Mix | Tune)
	this.add_html_element = function (element, number_of_tracks) {
			if (element instanceof Mix) {
				var new_li = document.createElement("li");
					new_li.id = element.id;
					var new_div = document.createElement("div");
						if (number_of_tracks != 1) {
							new_div.onclick = function(){playlist.tuneDisplay(this.parentNode)};
						} else {
							new_div.onclick = this.bindSelect(element.id, 0, true);
						}
						new_div.onmouseup = function(event){displayContextMenu("contextMenu", element.id, 0, event)};
						new_div.oncontextmenu = function(event){return disableDefault(event)};
						if (number_of_tracks != 1) {
							var new_img = document.createElement("img");
								new_img.src = IMG_FOLDER+IMG_MORE_OFF;
								new_img.alt = "+";
							new_div.appendChild(new_img);
						}
						var new_span = document.createElement("span");
							var new_span_text = document.createTextNode(element.title);
							new_span.appendChild(new_span_text);
						new_div.appendChild(new_span);
					new_li.appendChild(new_div);
					if (number_of_tracks != 1) {
						var new_ul = document.createElement("ul");
							new_ul.style.display = "none";
						new_li.appendChild(new_ul);
					}
				document.getElementById(this.html_data['id']).appendChild(new_li);
			} else if (element instanceof Tune) {
				var new_li = document.createElement("li");
					new_li.id = element.id;
					new_li.onclick = this.bindSelect(element.id_mix, element.position, false);
					new_li.onmouseup = function(event){displayContextMenu("contextMenu", element.id_mix, element.position, event)};
					new_li.oncontextmenu = function(event){return disableDefault(event)};
					var new_img = document.createElement("img");
						if (number_of_tracks != element.position) {
							new_img.src = IMG_FOLDER+IMG_STEM_ON;
						} else {
							new_img.src = IMG_FOLDER+IMG_STEM_OFF;
						}
						new_img.alt = ">";
					new_li.appendChild(new_img);
					var new_span = document.createElement("span");
						var new_span_text = document.createTextNode(element.title);
						new_span.appendChild(new_span_text);
					new_li.appendChild(new_span);
				document.getElementById(element.id_mix).getElementsByTagName("ul")[0].appendChild(new_li);
			}
	}
	// select and play (Mix | Tune)
	this.select = function(mix, tune_position) {
		// debug(mix.id);
		// debug(tune_position);
		if (this.selected_tune) {
			document.getElementById(this.selected_tune.id_mix).className = "";
			if (document.getElementById(this.selected_tune.id)) document.getElementById(this.selected_tune.id).className = "";
		}
		if (typeof tune_position == 'undefined') tune_position = 0;
		var pl_mix = this.get_mix(mix.id);
		var tune = pl_mix["tunes"][tune_position];
		document.getElementById(mix.id).className = this.html_data['selected_mix_class'];
		if (mix.tracks.length > 1) document.getElementById(tune.id).className = this.html_data['selected_tune_class'];
		this.selected_tune = tune;
		if (mix.tracks.length > 1) this.tuneDisplay(document.getElementById(mix.id), true);
		player_main.loadAndPlay(tune.src);
	}
	// reference to select function (id of Mix, position of Tune, state of display))
	this.bindSelect = function(id, position) {
		return function() {playlist.select(mixes_array[id], position);};
	}
	// display tunes (li node)
	this.tuneDisplay = function(li, forceDisplay) {
			if (li.getElementsByTagName('ul')[0].style.display == 'none' || forceDisplay) {
		// debug("bar");
				li.getElementsByTagName('ul')[0].style.display = 'block';
				li.getElementsByTagName('img')[0].src = IMG_FOLDER+IMG_MORE_ON;
			} else {
		// debug("foo");
				li.getElementsByTagName('ul')[0].style.display = 'none';
				li.getElementsByTagName('img')[0].src = IMG_FOLDER+IMG_MORE_OFF;
			}
	}
}
/*****************  END playlist  ******************/
function displayContextMenu (idContext, idMix, tunePosition, e) {
	if (!e) e = window.event;
	if (e.button == 2) {
		var mixPl = playlist.get_mix(idMix);
		var mix = mixPl["mix"];
		var mixer_name=mixes_array[idMix].mixer;
		var tune_url_info=mixes_array[idMix].tracks[tunePosition].src;
		//var url_to_call=INCLUDE_FOLDER+"get_id3_tag.php?mix_length="+mixes_array[idMix].tracks.length+"&tune_url="+tune_url_info;
		var url_to_call=INCLUDE_FOLDER+"get_id3_tag.php?mix_length="+mixes_array[idMix].tracks.length+"&tune_url="+tune_url_info;
		//alert (url_to_call);
		htmlRequest = ajax_new_request();
		id3_answer="";
		if (htmlRequest==null){ return;}
		htmlRequest.open("GET", url_to_call, true);
		htmlRequest.onreadystatechange=function() 
			{
				if (htmlRequest.readyState==4 && htmlRequest.status==200) 
				{
					// id3_answer=htmlRequest.responseText;
					// if(typeof artists_ALL[mixer_name] != "undefined"){
						// artist_link="<span class=\"id3_mixer\"> mixed by <a onclick=\"javascript:load_href('artists',['"+mixer_name+"'],1)\"></span>"+artists_ALL[mixer_name].nickname+"</a>"; }
					// else{artist_link=" mixed by "+mixer_name;}
					var mix_link="<a style=\"color:white;\" href=\"javascript:view_mix_details(new Array('"+idMix+"'))\">Mix Details</a>";
					document.getElementById(idContext).innerHTML = mix_link;
					visible(idContext, e);
				}
			}
		htmlRequest.send(null);
		
		
		
	}
}
function disableDefault(e) {
	if (!e) e = window.event;
	if (e.preventDefault) e.preventDefault();
	else e.returnValue= false;
	return false;
}

function visible(id_tooltip, e) {
	/***** fonction qui va placer l'élément dont l'id est 'id_tooltip' (passé en paramètre dansla fonction) par rapport à la position du curseur de la souris, et va le rendre visible *****/
	
	// on récupère les coordonnées du curseur de la souris
	if (e.pageX == null) {
		// IE case
		var d= (document.documentElement &&	document.documentElement.scrollLeft != null) ? document.documentElement : document.body;
		var x_cursor= e.clientX + d.scrollLeft;
		var y_cursor= e.clientY + d.scrollTop;
		} else {
		// all other browsers
		var x_cursor= e.pageX;
		var y_cursor= e.pageY;
		}
	
	/***** ce qui suit va permettre de déterminer où positionner l'élément par rapport à sa taille et la taille de la fenêtre du navigateur *****/
	
	// on récupère la taille du tooltip
	var width_tooltip = parseInt(document.getElementById(id_tooltip).offsetWidth);
	var height_tooltip = parseInt(document.getElementById(id_tooltip).offsetHeight);
	
	// on récupère la taille de la zone visible de la fenêtre du navigateur, et sa position par rapport à la page internet (scrolling)
	var width_window = parseInt(document.documentElement.clientWidth);
	var height_window = parseInt(document.documentElement.clientHeight);
	var x_window = parseInt(document.documentElement.scrollLeft);
	var y_window = parseInt(document.documentElement.scrollTop);
	
	var x_tooltip = x_cursor + 10;
	var y_tooltip = y_cursor + 10;
	
	if (width_tooltip + x_tooltip > width_window + x_window && height_tooltip + y_tooltip <= height_window + y_window) {
		if (width_window - width_tooltip < 0) {
			x_tooltip = x_window;
		} else {
			x_tooltip = width_window + x_window - width_tooltip;
		}
	} else if (width_tooltip + x_tooltip <= width_window + x_window && height_tooltip + y_tooltip > height_window + y_window) {
		if (height_window - height_tooltip < 0) {
			y_tooltip = y_window;
		} else {
			y_tooltip = height_window + y_window - height_tooltip;
		}
	} else if (width_tooltip + x_tooltip > width_window + x_window && height_tooltip + y_tooltip > height_window + y_window) {
		if (y_cursor - height_tooltip - y_window - 10 < 0) {
			if (x_cursor - width_tooltip - x_window - 10 < 0) {
				if (height_window - height_tooltip < 0) {
					y_tooltip = y_window;
				} else {
					y_tooltip = height_window + y_window - height_tooltip;
				}
			} else {
				x_tooltip = x_cursor - width_tooltip - 10;
				y_tooltip = height_window + y_window - height_tooltip;
			}						
		} else {
			x_tooltip = width_window + x_window - width_tooltip;
			y_tooltip = y_cursor - height_tooltip - 10;
		}
	}
	
	// positionne le div 'bulle' où l'on veut
	document.getElementById(id_tooltip).style.left = x_tooltip + "px" ;
	document.getElementById(id_tooltip).style.top = y_tooltip + "px" ;
	
	// rend visible le div
	document.getElementById(id_tooltip).style.visibility = "visible";
}
function callStream() {
	interval = setInterval("checkFlashLoaded(0, 1)", 1000);
	//var foo = "player_main.loadAndPlay('http://pul-lup.com:8000/;stream.nsv')";
	var bar = "playlist.add_music('2');";
	//la c'est la radio ...
	//playlist.add_html_element(mixes_array['2'],1);
}
function callMix(idMix) {
	if(typeof idMix != "undefined")
	{
		//debug(idMix);
		interval2 = setInterval("checkFlashLoaded(idMix, 2)", 1000);
	}	
}
var counter = 0;

function checkFlashLoaded(idMix, idInterval) {
	if (typeof player_main.obj.SetVariable != "undefined") {
		switch (idInterval) {
			case 1:
				clearInterval(interval);
				break;
			case 2:
				clearInterval(interval2);
				break;
		}
		if (idMix instanceof Array) {
			for (i in idMix) {
				playlist.add_music(idMix[i]);
			}
		} else {
			if (idMix == 0) player_main.loadAndPlay('http://pul-lup.com:8000/;stream.nsv');
			else if (idMix > 0) {
				playlist.add_music(idMix);
			}
		}
	} else if (counter > 10) {
		switch (idInterval) {
			case 1:
				clearInterval(interval);
				break;
			case 2:
				clearInterval(interval2);
				break;
		}
	}
	counter++;
}

function addCommand(command) {
	
	
}

