Adept.Core.namespace("Bable");
Bable.Messenger = (
{
	currentUserId:10,
	
	
	messageListTimer: null,
	userInfoTimer: null,
	userListTimer: null,
	messageRequestProcess: false,
	userRequestProcess: false,
	scroller:null,
	
	messengerWindow: null,
	
	
	init: function(userId)
	{
		this.currentUserId = userId;
		this.messageListTimer = new PeriodicalExecuter(this.updateMessageList.bind(this), 15);
		this.userListTimer = new PeriodicalExecuter(this.updateUserList.bind(this), 30);
        $('userId').value = this.currentUserId;
        this.scroller = new Adept.Controller.Scroll('scrollArea');
        this.setScrollAreaHeight();
		this.scroller.makeScrollBottom();
		soundManagerInit();
	},
	
	closeMessenger: function()
	{
		//this.messageListTimer.stop();
		//this.userListTimer.stop();
		window.close(); 
		
	},
	
	onNewMessage: function()
	{
       soundManager.play('msgnotify');
	},
	
	updateUserList: function()
	{
			if(!this.userRequestProcess){
				this.userRequestProcess = true;
				var request = Adept.Ajax.Backend.createRequest();
		        request.setAction('updateUserList');
		        Adept.Observer.addListener(request, 'complite', 
	        		function(){ 
	        			this.userRequestProcess = false;
	        		}.bind(this)
	        	);
	        	
	        	Adept.Observer.addListener(request, 'error', 
	        		function(){ 
	        			this.userRequestProcess = false;
	        		}.bind(this)
	        	);
	        	
	           
		        request.setBusyState(Adept.Ajax.Request.IDLE);
		        request.send();
	        }
	},
	
	updateMessageList: function()
	{
			if(!this.messageRequestProcess){
				this.messageRequestProcess = true;
				var request = Adept.Ajax.Backend.createRequest();
	        	request.setAction('updateMessageList');
	        	request.setBusyState(Adept.Ajax.Request.IDLE);
	        	Adept.Observer.addListener(request, 'complite', 
	        		function(){ 
	        			this.messageRequestProcess = false;
	        			this.scroller.scrollBottom();
	        			
	        		}.bind(this)
	        	);
	        	
	        	Adept.Observer.addListener(request, 'error', 
	        		function(){ 
	        			this.messageRequestProcess = false;
	        		}.bind(this)
	        	);
	        	request.send();
	        }
	},
	
	
	updateUserInfo: function()
	{
		var request = Adept.Ajax.Backend.createRequest({_partition:'userInfoPartition'});
        request.setAction('updateUserInfo');
        request.setBusyState(Adept.Ajax.Request.IDLE);
        request.send();
	},
	
	decorateSelectedTab: function(userId)
	{
	   var tabs = document.getElementsByClassName('messenger-user-item');
	   $A(tabs).each(
	   		function(item){
	   			item.removeClassName('active');
	   		}
	   	);
	   	
	   	$(userId + ":userContainer").addClassName('active');
	},
	
	setScrollAreaHeight: function()
	{
	   $('scrollArea').setStyle({height: (document.viewport.getHeight() - $('userInfoContainer').getHeight() - $('messageForm').getHeight() - 4  + 'px')}); 
	},
	
	switchTab: function(userId, removeId)
	{
		$(this.currentUserId + ':messageContainer').id = userId + ':messageContainer';
		$(this.currentUserId + ':userListContainer').id = userId + ':userListContainer';
	   	this.currentUserId = userId;
	   
	   if($(userId + ":newMessage")){
	       $(userId + ":newMessage").remove();
	   }
	   
	   this.flush();
	   this.decorateSelectedTab(userId);
	   Adept.Ajax.Backend.flush();
	   var params = {userId: this.currentUserId};
	   if(Adept.Core.isset(removeId)){
	       params['removeId'] = removeId;
	   }
	   var request = Adept.Ajax.Backend.createRequest(params);
        request.setAction('changeUser');
        Adept.Observer.addListener(request, 'complite',
            function(){
                this.setScrollAreaHeight();
                this.scroller.makeScrollBottom();
                $('chatArea').activate();
                
            }.bind(this)
            
        );
        //request.setBusyState(Adept.Ajax.Request.IDLE);
        request.send();
	},
	
	closeTab: function(userId)
	{
		var tabs = document.getElementsByClassName('messenger-user-item');
		
		if(tabs && tabs.length > 1){
			
			for(var i=0; i < tabs.length; i++){
				if(tabs[i].getAttribute('userId') == userId){
                    //tabs[i].hide();
                                        
                    if(Adept.Core.isset(tabs[i - 1])){
                    	this.switchTab(tabs[i - 1].getAttribute('userId'), userId);
                    }else{
                    	this.switchTab(tabs[i + 1].getAttribute('userId'), userId);
                    }
                    Adept.Effect.Factory.create(tabs[i], 'blindUp').duration('0.3').go();
                    tabs[i].removeClassName('messenger-user-item');
                    
                    break;
				}
			}
			
		}else{
			this.closeMessenger();
		}
	},
	
	flush: function()
	{
		$('userInfoContainer').innerHTML = '';
		$('userInfoContainer').addClassName('loading');
		$(this.currentUserId + ':messageContainer').innerHTML = '';
	},
	
	show: function(userId)
	{
		this.currentUserId = userId;
        this.createPopup();
	},
	
	
	createPopup: function()
	{
		  this.messengerWindow =  window.open('/messenger/?userId=' + this.currentUserId  , 'Dialog', 
		      'scrollbars=yes,resizable=yes,width=700,height=600,top=' + (screen.height - 600)/2 + ', left=' + (screen.width - 700)/2);
	}	
});

function insert(el,ins) {
    if (el.setSelectionRange){
        el.value = el.value.substring(0,el.selectionStart) + ins + el.value.substring(el.selectionStart,el.selectionEnd) + el.value.substring(el.selectionEnd,el.value.length);
    }
    else if (document.selection && document.selection.createRange) {
        el.focus();
        var range = document.selection.createRange();
        range.text = ins + range.text;
    }
    $('smileys_holder').hide();
}