--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/ajim/shoutbox.js Sun Jan 11 21:38:42 2009 -0500
@@ -0,0 +1,402 @@
+var ajim_last_refresh = 0;
+
+window.ajim_init = function()
+{
+ window.ajim_authed = ( auth_level >= USER_LEVEL_CHPREF && ajim_can_mod );
+ // have it immediately pull in whatever comments the server wants us to pull
+ ajim_watch(true);
+ ajim_setup_textarea();
+}
+
+addOnloadHook(ajim_init);
+
+window.ajim_watch = function(immediate)
+{
+ ajim_send_request({
+ mode: 'watch',
+ lastrefresh: immediate ? 0 : ajim_last_refresh
+ });
+}
+
+window.ajim_send_request = function(request)
+{
+ request = ajaxEscape(toJSONString(request));
+ ajaxPost(makeUrlNS('Special', 'AjimJson'), 'r=' + request, function()
+ {
+ if ( ajax.readyState == 4 && ajax.status == 200 )
+ {
+ var response = String(ajax.responseText + '');
+ if ( !check_json_response(response) )
+ {
+ ajim_handle_invalid_json(response);
+ return false;
+ }
+ response = parseJSON(response);
+ ajim_handle_response(response);
+ }
+ });
+}
+
+window.ajim_handle_invalid_json = function(response)
+{
+ ajim_fail_message_list();
+ load_component('l10n');
+ var messages = document.getElementById('ajim_messages');
+ messages.innerHTML = $lang.get('ajim_err_bad_json') + '<br />';
+ messages.appendChild(document.createTextNode(response));
+}
+
+window.ajim_handle_response = function(response)
+{
+ switch(response.mode)
+ {
+ case 'messages':
+ ajim_show_message_list();
+
+ var noposts = document.getElementById('ajim_noposts');
+ if ( noposts )
+ noposts.parentNode.removeChild(noposts);
+ for ( var i = response.messages.length - 1; i >= 0; i-- )
+ {
+ ajim_inject_message(response.messages[i]);
+ }
+ if ( response.now )
+ {
+ window.ajim_last_refresh = response.now;
+ ajim_watch();
+ }
+ break;
+ case 'delete':
+ var message = document.getElementById('ajim_message:' + response.message_id);
+ if ( message )
+ {
+ message.parentNode.removeChild(message);
+ }
+ ajim_show_message_list();
+ break;
+ case 'update':
+ var message = document.getElementById('ajim_message:' + response.message_id);
+ if ( message )
+ {
+ var inner = getElementsByClassName(message, 'div', 'ajim_message_inner')[0];
+ inner.innerHTML = response.message_html;
+ message.meta.message_src = response.message;
+ }
+ ajim_show_message_list();
+ break;
+ case 'error':
+ ajim_fail_message_list();
+ ajim_show_error(response.error);
+ break;
+ }
+}
+
+window.ajim_draw_message = function(message)
+{
+ var div = document.createElement('div');
+ div.id = 'ajim_message:' + message.message_id;
+ div.className = 'ajim_message';
+ div.meta = {
+ message_id: message.message_id,
+ message_src: message.message
+ };
+
+ // deleted message?
+ if ( message.message == '' )
+ return div;
+
+ // *sigh* actually draw a message.
+
+ // mod buttons
+ var modbuttons = document.createElement('div');
+ modbuttons.className = 'ajim_modbuttons';
+ if ( !window.ajim_authed && ( ( message.user_id != 1 && message.user_id != ajim_user_id ) || message.user_id == 1 ) )
+ modbuttons.style.display = 'none';
+
+ var edbtn = document.createElement('a');
+ edbtn.href = '#';
+ edbtn.className = 'ajim_btn_edit';
+ edbtn.appendChild(document.createTextNode(ajim_str_edit));
+ edbtn.onclick = ajim_handle_click_edit;
+ modbuttons.appendChild(edbtn);
+
+ modbuttons.appendChild(document.createTextNode(' | '));
+
+ var delbtn = document.createElement('a');
+ delbtn.href = '#';
+ delbtn.className = 'ajim_btn_delete';
+ delbtn.appendChild(document.createTextNode(ajim_str_delete));
+ delbtn.onclick = ajim_handle_click_delete;
+ modbuttons.appendChild(delbtn);
+
+ div.appendChild(modbuttons);
+
+ // username
+ var el = message.user_id == 1 ? 'span' : 'a';
+ var username = document.createElement(el);
+ username.appendChild(document.createTextNode(message.username));
+ username.title = message.rank_info.rank_title;
+ username.setAttribute('style', message.rank_info.rank_style);
+ if ( message.user_id != 1 )
+ username.href = makeUrlNS('User', message.username);
+ div.appendChild(username);
+
+ // message header (does a clear: both)
+ var messagehead = document.createElement('div');
+ messagehead.className = 'ajim_messagehead';
+ div.appendChild(messagehead);
+
+ // date
+ var date = document.createElement('div');
+ date.className = 'ajim_timestamp';
+ date.appendChild(document.createTextNode(message.human_time));
+ div.appendChild(date);
+
+ // *finally* message
+ var msgdata = document.createElement('div');
+ msgdata.innerHTML = message.message_html;
+ msgdata.className = 'ajim_message_inner';
+ div.appendChild(msgdata);
+
+ // message footer
+ var messagefoot = document.createElement('div');
+ messagefoot.className = 'ajim_messagefoot';
+ div.appendChild(messagefoot);
+
+ return div;
+}
+
+window.ajim_inject_message = function(message)
+{
+ var drawn = ajim_draw_message(message);
+ var existing = document.getElementById('ajim_message:' + message.message_id);
+ if ( existing )
+ {
+ insertAfter(existing.parentNode, drawn, existing);
+ existing.parentNode.removeChild(existing);
+ }
+ else
+ {
+ ajim_inject_object(drawn);
+ }
+}
+
+window.ajim_inject_object = function(element)
+{
+ var error = document.getElementById('ajim_error');
+ insertAfter(error.parentNode, element, error);
+}
+
+window.ajim_show_error = function(message)
+{
+ if ( window.ajim_error_timeout )
+ window.clearTimeout(ajim_error_timeout);
+ var error = document.getElementById('ajim_error');
+ error.innerHTML = '';
+ error.appendChild(document.createTextNode(message));
+ window.ajim_error_timeout = window.setTimeout(ajim_clear_error, 5000);
+}
+
+window.ajim_clear_error = function()
+{
+ var error = document.getElementById('ajim_error');
+ error.innerHTML = '';
+}
+
+window.ajim_handle_click_edit = function()
+{
+ if ( this.editing )
+ {
+ this.editing = false;
+
+ this.firstChild.nodeValue = $lang.get('ajim_btn_edit');
+ this.nextSibling.nextSibling.firstChild.nodeValue = $lang.get('ajim_btn_delete');
+
+ var newsrc = this.ta.value;
+ this.ta.parentNode.removeChild(this.ta);
+ this.inner.style.display = 'block';
+
+ if ( newsrc == '' )
+ ajim_show_error($lang.get('ajim_err_no_post'));
+
+ ajim_hide_message_list();
+
+ ajim_send_request({
+ mode: 'update',
+ message_id: this.parentNode.parentNode.meta.message_id,
+ message: newsrc
+ });
+ }
+ else
+ {
+ load_component('l10n');
+ this.firstChild.nodeValue = $lang.get('ajim_btn_save');
+ this.nextSibling.nextSibling.firstChild.nodeValue = $lang.get('etc_cancel').toLowerCase();
+ this.editing = true;
+
+ var src = this.parentNode.parentNode.meta.message_src;
+ var inner = this.parentNode.nextSibling.nextSibling.nextSibling.nextSibling;
+
+ var ta = document.createElement('textarea');
+ ta.value = src;
+ ta.style.fontSize = '100%';
+ ta.style.width = '93%';
+ inner.style.display = 'none';
+ this.parentNode.parentNode.appendChild(ta);
+ this.ta = ta;
+ this.inner = inner;
+ }
+ return false;
+}
+
+window.ajim_handle_click_delete = function()
+{
+ var editlink = this.previousSibling.previousSibling;
+ if ( editlink.editing )
+ {
+ editlink.editing = false;
+
+ editlink.firstChild.nodeValue = $lang.get('ajim_btn_edit');
+ this.firstChild.nodeValue = $lang.get('ajim_btn_delete');
+
+ editlink.ta.parentNode.removeChild(editlink.ta);
+ editlink.inner.style.display = 'block';
+ }
+ else
+ {
+ ajim_hide_message_list();
+ var message_id = this.parentNode.parentNode.meta.message_id;
+ ajim_send_request({
+ mode: 'delete',
+ message_id: message_id
+ });
+ }
+ return false;
+}
+
+window.ajim_handle_click_mod = function()
+{
+ if ( auth_level >= USER_LEVEL_CHPREF )
+ return false;
+ load_component('login');
+
+ ajaxLogonInit(function(k)
+ {
+ ajaxLoginReplaceSIDInline(k, false, USER_LEVEL_CHPREF);
+ window.setTimeout(function()
+ {
+ mb_current_obj.destroy();
+ ajim_enable_mod_tools();
+ }, 500);
+ }, USER_LEVEL_CHPREF);
+
+ return false;
+}
+
+window.ajim_enable_mod_tools = function()
+{
+ var mods = document.getElementsByClassName('div', 'ajim_modbuttons');
+ for ( var i = 0; i < mods.length; i++ )
+ {
+ mods[i].style.display = 'block';
+ }
+ document.getElementById('ajim_mod').innerHTML = '';
+}
+
+window.ajim_setup_textarea = function()
+{
+ var ta = document.getElementById('ajim_message');
+ if ( !ta )
+ return false;
+
+ ta.shift = false;
+ ta.onkeypress = function(e)
+ {
+ if ( !e )
+ e = window.event;
+ if ( !e )
+ return true;
+ if ( typeof(e.keyCode) == undefined )
+ return true;
+ if ( e.keyCode == 13 )
+ {
+ if ( !this.shift )
+ {
+ ajim_submit_message();
+ e.preventDefault();
+ return false;
+ }
+ }
+ }
+ ta.onkeydown = function(e)
+ {
+ if ( !e )
+ e = window.event;
+ if ( !e )
+ return true;
+ if ( !e.keyCode )
+ return true;
+ if ( e.keyCode == 16 )
+ {
+ this.shift = true;
+ }
+ }
+ ta.onkeyup = function(e)
+ {
+ if ( !e )
+ e = window.event;
+ if ( !e )
+ return true;
+ if ( !e.keyCode )
+ return true;
+ if ( e.keyCode == 16 )
+ {
+ this.shift = false;
+ }
+ }
+}
+
+window.ajim_submit_message = function()
+{
+ var ta = document.getElementById('ajim_message');
+ if ( ta.value == '' )
+ {
+ load_component('l10n');
+ ajim_show_error($lang.get('ajim_err_no_post'));
+ return false;
+ }
+
+ var user = document.getElementById('ajim_nickname');
+ if ( user.value == '' )
+ user.value = 'Guest';
+
+ ajim_hide_message_list();
+
+ ajim_send_request({
+ mode: 'submit',
+ user: user.value,
+ message: ta.value
+ });
+
+ ta.value = '';
+}
+
+window.ajim_hide_message_list = function()
+{
+ var messages = document.getElementById('ajim_messages');
+ window.ajim_submit_whitey = whiteOutElement(messages);
+}
+
+window.ajim_show_message_list = function()
+{
+ if ( window.ajim_submit_whitey )
+ whiteOutReportSuccess(window.ajim_submit_whitey);
+ window.ajim_submit_whitey = false;
+}
+
+window.ajim_fail_message_list = function()
+{
+ if ( window.ajim_submit_whitey )
+ whiteOutReportFailure(window.ajim_submit_whitey);
+ window.ajim_submit_whitey = false;
+}