var req;
var xmlHttpReq;
var current_list_str = "";
var clicked_item = null;
var colapsed = true;
var autoload=false;


//for debugging
function trace(p_msg){
	document.getElementById('debug_output').value += p_msg +"\n";
}

function clearOutput(){
	document.getElementById('debug_output').value = "";
}

function getParameter ( queryString, parameterName ) {
	var parameterName = parameterName + "=";
	if ( queryString.length > 0 ) {
		begin = queryString.indexOf ( parameterName );
		if ( begin != -1 ) {
			begin += parameterName.length;
			end = queryString.indexOf ( "&" , begin );
			if ( end == -1 ) {
				end = queryString.length
			}
			return unescape ( queryString.substring ( begin, end ) );
		}
	return "null";
	}
}

function init(){
	var DEFAULT_URL = "http://webjay.org/by/hideout/hideoutshow2312"
	var playlist_par = getParameter(location.search,'playlist_url')
	var colapsed_par = getParameter(location.search,'colapsed')
	var debug_par = getParameter(location.search,'debug')
	if(playlist_par){
		DEFAULT_URL = playlist_par
		autoload=true;
	}
	if(debug_par=="on"){
		document.getElementById('debug_window').style.display="block";
	}
	if(colapsed_par=="false") colapsed=false;
	document.getElementById('playlist_url').value = DEFAULT_URL;
	//capture de mouseup event on the page
	document.addEventListener("mouseup",dragStop, true);
	//clearOutput();
	if(autoload)loadPlaylist()
}

function loadPlaylist(){
	var playlist_url=document.getElementById('playlist_url').value;
	//playlist_url = playlist_url.replace('/by/','/api/xspf/')
	current_list_str = playlist_url;
	playlist_url +='.xspf'
	loadXMLDoc(playlist_url)
	document.getElementById('playlist_form').setAttribute('style','display:block');
	return false;
}

function loadXMLDoc(url,p_element) {
   // branch for native XMLHttpRequest object
   if (window.XMLHttpRequest) {
       req = new XMLHttpRequest();
       req.onreadystatechange = function(){processReqChange(p_element)};
       netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
       req.open("GET", url, true);
       req.overrideMimeType("text/xml")
       req.send(null);
   // branch for IE/Windows ActiveX version
   } else if (window.ActiveXObject) {
       req = new ActiveXObject("Microsoft.XMLHTTP");
       if (req) {
           req.onreadystatechange = processReqChange;
           req.open("GET", url, true);
           req.send();
       }
   }
}

function xmlhttpPost(strURL, strSubmit,p_meta_save_btn) {
	trace('xmlPost! '+strURL)
  netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
	xmlHttpReq = false;
	// Mozilla/Safari
	if (window.XMLHttpRequest) {
		xmlHttpReq = new XMLHttpRequest();
		xmlHttpReq.overrideMimeType('text/xml');
	}
	// IE
	else if (window.ActiveXObject) {
		xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
	}

	xmlHttpReq.open('POST', strURL, true);
	xmlHttpReq.setRequestHeader('Content-Type', 
	'application/x-www-form-urlencoded');
	xmlHttpReq.onreadystatechange = function(){
		trace('xmlHttpReq.readyState: '+xmlHttpReq.readyState);
		if (xmlHttpReq.readyState == 4) {
			trace('xmlHttpReq.responseText: '+xmlHttpReq.responseText)
			if(xmlHttpReq.responseText.substring(0,2) == 'OK'){
				if(p_meta_save_btn==undefined){
					alert('new m3u Saved!');
				}else{
					alert('track metadata updated!');
					p_meta_save_btn.className = "saved_button"
				}
			}else{
				alert('error '+xmlHttpReq.responseText)
			}
			//eval(strResultFunc + '(xmlHttpReq.responseText;);');
		}
	}
	xmlHttpReq.send(strSubmit);
}

function processReqChange(p_element) {
	trace("req.readyState "+req.readyState)
	// only if req shows "loaded"
	if (req.readyState == 4) {
		// only if "OK"
		if (req.status == 200) {
			trace('loaded!')
			if (window.XMLHttpRequest) { //not IE
				netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
			}
			var xmlResponse = req.responseXML;
			if(req.responseXML){
				if(xmlResponse.documentElement){
					trace(xmlResponse.documentElement.nodeName);
					if(xmlResponse.documentElement.nodeName=="playlist"){
						//xspf
						generateOrderedList(xmlResponse.documentElement)
					}else if(xmlResponse.documentElement.nodeName=="ProductInfo"){
						//amazon result
						generateImagesList(xmlResponse.documentElement,p_element)
					}else{
						trace('nenhum dos dois: '+xmlResponse.documentElement.nodeName)
					}

			}else{
				alert("error")
			}
		}
	} else {
		alert("There was a problem retrieving the XML data:\n" +
		req.statusText);
		}
	}
}

   	
function generateOrderedList(p_xspf){
	//clear the playlist
	var playlist_element = document.getElementById('playlist');
	while(playlist_element.firstChild!=null){
		playlist_element.removeChild(playlist_element.firstChild)
	}
	var reorder_btn = document.getElementById('reorder_btn');
	reorder_btn.className = "saved_button"

	p_xspf.ignoreWhite = true;
	var tracks_ar = p_xspf.getElementsByTagName('track')
	for(var i=0; i< tracks_ar.length;i++){
		var location_str = ""
		var annotation_str = ""
		var image_str = ""
		var info_str = ""
		//ignore the second track (webjay's vignete i=1)
		if(i!=1){
			if(tracks_ar[i].getElementsByTagName('location').length>0)
				location_str = tracks_ar[i].getElementsByTagName('location')[0].firstChild.nodeValue;
			if(tracks_ar[i].getElementsByTagName('annotation').length>0){
				annotation_str = tracks_ar[i].getElementsByTagName('annotation')[0].firstChild.nodeValue;
			}else{
				annotation_str = location_str;
			}
			if(tracks_ar[i].getElementsByTagName('image').length>0)
				image_str = tracks_ar[i].getElementsByTagName('image')[0].firstChild.nodeValue;
			if(tracks_ar[i].getElementsByTagName('info').length>0)
				info_str = tracks_ar[i].getElementsByTagName('info')[0].firstChild.nodeValue;
			
			html_str = generateHtmlTrack(location_str,annotation_str,image_str,info_str);
			var li_element = document.createElement('li');
			
			//par ou impar
			if((i%2!=0)||(i==0)){
				li_element.className = 'odd'
			}else{
				li_element.className = 'even'
			}

			li_element.setAttribute('title','Drag to Reorder');
			li_element.setAttribute('onmousedown','setClickedItem(this)');
			li_element.setAttribute('onmouseover','swapItem(this)');
			li_element.innerHTML = html_str;
			playlist_element.appendChild(li_element)
		}
	}
	if(!colapsed){
		expandAll()
	}
}
function generateHtmlTrack(location_str,annotation_str,image_str,info_str){
			var html_str = ""
			html_str += "					<div class=\"track\">\n"
			html_str += "						<input type=\"button\" title=\"Show more info\" class=\"colapse_button\" value=\">\" onclick=\"colapseItem(this)\" />\n"
			html_str += "						<a title=\"Click to Play\" \n"
			html_str += "						href=\""+location_str+"\" \n"
			html_str += "						onclick=\"playTrack('"+location_str+"','"+escape(annotation_str)+"',this); return false\"\n"
			html_str += "						>\n"
			html_str += "						<img src=\"play.gif\" alt=\"play\" width=\"14\" height=\"14\" class=\"play_btn\" /></a>\n"
			html_str += "						<input type=\"text\" class=\"textfield\" title=\"Click to Edit\" value=\""+annotation_str+"\" onblur=\"trackTitleChanged(this)\" />\n"
			html_str += "						<div class=\"track_meta\">\n"
			html_str += "									<fieldset>\n"
			html_str += "										<legend>Info</legend>\n"
			html_str += "										<ul>\n"
			html_str += "											<li><strong>URL:</strong><br /> <a href=\""+location_str+"\">"+location_str+"</a></li>\n"
			html_str += "											<li>\n"
			html_str += "											<label class=\"image_field\">\n"
			html_str += "												Image:\n"
			html_str += "												<input type=\"text\" class=\"textfield\" title=\"Click to edit\" value=\""+image_str+"\" onblur=\"trackMetaChanged(this)\" />\n"
			html_str += "												<input type=\"button\" class=\"meta_button\" value=\"Preview\" title=\"click to Preview\" onclick=\"previewImage(this);\" />\n"
			html_str += "												<input type=\"button\" class=\"meta_button\" value=\"Fetch Amazon\" title=\"click to search album art on Amazon.com\" onclick=\"fetchAmazon(this,'"+escape(annotation_str)+"');\" />\n"
			html_str += "											</label>\n"
			html_str += "											</li>\n"
			html_str += "											<li>\n"
			html_str += "											<label>\n"
			html_str += "												Info URL:\n"
			html_str += "												<input type=\"text\" class=\"textfield\"  title=\"Click to edit\" value=\""+info_str+"\"  onblur=\"trackMetaChanged(this)\" />\n"
			html_str += "											</label>\n"
			html_str += "											</li>\n"
			html_str += "										</ul>\n"
			html_str += "										<input type=\"button\" class=\"saved_button\" value=\"Save Changes\" title=\"click to send the changes made to this track\" onclick=\"saveTrackChanges(this,'"+location_str+"');\" />\n"
			html_str += "										<div class=\"track_image\">\n"
			html_str += "											<img src=\""+image_str+"\" alt=\"track image\" />\n"
			html_str += "										</div>\n"
			html_str += "									</fieldset>\n"
			html_str += "						</div>\n"
			html_str += "						<input type=\"button\" class=\"delete_track_btn\" title=\"click do delete\" onclick=\"deleteTrack(this)\" ttitle=\"DELETE track\" />\n"
			html_str += "					</div>\n"
			return html_str;
}
function addTrack(){
	var location_str = prompt('Please enter the track URL:','');
	if(location_str.length>7){
		var annotation_str = location_str;
		var image_str = '';
		var info_str = '';
		var html_str = generateHtmlTrack(location_str,annotation_str,image_str,info_str);
		var li_element = document.createElement('li');
		var playlist_element = document.getElementById('playlist');
		trace('EE: '+playlist_element.lastChild.className)
		//par ou impar
		if(playlist_element.lastChild.className=='even'){
			li_element.className = 'odd'
		}else{
			li_element.className = 'even'
		}
		li_element.setAttribute('title','Drag to Reorder');
		li_element.setAttribute('onmousedown','setClickedItem(this)');
		li_element.setAttribute('onmouseover','swapItem(this)');
		li_element.innerHTML = html_str;
		playlist_element.appendChild(li_element)
		reorderPlaylist();
	}
}

function colapseItem(p_btn,p_state){
	if(!p_state){
		p_state = p_btn.value;
	}
	if(p_state==">"){
		p_btn.value = "v";
		p_btn.parentNode.getElementsByTagName('div')[0].className="meta_visible"
	}else{
		p_btn.value = ">";
		p_btn.parentNode.getElementsByTagName('div')[0].className="track_meta"
	}
}
function colapseAll(p_state){
	if(!p_state) p_state = "v";
	var playlist_element = document.getElementById('playlist');
	for(var li_node = playlist_element.firstChild; li_node!=null; li_node = li_node.nextSibling){
		if(li_node.nodeName == "LI"){
			var btn = li_node.getElementsByTagName('input')[0]
			colapseItem(btn,p_state)
		}
	}
}
function expandAll(){
	colapseAll(">")
}

function dragStop(){
	if(clicked_item!=null){
		clicked_item.getElementsByTagName('div')[0].setAttribute ('class','track')
		var reorder_btn = document.getElementById('reorder_btn');
		reorder_btn.className = "toolbar_button"
	}
	clicked_item = null;
}

function setClickedItem(p_element){
	clicked_item = p_element;
	p_element.getElementsByTagName('div')[0].setAttribute ('class','track_selected')
	//commit the input text changes
	var inputs_ar = p_element.getElementsByTagName('input')
	for (var i in inputs_ar){
		if(inputs_ar[i].attributes){
			inputs_ar[i].setAttribute('value',inputs_ar[i].value)
		}
	}
	//replace the flash player with a gif if it is playing
	if(p_element.getElementsByTagName('object').length>0){
		var object_element = p_element.getElementsByTagName('object')[0];
		object_element.previousSibling.setAttribute('style','display:inline');
		object_element.parentNode.removeChild(object_element.previousSibling.nextSibling)
	}
}
function swapItem(p_element){
	if(clicked_item){
		var temp_element = p_element.cloneNode(true)
		p_element.innerHTML = clicked_item.innerHTML;
		clicked_item.innerHTML = temp_element.innerHTML
		clicked_item = p_element;
	}else{
		//there is nothing to swap
	}
	return false;
}
function playTrack(p_url,p_title,p_link){
	var url = "http://musicplayer.sourceforge.net/button/musicplayer.swf?&scale=true&autoplay=true&song_url="+escape(p_url)+"&song_title="+p_title
	var width = 12
	var height = 12
	var object_element = document.createElement('object');
	object_element.setAttribute('type','application/x-shockwave-flash');
	object_element.setAttribute('data',url);
	object_element.setAttribute('width',width);
	object_element.setAttribute('height',height);
	
	var param_element = document.createElement('param');
	param_element.setAttribute('name','movie');
	param_element.setAttribute('value',url);
	
	var param_element2 = document.createElement('param');
	param_element2.setAttribute('name','wmode');
	param_element2.setAttribute('value','transparent');
	
	object_element.appendChild(param_element)
	object_element.appendChild(param_element2)
	p_link.parentNode.replaceChild(object_element, p_link.nextSibling)
	p_link.setAttribute('style','display:none;');
}

function previewImage(p_label_child){
	var image_url = p_label_child.parentNode.getElementsByTagName('input')[0].value;
	p_label_child.parentNode.parentNode.parentNode.parentNode.getElementsByTagName('div')[0].getElementsByTagName('img')[0].setAttribute('src',image_url);
}

function fetchAmazon(p_label_child,p_title){
	p_title =unescape(p_title)
	var sugested_name = p_title.substring(0,p_title.indexOf(" -"))
	var artist_name=prompt('Enter ONLY the Artist name:',sugested_name);
	if(artist_name!=null){
		var amazon_url = "http://xml.amazon.com/onca/xml3?locale=us&t=hideout-20&dev-t=1R8XRPEBW6WBBHZN0K02&ArtistSearch="+escape(artist_name)+"&mode=music&sort=+pmrank&offer=All&type=lite&page=1&f=xml";
		trace(amazon_url);
		loadXMLDoc(amazon_url,p_label_child)
	}
}

function generateImagesList(p_xml,p_button){
	trace("Amazon results:")
	var details_ar = p_xml.getElementsByTagName('Details');
	trace("there are "+details_ar.length+" results")
	if(details_ar.length>0){
		var amazon_results = document.createElement('span');
		var ol_element = document.createElement('ol');
		amazon_results.className = "amazon_results";
		for(var i=0; i<details_ar.length;i++){
			var product_url = details_ar[i].getAttribute('url');
			var product_name = details_ar[i].getElementsByTagName('ProductName')[0].firstChild.nodeValue;
			var img_url = details_ar[i].getElementsByTagName('ImageUrlMedium')[0].firstChild.nodeValue;
			var li_element = document.createElement('li');
			var html_str = "";
			html_str += product_name+": \n"
			html_str += "<a href=\""+img_url+"\" title=\"Click to replace Image\" onclick=\"replaceImageUrl(this,'"+img_url+"');return false;\">image</a>\n";
			html_str += ", <a href=\""+product_url+"\" title=\""+product_name+" (external link)\" >product</a>\n";
			li_element.innerHTML = html_str;
			ol_element.appendChild(li_element)
		}
		var close_btn = document.createElement('input')
		close_btn.className = 'close_btn';
		close_btn.setAttribute('type','button')
		close_btn.setAttribute('value','close')
		close_btn.setAttribute('title','Click to close the results')		
		close_btn.setAttribute('onclick','this.parentNode.parentNode.removeChild(this.parentNode)')
		amazon_results.appendChild(ol_element)
		amazon_results.appendChild(close_btn)
		p_button.parentNode.insertBefore(amazon_results,p_button.nextSibling)
		
	}else{
		alert('Sorry, your Amazon search returned no results :(')
	}
}

function replaceImageUrl(p_results_li_child,p_img_url){
	var p_label_child = p_results_li_child.parentNode.parentNode.parentNode.parentNode; //span
	p_label_child.parentNode.getElementsByTagName('input')[0].value = p_img_url;
	p_label_child.parentNode.parentNode.parentNode.parentNode.getElementsByTagName('div')[0].getElementsByTagName('img')[0].setAttribute('src',p_img_url);
}

function reorderPlaylist(){
	var playlist_element = document.getElementById('playlist');
	var m3u_str = "";
	for(var li_node = playlist_element.firstChild;li_node!=null;li_node=li_node.nextSibling){
		m3u_str +=li_node.getElementsByTagName('a')[0].getAttribute('href')+"\n";
	}
	trace(m3u_str)

	post_url = current_list_str.replace('/by/','/api/by/')
	trace(post_url)
	//post to http://webjay.org/api/by/yourname/short-name
	
	var playlist_form = document.getElementById('playlist_form');
	playlist_form.setAttribute('action',post_url);

	var post_parameters = document.getElementById('post_parameters');
	while(post_parameters.firstChild!=null){
		post_parameters.removeChild(post_parameters.firstChild)
	}
	var hidden_element = document.createElement('input')
//	hidden_element.setAttribute('type','hidden');
//	hidden_element.setAttribute('name','m3u');
//	hidden_element.setAttribute('value',m3u_str);
//	post_parameters.appendChild(hidden_element)
	
	post_str = "m3u="+escape(m3u_str);

	xmlhttpPost(post_url, post_str)	
	//return false;
}

function trackTitleChanged(p_textfield){
	//commit the change to the DOM tree
	p_textfield.setAttribute('value',p_textfield.value)
	var input_ar = p_textfield.parentNode.getElementsByTagName('input');
	var save_btn = input_ar[input_ar.length-2]
	trace(save_btn.className);
	save_btn.className = "meta_button"
}

function trackMetaChanged(p_textfield){
	//commit the change to the DOM tree
	p_textfield.setAttribute('value',p_textfield.value)
	var input_ar = p_textfield.parentNode.parentNode.parentNode.parentNode.getElementsByTagName('input');
	var save_btn = input_ar[input_ar.length-1]
	save_btn.className = "meta_button"
}

function saveTrackChanges(p_meta_save_btn, p_track_url){
	var post_url =""
	var post_str =""
	var description_str =""
	var image_str = ""
	var site_str =""

	trace(p_meta_save_btn.parentNode.parentNode.parentNode.parentNode.getElementsByTagName('input')[1].getAttribute('value'))
	description_str = p_meta_save_btn.parentNode.parentNode.parentNode.parentNode.getElementsByTagName('input')[1].getAttribute('value');
	
	var fieldset_inputs_ar = p_meta_save_btn.parentNode.getElementsByTagName('input')
	trace(fieldset_inputs_ar[0].getAttribute('value'))
	image_str = fieldset_inputs_ar[0].getAttribute('value');

	trace(fieldset_inputs_ar[fieldset_inputs_ar.length-2].getAttribute('value'))
	site_str = fieldset_inputs_ar[fieldset_inputs_ar.length-2].getAttribute('value');

	//API URI /api/username/short-name?audio=[URL of an audio resource in one of your playlists]
	post_url = current_list_str.replace('/by/','/api/songmetadata/');
	trace("post_url: "+post_url)
	
	post_str = "audio="+escape(p_track_url)+"&description="+escape(description_str)+"&image="+escape(image_str)+"&site="+escape(site_str);
	trace("post_str: "+post_str)
	xmlhttpPost(post_url, post_str,p_meta_save_btn)	
}

function deleteTrack(p_li_grandchild){
	li_element = p_li_grandchild.parentNode.parentNode;
	//update the odd/even colors
	for(var node = li_element; node!=null; node=node.nextSibling){
		if(node.className == "odd"){
			node.className = "even"
		}else{
			node.className = "odd"
		}
	}
	li_element.parentNode.removeChild(li_element);
}
