var presenceClass = {
    user : undefined,
    flashContainer : undefined,
    init : function(_user,_trackID,_fms,_params){

        this.user = _user;
        this.flashContainer = _params.flashContainer;
        presenceFlashInterface.init(_user,_trackID,_fms,_params);

        //this._initListeners();

    },
    _initListeners: function(){
        $(this.flashContainer).bind('RTM_msg', function(event){
            //console.log('ricevuto messaggio:',event.rtm.data.val);
        }).bind('RTM_evt', function(event){
            //console.log('ricevuto evento:',event.rtm);
        }).bind('RTM_act', function(event){
            //console.log('ricevuta azione:',event.rtm.data.val, event.rtm.data.data);
        }).bind('NetStatusHandler', function(event,code)
        {
            try{
                //console.log("nc satus: ",code);
            }catch(err){};
            switch(code){
                case "NetConnection.Connect.Success":
                    // non posso chiedere qui gli SO perchè non sono ancora inizializzati in flash
                    // li chiedo al primo sync degli online (anche se non è una soluzione pulita)
                    break;

                case "NetConnection.Connect.Rejected":
                    break;

                case "NetConnection.Connect.Failed":
                    break;

                case "NetConnection.Connect.Closed":
                    break;
            }
        }).bind('RSONetStatus', function(event,code){
            //console.log('RSONetStatus',code);
            switch(code){
                case "SharedObject.BadPersistence":
                    break;
                case "SharedObject.UriMismatch":
                    break;
            }
        }).bind('LSOFlushStatus', function(event,code){
            //console.log('LSOFlushStatus',code);
            switch(code){
                case "SharedObject.Flush.Failed":
                    break;
                case "SharedObject.Flush.Success":
                    break;
            }
        }).bind('onlineSync', function(event){
            console.log('onlineSync',event.changeList);
            for (var el in event.changeList) {
                var elem = event.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
                        //console.log("mi sono connesso allo SO la prima volta oppure tutte le proprietà delle SO sono state cancellate");
                        break;

                    case 'delete':
                        // la proprietà col nome 'id' è stato rimossa dallo SO
                        //console.log(id +" - deleted");
                        break;

                    case 'change':
                        // qualcuno ha cambiato lo SO ed è arrivata la notifica
                        if(oldVal){
                            // l'elemento è stato modificato in una sua proprietà

                            //console.log(id +" ("+oldVal.status+") - changed");
                            //console.log(id +" ("+newVal.status+") - changed");
                            //$.DOMCached.set(id, $.toJSON(newVal), false, 'user');
                        }else{
                            // l'elemento è stato aggiunto allo SO
                            //console.log(id +" ("+newVal.status+") - added");
                            //$.DOMCached.set(id, $.toJSON(newVal), false, 'user');
                        }
                        break;

                    case 'reject':
                        // non sono riuscito a cambiare lo SO, intanto un altro l'ha cambiato
                        //console.log('change status rejected');
                        break;

                    case 'success':
                        // ho modificato lo SO
                        //console.log('ho modificato lo SO');
                        break;
                }
            }
        });
    },
    // JS -> FLASH
    sendRTM: function (_type,_to,_data){
        //console.log(typeof(_data));
        var data =  typeof(_data) != 'object' ? {
            'val':_data
        } : _data;
        var rtm = $.toJSON({
            'type':_type,
            'to':_to,
            'data':data
        });
        //console.log(rtm);
        presenceFlashInterface.sendRTM(rtm);
    },
    updateUser: function (prop,val){
        //console.log('updatingSO: '+prop+' -> '+val);
        presenceFlashInterface.updateUser(prop,val);
    },
    get_trackerLO: function (){
        return presenceFlashInterface.get_trackerLO();
    },
    set_trackerLO: function (){
        //console.log('get trackID');
        var val = Math.round(Math.random()*100000);
        presenceFlashInterface.set_trackerLO(val);
    },
    set_lastpageLO: function (){
        var val = 'page_'+Math.round(Math.random()*100000);
        presenceFlashInterface.set_lastpageLO(val);
    },
    get_lastpageLO: function (){
        return presenceFlashInterface.get_lastpageLO();
    },
    get_sessionSO: function (){
        //this.sessionSO = presenceFlashInterface.get_SO("session_so",this.user.id);
        //console.log('session SO:', this.sessionSO);
        // se c'è qualcosa nella session devo fare il merge delle info nel DB
        // e poi inizializzare la pagina (liste, punti)
//        if(this.sessionSO != undefined){
//            console.log('merge della session');
//        }
    },
    get_notificationSO: function (){
        //console.log('notification SO:',this.user.id, notificationSO);
        return presenceFlashInterface.get_SO("notification_so",this.user.id);
    },
    // JS -> JS
    clear_notification : function(type){
        this.sendRTM('act',[],{
            val:'clearNotification',
            data:type
        });
    },
    //////////////////////////
    interaction : function(type,toID){
        this.sendRTM('evt',[{
            id:toID
        }],type);
    }
};
