]> git.mxchange.org Git - friendica-addons.git/blobdiff - jappixmini/jappix/js/mobile.js
jappixmini: include jappix source
[friendica-addons.git] / jappixmini / jappix / js / mobile.js
diff --git a/jappixmini/jappix/js/mobile.js b/jappixmini/jappix/js/mobile.js
new file mode 100644 (file)
index 0000000..40130a5
--- /dev/null
@@ -0,0 +1,592 @@
+/*
+
+Jappix - An open social platform
+These are the Jappix Mobile lightweight JS script
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 10/07/11
+
+*/
+
+/* BEGIN CONNECTION FUNCTIONS */
+
+function doLogin(aForm) {
+       try {
+               // Reset the panels
+               resetPanel();
+               
+               // Get the values
+               var xid = aForm.xid.value;
+               var username, domain;
+               
+               // A domain is specified
+               if(xid.indexOf('@') != -1) {
+                       username = getXIDNick(xid);
+                       domain = getXIDHost(xid);
+                       
+                       // Domain is locked and not the same
+                       if((LOCK_HOST == 'on') && (domain != HOST_MAIN)) {
+                               showThis('error');
+                               
+                               return false;
+                       }
+               }
+               
+               // No "@" in the XID, we should add the default domain
+               else {
+                       username = xid;
+                       domain = HOST_MAIN;
+               }
+               
+               var pwd = aForm.pwd.value;
+               var reg = false;
+               
+               if(aForm.reg)
+                       reg = aForm.reg.checked;
+               
+               // Enough parameters
+               if(username && domain && pwd) {
+                       // Show the info notification
+                       showThis('info');
+                       
+                       // 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
+                       con.registerHandler('message', handleMessage);
+                       con.registerHandler('presence', handlePresence);
+                       con.registerHandler('iq', handleIQ);
+                       con.registerHandler('onconnect', handleConnected);
+                       con.registerHandler('onerror', handleError);
+                       con.registerHandler('ondisconnect', handleDisconnected);
+                       
+                       // We retrieve what the user typed in the login inputs
+                       oArgs = new Object();
+                       oArgs.username = username;
+                       oArgs.domain = domain;
+                       oArgs.resource = JAPPIX_RESOURCE + ' Mobile (' + (new Date()).getTime() + ')';
+                       oArgs.pass = pwd;
+                       oArgs.secure = true;
+                       oArgs.xmllang = XML_LANG;
+                       
+                       // Register?
+                       if(reg)
+                               oArgs.register = true;
+                       
+                       // We connect !
+                       con.connect(oArgs);
+               }
+               
+               // Not enough parameters
+               else
+                       showThis('error');
+       }
+       
+       catch(e) {
+               // An error happened
+               resetPanel('error');
+       }
+       
+       finally {
+               return false;
+       }
+}
+
+function doLogout() {
+       con.disconnect();
+}
+
+/* END CONNECTION FUNCTIONS */
+
+/* BEGIN SHOW/HIDE FUNCTIONS */
+
+function showThis(id) {
+       document.getElementById(id).style.display = 'block';
+}
+
+function hideThis(id) {
+       document.getElementById(id).style.display = 'none';
+}
+
+function resetPanel(id) {
+       // Hide the opened panels
+       hideThis('info');
+       hideThis('error');
+       
+       //Show the target panel
+       if(id)
+               showThis(id);
+}
+
+function resetDOM() {
+       // Reset the "secret" input values
+       document.getElementById('pwd').value = '';
+       
+       // Remove the useless DOM elements
+       var body = document.getElementsByTagName('body')[0];
+       body.removeChild(document.getElementById('talk'));
+       body.removeChild(document.getElementById('chat'));
+}
+
+/* END SHOW/HIDE FUNCTIONS */
+
+/* BEGIN SYSTEM FUNCTIONS */
+
+function exists(id) {
+       if(!document.getElementById(id))
+               return false;
+       else
+               return true;
+}
+
+function _e(string) {
+       return string;
+}
+
+function encodeOnclick(str) {
+       return str.replace(/'/g, '\\$&').replace(/"/g, '"');
+}
+
+function getJappixLocation() {
+       var url = window.location.href;
+       
+       // If the URL has variables, remove them
+       if(url.indexOf('?') != -1)
+               url = url.split('?')[0];
+       if(url.indexOf('#') != -1)
+               url = url.split('#')[0];
+       
+       // No "/" at the end
+       if(!url.match(/(.+)\/$/))
+               url += '/';
+       
+       return url;
+}
+
+/* END SYSTEM FUNCTIONS */
+
+/* BEGIN HANDLING FUNCTIONS */
+
+function handleMessage(msg) {
+       var type = msg.getType();
+       
+       if(type == 'chat' || type == 'normal') {
+               // Get the body
+               var body = msg.getBody();
+               
+               if(body) {
+                       // Get the values
+                       var xid = cutResource(msg.getFrom());
+                       var hash = hex_md5(xid);
+                       var nick = getNick(xid, hash);
+                       
+                       // No nickname?
+                       if(!nick)
+                               nick = xid;
+               
+                       // Create the chat if it does not exist
+                       chat(xid, nick);
+               
+                       // Display the message
+                       displayMessage(xid, body, nick, hash);
+               }
+       }
+}
+
+function handlePresence(pre) {
+       // Define the variables
+       var xid = cutResource(pre.getFrom());
+       var hash = hex_md5(xid);
+       var type = pre.getType();
+       var show = pre.getShow();
+       
+       // Online buddy: show it!
+       if(!type) {
+               showThis('buddy-' + hash);
+               
+               // Display the correct presence
+               switch(show) {
+                       case 'chat':
+                               displayPresence(hash, show);
+                               break;
+                       
+                       case 'away':
+                               displayPresence(hash, show);
+                               break;
+                       
+                       case 'xa':
+                               displayPresence(hash, show);
+                               break;
+                       
+                       case 'dnd':
+                               displayPresence(hash, show);
+                               break;
+                       
+                       default:
+                               displayPresence(hash, 'available');
+                               break;
+               }
+       }
+       
+       else
+               hideThis('buddy-' + hash);
+}
+
+function handleIQ(iq) {
+       // Get the content
+       var iqFrom = iq.getFrom();
+       var iqID = iq.getID();
+       var iqQueryXMLNS = iq.getQueryXMLNS();
+       var iqType = iq.getType();
+       
+       // Create the response
+       if((iqType == 'get') && ((iqQueryXMLNS == NS_DISCO_INFO) || (iqQueryXMLNS == NS_VERSION))) {
+               var iqResponse = new JSJaCIQ();
+               iqResponse.setID(iqID);
+               iqResponse.setTo(iqFrom);
+               iqResponse.setType('result');
+       }
+       
+       // Disco#infos query
+       if((iqQueryXMLNS == NS_DISCO_INFO) && (iqType == 'get')) {
+               /* REF: http://xmpp.org/extensions/xep-0030.html */
+               
+               var iqQuery = iqResponse.setQuery(NS_DISCO_INFO);
+               
+               // We set the name of the client
+               iqQuery.appendChild(iq.appendNode('identity', {
+                       'category': 'client',
+                       'type': 'mobile',
+                       'name': 'Jappix Mobile'
+               }));
+               
+               // We set all the supported features
+               var fArray = new Array(
+                       NS_DISCO_INFO,
+                       NS_VERSION
+               );
+               
+               for(i in fArray)
+                       iqQuery.appendChild(iq.buildNode('feature', {'var': fArray[i]}));
+               
+               con.send(iqResponse);
+       }
+       
+       // Software version query
+       else if((iqQueryXMLNS == NS_VERSION) && (iqType == 'get')) {
+               /* REF: http://xmpp.org/extensions/xep-0092.html */
+               
+               var iqQuery = iqResponse.setQuery(NS_VERSION);
+               
+               iqQuery.appendChild(iq.buildNode('name', 'Jappix Mobile'));
+               iqQuery.appendChild(iq.buildNode('version', JAPPIX_VERSION));
+               iqQuery.appendChild(iq.buildNode('os', BrowserDetect.OS));
+               
+               con.send(iqResponse);
+       }
+}
+
+function handleConnected() {
+       // Reset the elements
+       hideThis('home');
+       resetPanel();
+       
+       // Create the talk page
+       document.getElementsByTagName('body')[0].innerHTML +=
+       '<div id="talk">' + 
+               '<div class="header">' + 
+                       '<div class="mobile-images"></div>' + 
+                       '<button onclick="doLogout();">' + _e("Disconnect") + '</button>' + 
+               '</div>' + 
+               
+               '<div id="roster"></div>' + 
+       '</div>' + 
+       
+       '<div id="chat">' + 
+               '<div class="header">' + 
+                       '<div class="mobile-images"></div>' + 
+                       '<button onclick="returnToRoster();">' + _e("Previous") + '</button>' + 
+               '</div>' + 
+               
+               '<div id="chans"></div>' + 
+       '</div>';
+       
+       // Get the roster items
+       getRoster();
+}
+
+function handleError(error) {
+       resetPanel('error');
+}
+
+function handleDisconnected() {
+       // Reset the elements
+       resetDOM();
+       
+       // Show the home page
+       showThis('home');
+}
+
+function handleRoster(iq) {
+       // Error: send presence anyway
+       if(!iq || (iq.getType() != 'result'))
+               return sendPresence('', 'available', 1);
+       
+       // Define some pre-vars
+       var current, xid, nick, oneBuddy, oneID, hash;
+       var roster = document.getElementById('roster');
+       
+       // Get roster items
+       var iqNode = iq.getNode();
+       var bItems = iqNode.getElementsByTagName('item');
+       
+       // Display each elements from the roster
+       for(var i = 0; i < bItems.length; i++) {
+               // Get the values
+               current = iqNode.getElementsByTagName('item').item(i);
+               xid = current.getAttribute('jid').htmlEnc();
+               nick = current.getAttribute('name');
+               hash = hex_md5(xid);
+               
+               // No defined nick?
+               if(!nick)
+                       nick = getDirectNick(xid);
+               
+               // Display the values
+               oneBuddy = document.createElement('a');
+               oneID = 'buddy-' + hash;
+               oneBuddy.setAttribute('href', '#');
+               oneBuddy.setAttribute('id', oneID);
+               oneBuddy.setAttribute('class', 'one-buddy');
+               oneBuddy.setAttribute('onclick', 'return chat(\'' + encodeOnclick(xid) + '\', \'' + encodeOnclick(nick) + '\');');
+               oneBuddy.innerHTML = nick.htmlEnc();
+               roster.appendChild(oneBuddy);
+       }
+       
+       // Start handling buddies presence
+       sendPresence('', 'available', 1);
+}
+
+/* END HANDLING FUNCTIONS */
+
+/* BEGIN SENDING FUNCTIONS */
+
+function sendMessage(aForm) {
+       try {
+               var body = aForm.body.value;
+               var xid = aForm.xid.value;
+               var hash = hex_md5(xid);
+               
+               if(body && xid) {
+                       // Send the message
+                       var aMsg = new JSJaCMessage();
+                       aMsg.setTo(xid);
+                       aMsg.setType('chat');
+                       aMsg.setBody(body);
+                       con.send(aMsg);
+                       
+                       // Clear our input
+                       aForm.body.value = '';
+                       
+                       // Display the message we sent
+                       displayMessage(xid, body, 'me', hash);
+               }
+       }
+       
+       finally {
+               return false;
+       }
+}
+
+function sendPresence(type, show, priority, status) {
+       var presence = new JSJaCPresence();
+       
+       if(type)
+               presence.setType(type);
+       if(show)
+               presence.setShow(show);
+       if(priority)
+               presence.setPriority(priority);
+       if(status)
+               presence.setStatus(status);
+       
+       con.send(presence);
+}
+
+/* END SENDING FUNCTIONS */
+
+/* BEGIN GETTING FUNCTIONS */
+
+function getRoster() {
+       iq = new JSJaCIQ();
+       iq.setType('get');
+       iq.setQuery(NS_ROSTER);
+       
+       con.send(iq, handleRoster);
+}
+
+function getDirectNick(xid) {
+       return explodeThis('@', xid, 0);
+}
+
+function getNick(xid, hash) {
+       var path = 'buddy-' + hash;
+       
+       if(exists(path))
+               return document.getElementById(path).innerHTML;
+       
+       else
+               getDirectNick(xid);
+}
+
+/* END GETTING FUNCTIONS */
+
+/* BEGIN RESOURCES FUNCTIONS */
+function explodeThis(toEx, toStr, i) {
+       // Get the index of our char to explode
+       var index = toStr.indexOf(toEx);
+       
+       // We split if necessary the string
+       if(index != -1) {
+               if(i == 0)
+                       toStr = toStr.substr(0, index);
+               else
+                       toStr = toStr.substr(index + 1);
+       }
+       
+       // We return the value
+       return toStr;
+}
+
+function cutResource(aXID) {
+       return explodeThis('/', aXID, 0);
+}
+
+function getXIDNick(aXID) {
+       return explodeThis('@', aXID, 0);
+}
+
+function getXIDHost(aXID) {
+       return explodeThis('@', aXID, 1);
+}
+/* END RESOURCES FUNCTIONS */
+
+/* BEGIN CHAT FUNCTIONS */
+
+function filter(msg) {
+       var msg = msg
+       
+       // Encode in HTML
+       .htmlEnc()
+       
+       // Highlighted text
+       .replace(/(\s|^)\*(.+)\*(\s|$)/gi,'$1<em>$2</em>$3');
+       
+       // Links
+       msg = applyLinks(msg, 'mini');
+       
+       return msg;
+}
+
+function displayMessage(xid, body, nick, hash) {
+       // Get the path
+       var path = 'content-' + hash;
+       
+       // Display the message
+       html = '<span><b';
+       
+       if(nick == 'me')
+               html += ' class="me">' + _e("You");
+       else
+               html += ' class="him">' + nick;
+       
+       html += '</b> ' + filter(body) + '</span>';
+       
+       document.getElementById(path).innerHTML += html;
+       
+       // Scroll to the last element
+       document.getElementById(path).lastChild.scrollIntoView();
+}
+
+function returnToRoster() {
+       // Hide the chats
+       hideThis('chat');
+       
+       // Show the roster
+       showThis('talk');
+}
+
+function chatSwitch(hash) {
+       // Hide the roster page
+       hideThis('talk');
+       
+       // Hide the other chats
+       var divs = document.getElementsByTagName('div');
+       
+       for(var i = 0; i < divs.length; i++) {
+               if(divs.item(i).getAttribute('class') == 'one-chat')
+                       divs.item(i).style.display = 'none';
+       }
+       
+       // Show the chat
+       showThis('chat');
+       showThis(hash);
+}
+
+function createChat(xid, nick, hash) {
+       // Define the variables
+       var chat = document.getElementById('chans');
+       var oneChat = document.createElement('div');
+       
+       // Apply the DOM modification
+       oneChat.setAttribute('id', 'chat-' + hash);
+       oneChat.setAttribute('class', 'one-chat');
+       oneChat.innerHTML = '<p>' + nick + '</p><div id="content-' + hash + '"></div><form action="#" method="post" onsubmit="return sendMessage(this);"><input type="text" name="body" /><input type="hidden" name="xid" value="' + xid + '" /><input type="submit" class="submit" value="OK" /></form>';
+       chat.appendChild(oneChat);
+}
+
+function chat(xid, nick) {
+       var hash = hex_md5(xid);
+       
+       // If the chat was not yet opened
+       if(!exists('chat-' + hash)) {
+               // No nick?
+               if(!nick)
+                       nick = getNick(xid, hash);
+               
+               // Create the chat
+               createChat(xid, nick, hash);
+       }
+       
+       // Switch to the chat
+       chatSwitch('chat-' + hash);
+       
+       return false;
+}
+
+/* END CHAT FUNCTIONS */
+
+/* BEGIN PRESENCE FUNCTIONS */
+
+function displayPresence(hash, show) {
+       document.getElementById('buddy-' + hash).setAttribute('class', 'one-buddy ' + show);
+}
+
+/* END PRESENCE FUNCTIONS */
+
+/* BEGIN DOCUMENT EVENTS FUNCTIONS */
+
+onbeforeunload = doLogout;
+
+/* END DOCUMENT EVENTS FUNCTIONS */