/*
	Base functions to get connected to the TokBox presence.
*/

var tbService			= null;
var messengerService	= null;

var jabberID			= "1244215"; 							// 1244215
var partnerKey			= "1335";
var secret				= "c18c88872984b603a6e68996dc32fcd2";  	// This is a MD5 of the jabberID's password.  c18c88872984b603a6e68996dc32fcd2

var screenName			= null;
var messengerClient		= "yahoo"; 								// Set AIM as the default.
var contacts			= [];
var contactRefreshRate	= 3000;
var selectedContact		= {};
var videoToPlay			= null;
var currentStep			= 1;
var contactHasResponded = false;
var msnId				= 0;

// Intervals
var msnInterval			= null;
var refreshInterval		= null;


// Static Vars
var messageToSend		= "Hey, I'm checking out a new video chat site. Wanna try it...? http://e-chatter.net/index.html?r={friend_name}&s={sender_name}&v={video_id}";
var confirmationMessage = "An alertification message was just sent to {friend_name}.<br/><br/>When you're ready, send another alertification."

// Start up the presence engine.
swfobject.addDomLoadEvent(function() {
	setStatus("Logging into TokBox...");
	tbService = TokBox.init('tokbox');
	setTimeout(initTBService, 2000);
});

var initTBService = function() {
	tbService.connect(jabberID, partnerKey + '-' + secret);
	tbService.registerCallback('onReceiveMessage', tbReceiveMessage);
	tbService.registerCallback('error', tbErrorHandler);
	tbService.registerCallback('onConnect', tbServiceConnect);
}

// TokBox User Functions

var tbReceiveMessage = function(userObj, msg) {
   alert(userObj + ": " + msg);
};

var tbErrorHandler = function(error) {
	setStatus("There was an error when logging into TokBox: " + error);
};

var tbServiceConnect = function() {
	setStatus("Now logged into TokBox.");
	document.getElementById('login').style.display = 'block';
};

// First step, select the video.

var selectVideo = function(event) {
	videoToPlay = event.data;
	var displayName = messengerClient.toUpperCase();
	if(messengerClient == "yahoo") {
		displayName += "!"
	}
	$("#messengerLogo").attr("class", (messengerClient + "IconSmall"));	
	$("#userNameHeader").text(displayName + " Screen Name:");	
	goToStep(2);
}

// Second step, select your messenger client.

var changeService  = function(event) {
	messengerClient = $(event.data).attr("id");
	var displayName = messengerClient.toUpperCase();
	if(messengerClient == "yahoo") {
		displayName += "!"
	}
	$("#userNameHeader").text(displayName + " Screen Name:");	
		$("#clients").children().each(
			function(){
				$(this).removeClass("serviceOn");
				$(this).addClass("serviceOff");
			}
		); 	
		$("#messengerLogo").attr("class", (messengerClient + "IconSmall"));	
		$(event.data).removeClass("serviceOff");
		$(event.data).addClass("serviceOn");		
}


// Messenger Client Functions

var logIn = function(){
	var service 	= messengerClient;
	var username	= document.getElementById('username_txt').value;
	var password	= document.getElementById('password_txt').value;
	screenName 		= username;
	
	if(service == "gmail") {
		service = "27Pes7AS";
	}
	if(service == "msn") {
		service = "zZz7Tc7q";
	}
	if(service == "yahoo") {
		service = "uLQnN9Wm";
	}
	
	signIntoService(service, username, password);
	setStatus("Logging into " + service.toUpperCase());
};

var signIntoService = function (serviceName, username, password){
	messengerService = TokBox.getIMConnection(serviceName);
		
	messengerService.registerCallback('onConnect', messengerServiceConnect);
	messengerService.registerCallback('error', messengerServiceError);
	messengerService.registerCallback('onGetContacts', buildMessengerServiceContactList);
	messengerService.registerCallback('onUpdateContact', messengerOnUpdateContact);
	messengerService.registerCallback('onReceiveMessage', messengerReceiveMessage);
		
	messengerService.registerCallback('onDisconnect', messengerOnDisconnect);
	messengerService.registerCallback('subscripRequest', messengerSubscripRequest);
	
	messengerService.connect(username, password);
	
// 	MSN Functions
/*	setUserStatus
	grantSubscription
	denySubscription
	addContact
	removeContact
	getContacts
	getGroupNames
	getContactProfile
*/	
}

var messengerOnDisconnect = function(msg) {
     alert("That doesn't seem right. Want to give it another try?");
};

var errorHandler = function(error) {
	setStatus("There was an error when logging into your messenger acount: " + error);
};

var messengerServiceConnect = function() {
	try {
		goToStep(3);
		messengerService.getContacts();
    }
    catch(err) {
        errorHandler(err);
    }
};

var messengerServiceError = function(error) {
     alert("There was an error: " + error);
};

var buildMessengerServiceContactList = function(contacts) {
    var allContacts 			= JSON.parse(contacts);
	allContacts.sort(sortByScreenName);
	
	document.getElementById('loadingContacts').style.display = "block";
	document.getElementById("contactsHeader").className = "";
	document.getElementById("contactsHeader").innerHTML = "Online Now"; 
	document.getElementById("contactList").style.display = "block"; 
	
	document.getElementById('videoImage').className = videoToPlay;
	
	var contactList = document.getElementById('contactList'); 
	
	// Let's clear out old contacts if they already exist.
	contactList.innerHTML = "";
	contacts = [];
	
	if(messengerClient == "msn") {
		setTimeout("messengerService.setUserStatus('available')", 1000);
	} else {
		for(var i = allContacts.length - 1; i >= 0; i--){
			var contact 				= allContacts[i];
			var newContact 				= document.createElement("div");
			var contactName 			= document.createElement("div");
			var messengerIcon 			= document.createElement("div");
			var messengerId				= document.createElement("div");
			var status					= document.createElement("div");
			var groupName				= document.createElement("div");
			var userScreenName 			= contact.screenName.replace(/^\s*|\s*$/g,''); // Removes all whitespace from name.
			userScreenName				= userScreenName.replace("@", "");
			userScreenName				= userScreenName.replace(".", "");
			contact.id					= userScreenName;
			contact.messengerId			= (contact.jid) ?  contact.jid : contact.screenName;
			
			// Now it's time to see if the user is already in the contacts array via the messengerOnUpdateContact, 
			// since it can sometimes get called earlier. If so, we want to use what was already in it.
			if(!contacts[userScreenName]) {  			
				contacts[userScreenName] 		= contact;
				newContact.style.display 		= "none";
			} else {
				if(contacts[userScreenName].online == "true") {
					newContact.style.display 	= "block";
				} else {
					newContact.style.display 	= "none";
				}
			}
			newContact.className			= "contactOff";
			newContact.id					= contact.id;
			$(newContact).bind('click', contact, selectContact);
			contactName.className 			= "name";	
			if(contact.screenName.length > 20) {
				contactName.innerHTML 			= contact.screenName.substring(0,14) + "...";	
			} else {
				contactName.innerHTML 			= contact.screenName;
			}
			messengerIcon.className 		= messengerService.serviceType + "IconSmall";
		
			messengerId.className 			= "messengerId";	
			messengerId.innerHTML			= contact.messengerId;
			messengerId.style.display		= "none";
			
			status.className 				= "status";	
			status.innerHTML				= contact.status;
			status.style.display			= "none";
			
			groupName.className 			= "groupName";	
			groupName.innerHTML				= contact.groupName;
			groupName.style.display			= "none";		
			
			newContact.appendChild(contactName);
			newContact.appendChild(messengerIcon);
			newContact.appendChild(messengerId);
			newContact.appendChild(status);
			newContact.appendChild(groupName);
			contactList.appendChild(newContact);
		}
	}
	refreshInterval = setInterval("refreshContacts()", contactRefreshRate);
	
};

var messengerOnUpdateContact = function(userObj) {
	var contactInfo 			= new Object();
	contactInfo 				= parseUserObject(userObj);
	var userScreenName 			= contactInfo.screenName.replace(/^\s*|\s*$/g,''); // Removes all whitespace from name.
	contactInfo.id				= userScreenName;
	var found = false;
	if(messengerClient != "msn") {
		contacts[userScreenName] 	= contactInfo;
	} else {
		var pos = contactInfo.screenName.indexOf("@")
		if (pos >= 0) {  // No @ symbol in the name, meaning it is a valid MSN name.
			for(var x in contacts) {
				if(contacts[x].screenName == contactInfo.screenName) {
					contacts[x] = contactInfo;
					found = true;
					break;
				}
			}
			if(!found){
			
				var contactList			 	= document.getElementById('contactList'); 
				var contact 				= contactInfo;
				var newContact 				= document.createElement("div");
				var contactName 			= document.createElement("div");
				var messengerIcon 			= document.createElement("div");
				var messengerId				= document.createElement("div");
				var status					= document.createElement("div");
				var groupName				= document.createElement("div");
				contact.id					= "MSN" + msnId++;
				contact.messengerId			= (contact.jid) ?  contact.jid : contact.screenName;

				if(contact.online == "true") {
					newContact.style.display 	= "block";
				} else {
					newContact.style.display 	= "none";
				}
				newContact.className			= "contactOff";
				newContact.id					= contact.id;
				$(newContact).bind('click', contact, selectContact);
				contactName.className 			= "name";	
				if(contact.screenName.length > 20) {
					contactName.innerHTML 			= contact.screenName.substring(0,14) + "...";	
				} else {
					contactName.innerHTML 			= contact.screenName;
				}
				messengerIcon.className 		= messengerService.serviceType + "IconSmall";
			
				messengerId.className 			= "messengerId";	
				messengerId.innerHTML			= contact.messengerId;
				messengerId.style.display		= "none";
				
				status.className 				= "status";	
				status.innerHTML				= contact.status;
				status.style.display			= "none";
				
				groupName.className 			= "groupName";	
				groupName.innerHTML				= contact.groupName;
				groupName.style.display			= "none";		
				
				newContact.appendChild(contactName);
				newContact.appendChild(messengerIcon);
				newContact.appendChild(messengerId);
				newContact.appendChild(status);
				newContact.appendChild(groupName);
				contactList.appendChild(newContact);
				contacts[contact.id] 	= contact;
			}
		}
	}
};

var refreshContacts = function() {
	document.getElementById('loadingContacts').style.display = "none";
	var buddiesOnline = 0;
	for(var i in contacts) {
		var contactTag = document.getElementById(i); 
		if(contacts[i].online == "true") {
			contactTag.style.display 	= "block";
			buddiesOnline++;
		} else {
			contactTag.style.display 	= "none";
		}
	}
	
	if(buddiesOnline > 0) {
		document.getElementById("contactsHeader").className = "";
		document.getElementById("contactsHeader").innerHTML = "Online Now"; 
		document.getElementById("contactList").style.display = "block"; 
	} else 	{
		document.getElementById("contactList").style.display = "none"; 
		document.getElementById("contactsHeader").className = "empty";
		document.getElementById("contactsHeader").innerHTML = "No one online right now. Try again later."; 
	}
}

// Third step, select the client you wish to send the video to.

var selectContact = function(event) {
	selectedContact = event.data;
	
	for(var i in contacts) {
		document.getElementById(i).className = "contactOff";
	}
	document.getElementById(selectedContact.id).className = "contactOn";
	document.getElementById('videoText').innerHTML = "Send " + videoToPlay + " to alertify " + event.data.screenName + ".";
}

var sendVideo = function(event) {
	var vidId = "1";
	if(videoToPlay != "Fred") {
		vidId = "2";
	}
	
	var message 	= messageToSend;
	message 		= message.replace("{friend_name}", escape(selectedContact.screenName));
	message 		= message.replace("{sender_name}", escape(screenName));
	message 		= message.replace("{video_id}", vidId);
	
	var cMessage 	= confirmationMessage;
	cMessage 		= cMessage.replace("{friend_name}", selectedContact.screenName);
	
	document.getElementById('chatHeader').innerHTML = "Chat with " + selectedContact.screenName;
	document.getElementById('success').innerHTML = cMessage;
	document.getElementById('chatHistory').innerHTML = "";
	contactHasResponded = false;
	$("#message").val(null);
	$("#message").val(message);
	
	sendMessage(selectedContact);
	
	// Need to set the enter button to fire off chat sends... 
	goToStep(4);
}

// Fourth step, communicate with your friend, or start over again.

var sendMessage = function(contact) {
	messengerService.sendMessage(contact.messengerId, $("#message").val());
		
	var messagesReceived 		= document.getElementById('chatHistory'); 
	
	var message 				= document.createElement("div");
	message.className 			= "message";
	
	var contactName 			= document.createElement("span");
	contactName.className 		= "yourself";	
	contactName.innerHTML		= screenName + ": ";
	
	var contactMessage 			= document.createElement("span");
	contactMessage.className 	= "yourMessage";	
	contactMessage.innerHTML	= $("#message").val();
	
	// For some reason, need to make it delay just a fraction of a second, in order to remove the hard return.
	setTimeout("$('#message').val(null);", 10);
	//$("#message").val(null);
	
	message.appendChild(contactName);
	message.appendChild(contactMessage);
	messagesReceived.appendChild(message);
	
	if(!contactHasResponded) {
		var message2 				= document.createElement("div");
		message2.className 			= "message";
		
		var waitingMessage 			= document.createElement("span");
		waitingMessage.className 	= "yourself";	
		waitingMessage.innerHTML	= "<br>Waiting for " + contact.screenName + " to respond...<br><br>";
		
		message2.appendChild(waitingMessage);
		messagesReceived.appendChild(message2);
		contactHasResponded = true;
	}
}

var messengerReceiveMessage = function (userObj, msg) {
	var uO = new Object();
	uO = parseUserObject(userObj);
		
	var messagesReceived 		= document.getElementById('chatHistory'); 
	
	var message 				= document.createElement("div");
	message.className 			= "message";
	
	var contactName 			= document.createElement("span");
	contactName.className 		= "yourfriend";	
	contactName.innerHTML		= uO.screenName + ": ";
	
	var contactMessage 			= document.createElement("span");
	contactMessage.className 	= "contactMessage";	
	contactMessage.innerHTML	= msg;
	
	message.appendChild(contactName);
	message.appendChild(contactMessage);
	messagesReceived.appendChild(message);
	
};

var goToStep = function(stepNumber) {
	currentStep = stepNumber;
	
	document.getElementById('step1').style.display 				= "none"; 
	document.getElementById('step2').style.display 				= "none"; 
	document.getElementById('step3').style.display 				= "none"; 
	document.getElementById('step4').style.display 				= "none"; 
	document.getElementById('step' + stepNumber).style.display 	= "block"; 
	
	$(document).unbind('keypress', enterCheckLogin);
	$(document).unbind('keypress', enterCheckMessage);
	
	switch(stepNumber){
		case 2:
			$(document).bind('keypress', enterCheckLogin);
			break;
		case 4:
			$(document).bind("keypress", enterCheckMessage);
			break;    
	}
}

var enterCheckMessage = function(evt) {
	if (evt.keyCode == 13) {
		sendMessage(selectedContact);
	}
}
var enterCheckLogin = function(evt) {
	if (evt.keyCode == 13) {
		logIn();
	}
}

var goBack = function(event) {
	if(currentStep == 3) {
		signOff();
		
	}
	document.getElementById('videoText').innerHTML = "";
	goToStep(currentStep - 1);
}

var startOver = function() {
	signOff();
	goToStep(1);
}

var signOff = function() {
	if(messengerService != null) {
		messengerService.registerCallback('onDisconnect', silentSignOff);
		messengerService.disconnect();
	}
}

var silentSignOff = function(msg) {
	clearInterval(refreshInterval);
	document.getElementById('contactList').innerHTML = "";
	contacts = [];
};

// Functions not using yet...

var messengerOnLoaded = function() {
	messengerService.setUserStatus("Online");
};

var messengerOnGetGroupNames = function(msg) {
     alert("messengerOnGetGroupNames: " + msg);
};

var messengerSubscripRequest = function(msg) {
     alert("messengerSubscripRequest: " + msg);
};

// Bind button events.
var setUpJQueryEvents = function() {
	// Click events
	$("#clients").children().each(
		function() {
			$(this).bind('click', $(this), changeService);
		}
	); 	
	$("#loginButton").bind('click', logIn);
	$("#fredButton").bind('click', "Fred", selectVideo);
	$("#robButton").bind('click', "Rob", selectVideo);
	$("#sendAlertButton").bind('click', sendVideo);
	$("#startOverButton").bind('click', startOver);
	$(".backBtn").bind('click', goBack);
	
	// Rollover Events
	$("#fredButton").hover(buttonRollOver,buttonRollOut); 
	$("#robButton").hover(buttonRollOver,buttonRollOut); 
	$("#loginButton").hover(buttonRollOver,buttonRollOut); 
	$("#sendAlertButton").hover(buttonRollOver,buttonRollOut); 
	$("#startOverButton").hover(buttonRollOver,buttonRollOut); 
};

var buttonRollOver	= function() {
	$(this).removeClass("buttonOff");
	$(this).addClass("buttonOn");
}
var buttonRollOut	= function() {
	$(this).removeClass("buttonOn");
	$(this).addClass("buttonOff");
}


// Util Functions

var setStatus = function(a) {
	document.getElementById("statusMessage").style.display = 'none';
	document.getElementById("statusMessage").innerHTML = a;  
}


var parseUserObject = function(str){
	str = 	str.replace( /{/g, '' );
	str = 	str.replace( /}/g, '' );
	
	var pairs = str.split(",");
	var userObject = new Object();
	var total = pairs.length;
	
	for (var i = 0; i < total; i++) {
		
		pairs[i] = 	pairs[i].replace( /"/g, '' );  // Remove the double quotes on all the strings.
		var tempProp = pairs[i].split(":");
		userObject[tempProp[0]] = tempProp[1];	
		
	}
	return userObject;
}

var sortByScreenName = function(a,b) {
	var x=a.screenName.toLowerCase();
	var y=b.screenName.toLowerCase();
	return x < y?1:x > y?-1:0;
}

String.prototype.trim = function () {
    return this.replace(/^\s*/, "").replace(/\s*$/, "");
}


$(document).ready(setUpJQueryEvents);