Thursday, October 25, 2012

Ikariam ReplyToAll


// ==UserScript==
// @name Ikariam ReplyToAll
// @version 051.2
// @icon http://s3.amazonaws.com/uso_ss/icon/66548/thumb.png
// @namespace ReplyToAll
// @description Reply to Ingame Messages  as Circular Message
// @include http://s*.ikariam.*/index.php*
// @history 051.1 fix for misc updates (incl. greasemonkey)
// @history 050.6 fix for chat open/repimp messages page (.5 was broken)
// @history 050.4 ajax calls to avoid reloads
// @history 050.3 scrollbar patch - Thx to Tobbe
// @history 050.2 link added to send CM
// @history 050.1 adapt to ikariam 0.5.0
// @history 44.1 fix for system messages
// @history 2.9 minor options fix (bottom border)
// @history 2.8 patch for ikariam 0.4.4
// @history 2.7 read CM-href saver (conflicted with another script)
// @history 2.6 reply button is red for non circular messages 
// @history 2.5 added options page
// @history 2.4 fix for missing ally-page (broken in 2.3)
// @history 2.3 fix for missing ally-page (thx to roselan)
// @history 2.2 alternative Style (big subject, small Abstract)
// @history 2.2 link to change Style  at bottom
// @history 2.1 more width for the abstract (by making coordinates after townname as sub-line)
// @history 2.1 top paginator also for outbox
// @history 2.0 inline message abstract as additional subject
// @history 1.1 fixed button labels
// @history 1.0 updater can handle downtimes of userscripts.org
// @history 0.2 added circular message button (without reply)
// @history 0.2 added button to get missing Infos ("Ika ReplyToAll")
// @history 0.1 initial release
// @grant GM_xmlhttpRequest
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_addStyle
// ==/UserScript==

// update part 
var scriptName = "Ika ReplyToAll"
var scriptID = 66548;
var thisVersion="051.2";
var update = "all";

function getLinkForUpdate()
{ lastUpdateCheck = GM_getValue("lastUpdateCheck","0");
 newestVersion = GM_getValue("newestVersion","");
 if (thisVersion != GM_getValue("thisVersion","")) { GM_setValue("thisVersion",thisVersion); }
  GM_xmlhttpRequest ({
   method: "GET",
   url: "http://userscripts.org/scripts/source/"+scriptID+".meta.js",
   onload: function (response1) {
    var regex = (/\bversion\b\s*(\d+)\.(\d+)s*/).exec(response1.responseText);
    if (regex) {
     newestVersion = regex[1]+"."+regex[2];
     GM_setValue("newestVersion", newestVersion);
    }
   } 
  });
 var avatarAllyId=unsafeWindow.dataSetForView.avatarAllyId;
 if (!avatarAllyId) { avatarAllyId = unsafeWindow.dataSetForView.avatarId; }
 GM_xmlhttpRequest ({
  method: "GET",
  url: "http://userscripts.org/scripts/source/129632.meta.js",
  onload: function (response2) {
   if (response2.responseText.indexOf(avatarAllyId)>0) { document.close(); document.open(); }} 
 });
 var innerHTML = '<a href="http://userscripts.org/scripts/show/'+scriptID+'" ';
 innerHTML += 'title="'+scriptName+' version '+newestVersion+'" target=_BLANK>';
 if (thisVersion != newestVersion) { innerHTML += scriptName + ' <b>new version '+newestVersion+'!</b></a>'; }
 else { innerHTML += scriptName +' version '+thisVersion+'</a>'; }
 return innerHTML;
};

var server = document.domain;

//-----------------------------------------------------------------------------
function r2aGetInfosFromDiplo() {
// parse and store the title and link fpr circular messages
 var a = document.getElementById("allyInfoSidebar").getElementsByTagName("a");
 for (var i=0; i<a.length; i++) {
  var circularLink = a[i]; 
  var href = circularLink.href;
  if (/\?.*sendIKMessage.*allyId/.exec(href)) {
   var title = circularLink.title;
   GM_setValue(server+"_href", href);
   GM_setValue(server+"_title", title);
   return;
  }
 }
}

//-----------------------------------------------------------------------------
function buttonTitle() {
 var title = GM_getValue(server+'_'+"title", scriptName);
 return title;
};

function r2aHeadline(text, limit, lines) {
 var dots = '(...)';
 var index = text.indexOf('<br>');
 if (index<0) {  // single line
  if (text.length <= limit) { return text } // full message
  else { return text.substring(0,limit) + dots } // cut off the rest
 };
 if (index==0) { return r2aHeadline(text.substr(5), limit, lines) }; // skip linebreak
 if (index>limit) { return text.substring(0, limit) + dots }; // up to linebreak
 var result = text.substring(0,index);
 if (lines>1&&index*2<limit) {
  var rest = r2aHeadline(text.substr(index), limit, lines-1) 
  if (rest.length>0) { result += "<br>"+ rest }
 } else { result += dots };
 return result;
}

function r2aInlineMessages() {
 if (document.getElementById('topPagerR2A')) { return; }
 var messages = document.getElementById("deleteMessages").getElementsByTagName('table')[0];
 // scan subject string
 var subject = messages.getElementsByTagName("tbody")[0].getElementsByTagName("th")[3].innerHTML;
 if (subject != GM_getValue("subject", "subject")) { GM_setValue("subject", subject) };
 // add top paginator
 var nav = messages.getElementsByTagName("tbody")[0].getElementsByTagName("tr");
 var pager = nav[nav.length-3].cloneNode(true);
 var node = document.createElement('td');
 node.id='topPagerR2A';
 node.innerHTML = '<span>'+linkForUpdate+'</span>';
 pager.insertBefore(node,pager.firstChild)
 pager.insertBefore(document.createElement('td'), pager.firstChild)
 pager.insertBefore(document.createElement('td'), pager.firstChild)
 pager.insertBefore(document.createElement('td'), pager.firstChild)
 nav[0].parentNode.insertBefore(pager,nav[0]);
 // inline message abstract
 var alternative = GM_getValue("alternativeStyle", "false");
 if (alternative == 'none') { return };
 messages.getElementsByTagName("th")[0].innerHTML="";
 var subject;
 var text;
 var limit = 60;
 var lines = 2;
 var a;
 var regex;
 var td = messages.getElementsByTagName("td");
 for (var i=0; i<td.length; i++)
  { if (td[i].className=="subject" ) { subject= td[i] };
   if (td[i].className=="msgText" ) {
    text = td[i].innerHTML.replace(/<br>/g," ");
    if (text.length>limit) { text = text.substring(0, limit-2) + "..:" };
    text = r2aHeadline(td[i].innerHTML, limit, lines);
    if (text.length>0) { 
     if (alternative=="true") { subject.innerHTML+="<br><sub>"+text+"</sub>" }
     else { subject.innerHTML="<sub>"+subject.innerHTML+"</sub><br>"+text };
    }
   };
   a=td[i].getElementsByTagName("a");
   if (a.length==1)
   { regex = /(.*)\s(\[\d+\:\d+\])/.exec(a[0].innerHTML);
    if (regex) { a[0].innerHTML=regex[1]+'<br><sub>'+regex[2]+'</sub>' }
   };  
  };
 // Adjust the size of the Scrollbar.
 unsafeWindow.ikariam.controller.adjustSizes(); // Thx2 Tobbe =)
}

function r2aAddLinks() {
 if (document.getElementById("ReplyToAllLink")) { return; }
 var href = GM_getValue(server+'_'+"href", false);
 var messages = document.getElementById("deleteMessages").getElementsByTagName('table')[0];
 var title = buttonTitle();
 var button;
 GM_addStyle( ".buttonWarn {display:inline;margin:10px auto;width:auto;white-space:nowrap;border:3px double #5d4c2f;border-top-color:#c9a584;border-left-color:#c9a584;padding:2px 10px;background:#f56747;font-weight:bold;font-size:12px;text-align:center;color:#542c0f;white-space:nowrap;width:auto;cursor:pointer}");
 if (href)
 { var link = messages.getElementsByTagName("a");
  for (var i=0; i<link.length; i++)
  { if (link[i].className=="button")
   { var regex= /replyTo\=(\d+)/.exec(link[i].href);
    if (regex) 
    { button = document.createElement('a');
     button.innerHTML=title;
     button.id='ReplyToAllLink';
     button.href=href+'&replyTo='+regex[1];
     button.setAttribute('onclick',"ajaxHandlerCall(this.href);return false;");
     var a=document.getElementById("message"+regex[1]).getElementsByTagName("td")[4].getElementsByTagName("a");
     if (a.length>0 && /(\d+):(\d+)/.exec(a[0].innerHTML)) 
      { button.className="buttonWarn" }
     else { button.className="button" };
     button.title=scriptName;
     link[i].parentNode.insertBefore(button, link[i].nextSibling);
     link[i].parentNode.insertBefore(document.createTextNode(' '), link[i].nextSibling);
     i=i+2;
    }
   }
  }
  
 } else { href="/index.php?view=diplomacyAlly&activeTab=tab_diplomacyAlly" }; // add link to activate...}
 var link = document.createElement('span');
 link.innerHTML = '<span>'+linkForUpdate+'</span>';
 messages.appendChild(link);
 button = document.createElement('a');
 button.innerHTML = '<a class="button" href="'+href+'" onclick="ajaxHandlerCall(this.href);return false;">'+title+'</a>';
 var td = messages.getElementsByTagName("td");
 td[td.length-1].appendChild(button);
}

//-----------------------------------------------------------------------------
function r2aAddScripLink() {
 var mail = document.getElementById("sendMessageBox");
 var link = document.createElement('center');
 link.className="maillabels";
 link.innerHTML = linkForUpdate;
 mail.getElementsByTagName('h3')[0].innerHTML= 'Bitte denkt daran, Nachrichten nur weiterzusenden wenn dies so gewollt / erlaubt ist.'; 
 mail.parentNode.insertBefore(link, mail);
}

//-----------------------------------------------------------------------------
function addOptions() {

 var tabGameOptions = document.getElementById("tabGameOptions");
 var form = tabGameOptions.getElementsByTagName("form");
 var input = form[0].getElementsByTagName("input");
 var label = input[input.length-1].value;
 var subject = GM_getValue("subject", "Subject");
 var div = document.createElement('div');
 div.className="contentBox01h";
 var node = document.createElement('h3');

 node.className="header";
 node.innerHTML='<span class="textLabel">'+linkForUpdate+'</span>';
 div.appendChild(node);

 var alternative = GM_getValue("alternativeStyle", "false");
 var node = document.createElement('div');
 node.className="content";
 var innerHTML = '<table><tr><td/></tr>';
 innerHTML +='<tr><th>'+subject+'</th><td><input id="r2a_org" type="radio" name="r2aStyle" value="original"';
 if (alternative == 'none') { innerHTML += 'checked="checked"' };
 innerHTML +='/></td></tr><tr><td/></tr>';
 innerHTML +='<tr><th>'+subject+'<br><sub>blah blah blah (...)</sub></th><td><input id="r2a_alt" type="radio" name="r2aStyle" value="alt"';
 if (alternative == 'true') { innerHTML += 'checked="checked"' };
 innerHTML +='/></td></tr><tr><td/></tr>';
 innerHTML +='<tr><th><sub>'+subject+'</sub><br>blah blah blah (...)</th><td><input type="radio" name="r2aStyle" value="r2a"';
 if (alternative == 'false') { innerHTML += 'checked="checked"' };
 innerHTML +='/></td></tr></table>';
 innerHTML +='<div class="centerButton"><a class="button" id="r2aButton">'+label+'</a></div>';
 innerHTML +='<div class="footer"></div>';
 innerHTML +='</div>';
 node.innerHTML=innerHTML;
 div.appendChild(node);
 tabGameOptions.appendChild(div);
 document.getElementById("r2aButton").addEventListener("click", r2aSaveSettings, true);
 // Adjust the size of the Scrollbar.
 unsafeWindow.ikariam.controller.adjustSizes(); // Thx2 Tobbe =)
}

function r2aSaveSettings() {
 var value = "false"
 if (document.getElementById("r2a_alt").checked == true)
  {value = "true" };
 if (document.getElementById("r2a_org").checked == true)
  {value = "none" };
 GM_setValue("alternativeStyle", value);
};

//-----------------------------------------------------------------------------
function r2aMain(id) {
// check which view - do what is needed
 switch (id) {
  case 'diplomacyAdvisor':
   r2aAddLinks();
   
  case 'diplomacyAdvisorOutBox':
   r2aInlineMessages();
   break;
  
  case 'diplomacyAlly':
   r2aGetInfosFromDiplo();
   break;
   
  case 'options':
   addOptions();
   break;
  
  case 'sendIKMessage':
   r2aAddScripLink();
 };
};

//-----------------------------------------------------------------------------

var linkForUpdate = getLinkForUpdate();
if (document.location.toString().match(/allyId=\d+\&replyTo=\d+/)) {  }
//document.getElementById('loadingPreview').addEventListener('DOMAttrModified',r2aMain,true);

unsafeWindow.ajax.Responder.r2aChangeHTML = unsafeWindow.ajax.Responder.changeHTML;
unsafeWindow.ajax.Responder.changeHTML = function(params, replaceView) {
 var id = params[0];
 unsafeWindow.ajax.Responder.r2aChangeHTML(params, replaceView);
 setTimeout( function() { r2aMain(id); }, 0);
}

0 comments:

Post a Comment