/* 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);