/*
 * NEEDED /global/components/dropbox/dropbox.js
 * NEEDED /global/components/colorpicker/jquery.colorPicker.js
 * NEEDED /global/js/functions/user_ico_class.js
 * NEEDED /global/js/functions/stopPropagation.js
 */

var chatClass = 
{
	tplURL : '/global/components/chat/chat.html',
    tplReference : '#chat',
    datasource : 'chat_html',	
	room : undefined,
    ////////
    totalusers : 0, // numero di utenti in chat
    keyActive : false, // controllo del campo input sul keypress
    timeoutIE7 : false,

    init :function(_user, _menutype, _room, _app, _fms){
    	this.preferences = me.settings.peferences.chat;
        var flashvars = $.toJSON({
            JSclass:'chatClass.',
            fms:	_fms,
            app:	_app,
            room:	_room,
            user:	_user
        });
        
        this.room = _room;
       
        chatClass._init(_user, flashvars, _menutype);
        // CSS SETTINGS /////////////
        $('#chat_input, #chat_dropBox').css('resize', 'none');

    },
    _init: function(user, flashvars, menutype){
 
        // FLASH OBJECT /////////////////
        this.chatembed(user,flashvars);

        // DROP BOX ///////////////////////////////////
        $('#dropbox').live('change', function(event){
            //console.log(event._link,event._type);
            chatClass.sendRTM( 'msg', [], event._link );
            $('#chat_input').focus();
        });
       
        $('#chat_dropBox').change(function(e){
            if($(e.target).data('captured')) chatClass.sendRTM( 'msg', [], $(e.target).data('captured') );
            window.focus();
            $('#chat_input').focus();
        });
		
        // MENU BAR ///////////////////////////////

        if(menutype != '') {
            $('#chat #menu_container').load('/global/components/chat/chat_menu_'+menutype+'.html',function(){
                chatMenuClass.init(menutype);
            });
        }
		
        // PREFERENCES BAR ////////////////////////
		
        $('#text_weight_btn').toggle(function (e){
            $(e.target).attr('src', '/global/img/icons/color/bold.png');
            chatClass.preferences.weight = 'bold';
            chatClass.setPreferences("weight", "bold");
        },
        function(e){
            $(e.target).attr('src', '/global/img/icons/light/bold.png');
            chatClass.setPreferences("weight", "normal");
        });
        $('#text_style_btn').toggle(function (e){
            $(e.target).attr('src', '/global/img/icons/color/italic.png');
            chatClass.setPreferences("style", "italic");
        },
        function(e){
            $(e.target).attr('src', '/global/img/icons/light/italic.png');
            chatClass.setPreferences("style", "normal");
        });
		
        $('#chat_user_name').html(user.name);
        if(this.preferences.weight == "bold") $('#text_weight_btn').click();
        if(this.preferences.style == "italic") $('#text_style_btn').click();
        if(!this.preferences.color) this.preferences.color = random_color('hex');
		
        $("#text_colorpicker").colorPicker({
            'defaultcolor': chatClass.preferences.color
        }).bind('taste',function(event,color){
            $('#text_colorpicker').css({
                'background-color': color,
                'border-color':  color
            });
            $('#chat_input').css({
                'color': color
            });
        }).bind('select',function(event,color){
            chatClass.setPreferences("color", color);
        });

        $("#brd_colorpicker").colorPicker({
            'defaultcolor': chatClass.preferences.border
        }).bind('taste',function(event,color){
            $('#brd_colorpicker').css({
                'border-color':  color
            });
            $('#chat_input').css({
                'border-color':  color
            });
        }).bind('select',function(event,color){
            chatClass.setPreferences("border", color);
        });
		
        chatClass.resizeChat();
	
        if ($.browser.mozilla) {
            $('#chat_input').keypress(chatClass.chkKey);
        } else {
            $('#chat_input').keydown(chatClass.chkKey);
        }
		
        $('#chat_input').hover(function(){
            chatClass.keyActive = true;
        },function(){
            chatClass.keyActive = false;
        }).click(function(){
            chatClass.keyActive = true;
        }).focus();

    },
    chatembed: function(user, flashvars){
        chatFlash = flashembed('#chatFlash_cont',{
        	id: 'flashChat',
        	name: 'flashChat',
            src: "/global/components/chat/chat.swf",
            wmode: "opaque", //transparent,opaque,window
            bgcolor: '#000000',
            width: "1px",
            height: "1px"
        },
        {
            vars:flashvars
        }).getApi();
        $('#chat_history').empty();
        chatClass.scrollHeight();
        $('#chat_input').focus();
        //$('.chattone').resize();
        $('#container_history_container').addClass('waiting');
    },
	
    // JS -> AS //////////////////////////////////
    onInputVerified : function(rtm){
        if(rtm.data.img == "error" || rtm.data.img == "abort") chatClass.onMsg(rtm); // non parte il messaggio ma scrive solo a me l'errore
        else chatFlash.sendRTM($.toJSON(rtm));
    },
    updateUser: function (prop,val){
        //console.log('updatingSO: '+prop+' -> '+val);
        chatFlash.updateUser(prop,val);
    },
    enterRoom : function(_room){
        if(_room == this.room) return;
        $('#chat_history').empty();
        $('#container_history_container').addClass('waiting');
        this.room = _room;
        chatFlash.enterRoom(_room);
        chatClass.resizeChat();
    },
	
    // AS -> JS ////////////////////////////////////
    receiveRTM: function (type_from_to_data){
        // type:	String 				-> msg, evt, act
        // from:	Object 				-> { id:xyz, name:pippo, ... }
        // to:		Array of Objects	-> [ {id:xyz, name:pippo, ...}, {id:ert, name:maria, ...} ]
        // data:	Object 				-> { val:ciao, col:ff0000, brd:00ff00, size:10, weight:bold, style:italic } o { type:status, val:3 }
        var rtm =  $.evalJSON(type_from_to_data);
        
        switch(rtm.type){
            case 'msg':
                if(chatMenuClass.paginationOptions.current_page != 0){
                    chatMenuClass.paginationOptions.current_page = 0;
                    chatMenuClass.setupPagination($('#chat_history').data('history').length);
                };
                var h = $('#chat_history').data('history');
                h.push(rtm);
                $('#chat_history').data('history', h);
                chatClass.onMsg(rtm);
                break;
			
            case 'evt':
			
                break;
			
            case 'act':
                break;
        }
    },
    initHistory: function(historyArray_json){
        
        $('#container_history_container').removeClass('waiting');
		
        var history = $.evalJSON(historyArray_json);
        
        $('#chat_history').data('history', history);
        this.renderHistory();
        chatMenuClass.setupPagination(history.length);
    },
    online_soSync: function (changeList_json)
    {
        var changeList =  $.evalJSON(changeList_json);
        //console.log('onlinesync',changeList);
        $('#chat').trigger('online_soSync', changeList);
        
        for (var el in changeList) {
            var elem = changeList[el];
            var id = elem.name;
            var action = elem.code;
            var oldVal = elem.oldValue;
            var newVal = elem.newVal;
            //console.log("elemento:",id,"azione:",action,"oldVal:",oldVal,"newVal:",newVal);
            switch(action){
                case 'clear':
                    // mi sono connesso allo SO la prima volta oppure tutte le proprietà delle SO sono state cancellate
                    $('#chat_users_list').empty();
                    chatClass.totalusers = 0;
                    //$.DOMCached.deleteKey('chat', 'count');;
                    break;
                case 'delete':
                    // la proprietà col nome 'id' è stato rimossa dallo SO
                    $('#chat_users_list #'+id).remove();
                    chatClass.totalusers -= 1;
                    break;
                case 'change':
                    // qualcuno ha cambiato lo SO ed è arrivata la notifica
                    if(oldVal){
                    // l'elemento è stato modificato in una sua proprietà
                    // $('#chat_users_list li[id="'+oldVal.id+'"]')
                    }else{
                        // l'elemento è stato aggiunto allo SO
                        var ico = user_ico_class(newVal);
                        $('#chat_users_list').append("<li id='"+id+"'><a href='#' class='"+ico+" default'>"+ newVal.name +"</a></li>");
                        //var totalusers = $.DOMCached.incr('chat', 1, 'count', 1);
                        chatClass.totalusers += 1;
                    }
                    break;
                case 'reject':
                    // non sono riuscito a cambiare lo SO, intanto un altro l'ha cambiato
                    alert('change status rejected');
                    break;
                case 'success':
                    // ho modificato lo SO
                    //console.log('ho modificato lo SO');
                    break;
            }
        }
        $('#users_list_handler').html(this.totalusers + " Users");
        chatClass.scrollHeight();
        
    },
    NetStatusHandler : function(code){
        //console.log("netstatus:",code);
        switch (code){
            case 'NetConnection.Connect.Success':
                $('#chat').trigger('NetConnection.Connect.Success',chatClass.room);
                break;
            case "NetConnection.Connect.Rejected":
                break;

            case "NetConnection.Connect.Failed":
                break;

            case "NetConnection.Connect.Closed":
                $('#chat').trigger('NetConnection.Connect.Closed');
                break;

            case "NetConnection.Connect.AppShutdown":
                break;

            case "NetConnection.Connect.IdleTimeout":
                break;

            case "NetConnection.Connect.InvalidApp":
                break;

            case "NetConnection.Connect.NetworkChange":
                break;
        }
    },
	
    // JS -> JS ///////////////////////////////////////////////
    renderHistory : function(){
        $('#chat_history').empty();
        var history = $('#chat_history').data('history');

        for(l in history){
            chatClass.onMsg(history[l]);
        }

    },
    chkKey: function (_e){
        var e = _e ? _e : window.event;
        var code = (e.keyCode ? e.keyCode : e.which);
        this.keyActive = true;
        if(code == 13){
        	stopPropagationFunction(e);
            var string = $('#chat_input').val();
            $('#chat_input').val('');
            string = string.replace(/<[^>]*>?/ig,'');
            string = string.replace(/(\r\n|\n|\r)/gm,' ');
            string = string.replace(/\s{2,}/g, ' ');
            for (var i = 0; i < string.length; i++) {
            	string = string.replace('&nbsp;', ' ', 'g');
            	string = string.replace('  ', ' ', 'g');
            }
            if(string == '' || string == ' ' || string == '  ' || string == '   ') return;
            chatClass.sendRTM('msg',[],string);
            setTimeout("$('#chat_input').val('')", 10);
        }
    },
    resizeChat: function(){
        //$('#chat').css({height: $('#chatcontent').height()});
        $('#history_container').css({height: $('#chat_main_container').height()});
        $('#chat_history').css({height: $('#chat_main_container').height()-1, width: $('#chat_main_container').width(), overflow:'auto'});
               
        if($.browser.msie && parseInt($.browser.version)<=7) {
        	$('#chat_history').css({height: $('#chat_main_container').height()-1, width: '100%', overflow:'auto'});
        }

    },
    setPreferences: function(propertyToChange, value){
        this.preferences[propertyToChange] = value;
        $('#text_colorpicker').css({
            'background-color': this.preferences.color,
            'border-color':  this.preferences.color
        });
        $('#brd_colorpicker').css({
            'border-color':  this.preferences.border
        });
        $('#chat_input').css({
            'color': this.preferences.color,
            'border-color':  this.preferences.border,
            'font-weight': this.preferences.weight,
            'font-style': this.preferences.style
        });
        
        var event = jQuery.Event('updateSetting');
   	 	event.session= "chat";
   	 	event.key = propertyToChange;
   	 	event.value = value;
   	 	$('body').trigger('updatesettings',event);
   	 	updateSettingsClass.init();

    },
    sendRTM: function (_type,_to,_data){
        
        switch(_type){
            case 'msg':
                data = {
                    'val':_data,
                    'col':this.preferences.color,
                    'brd':this.preferences.border,
                    'bg':this.preferences.bg,
                    'style':this.preferences.style,
                    'weight':this.preferences.weight
                };
                break;
			
            case 'evt':
                data = {
                    'val':_data
                };
                break;
			
            case 'act':
                break;
        }
		
        var rtm = {
            'type':_type,
            'to':_to,
            'data':data
        };
	
        $.chatInputVerify(rtm, chatClass.onInputVerified); // controllo se è link, mail, immagine, ...
    },
    onMsg: function(rtm){
        $('#chat_history').append( $("<li></li>").chatline(rtm) );
        $("#chatcontent").resize();
        $('#history_container').css({height: $('#chat_main_container').height()});
        this.scrollHeight();
        
        $('#chat_history .chatline a').click(function(){
        	if($('#profileContainer').length==0){
            	$('body').append('<div id="profileContainer"></div>');
            }
            
            $('#profileContainer').load('global/contents/profile/profile.html', function() {
                profileClass.init();
            });
            
        });
    },
    scrollHeight: function () {
        var currentOffset = $("#chat_history").height();
        $('#history_container').scrollTop(currentOffset);
        this.resizeChat();
    }
};
