--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the archives functions for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 03/03/11
+
+*/
+
+// Opens the archive tools
+function openArchives() {
+ // Popup HTML content
+ var html =
+ '<div class="top">' + _e("Message archives") + '</div>' +
+
+ '<div class="content">' +
+ '<div class="filter">' +
+ '<select class="friend" multiple=""></select>' +
+
+ '<div class="date"></div>' +
+ '</div>' +
+
+ '<div class="current">' +
+ '<span class="name"></span>' +
+ '<span class="time">' + _e("Please select a friend to view the chat history.") + '</span>' +
+ '</div>' +
+
+ '<div class="logs" id="chat-content-archives"></div>' +
+ '</div>' +
+
+ '<div class="bottom">' +
+ '<div class="wait wait-medium"></div>' +
+
+ '<a href="#" class="finish">' + _e("Close") + '</a>' +
+ '</div>';
+
+ // Create the popup
+ createPopup('archives', html);
+
+ // Associate the events
+ launchArchives();
+
+ // Get all the buddies in our roster
+ var buddies = getAllBuddies();
+ var options = '';
+
+ for(i in buddies) {
+ var current = buddies[i];
+
+ // Add the current buddy
+ options += '<option value="' + encodeQuotes(current) + '">' + getBuddyName(current).htmlEnc() + '</option>';
+ }
+
+ // Can append the buddy HTML code?
+ if(options)
+ $('#archives .filter .friend').append(options);
+
+ return false;
+}
+
+// Closes the archive tools
+function closeArchives() {
+ // Destroy the popup
+ destroyPopup('archives');
+
+ return false;
+}
+
+// Gets the archives list for a buddy
+function getListArchives(xid) {
+ // Reset the archives viewer
+ $('#archives .logs').empty();
+
+ // Show the waiting icon
+ $('#archives .wait').show();
+
+ // Apply the ID
+ var id = genID();
+ $('#archives').attr('data-session', id);
+
+ // New IQ
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+ iq.setID(id);
+
+ var list = iq.appendNode('list', {'xmlns': NS_URN_ARCHIVE, 'with': xid});
+ var set = list.appendChild(iq.buildNode('set', {'xmlns': NS_RSM}));
+ set.appendChild(iq.buildNode('max', {'xmlns': NS_RSM}, '0'));
+
+ con.send(iq, handleListArchives);
+
+ logThis('Getting archives list for: ' + xid + '...');
+}
+
+// Handles the archives list for a buddy
+function handleListArchives(iq) {
+ // Hide the waiting icon
+ $('#archives .wait').hide();
+
+ // Any error?
+ if(handleErrorReply(iq) || !exists('#archives[data-session=' + iq.getID() + ']'))
+ return;
+
+ // Get the last archive date
+ var last = $(iq.getNode()).find('list set changed').text();
+
+ // Any last archive?
+ if(last) {
+ // Read the date
+ var date = Date.jab2date(last);
+
+ // Change the datepicker value
+ $('#archives .filter .date').DatePickerSetDate(date, true);
+
+ // Retrieve the archives
+ checkChangeArchives();
+ }
+
+ logThis('Got archives list.', 2);
+}
+
+// Gets the archives for a day
+function getDayArchives(xid, date) {
+ // Reset the archives viewer
+ $('#archives .logs').empty();
+
+ // Show the waiting icon
+ $('#archives .wait').show();
+
+ // Apply the ID
+ var id = genID();
+ $('#archives').attr('data-session', id);
+
+ // New IQ
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+ iq.setID(id);
+
+ iq.appendNode('list', {'xmlns': NS_URN_ARCHIVE, 'with': xid, 'start': date + 'T00:00:00Z', 'end': date + 'T23:59:59Z'});
+
+ con.send(iq, handleDayArchives);
+
+ logThis('Getting day archives (' + date + ') for: ' + xid + '...');
+}
+
+// Handles the archives for a day
+function handleDayArchives(iq) {
+ // Hide the waiting icon
+ $('#archives .wait').hide();
+
+ // Any error?
+ if(handleErrorReply(iq) || !exists('#archives[data-session=' + iq.getID() + ']'))
+ return;
+
+ // Get each archive thread
+ $(iq.getNode()).find('chat').each(function() {
+ // Current values
+ var xid = $(this).attr('with');
+ var start = $(this).attr('start');
+
+ if(xid && start)
+ $('#archives .logs').append('<input class="archives-pending" type="hidden" data-with="' + encodeQuotes(xid) + '" data-start="' + encodeQuotes(start) + '" />');
+ });
+
+ // Display the day
+ var date = parseDay($('#archives .filter .date').DatePickerGetDate(true) + 'T00:00:00Z' + getDateTZO());
+
+ // Try to get the first thread
+ var pending = '#archives input.archives-pending:first';
+
+ if(!exists(pending))
+ date = printf(_e("Nothing found for: %s"), date);
+
+ else {
+ retrieveArchives($(pending).attr('data-with'), $(pending).attr('data-start'));
+ $(pending).remove();
+ }
+
+ $('#archives .current .time').text(date);
+
+ logThis('Got day archives.', 2);
+}
+
+// Retrieves a specified archive collection
+function retrieveArchives(xid, start) {
+ // Show the waiting icon
+ $('#archives .wait').show();
+
+ // Apply the ID
+ var id = genID();
+ $('#archives').attr('data-session', id);
+
+ // New IQ
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+ iq.setID(id);
+
+ var list = iq.appendNode('retrieve', {'xmlns': NS_URN_ARCHIVE, 'with': xid, 'start': start});
+
+ con.send(iq, handleRetrieveArchives);
+
+ logThis('Retrieving archives (start: ' + start + ') for: ' + xid + '...');
+}
+
+// Handles a specified archive collection
+function handleRetrieveArchives(iq) {
+ // Hide the waiting icon
+ $('#archives .wait').hide();
+
+ // Any error?
+ if(handleErrorReply(iq) || !exists('#archives[data-session=' + iq.getID() + ']'))
+ return;
+
+ // Get the node
+ var chat = $(iq.getNode()).find('chat:first');
+
+ // Get the buddy XID
+ var xid = bareXID(chat.attr('with'));
+
+ // Get the start date & stamp
+ var start_date = Date.jab2date(chat.attr('start'));
+ var start_stamp = extractStamp(start_date);
+
+ // Parse the result chat
+ chat.find('to, from').each(function() {
+ var node = (this).nodeName;
+ var stamp = start_stamp + parseInt($(this).attr('secs'));
+ var date = extractTime(new Date(stamp * 1000));
+ var body = $(this).find('body').text();
+
+ // Is it my message?
+ if((node == 'to') && body)
+ displayMessage('chat', getXID(), 'archives', getBuddyName(getXID()).htmlEnc(), body, date, start_stamp, 'user-message', true, '', 'me');
+
+ // Is it a buddy message?
+ else if((node == 'from') && body)
+ displayMessage('chat', xid, 'archives', getBuddyName(xid).htmlEnc(), body, date, start_stamp, 'user-message', true, '', 'him');
+ });
+
+ // Not the latest thread?
+ var pending = '#archives input.archives-pending:first';
+
+ if(exists(pending)) {
+ retrieveArchives($(pending).attr('data-with'), $(pending).attr('data-start'));
+ $(pending).remove();
+ }
+
+ // Everything has been retrieved, get the avatars
+ else {
+ getAvatar(getXID(), 'cache', 'true', 'forget');
+ getAvatar(xid, 'cache', 'true', 'forget');
+ }
+
+ logThis('Got archives.', 2);
+}
+
+// Gets the archiving configuration
+function getConfigArchives() {
+ // Lock the archiving options
+ $('#archiving').attr('checked', false).attr('disabled', true);
+
+ // Get the archiving configuration
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+
+ iq.appendNode('pref', {'xmlns': NS_URN_ARCHIVE});
+
+ con.send(iq, handleGetConfigArchives);
+}
+
+// Handles the archiving configuration
+function handleGetConfigArchives(iq) {
+ // Reset the options stuffs
+ waitOptions('archives');
+
+ // Unlock the archiving options
+ $('#archiving').removeAttr('disabled');
+
+ // End if not a result
+ if(!iq || (iq.getType() != 'result'))
+ return;
+
+ // Extract the preferences from the IQ
+ var enabled = $(iq.getNode()).find('pref auto').attr('save');
+
+ // Define the input enabling/disabling vars
+ var checked = true;
+
+ if(enabled != 'true')
+ checked = false;
+
+ // Apply the values
+ $('#archiving').attr('checked', checked);
+}
+
+// Configures the archiving on the server
+function configArchives(enabled) {
+ // Configure the auto element
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ iq.appendNode('auto', {'xmlns': NS_URN_ARCHIVE, 'save': enabled});
+
+ con.send(iq, handleConfigArchives);
+
+ // Configure the default element
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ var pref = iq.appendNode('pref', {'xmlns': NS_URN_ARCHIVE});
+ pref.appendChild(iq.appendNode('default', {'xmlns': NS_URN_ARCHIVE, 'otr': 'concede', 'save': 'body'}));
+
+ con.send(iq);
+
+ // Configure the method element
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ var mType = new Array('auto', 'local', 'manual');
+ var mUse = new Array('prefer', 'concede', 'concede');
+
+ var pref = iq.appendNode('pref', {'xmlns': NS_URN_ARCHIVE});
+
+ for(i in mType)
+ pref.appendChild(iq.appendNode('method', {'xmlns': NS_URN_ARCHIVE, 'type': mType[i], 'use': mUse[i]}));
+
+ con.send(iq);
+
+ // Logger
+ logThis('Configuring archives...', 3);
+}
+
+// Handles the archives configuration
+function handleConfigArchives(iq) {
+ if(!iq || (iq.getType() != 'result'))
+ logThis('Archives not configured.', 2);
+ else
+ logThis('Archives configured.', 3);
+}
+
+// Checks if the datepicker has changed
+function checkChangeArchives() {
+ var xid = $('#archives .filter .friend').val();
+ var date = $('#archives .filter .date').DatePickerGetDate(true);
+
+ // No XID?
+ if(!xid || !xid.length)
+ return;
+
+ // Too many value?
+ if(xid.length > 1) {
+ $('#archives .filter .friend').val(xid[0]);
+
+ return;
+ }
+
+ // Get the first XID
+ xid = xid[0];
+
+ // Get the archives
+ getDayArchives(xid, date);
+}
+
+// Update the archives with the selected XID
+function updateArchives() {
+ // Read the values
+ var xid = $('#archives .filter .friend').val();
+ var date = $('#archives .filter .date').DatePickerGetDate(true);
+
+ // No XID?
+ if(!xid || !xid.length)
+ return;
+
+ // Too many value?
+ if(xid.length > 1) {
+ $('#archives .filter .friend').val(xid[0]);
+
+ return;
+ }
+
+ // Get the first XID
+ xid = xid[0];
+
+ // Apply the current marker
+ $('#archives .current .name').text(getBuddyName(xid));
+ $('#archives .current .time').text(parseDay(date + 'T00:00:00Z' + getDateTZO()));
+
+ // Get the archives
+ getListArchives(xid, date);
+}
+
+// Plugin launcher
+function launchArchives() {
+ // Current date
+ var current_date = explodeThis('T', getXMPPTime(), 0);
+
+ // Datepicker
+ $('#archives .filter .date').DatePicker({
+ flat: true,
+ date: current_date,
+ current: current_date,
+ calendars: 1,
+ starts: 1,
+ onChange: checkChangeArchives
+ });
+
+ // Click events
+ $('#archives .bottom .finish').click(function() {
+ return closeArchives();
+ });
+
+ // Change event
+ $('#archives .filter .friend').change(updateArchives);
+}