/** @namespace XMPP @desc Routes XMPP packets to and from Orion User Server. */ var XMPP = XMPP || { /* properties */ 'subscription_packets': {}, 'registered_starlets' : [], 'queue' : [], 'connection' : null, 'reconnect' : 0, 'ping' : 0, 'internet_status' : 1, /* callbacks */ 'onPresence': function (presence) { var ptype = $(presence).attr('type'); !~$.inArray(ptype, ['orion_ping']) && log(L_FUNC, 'XMPP.onPresence', presence); 0 && !~$.inArray(ptype, [ 'orion_ping', 'peerstatus', 'extension', 'presence', 'dialpad_call', 'new_caller_info' ]) && console.log('PRES', presence); //Connection.onPing(); // any incoming traffic shows connection is alive // route switch (ptype) // alphabetical { // !! NEW case 'userSettings' : Processor.userSettings (presence); return true; // !! OLD case 'add_group' : Processor.add_group (presence, 'add_group'); return true; case 'add_group_extension' : Processor.add_group_extension (presence, 'add_group_extension'); return true; case 'api_broadcast' : Processor.xmpp.onBroadcast (presence); return true; case 'available' : log(L_DEBUG, 'XMPP.onPresence', 'available'); //Connection.onConnect(); return true; case 'availability_status' : Processor.first_roster (presence, 'availability_status'); return true; //case 'call_recording' : Processor.call_recording (presence, 'call_recording'); return true; //case 'call_recording_filter' : Processor.call_recording (presence, 'call_recording'); return true; case 'chat_status' : Processor.chat_status (presence, 'chat_status'); return true; case 'conference' : Processor.conference (presence, 'conference'); return true; case 'conference_event' : Processor.conferencesEvent (presence, 'conference_event'); return true; case 'create_fax_bucket' : Processor.create_fax_bucket (presence, 'create_fax_bucket'); return true; case 'delete_fax' : Processor.delete_fax (presence, 'delete_fax'); return true; case 'delete_fax_bucket' : Processor.delete_fax_bucket (presence, 'delete_fax_bucket'); return true; case 'dialpad_call' : if ($(presence).find('extension_id').text() == 0) { return true; } Processor.dialpad_call(presence); return true; case 'dialpad_key' : log(L_INFO, 'received a dialpad key'); Processor.dialpad_key(presence); return true; case 'error' : if ($(presence).find('error').find('conflict').length > 0) { var obj = $pres({'to': $(presence).attr('from') + '_sub_' + Math.floor((Math.random() * 100) + 1)}) .c('x', {'xmlns': 'http://jabber.org/protocol/muc'}); this.send(obj); } return true; case 'extension' : Processor.extension (presence, 'extension'); return true; case 'fax' : log(L_INFO, 'STARFAX INIT: PTYPE FAX'); Processor.fax(presence, 'fax'); return true; case 'fax_filter' : Processor.fax_messages (presence, 'fax_messages'); return true; case 'fax_messages' : Processor.fax_messages (presence, 'fax_messages'); return true; case 'fax_status' : return true; case 'file_upload_token' : Processor.file_upload_token (presence, 'file_upload_token'); return true; case 'first_roster' : Processor.first_roster (presence, 'first_roster'); return true; case 'framework_update' : Processor.frameworkUpdate (presence); return true; case 'get_starlets' : log(L_DEBUG, 'XMPP.onPresence', 'get_starlets'); //Connection.onConnect(); return true; case 'group_invites' : Processor.group_invites (presence, 'group_invites'); return true; // chat case 'group_roster' : Processor.group_roster (presence, 'group_roster'); return true; case 'groups' : Processor.groups (presence, 'groups'); return true; case 'hold' : Processor.xmpp.hold (presence); return true; case 'join_update' : log(L_INFO, 'received join_update packet: ' + $(presence).attr('to').text() + ' | id: ' + $(presence).attr('user_id').text()); var msg = "<div id='" + $(presence).attr('to').text() + "' class='message notice'>" + "<div style='display:none' id='timestamp'>" + new Date().getTime() + "</div>" + "<div class='nick center'>" + "sub_" + $(presence).attr('user_id').text() + "_ has joined.</div></div>"; amplify.publish('starchat_message', msg); return true; case 'location_chat_status' : Processor.location_chat_status (presence, 'location_chat_status'); return true; case 'location_status' : Processor.location_status (presence, 'location_status'); return true; case 'locations' : Processor.locations (presence, 'locations'); return true; case 'move_fax' : Processor.move_fax (presence, 'move_fax'); return true; case 'mycall' : Processor.mycalls (presence, 'mycall'); return true; case 'mycall_filter' : Processor.mycalls (presence, 'mycall'); return true; case 'mycalls' : Processor.mycalls (presence, 'mycall'); return true; case 'mycalls_filter' : Processor.mycalls (presence, 'mycall'); return true; //case 'new_call_recording' : Processor.call_recording (presence, 'new_call_recording'); return true; case 'new_caller_info' : Processor.new_caller_info (presence); return true; case 'new_fax' : Processor.fax (presence, 'new_fax'); return true; case 'notes_info' : Processor.notes_info (presence, 'notes_info'); return true; case 'orion_connection' : Processor.orion_connection (presence); return true; case 'orion_ping' : /*Connection.onPong();*/ return true; case 'orion_user_settings' : Processor.orion_user_settings (presence); return true; case 'parked' : Processor.parked (presence); return true; case 'peerstatus' : Processor.peerstatus (presence, 'peerstatus'); return true; case 'ping' : /*Connection.onPing();*/ return true; case 'pong' : Connection.onPong(); return true; case 'pop' : Processor.pop (presence, 'pop'); return true; case 'presence' : Processor.presence (presence); return true; case 'privacy_setting' : Processor.privacy_setting (presence, 'privacy_setting'); return true; case 'receive_chat' : Processor.receive_chat (presence, 'receive_chat'); return true; case 'remove_group' : Processor.remove_group (presence, 'remove_group'); return true; case 'remove_group_extension': Processor.remove_group_extension(presence, 'remove_group_extension'); return true; case 'rename' : Processor.rename (presence); return true; case 'rename_fax_bucket' : Processor.rename_fax_bucket (presence, 'rename_fax_bucket'); return true; case 'rename_group' : Processor.rename_group (presence, 'rename_group'); return true; case 'roster' : Processor.roster (presence, 'roster'); return true; case 'settings' : Processor.settings (presence); return true; case 'status' : Processor.status (presence); return true; case 'unavailable' : //log(L_INFO, 'received unavailable presence: ' + $(presence).attr('from')); //amplify.publish('user_disconnected', $(presence).attr('from').split('/').pop()); Processor.chatmessages(presence, true); return true; case 'update_locations' : Processor.locations (presence, 'update_locations'); return true; case 'update_roster' : Processor.roster (presence, 'update_roster'); return true; case 'user_extensions' : return true; case 'voicemail' : Processor.voicemail (presence, 'voicemail'); return true; case 'voicemail_filter' : Processor.voicemail (presence, 'voicemail'); return true; default : // chat events $(presence).find('x').attr('xmlns') === 'http://jabber.org/protocol/muc#user' && Processor.chatmessages(presence, true); return true; } }, 'onPublicMessage': function (message) { log(L_FUNC, 'XMPP.onPublicMessage', message); //console.log('onPublicMessage: ', message); // Connection.onPing(); // any incoming traffic shows connection is alive Processor.chatmessages(message); return true; }, /* methods */ 'connect': function (username, password, domain, url) { log(L_MAIN, 'XMPP.connect', arguments); Connection.username = username; Connection.password = password; Connection.domain = domain; Connection.url = url; //console.log('----------', Connection.internet, this.connection ); if (Connection.internet && this.connection === null) { var conn = new Strophe.Connection(Connection.url); conn.connect(Connection.username + '@' + Connection.domain, Connection.password, function (status) { switch (status) { case Strophe.Status.AUTHENTICATING: log(L_INFO , 'XMPP.connect', 'authenticating'); Connection.onPong(); break; case Strophe.Status.AUTHFAIL: log(L_ERROR, 'XMPP.connect', 'authentication fail'); XMPP.connection = null; //Connection.onDisconnect(); OrionConnection.logoffApplication(); break; case Strophe.Status.CONNECTING: log(L_INFO , 'XMPP.connect', 'connecting'); break; case Strophe.Status.CONNFAIL: log(L_ERROR, 'XMPP.connect', 'connection fail'); XMPP.connection = null; Connection.onDisconnect(); break; case Strophe.Status.CONNECTED: log(L_MAIN, 'XMPP.connect', 'connected'); if (XMPP.connection === null) { XMPP.connection = conn; XMPP.connection.addHandler(XMPP.onPresence , null, 'presence' ); XMPP.connection.addHandler(XMPP.onPublicMessage , null, 'message' , 'groupchat'); //XMPP.connection.addHandler(XMPP.on_private_message, null, 'message' , 'chat' ); XMPP.send($pres({'name': 'presence', 'category': 'update', 'type': 'subscribe_packet'})); // New packet to initialize the client. Replaces the old get_starlets. XMPP.send($pres({'user_id': Connection.my_user_id, 'location_id': Connection.my_location, 'type': 'initialize'})); //XMPP.send($pres({'type': 'available'}));//.c({'platform': ''}, {'version': ''})); // new 2.0 initial presence //Connection.onPing(); Connection.onConnect(); } break; case Strophe.Status.DISCONNECTING: log(L_INFO , 'XMPP.connect', 'disconnecting'); break; case Strophe.Status.DISCONNECTED: log(L_MAIN, 'XMPP.connect', 'disconnected'); XMPP.connection = null; Connection.onDisconnect(); break; case Strophe.Status.ERROR: log(L_ERROR, 'XMPP.connect', 'connection error'); XMPP.connection = null; Connection.onDisconnect(); break; default: log(L_INFO , 'XMPP.connect', 'status ' + status); break; } }); } }, 'disconnect': function () { this.connection && this.connection.disconnect(); }, 'send': function (packet) { log(L_INFO, 'XMPP.send', packet); XMPP.queue.push(packet); !XMPP.sendInterval && (XMPP.sendInterval = setInterval(function(){ if (XMPP.queue.length) { var item = XMPP.queue.shift(); XMPP.connection !== null && XMPP.connection.send(item); } else { clearInterval(XMPP.sendInterval); XMPP.sendInterval = null; } }, 500)) } };