mirror of
https://git.friendi.ca/friendica/friendica-addons.git
synced 2025-07-09 01:48:48 +00:00
jappixmini: include jappix source
This commit is contained in:
parent
61eb1f0d18
commit
302b2820d1
231 changed files with 96082 additions and 2 deletions
418
jappixmini/jappix/js/archives.js
Normal file
418
jappixmini/jappix/js/archives.js
Normal file
|
@ -0,0 +1,418 @@
|
|||
/*
|
||||
|
||||
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);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue