diff -r 000000000000 -r db23957ad1c7 plugins/ajim/shoutbox.js --- /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') + '
'; + 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; +}