(function($){   
  
$.cchat = $.cchat || function(){

	var APP_KEY = 'a117b3552c8e8292234e';
	var BASE_URL = '/cchat/';

	var Typer = function (a) {
        var b = a.broadcastRate || 4e3,
            c = a.timeout || 5e3,
            d = a.onTyping || null,
            e = a.onStart || null,
            f = a.onEnd || null;
        if (c < b + 500) throw "Timeout is too low, should be at least 0.5s longer than broadcast rate";
        var g = !1,
            h = null,
            i = null,
            j = null,
            k = function () {
                g = !0, e && e(), d && d(), i = setInterval(function () {
                    d && d()
                }, b)
            },
            l = function () {
                g = !1, clearInterval(i), f && f()
            },
            m = function () {
                h = Date.now(), j && clearTimeout(j), j = setTimeout(function () {
                    l()
                }, c)
            };
        this.typing = function () {
            m(), g === !1 && k()
        }, this.notTyping = function () {
            g === !0 && l()
        }
    };

	function showTyping(a) {
	}

	function hideTyping(a) {
	}

	function addMember(member){
      var p = $('<p>', { text: member.info.name, id: 'member_' + member.id } );
      $('#cchat_members_data').append( p );
    }
    function removeMember(member){
      $('#member_'+ member.id).remove()
    }

	function initialize() {

		// Enable pusher logging - don't include this in production
		Pusher.log = function(message) {
//		  if (window.console && window.console.log) window.console.log(message);
		};

		// Flash fallback logging - don't include this in production
		WEB_SOCKET_DEBUG = false;

		var pusher = new Pusher(APP_KEY);
		var channel = pusher.subscribe("presence-chat");

		$.fn.monitor = function (a) {
			$(this).keypress(function () {
				a.typing()
			}).blur(function () {
				a.notTyping()
			}), $(this).parents("form").submit(function () {
				a.notTyping()
			})
		}

		Pusher.channel_auth_endpoint = BASE_URL+'cchat_auth.php';
		
		channel.bind("pusher:connection_established", function (a) {

		})

		channel.bind("pusher:subscription_succeeded", function (members) {
			$('#jchat_count').html(channel.members.count);
			$('#cchat_members_data').empty();
			members.each(function(member) {
				addMember(member);
			});
		})
				
		channel.bind("pusher:member_removed", function (member) {
			$('#jchat_count').html(channel.members.count);
			removeMember(member);
		})
		
		channel.bind("pusher:member_added", function (member) {
			$('#jchat_count').html(channel.members.count);
			addMember(member);
		})
				
		channel.bind("message", function (a) {
			$('#cchat_chatrooms_data_convo').append(a+'<br/>');
			$('#cchat_chatrooms_data_convo').scrollTop(50000);

		})

		var a = new Typer({
			onStart: function () {
				showTyping(me)
			},
			onTyping: function () {
				channel.trigger("client-typing", {
					user_id: me
				})
			},
			onEnd: function () {
				hideTyping(me), channel.trigger("client-notTyping", {
					user_id: me
				})
			}
	    });

		channel.bind("client-typing", function (a) {
			var b = channel.members.get(a.user_id);
			$('#cchat_chatrooms_data_typing').html('<div id="istyping_'+a.user_id+'">'+b.info.name+' is typing...</div>');
		})
		
		channel.bind("client-notTyping", function (a) {
			var b = channel.members.get(a.user_id);
			$('#istyping_'+a.user_id).remove();
		})

		var code = '<div id="cchat"><div id="cchat_tabs"><div id="cchat_tabs_chatrooms" class="cchat_tab_selected">Chatroom</div><div id="cchat_tabs_divider"> | </div><div id="cchat_tabs_members">Members (<span id="jchat_count">connecting</span>)</div><div id="cchat_popout">&#x2197</div><div style="clear:both"></div></div><div id="cchat_chatroom_data"><div id="cchat_chatrooms_data_typing"></div><div id="cchat_chatrooms_data_convo"></div><div id="cchat_chatrooms_data_textbox"><form method="post" id="message" action="'+BASE_URL+'cchat_send.php"><input placeholder="Your message" name="text"></form></div></div><div id="cchat_members_data"></div></div>';

		$("body").append(code);

		$("#message input[name=text]").monitor(a), $("#message").submit(function () {
			return $.post(this.action, $(this).serialize()), this.reset(), !1
		})

		$('#cchat_tabs_chatrooms').click(function() {
			$('#cchat_tabs_chatrooms').addClass('cchat_tab_selected');
			$('#cchat_tabs_members').removeClass('cchat_tab_selected');

			$('#cchat_chatroom_data').css('display','block');
			$('#cchat_members_data').css('display','none');
		});

		$('#cchat_tabs_members').click(function() {
			$('#cchat_tabs_members').addClass('cchat_tab_selected');
			$('#cchat_tabs_chatrooms').removeClass('cchat_tab_selected');

			$('#cchat_members_data').css('display','block');
			$('#cchat_chatroom_data').css('display','none');
		});

		$.get(BASE_URL+"cchat_data.php?json_callback=?", {} , function(data){
			$('#cchat_chatrooms_data_convo').prepend(data);
			setTimeout(function() {$('#cchat_chatrooms_data_convo').scrollTop(50000);}, 100);
		});

		$('#cchat_popout').click(function() {
			var w = window.open (BASE_URL+'index.php', 'cchat',"status=0,toolbar=0,menubar=0,directories=0,resizable=0,location=0,status=0,scrollbars=0, width=200,height=300"); 
				w.focus(); 
		});


	}

	arguments.callee.init = function () {
		initialize();
	};

	arguments.callee.sendMessage = function() {
		$.getJSON(BASE_URL+"cchat_send.php?json_callback=?", {} , function(data){
			if (data == '0') {
				alert ('You have logged out. Please login again to chat.');
			}
		});
	}

}

})(jqcc);

jqcc(document).ready(function () {   
	jqcc.cchat();
	jqcc.cchat.init();
});
