deprecated-addons/jappixmini/jappix/js/connection.js

527 lines
12 KiB
JavaScript

/*
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);
}
// Addon 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 addon!
$(document).ready(launchConnection);