// Main Functional calls.

// ********* BEGIN: SetSessionID ********* //
function SetSessionID(newID)
{		
	SessionID = newID;	
	//toggle button flip
	//ToggleStartStopSession();
	debug("Started SessionID" + newID);
	
	toggleEmail();
	//Remove loading graphic
	//ClearList();
}


function StartSession_cb(newID)
{//only called from Sajax
	//Clear up any details from previous sessions.
	ClearList();
	
	SetSessionID(newID);
	//Send notification of new session.
	//Tokenize Data
	var dataPack = PrepareDataPack("si", newID);
	//SendDataPack(dataPack);
	window.external.Channel.SendData(dataPack);
	RequestNewItemID(); //Start off by adding a note
}

function RequestNewSessionID()
{
	x_StartSession(StartSession_cb);
}
// ********* END: SetSessionID ********* //

// ********* BEGIN: EndSessionID ********* //
function RequestEndSession_cb(closedID)
{	//The point of closing a session is so that 
	// no new item can be added to the old session.
	if(closedID != -99)
	{//Close successful
		SessionID = -99;			
		debug("Ended SessionID" + closedID);
		//ClearList(); (should move it to start session to simulate "save")
		//ToggleStartStopSession(); //Flip the open/close session		
	}
}
function RequestEndSession()
{
	//Only end the session if the other side has closed the window.
		//var ans = confirm("Are you sure you want to end this session?\nWARNING: Ending Session will permanently lose all items.")
		var ans = 1;
		if(ans)
		{
			if(SessionID != -99)
			{ //make sure session is opened.
				x_EndSession(SessionID, RequestEndSession_cb);		
			}
			//TODO: send endsession notification
		}
}
// ********* END: EndSessionID ********* //


// ********* BEGIN: NewItemID ********* //
function RequestNewItemID_cb(newNoteID)
{
	//alert("New NoteID:"+newNoteID);
	//AddNote to DOM via DHTML
	AddItem(newNoteID);	
	//Tokenize Data
	var dataPack_1 = PrepareDataPack("ai", newNoteID);
	var dataPack = PrepareDataPack(dataPack_1, defaultNewText);
	//SendDataPack(dataPack);	
	window.external.Channel.SendData(dataPack);
}

function RequestNewItemID()
{
	if(SessionID != -99)
	{ //make sure session is opened.
		x_AddNoteToSession(SessionID, defaultNewText, RequestNewItemID_cb);
	}
}

function LoadUI()
{
	if(isLoading == 1)
	{
		Element.show('stopsession', 'referenceform', 'legend', 'email');
		Element.hide('loader');
		toggleEmail();
		toggleLegend();
		isLoading = 0;
	}
}
function AddItem(itemID)
{
	LoadUI(); //Load up initial Screen
	
	var listName = document.getElementById(docName);
	var itm = document.createElement("li");
	itm.setAttribute("id", 'item_' + itemID);
	//AddNoteFull(itemID, defaultNewText);

	var oSpan = document.createElement("span");	
	var spanID = "s"+itemID;
	oSpan.setAttribute("id", spanID);
	
	var myTextNode = document.createTextNode(defaultNewText);  
	oSpan.appendChild(myTextNode);
	//append an image.
	itm.appendChild(AddMoveButton(itemID));
	itm.appendChild(oSpan);
	
	//Add Edit/Delete Buttons	
	itm.appendChild(AddEditButton(itemID));
	itm.appendChild(AddSaveButton(itemID));
	itm.appendChild(AddDeleteButton(itemID));
	
	listName.appendChild(itm);
	
	//Double Clicking Behaviour
	document.getElementById(spanID).ondblclick =  function() { 	
		RequestLockItemID(itemID); 
	}			
	document.getElementById(spanID).onblur = function() 
	{ 
		RequestUnLockItemID(itemID); 
		//SetUnEditable(spanID);
	}
	

	
	var aeID = "ae" + itemID;
	var adID = "ad" + itemID;
	//var requestDeleteItemString = "RequestDeleteItemID(" + itemID + ")";
	document.getElementById( "ae" + itemID).onclick = function()
	 {
		RequestLockItemID(itemID);
	 }
	document.getElementById("ad" + itemID).onclick = function()
	 {			
			RequestDeleteItemID(itemID);
		
	 }
	document.getElementById("as" +itemID).onclick = function()
	 {
	 	SaveItem(itemID);	
	 }
	 
	 document.getElementById("am" + itemID).onmouseup = function()
	 {
		 UpdateOrderOnDB();
	 }
	 
	 document.getElementById(spanID).onmouseup = function()
	{
		//Update Database
		UpdateOrderOnDB();
	}

	SetSortable();
}

// ********* End: NewItemID ********* //

// ********* Begin: Buttons ********* //
function AddEditButton(itemID)
{
	var anchor = document.createElement("a");
	anchor.setAttribute("href", "#");
	anchor.setAttribute("class", "bt_edit");
	anchor.setAttribute("id", "ae"+itemID);
	
	var LinkText = document.createTextNode("Edit");
	var img = document.createElement("img");
	img.setAttribute("src", "images/bt_edit.jpg");
	img.setAttribute("height", "22");
	img.setAttribute("width", "22");
	img.setAttribute("border", "0");
	img.setAttribute("alt", "Edit this item.");
	
	//anchor.appendChild(LinkText);
	anchor.appendChild(img);
	
	return anchor;
}

function AddDeleteButton(itemID)
{
	var anchor = document.createElement("a");
	anchor.setAttribute("href", "#");
	anchor.setAttribute("class", "bt_del");
	anchor.setAttribute("id", "ad"+itemID);
	
	var LinkText = document.createTextNode("Delete");
	var img = document.createElement("img");
	img.setAttribute("src", "images/bt_delete.jpg");
	img.setAttribute("height", "22");
	img.setAttribute("width", "22");
	img.setAttribute("border", "0");
	img.setAttribute("alt", "Delete this item.");
	
	//anchor.appendChild(LinkText);
	anchor.appendChild(img);
	
	return anchor;
}

function AddSaveButton(itemID)
{
	var anchor = document.createElement("a");
	anchor.setAttribute("href", "#");
	anchor.setAttribute("class", "bt_save");
	anchor.setAttribute("id", "as"+itemID);
	
	var LinkText = document.createTextNode("Save");
	var img = document.createElement("img");
	img.setAttribute("src", "images/bt_save.jpg");
	img.setAttribute("height", "22");
	img.setAttribute("width", "22");
	img.setAttribute("border", "0");
	img.setAttribute("alt", "Save this Item.");
	
	//anchor.appendChild(LinkText);
	anchor.appendChild(img);
	
	return anchor;
}

function AddMoveButton(itemID)
{		
	var anchor = document.createElement("a");
	anchor.setAttribute("href", "#");
	anchor.setAttribute("class", "bt_move");
	anchor.setAttribute("id", "am"+itemID);

	var img = document.createElement("img");
	img.setAttribute("src", "images/bt_move.jpg");
	img.setAttribute("height", "23");
	img.setAttribute("width", "24");
	img.setAttribute("border", "0");
	img.setAttribute("alt", "Drag this Item.");
	
	anchor.appendChild(img);
	
	return anchor;
}
// ********* End: Buttons ********* //

// ********* Begin: DeleteItemID ********* //
function RequestDeleteItemID_cb(DelItemID)
{
	if(DelItemID > 0)
	{
		//Send call to remove Node		
		RemoveItem(DelItemID);
		//TODO Send notification.
		var dataPack = PrepareDataPack("di", DelItemID);
		//SendDataPack(dataPack);
		window.external.Channel.SendData(dataPack);
	}
	else 
	{
		alert('Database Issue: could not find item.');
	}
}

function RequestDeleteItemID(itemID)
{
	var spanID = 's' + itemID;
	if((SessionID != -99) && (spanID != lockedItem) )
	{
		var ans = confirm("Are you sure you want to delete this item?");			
		if(ans)
		{
			if(itemID > 0)
			{
				//RemoveItem(itemID); //grey out item ?
				//Highlight(itemID, 'delete');
				x_DeleteNoteFromSession(SessionID, itemID, RequestDeleteItemID_cb);
			}else 
			{
				alert('Improper ID:' + itemID);
			}
		}
	}
}

function RemoveItem(itemID)
{
	var targetItem = document.getElementById('item_' + itemID);
	var listName = document.getElementById(docName);
	listName.removeChild(targetItem);
	if(itemID == editingItem)
	{//reset editing item if it was being edited.
		editingItem = 0;
	}
	var tempSpanId = "s" + itemID;
	if(tempSpanId == lockedItem)
	{//reset locked item if it was 
		lockedItem = 0;
	}
}
// ********* End: DeleteItemID ********* //

// ********* Begin: LockItemID ********* //
function RequestLockItemID_cb(itemID)
{
	if(itemID > 0)
	{ //approved
		
		var spanID = "s"+itemID;
		SetEditable(spanID); //Set to Editable
		editingItem = itemID;
		//Send ItemIsLocked Notification 		
		//Tokenize Data
		var dataPack = PrepareDataPack("li", spanID);
		//SendDataPack(dataPack);
		window.external.Channel.SendData(dataPack);
	}
}

function RequestLockItemID(itemID)
{
	var spanID = "s"+itemID;
	//Only lock the ones that you can lock.
	if((itemID > 0) && (spanID != lockedItem) && (SessionID !== -99))
	{
		if((editingItem != itemID) && (editingItem != 0))
		{
			//Save the old item (unlocking it)
			SaveItem(editingItem);
			RequestUnLockItemID(editingItem);
			
			x_LockNote(SessionID, itemID, RequestLockItemID_cb);
		}
		else if(editingItem == 0)
		{
			x_LockNote(SessionID, itemID, RequestLockItemID_cb);
		}
		
	}
}
function RequestUnLockItemID_cb(itemID)
{	
	if(itemID > 0) 
	{ //Note is Unlocked		
		SaveItem(itemID);
		var spanID = 's' + itemID;
		//Send ItemIsUNlocked Notification		
		//Tokenize Data
		var dataPack = PrepareDataPack("ui", spanID);
		//SendDataPack(dataPack);
		window.external.Channel.SendData(dataPack);
		editingItem = 0;
	}
}

function updateNote_cb(itemID)
{
	if(itemID > 0)
	{
		//Save Successful		
		var OpenedSpan = document.getElementById('s'+itemID);
		var newText = OpenedSpan.innerHTML;
		//Send update notification and new text.
		//Tokenize Data
		var dataPack_1 = PrepareDataPack("ei", itemID);
		var dataPack = PrepareDataPack(dataPack_1, newText);
		//SendDataPack(dataPack);
		window.external.Channel.SendData(dataPack);
	}
}

function SaveItem(itemID)
{ //alias for updateNote.
	var spanID = "s"+itemID;
	if( (SessionID != -99) && (spanID != lockedItem) )
	{

		SetUnEditable(spanID);
		updateNote(itemID);
		//RequestUnLockItemID(itemID);
	}
}
function updateNote(itemID)
{
		var OpenedSpan = document.getElementById('s'+itemID);
		var newText = OpenedSpan.innerHTML;
		//alert('Trying to save content:' + newText);
		debug("Saving: " + itemID);
		
		x_UpdateNote(SessionID, itemID, newText, updateNote_cb);
}

function RequestUnLockItemID(itemID)
{
	
	if(itemID > 0)
	{
		var spanID = "s"+itemID;
		SetUnEditable(spanID);			
		x_UnlockNote(SessionID, itemID, RequestUnLockItemID_cb);
		
	}
}
// ********* End: LockItemID ********* //


// editing Functions 
function SetEditable(spanID)
{
	//alert ('SetEditable: ' + spanID);
	var oSpan = document.getElementById(spanID);
	oSpan.contentEditable = true;
	//oSpan.style.border = "1px dotted green";
	HighlightItem("editing", spanID);
}

function SetUnEditable(spanID)
{
	//alert('SetUnEditable: '+spanID);
	var oSpan = document.getElementById(spanID);
	oSpan.contentEditable = false;
	//oSpan.style.border = "0px solid green";
	HighlightItem("",spanID);
}
//



function UpdateNoteFull(nID, cont)
{		
	var spanNode = document.getElementById('s'+nID);	
	
	spanNode.innerHTML = cont;	//Set content

	if(editingItem != 0)
	{
		//HighlightItem("editing", 's'+editingItem);
		SetEditable('s'+editingItem);
	}
	
}

function AddNoteFULL(nID, cont)
{	//Adds a note to the document.

	LoadUI(); //Load up initial Screen
	
	debug("--AddNoteFull called.--");
	var listNode = document.getElementById('notes');
	
	//<li id=""><span id='s__'>content</span></li>
	var itemNode = document.createElement('li');
	itemNode.setAttribute('id', 'item_' + nID);
	
	var spanNode = document.createElement('span');
	spanNode.setAttribute('id', 's'+nID);
	
	spanNode.innerHTML = cont;	//Set content
	debug('Setting content: ' + cont);
	var spanID = 's'+ nID;
	var itemID = nID;
	
	itemNode.appendChild(AddMoveButton(itemID));
	itemNode.appendChild(spanNode);

	//Add Edit/Delete Buttons	
	itemNode.appendChild(AddEditButton(itemID));
	itemNode.appendChild(AddSaveButton(itemID));
	itemNode.appendChild(AddDeleteButton(itemID));
	
	listNode.appendChild(itemNode);
	
	//Double Clicking Behaviour
	document.getElementById(spanID).ondblclick =  function() { 	
		RequestLockItemID(itemID); 
	}			
	document.getElementById(spanID).onblur = function() 
	{ 
		RequestUnLockItemID(itemID); 
		//SetUnEditable(spanID);
	}
	
	
	var aeID = "ae" + itemID;
	var adID = "ad" + itemID;
	var requestDeleteItemString = "RequestDeleteItemID(" + itemID + ")";
	document.getElementById( "ae" + itemID).onclick = function()
	 {
		RequestLockItemID(itemID);
	 }
	document.getElementById("ad" + itemID).onclick = function()
	 {		
		RequestDeleteItemID(itemID);
	 }
	document.getElementById("as" +itemID).onclick = function()
	 {
	 	SaveItem(itemID);	
	 }
	 
	 document.getElementById("am" + itemID).onmouseup = function()
	 {
		 UpdateOrderOnDB();
	 }
	 
	 document.getElementById(spanID).onmouseup = function()
	 {
		//Update Database
		UpdateOrderOnDB();
	 } 
	 
	 SetSortable();
}



// User Experience Functions.
function ClearList()
{
	//Remove the old
	var listNode = document.getElementById('notes');
	var contentNode = document.getElementById('content');
	contentNode.removeChild(listNode);
	
	//Create Node.
	//alert('Refreshing with:' + returnedList);
	listNode = document.createElement('ul'); //recreate ul 
	listNode.setAttribute("id", "notes");
	
	//Attach Node.
	contentNode.appendChild(listNode);
}

function RefreshList_cb(returnedList)
{
	//Clear List	
	ClearList();
	debug("**********Refreshing*********");
	//listNode.innerHTML = returnedList; //does not fire events.
	var notes = returnedList.split(":-:");
	//notes.length = Number notes + 1;
	//alert("First Note : " + notes[1] );
	for(x=1; x < notes.length; x++)
	{
		
		var itemDetails = notes[x].split(":::"); // [0] - id, [1] - content, [2] - locked
		//Add note to document
		debug("Calling AddNoteFull:" + itemDetails[1] + " as content.");
		
		AddNoteFULL(itemDetails[0], itemDetails[1]);
	}
	//Set Editable parts
	if(editingItem != 0)
	{
		SetEditable("s"+editingItem);
	}
	if(lockedItem != 0)
	{
		HighlightItem("isLocked", lockedItem);
	}
	
}
function RefreshList()
{	
if(SessionID != -99)
	x_GetNotes(SessionID, RefreshList_cb);
}

function ToggleStartStopSession()
{
	if(startStopToggle == 0)
	{
	debug('Removing Start Link');
	var startstopDiv = document.getElementById('startstop');
	startstopDiv.appendChild(startStopLink);
	var startLink = document.getElementById('startsession');
	startStopLink = startstopDiv.removeChild(startLink);
	startStopToggle = 1;
	}
	else
	{
	debug('Removing Stop Link');
	var startstopDiv = document.getElementById('startstop');
	startstopDiv.appendChild(startStopLink);
	var stopLink = document.getElementById('stopsession');
	startStopLink = startstopDiv.removeChild(stopLink);
	
	startStopToggle = 0;
	}
}

function HighlightItem(status, spanID)
{
	//var spanID = "s" + nID;
	var oSpan = document.getElementById(spanID);
	switch(status)
	{
		case "isLocked":
			oSpan.style.border = "1px solid red";
			oSpan.style.backgroundColor = "#cccccc";
			break;
		case "isUnlocked":
			oSpan.style.border = "0px";
			oSpan.style.backgroundColor = "transparent";
			break;
		case "editing":			
			oSpan.style.border = "1px dotted green";
			break;
		default:
			//remove border				
			oSpan.style.border = "0px";
			oSpan.style.backgroundColor = "transparent";
			break;		
	}
}

function CopyAll() {
	debug('Copy All()');
	var tempval=document.getElementById('notes');
	window.clipboardData.setData("Text", tempval.innerHTML);
}

// SCRIPTACULOUS DRAG AND DROP
function SetSortable()
{
	Sortable.create('notes',{tag:'li'});
}

function GetNewOrder()
{
	var newOrder = Sortable.serialize('notes');
	//window.clipboardData.setData("Text", newOrder);
	//alert('Copied');
	return newOrder;			
}

function UpdateOrderOnDB_cb(returnedSQL)
{ //ajax callback.
	//debug('returnedSQL: "' + returnedSQL + '"');
	//Refresh the other side.
	var dataPack = PrepareDataPack("rf", "99");
	//SendDataPack(dataPack);
	window.external.Channel.SendData(dataPack);
}

function UpdateOrderOnDB()
{
	var ans = 1;
	//alert("LockedITem:" + lockedItem);

	if(SessionID != -99)
	{
		debug('newOrder');
		var newOrder = GetNewOrder();
		if(newOrder != oldOrder)
		{
			x_GetNewOrder(newOrder, UpdateOrderOnDB_cb);
		}
	}
}
/*
function SetSortable()
{
  Sortable.create('notes',{ghosting:true,constraint:false})
}
*/
 function LoadNames()
 {
 	/*Users = window.external.Users; //.Name Property IS NULL DOES NOT WORK.
	myGuestName = GetRemoteUser(Users).Name;
	if(!myGuestName.length)
	{
		myGuestName = "Name Not Entered.";
	}
	myName = Users.Me.Name;
	if(!myName.length)
	{
		myName = "Name Not Entered.";
	}
	
	debug('Guest Name: ' + myGuestName + "\n" + "My Name: " + myName);	
	*/	
 } 
 
 function toggleLegend()
 {
  if(legendToggle == 0)
  { //it's open so close
    Effect.BlindUp('graphic');
    legendToggle = 1;
  }
  else
  {
    Effect.BlindDown('graphic');
    legendToggle = 0;
  }
 }
 
 function toggleReference()
 {
  if(refToggle == 0)
  { //it's open so close
    Effect.BlindUp('form');
    refToggle = 1;
  }
  else
  {
    Effect.BlindDown('form');
    refToggle = 0;
  }
 }
 
 function toggleEmail()
 {
if(emailToggle == 0)
  { //it's open so close
    Effect.BlindUp('email');
    emailToggle = 1;
  }
  else
  {
    Effect.BlindDown('email');
    emailToggle = 0;
  } 
 }
function popupform(myform, windowname)
{
if (! window.focus)return true;
window.open('', windowname, 'height=200,width=400,scrollbars=yes');
myform.target=windowname;
return true;
}

function openRef()
{
 var word = document.forms["referenceform"].dword.value;
 var url = "http://encarta.msn.com/dictionary_/" + word +".html";
 //alert('Opening :'+ url); 
 window.open (url, "RefWindow","resizable=1,width=400,height=400,scrollbars=yes");
 //RefreshList();
}

function sendEmail_cb(message)
{
	alert(message);
}
function sendEmail()
{	
 var eaddress = document.forms["emailform"].emailaddress.value;
 x_sendEmail(SessionID, eaddress, sendEmail_cb);
 //alert('Opening :'+ url);	
}

/***********************************************
* Disable "Enter" key in Form script- By Nurul Fadilah(nurul@REMOVETHISvolmedia.com)
* This notice must stay intact for use
* Visit http://www.dynamicdrive.com/ for full source code
***********************************************/
                
function handleEnter (field, event) {
		var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
		if (keyCode == 13) {
			var i;
			for (i = 0; i < field.form.elements.length; i++)
				if (field == field.form.elements[i])
					break;
			i = (i + 1) % field.form.elements.length;
			field.form.elements[i].focus();
			return false;
		} 
		else
		return true;
	}      

