2012-04-17 23:12:24 +00:00
/ *
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 ) ;
}
2018-01-20 16:01:59 +00:00
// Addon launcher
2012-04-17 23:12:24 +00:00
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 ) ;
}
}
2018-01-20 16:01:59 +00:00
// Launch this addon!
2012-04-17 23:12:24 +00:00
$ ( document ) . ready ( launchConnection ) ;