// #############################################################################
// # Favorites                                                                 #
// #############################################################################

var topVisibleEntry = -1;
var lastVisibleEntry = -1;
var entryAboveSelected = -1;
var entryBelowSelected = -1;
var listSize = 0;

// #############################################################################
// # Main functions                                                            #
// #############################################################################

// -----------------------------------------------------------------------------
// # moveRight                                                                 #
// -----------------------------------------------------------------------------
function moveRight(id){
  //alert("moveRight("+id+")");
  //setBrowserDisplay();
  
  if (id==-1){ // noting selected
	alert("Please choose an item to add to the selected list.");
  }else{
	 selectedEntryValue = document.getElementById(id+'leftOption').value; // name of the module

	// -----------------------------
	// # remove from left hand list 
	// -----------------------------
	var nodeToBeRemoved = document.getElementById('leftList')[id];
	//alert("xnodeToBeRemoved="+nodeToBeRemoved.value);
	document.getElementById('leftList').removeChild(nodeToBeRemoved);
	var leftShownList = document.getElementById('leftShown').value;
	
	//alert("document.getElementById(leftList).length="+document.getElementById('leftList').length);
	
	for (var i = id; i < document.getElementById('leftList').length; i++){
	  //alert("entry " + i + " with old id " + document.getElementById('leftList')[i].id + " and value " + document.getElementById('leftList')[i].value);
	  document.getElementById('leftList')[i].id=i+'leftOption';
	  //alert("...got  ==> newId " + document.getElementById('leftList')[i].id);
	}
	
	
	// -----------------------------
	// ... & from shown list
	// -----------------------------
	leftShownList += "";
	var newLeftShownList = "";
	var indexOfDeleted = leftShownList.indexOf(nodeToBeRemoved.value);
	//alert("indexOfDeleted="+indexOfDeleted);
	lastComma = leftShownList.lastIndexOf(",");
	if (indexOfDeleted == 0){ // first or only entry to be deleted
	  if (lastComma > -1){
		newLeftShownList = leftShownList.substring(nodeToBeRemoved.value.length+1);
	  }//else{ // one and only to be deleted
		//newLeftShownList = "";
	  //}
	}else if (indexOfDeleted > lastComma){ // last to be deleted 
	  newLeftShownList = leftShownList.substring(0, lastComma);
	}else{ // middle entry to be deleted
	  newLeftShownList = leftShownList.substring(0, indexOfDeleted) + leftShownList.substring(indexOfDeleted + nodeToBeRemoved.value.length+1);
	}
	document.getElementById('leftShown').value = newLeftShownList;
	//alert("new leftShownList="+document.getElementById('leftShown').value);
	// change entries below removed item

	// -----------------------------
	// # add to right hand list
	// -----------------------------
	//alert("node to add: " + selectedEntryValue);
	var newOption = new Option(selectedEntryValue,selectedEntryValue, false, true);
	  newOption.setAttribute("id",document.getElementById('rightList').length + 'rightOption');
	  
	  //alert("newOption.id=" + newOption.id);
	  //alert("newOption="+newOption);
	  var selectList = document.getElementById('rightList');
	  //alert("selectList="+selectList);
	  selectList.options[selectList.length] = newOption;
	  //alert("showing current rightList: list.length = " + document.getElementById('rightList').length);
	  //for (var i = 0; i < document.getElementById('rightList').length; i++){alert("position = " + i + " value = " + document.getElementById(i+'rightOption').value);}
  }
}


// -----------------------------------------------------------------------------
// # moveLeft                                                                  #
// -----------------------------------------------------------------------------
function moveLeft(id){
  //alert("moveLeft("+id+")");

  if (id==-1){ // noting selected
	alert("Please choose an item to remove from the selected list.");
  }else{
	selectedEntryValue = document.getElementById(id+'rightOption').value;
	var mList = document.getElementById('masterList').value;
	mList += ""; // make it a 'real' String
	var leftShownList = document.getElementById('leftShown').value;
	leftShownList += "";
	var master = mList.split(",");
	//alert("mList=" + mList);
	//alert("master (split mList) =" + master);

	//alert(document.getElementById('leftList').length + " elements in left list");

	emptyLeftList();
	
	// -----------------------------
	// # build new left hand list
	// -----------------------------
	for (var i = 0; i < master.length ; i++){ 
	  //document.getElementById('leftList')[i].id=i+'leftOption';
	  if ( (leftShownList.indexOf(master[i]) > -1) || (document.getElementById('rightList')[id].value==master[i])){
		var newOption = new Option(master[i],master[i], false, false);
	  	newOption.setAttribute("id",document.getElementById('leftList').length + 'leftOption');
		//alert("newOption.id=" + newOption.id);
		//alert("newOption="+newOption);
		//alert("selectList="+selectList);
	 	document.getElementById('leftList').options[document.getElementById('leftList').length] = newOption;
		//alert("old shown list=" + document.getElementById('leftShown').value);
		document.getElementById('leftShown').value=document.getElementById('leftShown').value+","+master[i];
		//alert("value added to shownlist, list now = " + document.getElementById('leftShown').value);
	  }
	}

	var nodeToBeRemoved = document.getElementById('rightList')[id];
	//alert("nodeToBeRemoved="+nodeToBeRemoved.value);

	// -----------------------------
	// # remove from right list
	// -----------------------------
	//alert("(old)document.getElementById('listSize').value="+document.getElementById('listSize').value);
	document.getElementById('rightList').removeChild(nodeToBeRemoved);
	//alert("(new)document.getElementById('listSize').value="+document.getElementById('listSize').value);
	//alert("new list.size is" + document.getElementById('listSize').value);
	
	// change entries below removed item: need to get a decremented id
	for (var i = id; i < document.getElementById('rightList').length; i++){
	  //alert("entry " + i + " with old id " + document.getElementById('rightList')[i].id + " and value " + document.getElementById('rightList')[i].value);
	  document.getElementById('rightList')[i].id=i+'rightOption';
	  //alert("...got  ==> newId " + document.getElementById('rightList')[i].id);
	}
	
	/*alert("showing current rightList: list.length = " + document.getElementById('rightList').length);
	for (var i = 0; i < document.getElementById('rightList').length; i++){
		if (document.getElementById(i+'rightOption')==null){
		  alert("position " + i + " is null");
		}else{
			alert("position = " + i + " value = " + document.getElementById(i+'rightOption').value);
		}	
	}*/

	/*alert("showing current leftList: list.length = " + document.getElementById('leftList').length);
	for (var i = 0; i < document.getElementById('leftList').length; i++){
	  if (document.getElementById(i+'leftOption')==null){
		alert("position " + i + " is null");
	  }else{
		alert("position = " + i + " value = " 
			+ document.getElementById(i+'leftOption').value + " display = " + document.getElementById(i+'leftOption').style.display);
	  }
	}*/
  }
}


// -----------------------------------------------------------------------------
// # moveUp                                                                    #
// -----------------------------------------------------------------------------
function moveUp(id){
  //alert("moveUp("+id+")");
  // if is first entry: do nothing
  if(id==0){
	// else: move one up
	alert("Chosen entry is already the first entry.");
  }else{
	//alert("id on top of selected entry:"+iUp);
	// exchange items
	selectedEntryValue = document.getElementById(id+'rightOption').value;
	for (var i = 0; i < document.getElementById('rightList').length; i++){
		if ((document.getElementById(i+'rightOption').value==selectedEntryValue)){
		  entryAboveSelected = id-1;
		  tmpContent = document.getElementById(entryAboveSelected+'rightOption').innerHTML; 
		  tmpValue = document.getElementById(entryAboveSelected+'rightOption').value;
		  document.getElementById(entryAboveSelected+'rightOption').innerHTML=document.getElementById(i+'rightOption').innerHTML;
		  document.getElementById(entryAboveSelected+'rightOption').value=document.getElementById(i+'rightOption').value;
		  document.getElementById(i+'rightOption').innerHTML=tmpContent;
		  document.getElementById(i+'rightOption').value=tmpValue;
		  //alert("new values for elementAt("+i+"):document.getElementById("+i+"rightOption).innerHTML="+document.getElementById(i+'rightOption').innerHTML
		  //	+"\ndocument.getElementById("+i+"rightOption).value="+document.getElementById(i+'rightOption').value);
		  document.getElementById(entryAboveSelected+'rightOption').selected=true;
		}
	}
  }
}


// -----------------------------------------------------------------------------
// # moveDown                                                                  #
// -----------------------------------------------------------------------------
function moveDown(id){
  //alert("moveDown("+id+")");
  // if is first entry: do nothing
  if(id==document.getElementById('rightList').length-1){
	alert("Chosen entry is already the last entry.");
  }else{
	//alert("id below selected entry:");
	selectedEntryValue = document.getElementById(id+'rightOption').value;
	// exchange items
	for (var i = 0; i < document.getElementById('rightList').length; i++){
		if ((document.getElementById(i+'rightOption').value==selectedEntryValue)){
		  entryBelowSelected = id + 1;
		  tmpContent = document.getElementById(entryBelowSelected+'rightOption').innerHTML; 
		  tmpValue = document.getElementById(entryBelowSelected+'rightOption').value;
		  document.getElementById(entryBelowSelected+'rightOption').innerHTML=document.getElementById(i+'rightOption').innerHTML;
		  document.getElementById(entryBelowSelected+'rightOption').value=document.getElementById(i+'rightOption').value;
		  document.getElementById(i+'rightOption').innerHTML=tmpContent;
		  document.getElementById(i+'rightOption').value=tmpValue;
		  //alert("new values for elementAt("+i+"):document.getElementById("+i+"rightOption).innerHTML="+document.getElementById(i+'rightOption').innerHTML
		  //	+"\ndocument.getElementById("+i+"rightOption).value="+document.getElementById(i+'rightOption').value);
		  document.getElementById(entryBelowSelected+'rightOption').selected=true;
		}
	}
  }
}


// -----------------------------------------------------------------------------
// # reset                                                                     #
// -----------------------------------------------------------------------------
function reset(){
  //setBrowserDisplay();

  	var cookie = null;
	var i=0  //Suchposition im Cookie
	var name = "managemFavorites";
	var suche = name+"=";
	var cookieValue = null;
	while (i<document.cookie.length){
	  if (document.cookie.substring(i, i+suche.length)==suche){
		var ende = document.cookie.indexOf(";", i+suche.length);
		ende = (ende>-1) ? ende : document.cookie.length;
		var cook = document.cookie.substring(i+suche.length, ende);
		cookieValue = unescape(cook);
	  }
      i++
	}
	//alert("cookieValue="+cookieValue);
	if (cookieValue != null && cookieValue!=""){ // set according to cookie value
	  // --- left list: all visible except those in cookie
	 
	var mList = document.getElementById('masterList').value;
	mList += ""; // make it a 'real' String
	var leftShownList = document.getElementById('leftShown').value;
	leftShownList += "";
	var master = mList.split(",");

	emptyLeftList();
	
	// -----------------------------
	// # build new left hand list
	// -----------------------------
	//alert("building new left list...");
	for (var i = 0; i < master.length ; i++){ 
	  if (cookieValue.indexOf(master[i]) == -1){
		var newOption = new Option(master[i],master[i], false, false);
	  	newOption.setAttribute("id",document.getElementById('leftList').length + 'leftOption');
	 	document.getElementById('leftList').options[document.getElementById('leftList').length] = newOption;
		//alert("old shown list=" + document.getElementById('leftShown').value);
		document.getElementById('leftShown').value=document.getElementById('leftShown').value+","+master[i];
		//alert("value added to shownlist, list now = " + document.getElementById('leftShown').value);
	  }
	}
	  // --- second list: all invisible except those in cookie
		var favorites = cookieValue.split(",");
		// remove all
		for (var i = document.getElementById('rightList').length-1; i > -1 ; i--){
		  //alert("removing " + document.getElementById('rightList')[i].value);
		  document.getElementById('rightList').removeChild(document.getElementById('rightList')[i]);
		}
		// reset those from cookie
		for (var i = 0; i < favorites.length ; i++){
		  //alert("adding from cookie " + favorites[i]);
		  // create & add element
		  var newOption = new Option(favorites[i],favorites[i], false, false);
		  newOption.setAttribute("id",document.getElementById('rightList').length + 'rightOption');
		  //alert("newOption.id=" + newOption.id);
		  //alert("newOption="+newOption);
		  var selectList = document.getElementById('rightList');
		  //alert("selectList="+selectList);
		  document.getElementById('rightList').options[document.getElementById('rightList').length] = newOption;
		}
	}else{// no cookie, so empty right list, rebuild left list
	  // show all of master in left list
	  for (var i = 0; i < document.getElementById('masterList').length; i++){
		var newOption = new Option(master[i],master[i], false, false);
	  	newOption.setAttribute("id",document.getElementById('leftList').length + 'leftOption');
	 	document.getElementById('leftList').options[document.getElementById('leftList').length] = newOption;
		document.getElementById('leftShown').value=document.getElementById('leftShown').value+","+master[i];
	  }
	  // empty right list
	  //alert("beginning listsize=" + document.getElementById('listSize').value);
	  for (var i = document.getElementById('rightList').length-1; i >= 0 ; i--){
		//alert("removing " + document.getElementById('rightList')[i].value);
		document.getElementById('rightList').removeChild(document.getElementById('rightList')[i]);
		//alert("current listsize=" + document.getElementById('rightList').length);
	  }
	}
}


// -----------------------------------------------------------------------------
// # save                                                                      #
// -----------------------------------------------------------------------------
function save(){
  //setBrowserDisplay();
  // build list from all entries in second list which are marked visible
  wsIdList = "";
  for (var i = 0; i < document.getElementById('rightList').length; i++){
	//alert("gettingValue for" +  i + ":");
	//alert("value:" + document.getElementById(i+'rightOption').value);
	  wsIdList += document.getElementById(i+'rightOption').value + ",";
  }
  var displayWS = wsIdList.substring(0,wsIdList.length-1);
  
  document.getElementById("mportal_portlet_editFavorites_1{actionForm.favoritesToSave}").value=wsIdList.substring(0,wsIdList.length-1);
  //alert("mportal_portlet_editFavorites_1{actionForm.favoritesToSave}:" + document.getElementById("mportal_portlet_editFavorites_1{actionForm.favoritesToSave}").value);
  
  displayWS = displayWS.replace(/,/g, "\n"); 
  if (displayWS.length > 0) {
    alert("These WebServices will be saved to your favorites list:\n\n"+displayWS);
  } else {
    alert("No favorites set yet.");
  }
}



// #############################################################################
// # Helper functions                                                          #
// #############################################################################
// -----------------------------------------------------------------------------
// # setBrowserDisplay                                                         #
// -----------------------------------------------------------------------------
function emptyLeftList(){
  	for (var i = document.getElementById('leftList').length - 1; i > -1 ; i--){
		//var nodeToBeRemovedLeft = document.getElementById('leftList')[i];
		//document.getElementById('leftList').removeChild(nodeToBeRemovedLeft);
		//alert("i=" + i);
		//alert("deleting " + document.getElementById('leftList')[i].value);
		document.getElementById('leftList')[i] = null;
		document.getElementById('leftShown').value = "";
		//alert("deleted.");
	}
}


