// © Joshua Bauer 2007-08. All rights reserved.
dojo.require("dojo.io.cometd");
dojo.require("dojo.lfx.html");
dojo.require("dojo.lfx.*");
dojo.require("dojo.event.*");
dojo.require("dojo.html.*");
dojo.require("dojo.widget.TitlePane");
	

function initChatBehavior()
	{
		cometd.init({}, "/cometd"); 
		setTimeout(room._init,0);
		setTimeout( function()
		{
				room.renew();
		}, 60000 );
	}

var EvUtil =
{
	getKeyCode : function(ev)
    {
        var keyc;
        if (window.event) keyc=window.event.keyCode;
        else
            keyc=ev.keyCode;
        return keyc;
    }
};

var room = 
{
  _last: "",
  _username: null,
  _tmpId: 0,
  _chatPanel: null,
  _roomname: 'Main',
  _isInitialized: 0,
  _lastroom: 'Main',
  
  join: function(name)
  {
    if (name == null || name.length==0 )
    {
      alert('You are presently known as ' + name + '. Please enter a username!');
      name = Math.random();
    }
    else
    {
       this._username=name;
       var chatJoinPanel = dojo.byId('chatJoinPanel');
       var chatJoinedPanel = dojo.byId('chatJoinedPanel');
       var phrase = dojo.byId('phrase');
       if( chatJoinPanel )
       {
       chatJoinPanel.className='hidden';
       chatJoinedPanel.className='';
       }
       phrase.focus();
       Behaviour.apply();
       if( room._lastroom != room._roomname )
       {
		   	cometd.subscribe("/chat/" + room._roomname, false, room, "_chat");
		          room._lastroom= room._roomname;
		 }
    }
  },
  renew: function()
  {
  				dojo.debug('refreshing cometd link at ' + new Date() );
  		 		cometd.unsubscribe("/chat/" + room._roomname, false, room, "_chat");
  		 	    cometd.subscribe("/chat/" + room._roomname, false, room, "_chat");
  		 	    setTimeout( function()
				{
					room.renew();
				}, 60000 );
  },
  leave: function()
  {
      room._username = null;
       var chatJoinPanel = dojo.byId('chatJoinPanel');
       var chatJoinedPanel = dojo.byId('chatJoinedPanel');
       if( chatJoinPanel )
       {
       chatJoinPanel.className='';
       chatJoinedPanel.className='hidden';
       }
       Behaviour.apply();
  },
  changeRoom: function(e)
  {
	var select = dojo.widget.byId('selectChatChannelNode');
	room.change( select.getLabel() );
  },
  change: function(roomname)
  {
  	var lastRoom = room._roomname;
  	if( roomname == lastRoom ) return;
  	if(  room._username != null )
  	{
       cometd.unsubscribe("/chat/"+ room._roomname, false, room, "_chat");
       room._roomname = roomname;
	   room.join(room._username);
	}
	else
	{
		room._roomname = roomname;
	}
	ChatOps.getMessages( room._roomname, room.loadPreviousChat );
  },
  
  chat: function(text)
  {
  	if( !userOps.handleSecuredRequest() )
		{
		userOps.interceptedEvent = chatBehaviours.joinChat;
		return;
	}
    if (text != null && text.length>0 )
    {
     	text = text.replace(/fuck|shit/i, '#$%*!');
  
    	text=text.replace(/</g,'&lt;');
    	text=text.replace(/>/g,'&gt;');
    	var words = text.split(' ');
    	var newText = '';
    	var namelength = userOps.user.username;
    	var maxLength = 12;
    	if( namelength > 10 )
    	{
    		maxLength = 4;
    	}
    	for( var i = 0; i < words.length; i += 1 )
    	{
    		if( words[i].length > maxLength )
    		{
    			var tmp = words[i];
    			var buffer = '';
    			while( tmp.length > maxLength )
    			{
    				buffer += tmp.substr(0,maxLength) + '\n ';
    				tmp = tmp.substr(maxLength);
    			}
    			buffer += tmp;
    			newText += buffer + ' ' ;
    		}
    		else
    		{
    		newText += words[i] + ' ' ;
    		}
    	}
    	text = newText;
        cometd.publish("/chat/" + room._roomname, { user: room._username, chat: text, uid: userOps.user.userId });
        ChatOps.addMessage( userOps.user.userId, room._roomname, room._username, text );
    }
  },
  _chat: function(message)
  {
     this._chatPanel = dojo.byId('chatPanel');
     var from = message.data.user;
     var special = message.data.join || message.data.leave;
     var text = message.data.chat;
     var tmpId = room._tmpId += 1;
     if (text!=null)
     {
         room._last=from;
         from+=":";
       if (special)
       {
      		 this._chatPanel.innerHTML += "<div id=\"tmpId" + tmpId + "\" class=\"chatNode\"><span class=\"alert\"><span class=\"from\" onclick='javascript:userOps.loadFriendTabProfile(" + message.data.uid + ");' >"+from+"&nbsp;</span><span class=\"text\">"+text+"</span></span><br/></div>";
      		 room._last="";
       }
       else
       {
       		 this._chatPanel.innerHTML += "<div id=\"tmpId" + tmpId + "\" class=\"chatNode\"><span style='cursor: pointer;' onclick='javascript:userOps.loadFriendTabProfile(" + message.data.uid + ");' class=\"from\" >"+from+"&nbsp;</span><span class=\"text\">"+text+"</span></div>";
       }
        var nodeName = 'tmpId' + tmpId;
        var destinationNode = dojo.byId( nodeName.toString() ); 
        if( destinationNode )
        {
	       var previousHeight = destinationNode.offsetHeight ;
	        destinationNode.setAttribute('style','opacity: 0.00;');
			var anm1 = new dojo.lfx.html.fadeIn(destinationNode, 20, dojo.lfx.easeIn).play();
			var anm2 = new dojo.lfx.html.highlight(destinationNode, '#FFFFA0', 20, dojo.lfx.easeIn).play(20);
			room.scrollWindow();
        }
     } 
  },
  scrollWindow: function()
  {
  var anm = new dojo.lfx.Animation(
				{
					beforeBegin: function()
					{
						if( this._chatPanel == null )
						{
						  this._chatPanel = dojo.byId('chatPanel');
						}
						delete this.curve;
						anm.curve = new dojo.lfx.Line([0,this._chatPanel.scrollTop],[0,this._chatPanel.scrollHeight+100+(this._chatPanel.clientHeight)]);
					},
					onAnimate: function(value)
					{
						this._chatPanel.scrollTop = value[1];
					}
				},
				1000, 
				null, //curve, will be set in scrollTo
				dojo.lfx.easeOut || dojo.lfx.easeIn
			);
			anm.play();
	},
  _init: function()
  {
  		dojo.byId('chatTab').style.display = 'block';
       var chatJoinPanel = dojo.byId('chatJoinPanel');
       var chatJoinedPanel = dojo.byId('chatJoinedPanel');
       var topicTable = dojo.byId('topicsTable');
        var select = dojo.widget.byId('selectChatChannelNode');
	   select.setLabel('Main');
	     setTimeout( function()
      {
	  		room.scrollWindow();
	 	}, 1500);
	     setTimeout( function()
      {
	  		room.scrollWindow();
	 	},3500);
       
       if( chatJoinPanel )
       {
       		chatJoinPanel.className='';
       		chatJoinedPanel.className='hidden';
       		  cometd.subscribe("/chat/Main", false, room, "_chat");
       }
      Behaviour.apply();
      dojo.event.topic.subscribe("/session", this, this.handleSessionUpdate);
  },
  prevMessages: null,
  loadPreviousChat: function(data)
  {
  	  room.prevMessages = data;
  	  var chatPanel = dojo.byId('chatPanel');
  	  chatPanel.innerHTML = '';
      if( data == null ) return;
      for( var i = data.length - 1; i >=  0; i-= 1)
      {
      		  var from = data[i].userName;
      		  var text = data[i].message;
	  		setTimeout( 'room.addPrevious( "' + from + '", "' + text + '", "' +  data[i].userId + '");', 30  );
      }
	  setTimeout(room.scrollWindow, 2000 + (data.length * 50));
  },
  addPrevious: function(from, text, uid)
  {
  			 var node = dojo.byId('chatPanel');
			  var tmpId = room._tmpId += 1;
			  var div = document.createElement( 'div' );
			  div. id = 'chat_tmp_id_' + tmpId;
			  div.className = 'chatNode';
			  div.innerHTML = "<span class=\"from\" style='cursor: pointer;' onclick='javascript:userOps.loadFriendTabProfile(" + message.data.uid + ");' >" +from+"&nbsp;</span><span class=\"text\" >"+text+"</span>";
			  div.style.opacity = '1.0';
     		  node.appendChild(div);
  },
  handleSessionUpdate : function(data)
  {
	  	if( data )
	  	{
	  		if( data.sessionStatus == 3 )
	  		{
	  			var name = data.username;
	  			if( name != 'null' )
	  			{
	  				room._username = name;
	  				room.join(name);
	  			}
	  		}
	  		else if( data.sessionStatus == 0 )
	  		{
	  			var name = data.username;
	  			room.leave();
	  			room._chatPanel.innerHTML = '';
	  			var lastRoom = room._roomname;
		  		var prevTopic = dojo.byId('topic_' + lastRoom);
				prevTopic.setAttribute('class', 'unselectedTopic');
	  		}
	  	}
  }
};

function scrollChatPanel()
{

var anm = new dojo.lfx.Animation(
				{
					beforeBegin: function()
					{
						if( this._chatPanel == null )
						{
						  this._chatPanel = dojo.byId('chatPanel');
						}
						delete this.curve;
						anm.curve = new dojo.lfx.Line([0,this._chatPanel.scrollTop],[0,this._chatPanel.scrollHeight-this._chatPanel.clientHeight]);
					},
					onAnimate: function(value)
					{
						this._chatPanel.scrollTop = value[1];
					}
				},
				800, 
				null, //curve, will be set in scrollTo
				dojo.lfx.easeOut || dojo.lfx.easeIn
			);
			anm.play();
};
var chatBehaviours = 
{ 
  'chatUsernameSubmit' : function(element)
  {
    element.setAttribute("autocomplete","OFF"); 
    element.onkeyup = function(ev)
    {          
        var keyc=EvUtil.getKeyCode(ev);
        if (keyc==13 || keyc==10)
        {
          var chatUsernameSubmit = dojo.byId('chatUsernameSubmit');
          room.join(chatUsernameSubmit.value);
		  return false;
		}
		return true;
    } 
  },
  
  '#phrase' : function(element)
  {
    element.setAttribute("autocomplete","OFF");
    element.onkeyup = function(ev)
    {   
        var keyc=EvUtil.getKeyCode(ev);
        if (keyc==13 || keyc==10)
        {
          var phrase = dojo.byId('phrase');
          room.chat(phrase.value);
          phrase.value='';
		  return false;
		}
		return true;
    }
  },
  '#sendB' : function(element)
  {
    element.onclick = function(event)
    {
    if( !userOps.handleSecuredRequest() )
		{
			return;
		}
				
      var phrase = dojo.byId('phrase');
      room.chat(phrase.value);
      phrase.value='';
      return false;
    }
  },
  '#leaveB' : function(element)
  {
    element.onclick = function()
    {
      room.leave();
      return false;
    }
  },
  
  '#joinB' : function(element)
  {
    element.onclick = function(event)
    {
      var chatUsernameSubmit = dojo.byId('chatUsernameSubmit');
      room.join(chatUsernameSubmit.value);
      return false;
    }
  },
  
  joinChat : function(element)
  {
  		if( userOps )
  		{
  			if( !userOps.handleSecuredRequest() )
				{
					dojo.debug( 'user tried joining chat');
					userOps.interceptedEvent = chatBehaviours.joinChat;
					return;
				}
			if( userOps.isLoggedIn == true )
			{
	      		room.join(userOps.user.username);
	      		}
     		return false;
  		}
      var chatUsernameSubmit = dojo.byId('chatUsernameSubmit');
      room.join(chatUsernameSubmit.value);
      return false;
  },
  
  sendChat : function(element)
  {
      var phrase = dojo.byId('phrase');
      room.chat(phrase.value);
      phrase.value='';
      return false;
  },
  leaveChat : function(element)
  {
      room.leave();
      return false;
  }
};
Behaviour.register(chatBehaviours); 
