--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the connection JS script for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 29/08/11
+
+*/
+
+// Does the user login
+var CURRENT_SESSION = false;
+
+function doLogin(lNick, lServer, lPass, lResource, lPriority, lRemember) {
+ try {
+ // We remove the not completed class to avoid problems
+ $('#home .loginer input').removeClass('please-complete');
+
+ // We add the login wait div
+ showGeneralWait();
+
+ // We define the http binding parameters
+ oArgs = new Object();
+
+ if(HOST_BOSH_MAIN)
+ oArgs.httpbase = HOST_BOSH_MAIN;
+ else
+ oArgs.httpbase = HOST_BOSH;
+
+ // We create the new http-binding connection
+ con = new JSJaCHttpBindingConnection(oArgs);
+
+ // And we handle everything that happen
+ setupCon(con);
+
+ // Generate a resource
+ var random_resource = getDB('session', 'resource');
+
+ if(!random_resource)
+ random_resource = lResource + ' (' + (new Date()).getTime() + ')';
+
+ // We retrieve what the user typed in the login inputs
+ oArgs = new Object();
+ oArgs.domain = trim(lServer);
+ oArgs.username = trim(lNick);
+ oArgs.resource = random_resource;
+ oArgs.pass = lPass;
+ oArgs.secure = true;
+ oArgs.xmllang = XML_LANG;
+
+ // Store the resource (for reconnection)
+ setDB('session', 'resource', random_resource);
+
+ // Generate a session XML to be stored
+ session_xml = '<session><stored>true</stored><domain>' + lServer.htmlEnc() + '</domain><username>' + lNick.htmlEnc() + '</username><resource>' + lResource.htmlEnc() + '</resource><password>' + lPass.htmlEnc() + '</password><priority>' + lPriority.htmlEnc() + '</priority></session>';
+
+ // Save the session parameters (for reconnect if network issue)
+ CURRENT_SESSION = session_xml;
+
+ // Remember me?
+ if(lRemember)
+ setDB('remember', 'session', 1);
+
+ // We store the infos of the user into the data-base
+ setDB('priority', 1, lPriority);
+
+ // We connect !
+ con.connect(oArgs);
+
+ // Change the page title
+ pageTitle('wait');
+
+ logThis('Jappix is connecting...', 3);
+ }
+
+ catch(e) {
+ // Logs errors
+ logThis('Error while logging in: ' + e, 1);
+
+ // Reset Jappix
+ destroyTalkPage();
+
+ // Open an unknown error
+ openThisError(2);
+ }
+
+ finally {
+ return false;
+ }
+}
+
+// Handles the user registration
+function handleRegistered() {
+ logThis('A new account has been registered.', 3);
+
+ // We remove the waiting image
+ removeGeneralWait();
+
+ // Reset the title
+ pageTitle('home');
+
+ // We show the success information
+ $('#home .registerer .success').fadeIn('fast');
+
+ // We quit the session
+ logout();
+}
+
+// Does the user registration
+function doRegister(username, domain, pass) {
+ logThis('Trying to register an account...', 3);
+
+ try {
+ // We define the http binding parameters
+ oArgs = new Object();
+
+ if(HOST_BOSH_MAIN)
+ oArgs.httpbase = HOST_BOSH_MAIN;
+ else
+ oArgs.httpbase = HOST_BOSH;
+
+ // We create the new http-binding connection
+ con = new JSJaCHttpBindingConnection(oArgs);
+
+ // We setup the connection !
+ con.registerHandler('onconnect', handleRegistered);
+ con.registerHandler('onerror', handleError);
+
+ // We retrieve what the user typed in the register inputs
+ oArgs = new Object();
+ oArgs.domain = trim(domain);
+ oArgs.username = trim(username);
+ oArgs.resource = JAPPIX_RESOURCE + ' Register (' + (new Date()).getTime() + ')';
+ oArgs.pass = pass;
+ oArgs.register = true;
+ oArgs.secure = true;
+ oArgs.xmllang = XML_LANG;
+
+ con.connect(oArgs);
+
+ // We change the registered information text
+ $('#home .homediv.registerer').append(
+ '<div class="info success">' +
+ _e("You have been registered, here is your XMPP address:") + ' <b>' + con.username.htmlEnc() + '@' + con.domain.htmlEnc() + '</b> - <a href="#">' + _e("Login") + '</a>' +
+ '</div>'
+ );
+
+ // Login link
+ $('#home .homediv.registerer .success a').click(function() {
+ return doLogin(con.username, con.domain, con.pass, con.resource, '10', false);
+ });
+
+ // Show the waiting image
+ showGeneralWait();
+
+ // Change the page title
+ pageTitle('wait');
+ }
+
+ catch(e) {
+ // Logs errors
+ logThis(e, 1);
+ }
+
+ finally {
+ return false;
+ }
+}
+
+// Does the user anonymous login
+function doAnonymous() {
+ logThis('Trying to login anonymously...', 3);
+
+ var aPath = '#home .anonymouser ';
+ var room = $(aPath + '.room').val();
+ var nick = $(aPath + '.nick').val();
+
+ // If the form is correctly completed
+ if(room && nick) {
+ // We remove the not completed class to avoid problems
+ $('#home .anonymouser input').removeClass('please-complete');
+
+ // Redirect the user to the anonymous room
+ window.location.href = JAPPIX_LOCATION + '?r=' + room + '&n=' + nick;
+ }
+
+ // We check if the form is entirely completed
+ else {
+ $(aPath + 'input[type=text]').each(function() {
+ var select = $(this);
+
+ if(!select.val())
+ $(document).oneTime(10, function() {
+ select.addClass('please-complete').focus();
+ });
+ else
+ select.removeClass('please-complete');
+ });
+ }
+
+ return false;
+}
+
+// Handles the user connected event
+var CONNECTED = false;
+
+function handleConnected() {
+ logThis('Jappix is now connected.', 3);
+
+ // Connection markers
+ CONNECTED = true;
+ RECONNECT_TRY = 0;
+ RECONNECT_TIMER = 0;
+
+ // We hide the home page
+ $('#home').hide();
+
+ // Not resumed?
+ if(!RESUME) {
+ // Remember the session?
+ if(getDB('remember', 'session'))
+ setPersistent('session', 1, CURRENT_SESSION);
+
+ // We show the chatting app.
+ createTalkPage();
+
+ // We reset the homepage
+ switchHome('default');
+
+ // We get all the other things
+ getEverything();
+
+ // Set last activity stamp
+ LAST_ACTIVITY = getTimeStamp();
+ }
+
+ // Resumed
+ else {
+ // Send our presence
+ presenceSend();
+
+ // Change the title
+ updateTitle();
+ }
+
+ // Remove the waiting item
+ removeGeneralWait();
+}
+
+// Handles the user disconnected event
+function handleDisconnected() {
+ logThis('Jappix is now disconnected.', 3);
+
+ // Normal disconnection
+ if(!CURRENT_SESSION && !CONNECTED)
+ destroyTalkPage();
+}
+
+// Setups the normal connection
+function setupCon(con) {
+ // We setup all the necessary handlers for the connection
+ con.registerHandler('message', handleMessage);
+ con.registerHandler('presence', handlePresence);
+ con.registerHandler('iq', handleIQ);
+ con.registerHandler('onconnect', handleConnected);
+ con.registerHandler('onerror', handleError);
+ con.registerHandler('ondisconnect', handleDisconnected);
+}
+
+// Logouts from the server
+function logout() {
+ // We are not connected
+ if(!isConnected())
+ return false;
+
+ // Disconnect from the XMPP server
+ con.disconnect();
+
+ logThis('Jappix is disconnecting...', 3);
+}
+
+// Terminates a session
+function terminate() {
+ if(!isConnected())
+ return;
+
+ // Clear temporary session storage
+ resetConMarkers();
+
+ // Show the waiting item (useful if BOSH is sloooow)
+ showGeneralWait();
+
+ // Change the page title
+ pageTitle('wait');
+
+ // Disconnect from the XMPP server
+ logout();
+}
+
+// Quitss a session
+function quit() {
+ if(!isConnected())
+ return;
+
+ // We show the waiting image
+ showGeneralWait();
+
+ // Change the page title
+ pageTitle('wait');
+
+ // We disconnect from the XMPP server
+ logout();
+}
+
+// Creates the reconnect pane
+var RECONNECT_TRY = 0;
+var RECONNECT_TIMER = 0;
+
+function createReconnect(mode) {
+ logThis('This is not a normal disconnection, show the reconnect pane...', 1);
+
+ // Reconnect pane not yet displayed?
+ if(!exists('#reconnect')) {
+ // Blur the focused input/textarea/select
+ $('input, select, textarea').blur();
+
+ // Create the HTML code
+ var html = '<div id="reconnect" class="lock">' +
+ '<div class="pane">' +
+ _e("Due to a network issue, you were disconnected. What do you want to do now?");
+
+ // Can we cancel reconnection?
+ if(mode == 'normal')
+ html += '<a href="#" class="finish cancel">' + _e("Cancel") + '</a>';
+
+ html += '<a href="#" class="finish reconnect">' + _e("Reconnect") + '</a>' +
+ '</div></div>';
+
+ // Append the code
+ $('body').append(html);
+
+ // Click events
+ if(mode == 'normal')
+ $('#reconnect a.finish.cancel').click(function() {
+ return cancelReconnect();
+ });
+
+ $('#reconnect a.finish.reconnect').click(function() {
+ return acceptReconnect(mode);
+ });
+
+ // Try to reconnect automatically after a while
+ if(RECONNECT_TRY < 5)
+ RECONNECT_TIMER = 5 + (5 * RECONNECT_TRY);
+ else
+ RECONNECT_TIMER = 120;
+
+ // Change the try number
+ RECONNECT_TRY++;
+
+ // Fire the event!
+ $('#reconnect a.finish.reconnect').everyTime('1s', function() {
+ // We can reconnect!
+ if(RECONNECT_TIMER == 0)
+ return acceptReconnect(mode);
+
+ // Button text
+ if(RECONNECT_TIMER <= 10)
+ $(this).text(_e("Reconnect") + ' (' + RECONNECT_TIMER + ')');
+
+ // Remove 1 second
+ RECONNECT_TIMER--;
+ });
+
+ // Page title
+ updateTitle();
+ }
+}
+
+// Reconnects the user if he was disconnected (network issue)
+var RESUME = false;
+
+function acceptReconnect(mode) {
+ logThis('Trying to reconnect the user...', 3);
+
+ // Resume marker
+ RESUME = true;
+
+ // Show waiting item
+ showGeneralWait();
+
+ // Reset some various stuffs
+ var groupchats = '#page-engine .page-engine-chan[data-type=groupchat]';
+ $(groupchats + ' .list .role').hide();
+ $(groupchats + ' .one-group, ' + groupchats + ' .list .user').remove();
+ $(groupchats).attr('data-initial', 'false');
+
+ // Stop the timer
+ $('#reconnect a.finish.reconnect').stopTime();
+
+ // Remove the reconnect pane
+ $('#reconnect').remove();
+
+ // Try to login again
+ if(mode == 'normal')
+ loginFromSession(XMLFromString(CURRENT_SESSION));
+ else if(mode == 'anonymous')
+ anonymousLogin(HOST_ANONYMOUS);
+
+ return false;
+}
+
+// Cancel the reconnection of user account (network issue)
+function cancelReconnect() {
+ logThis('User has canceled automatic reconnection...', 3);
+
+ // Stop the timer
+ $('#reconnect a.finish.reconnect').stopTime();
+
+ // Remove the reconnect pane
+ $('#reconnect').remove();
+
+ // Destroy the talk page
+ destroyTalkPage();
+
+ // Renitialize the previous session parameters
+ resetConMarkers();
+
+ return false;
+}
+
+// Clears session reminder database
+function clearLastSession() {
+ // Clear temporary storage
+ resetConMarkers();
+
+ // Clear persistent storage
+ if($(XMLFromString(getPersistent('session', 1))).find('stored').text() == 'true')
+ removePersistent('session', 1);
+}
+
+// Resets the connection markers
+function resetConMarkers() {
+ CURRENT_SESSION = false;
+ CONNECTED = false;
+ RESUME = false;
+ RECONNECT_TRY = 0;
+ RECONNECT_TIMER = 0;
+}
+
+// Logins from a saved session
+function loginFromSession(data) {
+ // Select the data
+ var session = $(data);
+
+ // Fire the login event
+ doLogin(
+ session.find('username').text(),
+ session.find('domain').text(),
+ session.find('password').text(),
+ session.find('resource').text(),
+ session.find('priority').text(),
+ false
+ );
+}
+
+// Quits a session normally
+function normalQuit() {
+ // Reset our database
+ clearLastSession();
+
+ // We quit the current session
+ quit();
+
+ // We show an info
+ openThisInfo(3);
+
+ return false;
+}
+
+// Gets all the users stuffs
+function getEverything() {
+ getFeatures();
+ getRoster();
+ listPrivacy();
+ getStorage(NS_ROSTERNOTES);
+}
+
+// Plugin launcher
+function launchConnection() {
+ // Logouts when Jappix is closed
+ $(window).bind('beforeunload', terminate);
+
+ // Nothing to do when anonymous!
+ if(isAnonymous())
+ return;
+
+ // Try to resume a stored session, if not anonymous
+ var session = XMLFromString(getPersistent('session', 1));
+
+ if($(session).find('stored').text() == 'true') {
+ // Hide the homepage
+ $('#home').hide();
+
+ // Show the waiting icon
+ showGeneralWait();
+
+ // Login!
+ loginFromSession(session);
+
+ logThis('Saved session found, resuming it...', 3);
+ }
+
+ // Not connected, maybe a XMPP link is submitted?
+ else if((parent.location.hash != '#OK') && LINK_VARS['x']) {
+ switchHome('loginer');
+
+ logThis('A XMPP link is set, switch to login page.', 3);
+ }
+}
+
+// Launch this plugin!
+$(document).ready(launchConnection);