/**
 *	Chat plugin 
 */

var chatInstance;
var first = true;
$(function(){
	sendRequest = function(){
		chatInstance.requestMessage();
	}
});


(function($){
	
$.fn.chat = function(options) {
	//Settings list and the default values

	var defaults = {
		animatePadding: 60,
		defaultPadding: 10,
		evenColor: '#ccc',
		oddColor: '#eee'
	};
	var chatObj = false;
	this.each(function() {
		chatObj = new Chat(this);
		// chatObj.createOperator();
		chatObj.createCharBar();
		
		// add friend
		$('#addFriend', this).click(function(){
			chatObj.requestNewFriend($('#friendEmail').val());
		});
		
		
	});
	chatInstance = chatObj;
	return chatObj;
};

})(jQuery);



Chat = function(domNode) {
	this.init(domNode);
};

$.extend(Chat.prototype, {
	// object variables
	domNode: false,
	
	// person Count
	personCount: 0,
	
	// last message id
	last: -1,
	
	// chatbox count
	chatBoxCount: 0,
	
	// timer
	timer: false,
	
	selfemail: '',
	
	init: function(domNode) {
		// do initialization here
     	this.domNode = domNode;
   	},

   	createCharBar: function() {
   		var html = '<div id="cometchat_base">'
   		+ '<span id="cometchat_hide" class="cometchat_tab"></span>'
   		+ '<span id="cometchat_optionsbutton" class="cometchat_tab cometchat_optionsimages"></span>'
   		+ '<span class="cometchat_tab" id="cometchat_userstab">'
   	 	+ '<span id="cometchat_userstab_icon" class="cometchat_user_away2"></span>'
   	 	+ '<span id="cometchat_userstab_text">Chat(0)</span>'
   		+ '</span>'
//   		+ '<div id="cometchat_chatboxes" style="width: 152px; ">'
//   		+ '<div id="cometchat_chatboxes_wide" style="width: 152px; ">'
//   		+ '</div>'
//   		+ '</div>'
   		+ '</div>'
   		$(this.domNode).append(html);
   		
   		this.createOption();
   		this.createUsers();
   		
   		// hidden event bind
   		$('#cometchat_hide').click(function(){
   			
   		});
   		
   		this.requestAll();
   		
   	},
   	
   	createOption: function() {
   		var html = '<div id="cometchat_optionsbutton_popup" class="cometchat_tabpopup" style="display: none; right: 53px; bottom: 24px;">'
   			+ '<div class="cometchat_userstabtitle">'
   			+ '<div class="cometchat_userstabtitletext lfloat">Chat Options</div>'
   			+ '<div class="cometchat_minimizebox"></div>'
   			+ '<br clear="all"/>'
   			+ '</div>'
   			+ '<div class="cometchat_tabsubtitle">Type your status and hit the enter key!</div>'
   			+ '<div class="cometchat_tabcontent cometchat_optionstyle">'
   			+ '<b>Status</b><br /><br />'
   			+ '<div>'
   			+ '<span class="cometchat_user_available"></span>'
   			+ '<span class="cometchat_optionsstatus available" style="text-decoration: underline; ">Available</span>'
   			+ '<span class="cometchat_optionsstatus2 cometchat_user_invisible"></span>'
   			+ '<span class="cometchat_optionsstatus invisible" style="text-decoration: none; ">Invisible</span>'
   			+ '<div style="clear:both"></div><span class="cometchat_optionsstatus2 cometchat_user_busy"></span>'
   			+ '<span class="cometchat_optionsstatus busy" style="text-decoration: none; ">Busy</span>'
   			+ '<span class="cometchat_optionsstatus2 cometchat_user_invisible"></span>'
   			+ '<span class="cometchat_optionsstatus cometchat_gooffline">Offline</span>'
   			+ '<br clear="all">'
   			+ '</div>'
   			+ '<div style="border-top:1px solid #eeeeee;margin-top:10px;padding-top:4px;">'
   			+ '<b>Add new friend</b><br /><br />'
   			+ '<div>'
   			+ 'Please input your friend email.'
   			+ '<input type="text" class="cometchat_input" id="friendEmail">'
   			+ '</div>'
   			+ '<div>'
   			+ '<input type="button" id="addFriend" class="cometchat_statusbutton" value="Add a new friend">'
   			+ '</div>'
   			+ '</div>'
   			+ '<div class="cometchat_hidebartext"><div><a href="javascript:void(0);" id="cometchat_hidebar"></a></div></div>'
   			+ '</div>'
   			+ '</div>';
   		$(this.domNode).append(html);
   		
   		// option bind
   		
   		var self = this;
   		$('#cometchat_optionsbutton').click(function(){
   			if($(this).hasClass('cometchat_tabclick')) {
   				$(this).removeClass('cometchat_tabclick');
   				$('#cometchat_optionsbutton_popup').hide();
   			} else {
   				$(this).addClass('cometchat_tabclick'); // cometchat_optionsimages 
   				$('#cometchat_optionsbutton_popup').show();
   				
   				$('#cometchat_userstab_popup').hide();
   				$('#cometchat_userstab').removeClass('cometchat_tabclick');
   			}
   		});
   		
   		$('#cometchat_optionsbutton_popup .cometchat_minimizebox').click(function(){
   			$('#cometchat_optionsbutton').click();
   		});
   		
   		$('#cometchat_optionsbutton_popup .available').click(function(){
   			self.requestStatus(0);
   		});
   		
   		$('#cometchat_optionsbutton_popup .busy').click(function(){
   			self.requestStatus(1);
   		});
   		
   		$('#cometchat_optionsbutton_popup .invisible').click(function(){
   			self.requestStatus(2);
   		});
   		
   		$('#cometchat_optionsbutton_popup .cometchat_gooffline').click(function(){
   			self.requestStatus(3);
   		});   		
   	},
   	
   	
   	createUsers: function() {
   		var html = '<div style="display: none; right: 53px; bottom: 24px;" class="cometchat_tabpopup" id="cometchat_userstab_popup">'
   		+ '<div class="cometchat_userstabtitle">'
   		+ '	<div class="cometchat_userstabtitletext">Who is Online</div>'
   		+ '	<div class="cometchat_minimizebox"></div>'
   		+ ' <br clear="all">'
   		+ '</div>'
   		+ '<div id="cometchat_searchbar" class="cometchat_tabsubtitle" style="display: none;">'
   		+ '	<input type="text" value="Find a user" id="cometchat_search" class="cometchat_search cometchat_search_light" name="cometchat_search">'
   		+ '</div>'
   		+ '<div class="cometchat_tabcontent cometchat_tabstyle">'
   		+ '	<div id="cometchat_userscontent" >'
   		+ '	<div id="cometchat_userslist_available" style="display: block;"><br />'
   		+ '		<div id="cometchat_friendlist"><b>&nbsp;&nbsp;Friends</b>'
   		+ '		<div style="border-top:1px solid #eeeeee;margin-top:10px;padding-top:4px;"></div>'
   		+ '		</div><br />'
   		+ '		<div id="cometchat_sellerlist"><b>&nbsp;&nbsp;Sellers</b>'
   		+ '		<div style="border-top:1px solid #eeeeee;margin-top:10px;padding-top:4px;"></div>'
   		+ '		</div>'   		
   		+ '	</div>'
   		+ '	</div>'
   		+ '</div>'
   		+ '</div>';
   		$(this.domNode).append(html);
   		
   		// user list bind
   		
   		$('#cometchat_userstab').click(function(){
   			if($(this).hasClass('cometchat_tabclick')) {
   				$(this).removeClass('cometchat_tabclick ');
   				$('#cometchat_userstab_popup').hide();
   			} else {
   				$(this).addClass('cometchat_tabclick'); // cometchat_optionsimages 
   				$('#cometchat_userstab_popup').show();
   				$('#cometchat_optionsbutton_popup').hide();
   				$('#cometchat_optionsbutton').removeClass('cometchat_tabclick');
   			}
   		});
   		
   		
   		// users tab minimizing
   		$('#cometchat_userstab_popup .cometchat_minimizebox').click(function(){
   			$('#cometchat_userstab').click();
   		});
   		
   	},
   	
	
	
   	addProfile: function(name, isseller, email, status, website, isaccept) {
		
		id="cometchat_userlist_" + this.replaceSpecials(email);
		
		var self = this;
		var cls = "cometchat_available";
		
		switch(status) {
		case '0':
			cls = "cometchat_available";
			break;
		case '1':
			cls = "cometchat_busy";
			break;
		case '2':
			cls = "cometchat_offline";
			break;
		case '3':
			cls = "cometchat_offline";
			break;			
		}
		
		if($("#" + id).size() == 0) {
			var tmpl = $.tmpl('<div class="cometchat_userlist" id="${id}" isaccept="${isaccept}">'
				+ '<span class="cometchat_userscontentavatar">'
				+ '<a href="mailto:${email}"><img src="images/none.jpg" class="cometchat_userscontentavatarimage" title="${email}"></a>'
				+ '</span>'
				+ '<span class="cometchat_userscontentname">${name}</span>'
				+ '<span class="cometchat_closebox_bottom" style="margin-top: 2px;"></span>'
				+ '<span class="cometchat_userscontentdot ${cls}"></span>'
				+ '</div>', {'name': name, 'id' : id, email: email, cls: cls, isaccept: isaccept} );
		
			if(isseller == 1)
				var targetDiv = "#cometchat_sellerlist";
			else
				var targetDiv = "#cometchat_friendlist";
			
			tmpl.appendTo($(targetDiv));
			var self = this;
			
			$('#' + id + ' .cometchat_userscontentname').click(function(){
				if($(this).attr('isaccept') == "1")
					self.createChatBox(name, email, website);
			});
			
			$('#' + id + ' .cometchat_closebox_bottom').click(function(){
				askMessage = "Do you want to delete this friend?";
				result = confirm(askMessage);
				if(result == 1) {
					self.requestDeleteFriend(email);	
				}
			});
		}
		
		
		$('#' + id + ' .cometchat_userscontentname').attr('isaccept', isaccept);
		
		
		
		$("#" + id + " .cometchat_userscontentdot").attr('class', 'cometchat_userscontentdot '+ cls);
		
		$("#cometchat_user_" + this.replaceSpecials(email) + " .cometchat_closebox_bottom_status")
			.attr('class', 'cometchat_closebox_bottom_status ' + cls);
		
		
		
	},
	
	removeProfile: function(name, friendemail) {
		id="#profile_" + this.replaceSpecials(friendemail);
		$(id, this.domNode).remove();
		this.removeChatBox(name);
		this.personCount--;
	},
	
	addMessage: function(fromemail, toemail, fromName, toName, message, fromWebsite, toWebsite) {
		// if there is no chat box 

		if(fromemail == this.selfemail) {
			var cls = "cometchat_self";
			id = this.createChatBox(toName, toemail, toWebsite);
			fromName = "Me";
		} else {
			var cls = "";
			id = this.createChatBox(fromName, fromemail, fromWebsite);
		}

		var tmpl = $.tmpl('<div class="cometchat_chatboxmessage">'
				+ '<span class="cometchat_chatboxmessagefrom ${cls}"><strong>${name}</strong>:&nbsp;&nbsp;</span>'
				+ '<span class="cometchat_chatboxmessagecontent ${cls}">${message}</span>'
				+ '<span class="cometchat_ts"></span>'
				+ '</div>'
			, {'name': fromName, 'message' : message, cls: cls, name: fromName });
		
		fbConversation = "#" + id + "_popup .cometchat_tabcontenttext > div";
		
		tmpl.appendTo($(fbConversation));
		
		fbcontent = "#" + id + "_popup .cometchat_tabcontenttext";
		
		$(fbcontent).get(0).scrollTop =$(fbcontent).get(0).scrollHeight; 
		
	},
	
	
	
	createChatBox: function(name, email, website) {
		//alert(website);
		var id = "cometchat_user_" + this.replaceSpecials(email);
		if($("#" + id).size() == 0) {
			position = 277 + this.chatBoxCount * 152;
			var tmpl = $.tmpl('<div id="${id}_popup" class="cometchat_tabpopup" style="display: none; right: ${position}px; bottom: 24px; ">'
				+ '<div class="cometchat_tabtitle">'
				+ '		<div class="cometchat_name">'
				+ '			<a href="${website}">${name}</a>'
				+ '			<span id="cometchat_typing_99999995" class="cometchat_typing" style="display: none; "></span>'
				+ '		</div>'
				+ '		<div class="cometchat_closebox"></div>'
				+ '		<div class="cometchat_minimizebox"></div>'
				+ '		<img title="Clear conversation" class="cometchat_pluginsicon" src="images/clearicon.png" style="float:right;">'				
				+ '		<br clear="all">'
				+ '	</div>'
				+ '	<div class="cometchat_tabcontent">'
				+ '	<div class="cometchat_tabcontenttext" id="cometchat_tabcontenttext_${email}">'
				+ '		<div>'

				+ '		</div>'
				+ '</div>'
				+ '<div class="cometchat_tabcontentinput">'
				+ '<input class="cometchat_textarea"></input>'
				+ '<div class="cometchat_tabcontentsubmit"></div>'
				+ '</div>'
				+ '<div style="clear:both">'
				+ '</div>'
				, {'name': name, 'id' : id
					, 'position' :position
					, 'email' :this.replaceSpecials(email)
					, website: website});
			
			tmpl.appendTo(this.domNode);
			
			var tmpl = $.tmpl('<span id="${id}" class="cometchat_tab">'
					+ '<span class="cometchat_user_shortname">${name}</span>'
					+ '<span class="cometchat_closebox_bottom_status cometchat_available"></span>'
					+ '<span class="cometchat_closebox_bottom cometchat_closebox_bottom_click"></span>'
					+ '</span>'
					, {'name': name, 'id' : id});
				tmpl.appendTo($('#cometchat_base'));
			
			
			// When Click chat tab			
			$('#' + id).click(function(){
				$('.cometchat_tabpopup').hide();
	   			if($(this).hasClass('cometchat_tabclick')) {
	   				$('.cometchat_tab').removeClass('cometchat_tabclick ');	
	   				$('#' + id + '_popup').hide();
	   			} else {
	   				$('.cometchat_tab').removeClass('cometchat_tabclick ');	   				
	   				$(this).addClass('cometchat_tabclick'); // cometchat_optionsimages
	   				$('#' + id + '_popup').show();
	   			}
	   		});
			
			// Minimize chat box
			$('#' + id + "_popup .cometchat_minimizebox").click(function(){
				$('.cometchat_tab').removeClass('cometchat_tabclick ');	
				$('.cometchat_tabpopup').hide();
   				$('#' + id + '_popup').hide();
   				
	   		});
			
			var self = this;
			
			// Close chat box
			$('#' + id + "_popup .cometchat_closebox").click(function(){
				$('#' + id + '_popup').remove();
				$('#' + id).remove();
				self.positionChatBox();
				
	   		});
			
			$('#' + id + " .cometchat_closebox_bottom").click(function(){
				$('#' + id + '_popup').remove();
				$('#' + id).remove();
				self.positionChatBox();
	   		});

			// click event bind
			$("input", $('#' + id + "_popup")).keypress(function(event) {
				if (event.keyCode == '13') {
				    event.preventDefault();
				    self.sendMessage(email, $("input", $('#' + id + "_popup")).val());
				    $(this).val('');
				}
			});
			
			// click clear conversation
			$('#' + id + "_popup .cometchat_pluginsicon").click(function(){
				$('#' + id + "_popup .cometchat_tabcontenttext > div").html('');
				self.requestClearMessage(email);
	   		});
			
			this.chatBoxCount++;
			
			this.positionChatBox();
			
		}
		return id;
	},
	
	positionChatBox: function() {
		var i = 0;
		$(".cometchat_tabpopup").each(function(){
			i++;
			if(i > 2) {
				var position = 277 + (i-3) * 152;
				$(this).css('right',  position + 'px');
			}
		});
	},
	
	replaceSpecials: function(value) {
		return value.replace(/[\s@.]/g, '_');
	},
	
	
	processData: function(response) {

		response = $(response);
		var self = this;
		personCount = 0;
		
		var status = 0;
		response.find("person").each(function(){
			
			self.addProfile($("name", this).html() 
					, $("isseller", this).html()
					, $("email", this).html()
					, $("status", this).html()
					, $("website", this).html()
					, $("isaccept", this).html());
			if ($("status", this).html() == '0') {
				personCount ++;
				$('#cometchat_userstab_text').text("Chat(" + personCount + ")");
			}
		});
		
		response.find("selfemail").each(function(){
			self.selfemail = $(this).html();
		});
		
		response.find("selfstatus").each(function(){
			status = $(this).html();
			usertabcls = "";
			optioncls = "";
			switch(status) {
			case '0':
				optioncls = "available";
				usertabcls = "cometchat_user_available2";
				break;
			case '1':
				optioncls = "busy";
				usertabcls = "cometchat_user_busy2";
				break;
			case '2':
				optioncls = "invisible";
				usertabcls = "cometchat_user_invisible2";
				break;
			case '3':
				optioncls = "cometchat_gooffline";
				usertabcls = "cometchat_user_invisible2";
				break;
			case 'none':
				return;
			default:
				return;
			}
			
			$('#cometchat_userstab_icon').attr('class', usertabcls);
			$('.cometchat_optionsstatus').css('text-decoration', 'none');
			$('.' + optioncls).css('text-decoration', 'underline');
			
		});
		
		response.find("message").each(function(){
			if(self.last < $("id", this).html()) {
			self.addMessage($("fromemail", this).html()
				, $("toemail", this).html()
				, $("fromName", this).html()
				, $("toName", this).html()
				, $("msg", this).html()
				, $("fromWebsite", this).html()
				, $("toWebsite", this).html()
				);
			self.last = $("id", this).html();
			}
		});
		
		// Ask friend
		response.find("askperson").each(function(){
			$askMessage = "Do you want to add " + $("name", this).html() + " with your friend?";
			result = confirm($askMessage);
			if(result == 1) {
				self.requestAccept($("email", this).html(), 1);
			}else {
				self.requestAccept($("email", this).html(), 2);
			}
		});
		
		// Remove domnode for deleting deleting friend
		$('.cometchat_userlist').each(function(i,item){
			id = $(this).attr('id');
			id = id.replace(/cometchat_userlist_/g, '');
			ismatch = false;
			response.find("person").each(function(){
				if(id == self.replaceSpecials($("email", this).html())) {
					ismatch = true;
					return;
				}
			});
			
			if(ismatch == false) {
				$(this).remove();
			}
		});
		
		
		if(status != '3') {
			
			self.timer = setTimeout('sendRequest();',2000); //Refresh our chat in 2 seconds
		}
		
	},
	
	requestNewFriend: function(email) {
		var self = this;
		$.ajax({
			url: "chat/chat.php?action=add_friend"
			, data: {friendemail: email, last: this.last, prevent: new Date()}
			, type: "POST"
			, dataType: "text/xml"
			, success: function(data){
				response = $(data);
				response.find("error").each(function(){
					if($(this).html() != "")
						alert($(this).html());
				}) ;
				self.processData(data);
			}
		});
	},
	
	requestAll: function() {
		var self = this;
		$.ajax({
			url: "chat/chat.php?action=all"
			, data: {last: this.last, prevent: new Date()}
			, type: "POST"
			, dataType: "text/xml"
			, success: function(data){
				self.processData(data);
			}
		});
	},
	
	requestMessage: function() {
		var self = this;
		$.ajax({
			url: "chat/chat.php?action=get_message"
			, data: {last: this.last, prevent: new Date()}
			, type: "POST"
			, dataType: "text/xml"
			, success: function(data){
				self.processData(data);
			}
		});
	},
	
	requestClearMessage: function(email) {
		var self = this;
		$.ajax({
			url: "chat/chat.php?action=clear"
			, data: {last: this.last, friendemail: email, prevent: new Date()}
			, type: "POST"
			, dataType: "text/xml"
			, success: function(data){
				
			}
		});
	},
	
	requestStatus: function(status) {
		var self = this;
		$.ajax({
			url: "chat/chat.php?action=status"
			, data: {status: status, prevent: new Date()}
			, type: "POST"
			, dataType: "text/xml"
			, success: function(data){
				self.processData(data);
			}
		});
	},
	
	requestAccept: function(friendemail, isaccept /*0: init status, 1: accept, 2: confuse */) {
		var self = this;
		$.ajax({
			url: "chat/chat.php?action=accept"
			, data: {friendemail: friendemail, isaccept: isaccept, prevent: new Date()}
			, type: "POST"
			, dataType: "text/xml"
			, success: function(data){
				self.processData(data);
			}
		});
	},
	
	requestDeleteFriend: function(friendemail) {
		var self = this;
		$.ajax({
			url: "chat/chat.php?action=delete"
			, data: {friendemail: friendemail, prevent: new Date()}
			, type: "POST"
			, dataType: "text/xml"
			, success: function(data){
				self.processData(data);
			}
		});
	},
	
	sendMessage: function(to, message) {
		message = $.trim(message);
		var self = this;
		clearInterval(self.timer);
		if(message != "") {
			$.ajax({
				url: "chat/chat.php?action=message"
				, data: {friendemail: to, message: message, last: this.last, prevent: new Date()}
				, type: "POST"
				, dataType: "text/xml"
				, success: function(data){
					self.processData(data);
				}
			});
		}
	}
});







