Chat Timestamp And Whisper Link *OLD*

Shows timestamp and whisper-link on mouseover of message sender

  1. // ==UserScript==
  2. // @name Chat Timestamp And Whisper Link *OLD*
  3. // @namespace tag://kongregate
  4. // @description Shows timestamp and whisper-link on mouseover of message sender
  5. // @include http://www.kongregate.com/games/*
  6. // @author Ventero
  7. // @version 1.2.2
  8. // @date 06.04.2013
  9. // @license MIT license
  10. // @require https://greasyfork.org/scripts/18206-chat-timestamp-and-whisper-link-library/code/Chat%20Timestamp%20And%20Whisper%20Link%20Library.js?version=114947
  11. // ==/UserScript==
  12.  
  13. // Written by Ventero (http://www.kongregate.com/accounts/Ventero) 06/04/09
  14. // Copyright (c) 2009-2013 Ventero, licensed under MIT/X11 license
  15. // http://www.opensource.org/licenses/mit-license.php
  16.  
  17. function init_timestamp(dom){
  18.  
  19. var holodeck = dom.holodeck,
  20. ChatDialogue = dom.ChatDialogue,
  21. $ = dom.$;
  22.  
  23. function injectMouseover(dom, $, holodeck, ChatDialogue) {
  24. var message_rollover_template = new dom.Element("div", {id: "message_rollover_template", "class": "user_rollover_container spritesite", style: "display: none"});
  25. var message_rollover = new dom.Element("div", {"class": "user_rollover spritesite"});
  26. var message_rollover_inner = new dom.Element("div", {"class": "user_rollover_inner"});
  27. var rollover_private_message_holder = new dom.Element("p", {"class": "rollover_message_private_message_link_message_link_holder"});
  28. var rollover_private_message_link = new dom.Element("a", {id: "rollover_message_private_message_link", "class": "rollover_message_private_message_link", href: "#"}).update("Private Message");
  29. rollover_private_message_holder.appendChild(rollover_private_message_link);
  30. var rollover_time_text = new dom.Element("p", {id: "rollover_time_text"});
  31. message_rollover_inner.appendChild(rollover_time_text);
  32. message_rollover_inner.appendChild(rollover_private_message_holder);
  33. message_rollover.appendChild(message_rollover_inner);
  34. message_rollover_template.appendChild(message_rollover);
  35. $('chat_tab_pane').appendChild(message_rollover_template);
  36.  
  37. var MessageRollover = dom.MessageRollover = function(chat_dialogue) {
  38. this.initialize(chat_dialogue);
  39. return this;
  40. }
  41.  
  42. MessageRollover.prototype = {
  43. initialize: function(chat_dialogue){
  44. this._active_dialogue = chat_dialogue;
  45. this._holodeck = chat_dialogue._holodeck;
  46. this._rollover_template_node = $('message_rollover_template');
  47. this._private_message_node = $('rollover_message_private_message_link');
  48. this._time_node = $('rollover_time_text');
  49.  
  50. this._private_message_observer = function(){};
  51.  
  52. if(this._rollover_template_node){
  53. var rollover = this;
  54. this._rollover_template_node.observe('mouseover', function(event){
  55. rollover.stopHide();
  56. dom.Event.stop(event);
  57. });
  58. this._rollover_template_node.observe('mouseout', function(event){
  59. rollover.beginHide();
  60. dom.Event.stop(event);
  61. });
  62. }
  63. },
  64. show: function(time, user, event){
  65. if(this._hideTimer) clearTimeout(this._hideTimer);
  66. this.updatePrivateMessageLink(user);
  67. this.updateTimeText(time);
  68. this.setRolloverPosition(event);
  69. this._rollover_template_node.show();
  70. },
  71. setRolloverPosition: function(event) {
  72. var messagenode = event.target;
  73. var current_scroll_top = this._active_dialogue._message_window_node.scrollTop;
  74. var current_message_top = messagenode.positionedOffset()[1];
  75. // nudge the user rollover up a little
  76. current_message_top = current_message_top - 9;
  77.  
  78. var new_top_val = current_message_top;
  79. if ( current_scroll_top < current_message_top ) {
  80. new_top_val = current_message_top - current_scroll_top;
  81. }
  82.  
  83. var top_style_str = new_top_val + 'px';
  84. this._rollover_template_node.setStyle({ top: top_style_str });
  85.  
  86. // set left position based on username length
  87. var username_width = messagenode.getWidth();
  88. var new_left_val = 20 + username_width;
  89.  
  90. var left_style_str = new_left_val + 'px';
  91. this._rollover_template_node.setStyle({ left: left_style_str });
  92. },
  93.  
  94. updatePrivateMessageLink: function(username){
  95. var cw = this._holodeck.chatWindow();
  96. // replace observer
  97. this._private_message_node.stopObserving('click');
  98. this._private_message_observer = dom.CapturesToInlineRegistration.decorate(function(event){
  99. // just put /w <username> in the chat input field
  100. cw.insertPrivateMessagePrefixFor(username);
  101. dom.Event.stop(event);
  102. return false;
  103. });
  104. this._private_message_node.observe('click', this._private_message_observer);
  105. },
  106. updateTimeText: function(time){
  107. this._time_node.innerHTML = time;
  108. },
  109. beginHide: function() {
  110. var rollover = this;
  111. if(this._hideTimer){ clearTimeout(this._hideTimer); }
  112. this._hideTimer = setTimeout(function() { rollover.hide(); }, 500);
  113. },
  114. stopHide: function() {
  115. clearTimeout(this._hideTimer);
  116. },
  117. hide: function() {
  118. this._rollover_template_node.hide();
  119. }
  120. };
  121.  
  122. ChatDialogue.MESSAGE_TEMPLATE.template = '<p class="#{classNames}"><span username="#{username}" time="#{time}" class="username #{userClassNames}">#{prefix}#{username}</span><span class="separator">: </span><span class="message">#{message}</span><span class="clear"></span></p>';
  123. ChatDialogue.MESSAGE_TEMPLATE.old_evaluate = ChatDialogue.MESSAGE_TEMPLATE.evaluate;
  124. ChatDialogue.MESSAGE_TEMPLATE.evaluate = function(args){
  125. var date = new Date();
  126. var hours = date.getHours();
  127. var minutes = date.getMinutes();
  128. var seconds = date.getSeconds();
  129. var time;
  130. if (holodeck._timeFormat == 12){
  131. time = (hours<10?(hours==0?"12":"0"+hours):(hours>12?(hours>21?hours-12:"0"+(hours-12)):hours))+":"+(minutes<10?"0":"")+minutes+":"+(seconds<10?"0":"")+seconds+(hours>11?" PM":" AM"); // 12-hour clock
  132. } else {
  133. time = (hours<10?"0":"")+hours+":"+(minutes<10?"0":"")+minutes+":"+(seconds<10?"0":"")+seconds; //24-hour clock
  134. }
  135. args.time = time;
  136. return this.old_evaluate(args);
  137. };
  138.  
  139. ChatDialogue.prototype.initialize = function(parent_node, onInputFunction, holodeck, user_manager) {
  140. this._messages_until_next_collection = 0;
  141. this._holodeck = holodeck;
  142. this._user_manager = user_manager;
  143. this._parent_node = parent_node;
  144. this._messages_count = 0;
  145. this._insertion_count = 0;
  146. this._onInputFunction = onInputFunction;
  147. this._message_rollover_manager = new MessageRollover(this);
  148.  
  149. // Establish references to re-used nodes
  150. this._message_window_node = parent_node.down('.chat_message_window');
  151. this._input_node = parent_node.down('.chat_input');
  152.  
  153. this._messages_to_retain = 200;
  154.  
  155. this._message_window_node.stopObserving();
  156.  
  157. this._message_window_node.observe('mouseover', function(event) {
  158. var time = event.target.getAttribute("time"),
  159. user = event.target.getAttribute("username");
  160. if (time){
  161. holodeck.activeDialogue().showMessageRollover(time, user, event);
  162. dom.Event.stop(event);
  163. }
  164. });
  165.  
  166. this._message_window_node.observe('mouseout', function(event) {
  167. holodeck.activeDialogue().hideMessageRollover();
  168. dom.Event.stop(event);
  169. });
  170.  
  171. // Bind event listeners
  172. var dialogue = this,
  173. input_node = this._input_node;
  174. this._input_node.observe('keypress', function(event) { dialogue.onKeyPress(event); });
  175. this._input_node.observe('focus', function(event) { dialogue.clearPrompt(); });
  176.  
  177. // Trigger mini-profile for clicks on usernames in chat.
  178. this._message_window_node.observe('click',
  179. function(event) {
  180. if (event.target) {
  181. var username = event.target.getAttribute('username');
  182. if(username){
  183. event.stop();
  184. user_manager.showProfile(username);
  185. }
  186. }
  187. });
  188. }
  189.  
  190. ChatDialogue.prototype.showMessageRollover = function (time, user, event){
  191. this._message_rollover_manager.show(time, user, event);
  192. }
  193.  
  194. ChatDialogue.prototype.hideMessageRollover = function(){
  195. this._message_rollover_manager.beginHide();
  196. }
  197. }
  198.  
  199. if(holodeck && ChatDialogue){
  200. if(!ChatDialogue.prototype && dom.CDprototype)
  201. ChatDialogue.prototype = dom.CDprototype;
  202.  
  203. if(!holodeck.__mouseover){
  204. holodeck.__mouseover = true;
  205.  
  206. var script = document.createElement("script");
  207. script.type = "text/javascript";
  208. script.textContent = "(" + injectMouseover.toString() + ")(window, $, holodeck, ChatDialogue);";
  209. document.body.appendChild(script);
  210. setTimeout(function(){document.body.removeChild(script);}, 100);
  211.  
  212. holodeck.addChatCommand("timeformat", function(l,n){
  213. var k = n.match(/^\/\S+\s+(\d+)/),
  214. m = "",
  215. q = l.activeDialogue();
  216. k && (m=k[1]);
  217. if(m==12 || m==24){
  218. l._timeFormat = m;
  219. window.setTimeout(function(){GM_setValue("kong_timeformat", m);}, 0);
  220. q.displayMessage("Timeformat", "Set to "+m+"-hour clock (hh:mm:ss"+(m==12?" AM/PM)":")"), { "class": "whisper received_whisper"}, {non_user: true});
  221. } else {
  222. q.displayMessage("Timeformat", "Allowed values: 12 and 24", { "class": "whisper received_whisper"}, {non_user: true});
  223. }
  224. return false;
  225. });
  226.  
  227. var timeformat = 12;
  228.  
  229. if(typeof GM_setValue !== "undefined"){
  230. timeformat = GM_getValue("kong_timeformat", 12)||12;
  231. }else{
  232. GM_setValue = function(){};
  233. }
  234.  
  235. holodeck._timeFormat = timeformat;
  236. }
  237. }
  238. }
  239.  
  240. function check(){
  241. var dom = (typeof unsafeWindow === "undefined"?window:unsafeWindow);
  242. var injectScript = dom.injectScript||(document.getElementById("injectScriptDiv")?document.getElementById("injectScriptDiv").onclick():0);
  243. if(injectScript){
  244. injectScript(init_timestamp, 0);
  245. } else if(!dom._promptedFramework && !/Chrome/i.test(navigator.appVersion)){
  246. if(confirm("You don't have the latest version of the framework-script!\n" +
  247. "Please install it, otherwise the scripts won't work.\n" +
  248. "Clicking ok will open a new tab where you can install the script"))
  249. window.open("http://userscripts.org/scripts/show/54245", "_blank");
  250. dom._promptedFramework = true;
  251. }
  252. }
  253.  
  254. setTimeout(check, 0);