// JavaScript Document
function Channel_OnRemoteAppLoaded()
{
//Fired when remote fires Channel.Initialize Function
//Both sides should be ready
//If you are inviter
//1. Get SessionID 
	debug("Remote App Loaded");
	//alert('Remote loaded');
	Users = window.external.Users;
 	if(Users.Me == Users.Inviter)
	{	//New User Starts Session
		debug('I am inviter and starting session...');	
		RequestNewSessionID();
		//RequestNewItemID();	//AUTO: (Send newNoteID to otherside)
	}
	else
	{
		debug('I am Invited.');
	}
	
}

function Channel_OnRemoteAppClosed()
{   //Clean-up
	//Change any editing notes to unedit
	if(editingItem!= 0)
		SetUnEditable("s"+editingItem);
	if(lockedItem != 0)
		HighlightItem("",lockedItem);
	//Hide email
	Element.hide('emailout', 'newitem', 'refreshitems', 'email');
	//TODO: find a way to hide the item-specific buttons
	alert('The other side has closed Notesaic. \nI\'m sorry you can no longer add/edit notes in this session. \nPlease open a new session of Notesaic to continue.');
	debug('Otherside closed');
	//1. Ask to email notes?
	//1. Is Session already closed?
	remoteHasEnded = 1;
	RequestEndSession();	
}

function Channel_OnDataReceived()
{
//Fired when remote app uses Channel.SendData
//1. Detokenize data.
//2. User only receives data in certain circumstances (adding of frag, deleting of frag, frag change, 
// var longstring= Most of the time Amrit is confused   OK, not most of the time ;
// var brokenstring=longstring.split(   );
// brokenstring[0] = "Most";
// break data according to some token.
	debug("receiving data pack");
if(testmode==0)
{
	var myData = window.external.Channel.Data;
}
else
{
	var myData = windowexternalChannelData;
	//debug('Receiving Data: ' + myData);
}
	debug("data: " + myData);
var tokenizedData = myData.split(token);

var action = tokenizedData[0];

	switch(action)
	{
		case "si":
			//opposite side decided to start new session
			//Set SessionID;
			var newSessionID = tokenizedData[1];
			debug("Setting SessionID to:" + newSessionID);
			SetSessionID(newSessionID);
			//Refresh List
			//"go" - show something that says go. - add a note?			
			break;
		case "ai":
			//otherside decided to add a new note.
			var newNoteID = tokenizedData[1];
			var newNoteContent = tokenizedData[2];			
			AddNoteFULL(newNoteID, newNoteContent);
			//TODO: alert?
			break;
		case "di":
			//delete
			var newNoteID = tokenizedData[1];
			RemoveItem(newNoteID);
			//TODO: alert?
			break;
		case "ei":
			//edit
			var newNoteID = tokenizedData[1];
			var newNoteContent = tokenizedData[2];
			//debug("NoteID:" + newNoteID + " content: " + newNoteContent);
			UpdateNoteFull(newNoteID, newNoteContent);
			//TODO: alert?
			break;
		case "li":
			//lock
			var spanID = tokenizedData[1];
			lockedItem = spanID;
			HighlightItem("isLocked", spanID );
			break;
		case "ui":
			//unlock
			var spanID = tokenizedData[1];
			lockedItem = 0;
			HighlightItem("isUnlocked", spanID );
			break;
		case "rf":
			//refresh - normally called after changing order of notes.
			RefreshList();
			break;
	}
}

function Channel_OnDataError()
{
//Channel.Error.Type - integer rep. type of error
//Channel.Error.Data - data that couldn't be sent
}

function GetRemoteUser(usercollection)
{ //Gets the user object that isn't yourself.
	for(index = 0; index < usercollection.Count; index++)
	{
		if( usercollection.me !== usercollection.Item(index) )
		{
			return usercollection.Item(index);
		}
	}
	
	return usercollection.me;
}

// DATA SENDING
function SendDataPack(dataPack)
{
	debug("sending data pack");
	if(testmode==0)
	{
		try {	
			debug("REAL SENDING:" + dataPack);
			window.external.Channel.SendData(datapack);
		}
		catch(ex) {
				debug("Exception fired: " + ex);
		}
	}
	else
	{ // in testmode
		windowexternalChannelData = dataPack;
		//Output
		debug(windowexternalChannelData);
		
		//TEMP WORKAROUND
		try {	
			window.external.Channel.SendData(datapack);
		}
		catch(ex) {
		}
	}
}

function PrepareDataPack(data1, data2)
{
	var dataPack = data1 + token + data2;
	return dataPack;
}

function InitChannel()
{
 	window.external.Channel.Initialize();	
}
