// ==UserScript==
// @name SpyShare
// @namespace SpyShareNamespace
// @author [TSN]Kanly
// @include *.ogame.gameforge.com/game/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @description SpyShare for Ogame: Allows you to share spy reports with your buddies even if you are not in the same alliance
// @version 2.0
// ==/UserScript==
var SSR = {};
var noSpyShareTxt = "\n\n\ If you see this message then you don't have the SpyShare Tool, it is not active/working or Commander is not activated. For more info check the[url=https://greasyfork.org/scripts/4739-spyshare] SpyShare Page[/url]";
function main() {
SSR.Data.init();
SSR.Updater.check();
SSR.Init.init();
}
SSR.Updater = {
scriptId: 4739,
updStr: "",
scriptName: "",
checkD: 1,
checkH: 0,
checkM: 0,
checkS: 0,
checkInterval: 0,
currVersion: 0,
parseVersion: function(data) {
return parseInt(data.match(/@version\s+\d+/)[0].match(/\d+/));
},
call: function(alertResp) {
GM_xmlhttpRequest({
method: 'GET',
url: 'https://greasyfork.org/scripts/4739-spyshare/code/' + this.scriptId + '.meta.js',
onload: function (response) {
SSR.Updater.compare(response.responseText, alertResp);
}
});
},
compare: function(metaData, alertResp) {
try{
var newVersion = parseInt(metaData.match(/@version\s+[\d\.]+/)[0].match(/[\d\.]+/)[0].replace(".",""));
if (newVersion > this.currVersion) {
if (confirm('A new version of the ' + this.scriptName + ' user script is available. Do you want to update?')) {
SSR.Storage.store(this.updStr, new Date().getTime() + "");
top.location.href = 'https://greasyfork.org/scripts/4739-spyshare/code/' + this.scriptId + '.user.js';
}
else {
if (confirm('Do you want to turn off auto updating for this script?')) {
SSR.Storage.store(this.updStr, "off");
GM_registerMenuCommand("Auto Update " + this.scriptName,
function () {
SSR.Storage.store(SSR.Updater.updStr, new Date().getTime() + "");
SSR.Updater.call(true);
});
alert('Automatic updates can be re-enabled for this script from the User Script Commands submenu.');
}
else {
SSR.Storage.store(this.updStr, new Date().getTime() + "");
}
}
}
else {
if (alertResp)
alert('No updates available for ' + this.scriptName);
SSR.Storage.store(this.updStr, new Date().getTime()+ "");
}
}catch(e){}
},
check: function() {
try {
var meta = GM_getResourceText('meta');
var updStat;
var timeNow = new Date().getTime();
//this.scriptName = meta.match(/@name\s+(.*)\s*\n/i)[1];
this.scriptName = GM_info.script.name;
//this.currVersion = meta.match(/@version\s+\d+/)[0].match(/\d+/);
this.currVersion = parseInt(GM_info.script.version.replace(".",""));
this.updStr = "updated_" + this.scriptId;
this.checkInterval = ((((this.checkD*24 + this.checkH)*60 + this.checkH)*60 + this.checkM)*60 + this.checkS)*1000;
updStat = SSR.Storage.get(this.updStr, 0);
if (updStat === "off") {
GM_registerMenuCommand("Enable " + this.scriptName + " updates",
function () {
SSR.Storage.store(SSR.Updater.updStr, new Date().getTime() + "");
SSR.Updater.call(true);
});
}
else {
if (timeNow > parseInt(updStat) + this.checkInterval) {
SSR.Storage.store(this.updStr, timeNow + "");
this.call();
}
}
GM_registerMenuCommand("Check " + this.scriptName + " for updates",
function () {
SSR.Storage.store(SSR.Updater.updStr, new Date().getTime() + '');
SSR.Updater.call(true);
});
}catch(e){}
}
};
SSR.Data = {
universe: '',
playerId: 0,
buddies: [],
page: '',
allianceName: '',
init: function() {
SSR.Data.playerId = document.getElementsByName("ogame-player-id")[0].content;
SSR.Data.universe = document.getElementsByName("ogame-universe")[0].content;
SSR.Data.allianceName = document.getElementsByName("ogame-alliance-tag")[0].content;
SSR.Data.page = (unsafeWindow.location+"").match(/page=[^&]+((?=&)|(?=#)|)/g)[0].replace("page=", "");
}
};
SSR.Storage = {
getPrefix: function() {
var s = SSR.Data.universe+"::"+SSR.Data.playerId+":::";
return s;
},
store: function(name, value) {
GM_setValue(SSR.Storage.getPrefix()+name, value);
},
get: function(name, defValue) {
return GM_getValue(SSR.Storage.getPrefix()+name, defValue);
},
remove: function(name) {
GM_deleteValue(SSR.Storage.getPrefix()+name);
}
};
SSR.Init = {
init: function() {
if (SSR.Init.hasCommander() === false)
return;
SSR.Buddies.getBuddies();
if (SSR.Data.page === "messages") {
GM_addStyle(SSR.shareSection.getCss());
SSR.Utils.waitForKeyElements('#mailz', SSR.Reports.fullSpyReports, false);
SSR.Utils.waitForKeyElements('.read.messagebox', SSR.Reports.widgetMessagePopUp, false);
}
},
hasCommander: function() {
var found = false;
$('#officers').find('a.tooltipHTML.on').each(function() {
var cls = $(this).attr('class');
if (cls.indexOf('commander') != -1)
found = true;
});
return found;
}
};
SSR.Reports = {
widgetMessagePopUp: function(jNode) {
var widget = jNode;
var isSharedRep = false;
var isSpyReport = false;
var isAllianceSharedRep = false;
if (jNode.find('.infohead th[scope="row"]').next().text().match(/\[spyShare\]/g)) {
isSharedRep = true;
}
else if ((kk = jNode.find('.textWrapper .note').text().match(/_SPY_SHARE_/g)) && kk && kk.length === 2) {
isSharedRep = true;
isAllianceSharedRep = true;
}
else if ($('.infohead span.playerName a[target="_parent"]').exists() === false && $('.defenseattack.spy').exists()) {
isSpyReport = true;
}
if (isSharedRep === false && isSpyReport === false)
return;
if (isSharedRep) {
var info = jNode.find('.note .other.newMessage');
if (info.exists() === false && isAllianceSharedRep === true)
info = jNode.find('.textWrapper .note');
info = info.text();
info = info.match(/_SPY_SHARE_.+_SPY_SHARE_/g)[0].replace(/_SPY_SHARE_/g, '');
info = JSON.decode(info);
jNode.find('.showMsgNavi').remove();
jNode.find('.answerHeadline.open').remove();
jNode.find('.answerForm').remove();
jNode.find('.note').html(SSR.Reports.formSharedReportHtml(info));
}
else if (isSpyReport) {
jNode.find('.defenseattack.spy').parent().append(SSR.shareSection.getHtml(true));
jNode.find('.textWrapper').css('max-height', 'none');
SSR.shareSection.initEvents(jNode);
}
},
fullSpyReports: function(jNode) {
$('[id^="spioDetails_"]').each(function () {
$(this).find('.defenseattack.spy').parent().append(SSR.shareSection.getHtml(true));
});
SSR.shareSection.initEvents(jNode);
},
formSharedReportHtml: function(info) {
var html = '';
var resTable = '';
var tables = '';
var header = '';
html = formHeader(info.header);
html += formResTable(info.resources);
for (var section in info.data) {
if (info.data.hasOwnProperty(section) && section !== "resources") {
html += formTable(section+"", info.data[section]);
}
}
function formHeader(hdr) {
var s =
'<table cellpadding="0" cellspacing="0" class="material spy">'+
'<tbody>'+
'<tr>'+
'<th class="area" style="color: #6f9fc8" colspan="6" plunder_status='+hdr.pl_st+'>'+
'<span style="float: left; color: '+hdr.act_clr+';" title='+hdr.act_title+'> '+hdr.act+'</span>'+hdr.part1+
'<a target="_parent" href="javascript:showGalaxy('+SSR.Utils.formatCoords(hdr.coords, true)+')">'+SSR.Utils.formatCoords(hdr.coords, false)+'</a>'+hdr.part2+
'<span class='+hdr.tar_class+'>'+hdr.player+'</span>)'+hdr.part3+
'</th>'+
'</tr>';
return s;
}
function formResTable(res) {
var s =
'<tr class="areadetail">'+
'<td colspan="6">'+
'<table class="fragment spy2">'+
'<tbody>'+
'<tr>'+
'<td class="item">'+res[0].name+'</td>'+
'<td>'+res[0].value+'</td>'+
'<td class="item">'+res[1].name+'</td>'+
'<td>'+res[1].value+'</td>'+
'</tr>'+
'<tr>'+
'<td class="item">'+res[2].name+'</td>'+
'<td>'+res[2].value+'</td>'+
'<td class="item">'+res[3].name+'</td>'+
'<td>'+res[3].value+'</td>'+
'</tr>'+
'</tbody>'+
'</table>';
return s;
};
function formTable(title, data) {
var html = '<table cellpadding="0" cellspacing="0" class="fleetdefbuildings spy">'+
'<tbody>'+
'<tr>'+
'<th class="area" colspan="4">'+title+'</th>'+
'</tr>';
var n = 0;
for (var entry in data) {
if (data.hasOwnProperty(entry)) {
if (n%2 === 0)
html += '<tr>';
html += '<td class="key">'+entry+'</td>'+
'<td class="value">'+data[entry]+'</td>';
if (n%2 === 1)
html += '</tr>';
n++;
}
}
html += '</tbody>'+
'</table>';
return html;
}
return html;
},
extractSpyReportData: function(buttTable) {
var item = buttTable;
var info = {};
var res = [];
var curRes = {};
var header = {};
var fltdefbuilt = {};
/*
header:{
pl_st:1,
act_title: Activitate,
tar_class: status_abbr_honorableTarget,
act:33,
act_clr: #848484
player: nume,
coords:["1", "167", "12"],
part1: Resurse la Planeta',
part2: Jucator:,
part3: in 02-02 18:28:02
}
<th class="area" colspan="6" plunder_status="1">
<span style="float: left; color: #848484;" title="Activitate"> -- </span>
Resurse la<figure class="planetIcon planet tooltip js_hideTipOnMobile" title="Planeta"></figure>Caledonia <a target="_parent" href="javascript:showGalaxy(1,172,8)">[1:172:8]</a>
(Jucator: <span class="status_abbr_honorableTarget">focul</span>) in 02-02 14:33:23
</th>
'53 ' 'Resurse la HomeDepo' '[1:167:12]' '(Jucator: ' 'Billy') ' in 02-02 18:28:02'
activity part1 coords part2 player date
*/
// get activity
item.siblings('.aktiv.spy').each(function () {
var item = $(this);
header.act_title = item.find('th.area').text();
if (item.find('font').exists()) {
header.act_clr = item.find('font').attr('color');
header.act = item.find('font').text();
}
else {
header.act_clr = "#848484";
header.act = "-- ";
}
});
// get header info
item.siblings('.material.spy').find('th.area').each(function () {
var item = $(this);
var coords = {};
var txt;
// plunder status
header.pl_st = (item.is('[plunder_status]') === true) ? item.attr("plunder_status") : "0";
// get target name
item.find('span:last').each(function() {
header.player = $(this).text();
header.tar_class = $(this).attr("class");
});
txt = item.text();
txt = txt.replace(header.act, '');
txt = txt.replace(header.player, '');
// get coords
var coordsStr = txt.match(/\[[^\]]+\]/g);
if (coordsStr && coordsStr[0]) {
header.coords = coordsStr[0].match(/\d+/g);
txt = txt.replace(coordsStr, '');
}
else
header.coords = ["0", "0", "0"];
// get "(Player: "
var playerSec = txt.match(/\([^\)]+/g);
if (playerSec && playerSec[0]) {
header.part2 = playerSec[0];
txt = txt.replace(playerSec, '');
} else
header.part2 = "(Player: ";
// get time
var dateSec = txt.match(/[^\)]+(.+)/);
if (dateSec && dateSec[1]) {
header.part3 = dateSec[1].replace(')', '');
txt = txt.replace(dateSec[1], '');
}
else
header.part3 = " no time available";
header.part1 = txt;
});
info.header = header;
// get resources
item.siblings('.material.spy').find('.fragment.spy2').each(function() {
var resCont = $(this);
resCont.find('td').each(function() {
var item = $(this);
if (item.attr('class') === 'item')
curRes.name = item.text();
else {
curRes.value = item.text();
res.push(curRes);
curRes = {};
}
});
});
info.resources = res;
// get fleet
item.siblings('.fleetdefbuildings.spy').each(function() {
var section = $(this).find('th.area').text();
var values = {};
$(this).find('td.key').each(function() {
values[$(this).text()] = $(this).next().text();
});
fltdefbuilt[section] = values;
});
info.data = fltdefbuilt;
return info;
}
};
SSR.Buddies = {
getBuddies: function() {
SSR.Data.buddies = JSON.decode(SSR.Storage.get("myBuddies", '[]'));
SSR.Utils.waitForKeyElements('#buddylist', SSR.Buddies.extractBuddies, false);
if (SSR.Data.buddies.length === 0)
SSR.Buddies.requestBuddies();
},
requestBuddies: function() {
var url = 'http://'+SSR.Data.universe+'/game/index.php?page=buddies&action=9&ajax=1';
var host = SSR.Data.universe;
var ref = 'http://'+SSR.Data.universe+'/game/index.php?page=overview';
var contType = 'application/x-www-form-urlencoded';
var payload = '';
SSR.Utils.sendRequest({
method: 'GET',
url: url,
host: host,
acc: '*/*',
ref: ref,
contType: contType,
payload: '',
onloadFun: SSR.Buddies.parseBuddiesStr});
},
parseBuddiesStr: function(resp) {
var html = $.parseHTML(resp);
SSR.Buddies.extractBuddies($(html, 'table#buddylist'));
},
extractBuddies: function(jNode) {
SSR.Data.buddies.length = 0;
jNode.find('tbody tr').each(function() {
var item = $(this);
var name = item.find('span:first').text();
var id = item.find('.deleteBuddy').attr('id');
SSR.Data.buddies.push({id:id, name:name});
});
SSR.Storage.remove("myBuddies");
SSR.Storage.store("myBuddies", JSON.encode(SSR.Data.buddies));
}
};
SSR.shareSection = {
getCss: function() {
var css =
'a.sendShareInfo.ok {'+
'color: green;'+
'}'+
'a.sendShareInfo.err {'+
'color: red;'+
'}'+
'td.blockTD {'+
'display: inline-block;'+
'}'+
'.dropdown-check-list {'+
'display: inline-block;'+
'font-family: Verdana,Arial,SunSans-Regular,Sans-Serif;'+
'font-size: 12px;'+
'}'+
'.dropdown-check-list .anchor {'+
'position: relative;'+
'cursor: pointer;'+
'display: inline-block;'+
'padding: 5px 50px 5px 10px;'+
'background-color: #23282d;'+
'border: 1px solid #000;'+
'color:#6f9fc8;'+
'-webkit-touch-callout: none;'+
'-webkit-user-select: none;'+
'-khtml-user-select: none;'+
'-moz-user-select: none;'+
'-ms-user-select: none;'+
'user-select: none;'+
'}'+
'.dropdown-check-list .anchor:after {'+
'position: absolute;'+
'content: "";'+
'border-left: 2px solid lawnGreen;'+
'border-top: 2px solid lawnGreen;'+
'padding: 5px;'+
'right: 10px;'+
'top: 20%;'+
'-moz-transform: rotate(-135deg);'+
'-ms-transform: rotate(-135deg);'+
'-o-transform: rotate(-135deg);'+
'-webkit-transform: rotate(-135deg);'+
'transform: rotate(-135deg);'+
'}'+
'.dropdown-check-list.visible .anchor:after {'+
'top: 40%;'+
'-moz-transform: rotate(45deg);'+
'-ms-transform: rotate(45deg);'+
'-o-transform: rotate(45deg);'+
'-webkit-transform: rotate(45deg);'+
'transform: rotate(45deg);'+
'}'+
'.dropdown-check-list ul.items {'+
'padding: 2px;'+
'display: none;'+
'margin: 0;'+
'border: 1px solid #000;'+
'border-top: none;'+
'background-color: #161A1F;'+
'color: #848484;'+
'}'+
'.dropdown-check-list ul.items li, .dropdown-check-list ul.items input {'+
'cursor: pointer;'+
'list-style: none;'+
'-webkit-touch-callout: none;'+
'-webkit-user-select: none;'+
'-khtml-user-select: none;'+
'-moz-user-select: none;'+
'-ms-user-select: none;'+
'user-select: none;'+
'}'+
'.dropdown-check-list.visible li.groupHeader {'+
'color: #6f9fc8;'+
'}'+
'.dropdown-check-list.visible .items {'+
'display: block;'+
'}';
return css;
},
getHtml: function(addTable) {
var html = '';
if (addTable)
html += '<table cellpadding="0" cellspacing="0" class="spy"><tbody>'+
'<tr><th class="area" colspan="4">Share it</th></tr>';
html +=
'<tr>'+
'<td>' + SSR.shareSection.getListHtml() + '</td>'+
'<td class="blockTD"><a class="btn_blue share_button">Share</a></td>'+
'<td class="blockTD"><a class="sendShareInfo"></a></td>'+
'</tr>';
if (addTable)
html += '</tbody></table>';
return html;
},
getListHtml: function() {
// buddies: [{id:id, name:name}, ... ]
var html =
'<div class="shareList dropdown-check-list">'+
'<span class="anchor">Share With</span>'+
'<ul class="items">';
if (SSR.Data.buddies.length !== 0)
html += '<li class="groupHeader"><input type="checkbox" data="Friend" class="shareGroup"/>All Friends </li>';
for (var bud in SSR.Data.buddies) {
html += '<li><input type="checkbox" data="'+SSR.Data.buddies[bud].id+'" class="share Friend" />'+SSR.Data.buddies[bud].name+'</li>';
}
html += '<li class="groupHeader"><input type="checkbox" id="allianceShare" data="Ally" class="shareGroup" />'+SSR.Data.allianceName+' Alliance </li>';
/*
for (var allId in allies) {
if (allies.hasOwnProperty(allId))
html += '<li><input type="checkbox" data="'+allId+'" class="share Ally" />'+allies[allId]+'</li>';
}
*/
html += '</ul>'+
'</div>';
return html;
},
updateShareNote: function(jNode, status, txt) {
if (status === 'err')
jNode.parent().siblings().find('a.sendShareInfo').removeClass('ok').addClass('err');
else
jNode.parent().siblings().find('a.sendShareInfo').removeClass('err').addClass('ok');
jNode.parent().siblings().find('a.sendShareInfo').text(txt);
},
initEvents: function(wrapper) {
// show/hide list
wrapper.find('.shareList .anchor').click(function(ev) {
var item = $(this).parent();
if (item.hasClass('visible'))
item.removeClass('visible');
else
item.addClass('visible');
});
// check/uncheck groups
wrapper.find('.shareList input:checkbox.shareGroup').click(function(ev) {
var item = $(this);
var newState = item.is(':checked');
var cls = item.attr('data');
if (!newState)
item.parent().siblings().find('input:checkbox:checked.'+cls).click();
else
item.parent().siblings().find('input:checkbox.'+cls).not(':checked').click();
});
// share button
wrapper.find('a.share_button').click(function(ev) {
var item = $(this);
var dest = [];
var inf = '';
var allianceShare = false;
ev.preventDefault();
item.parent().siblings().find('input:checked.share').each(function() {
dest.push($(this).attr('data'));
});
allianceShare = item.parent().siblings().find('#allianceShare:checked').exists();
if (dest.length === 0 && allianceShare === false) {
SSR.shareSection.updateShareNote(item, 'err', 'No destination selected!');
return;
}
else {
info = SSR.Reports.extractSpyReportData(item.closest('table'));
SSR.Utils.sendSharedMessages(item, dest,
'[spyShare] '+info.header.player+" ["+SSR.Utils.formatCoords(info.header.coords, false)+"]",
"_SPY_SHARE_"+JSON.encode(info)+"_SPY_SHARE_"+noSpyShareTxt, allianceShare);
}
});
}
};
SSR.Utils = {
sendRequest: function(opts) {
var hdr = {
'Accept-Language': 'en-us,en;q=0.5',
'Accept-Encoding': 'gzip, deflate',
'Connection': 'keep-alive'
};
var onLoadFun = opts.onLoadFun;
hdr.Accept = (opts.acc && opts.acc !== '') ? opts.acc : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
if (opts.host) hdr.Host = opts.host;
if (opts.ref) hdr.Referer = opts.ref;
if (opts.contType) hdr['Content-Type'] = opts.contType;
GM_xmlhttpRequest({
method: opts.method,
url: opts.url,
headers: hdr,
data: opts.payload,
onload: function(response) {
if (opts.onloadFun)
opts.onloadFun(response.responseText);
},
onabort: function(resp) {
if (opts.onabortFun)
opts.onabortFun(resp.responseText);
},
onerror: function(resp) {
if (opts.onerrorFun)
opts.onerrorFun(resp.responseText);
},
ontimeout: function(resp) {
if (opts.ontimeoutFun)
opts.ontimeoutFun(resp.responseText);
}
});
},
sendSharedMessages: function(jNode, dest, subj, content, allianceShare) {
var sent = 0;
var curBuddy = 0;
var totalMsg = dest.length;
if (allianceShare) {
totalMsg++;
curBuddy = -1;
sendAlliance();
}
else {
sendSingle(dest[curBuddy]);
}
function sendAlliance() {
var url = 'http://'+SSR.Data.universe+'/game/index.php?page=allianceBroadcast';
var host = SSR.Data.universe;
var ref = 'http://'+SSR.Data.universe+'/game/index.php?page=alliance';
var contType = 'application/x-www-form-urlencoded';
var payload = 'empfaenger=200&'+'&text='+content+'&ajax=1';
SSR.Utils.sendRequest({
method: 'POST',
url: url,
host: host,
acc: '',
ref: ref,
contType: contType,
payload: payload,
onloadFun: messageSentOk});
}
function sendSingle() {
var url = 'http://'+SSR.Data.universe+'/game/index.php?page=messages&to='+dest[curBuddy];
var host = SSR.Data.universe;
var ref = 'http://'+SSR.Data.universe+'/game/index.php?page=messages';
var contType = 'application/x-www-form-urlencoded';
var payload = 'betreff='+subj+'&text='+content;
SSR.Utils.sendRequest({
method: 'POST',
url: url,
host: host,
acc: '',
ref: ref,
contType: contType,
payload: payload,
onloadFun: messageSentOk});
}
function messageSentOk(resp) {
sent++;
curBuddy++;
SSR.shareSection.updateShareNote(jNode, 'ok', sent+'/'+totalMsg+' messages sent!');
if (curBuddy < dest.length)
unsafeWindow.setTimeout(sendSingle, 300);
}
},
formatCoords: function(coords, isHref) {
var del = (isHref ? ',' : ':');
var s = parseInt(coords[0]) + del + parseInt(coords[1]) + del + parseInt(coords[2]);
return s;
},
waitForKeyElements: function (selectorTxt, actionFunction, bWaitOnce, iframeSelector) {
var targetNodes, btargetsFound;
if (typeof iframeSelector == "undefined")
targetNodes = $(selectorTxt);
else
targetNodes = $(iframeSelector).contents()
.find(selectorTxt);
if (targetNodes && targetNodes.length > 0) {
/*--- Found target node(s). Go through each and act if they
are new.
*/
targetNodes.each(function () {
var jThis = $(this);
var alreadyFound = jThis.data('alreadyFound') || false;
if (!alreadyFound) {
//--- Call the payload function.
unsafeWindow.setTimeout(function () {
actionFunction(jThis);
}, 100);
jThis.data('alreadyFound', true);
}
});
btargetsFound = true;
} else {
btargetsFound = false;
}
//--- Get the timer-control variable for this selector.
var controlObj = SSR.Utils.waitForKeyElements.controlObj || {};
var controlKey = selectorTxt.replace(/[^\w]/g, "_");
var timeControl = controlObj[controlKey];
//--- Now set or clear the timer as appropriate.
if (btargetsFound && bWaitOnce && timeControl) {
//--- The only condition where we need to clear the timer.
clearInterval(timeControl);
delete controlObj[controlKey]
} else {
//--- Set a timer, if needed.
if (!timeControl) {
timeControl = setInterval(function () {
SSR.Utils.waitForKeyElements(selectorTxt,
actionFunction,
bWaitOnce,
iframeSelector
);
},
2000
);
controlObj[controlKey] = timeControl;
}
}
SSR.Utils.waitForKeyElements.controlObj = controlObj;
}
};
JSON=new function(){this.encode=function(){var self=arguments.length?arguments[0]:this,result,tmp;if(self===null)
result="null";else if(self!==undefined&&(tmp=$[typeof self](self))){switch(tmp){case Array:result=[];for(var i=0,j=0,k=self.length;j<k;j++){if(self[j]!==undefined&&(tmp=JSON.encode(self[j])))
result[i++]=tmp;};result="[".concat(result.join(","),"]");break;case Boolean:result=String(self);break;case Date:result='"'.concat(self.getFullYear(),'-',d(self.getMonth()+1),'-',d(self.getDate()),'T',d(self.getHours()),':',d(self.getMinutes()),':',d(self.getSeconds()),'"');break;case Function:break;case Number:result=isFinite(self)?String(self):"null";break;case String:result='"'.concat(self.replace(rs,s).replace(ru,u),'"');break;default:var i=0,key;result=[];for(key in self){if(self[key]!==undefined&&(tmp=JSON.encode(self[key])))
result[i++]='"'.concat(key.replace(rs,s).replace(ru,u),'":',tmp);};result="{".concat(result.join(","),"}");break;}};return result;};var c={"\b":"b","\t":"t","\n":"n","\f":"f","\r":"r",'"':'"',"\\":"\\","/":"/"},d=function(n){return n<10?"0".concat(n):n},e=function(c,f,e){e=eval;delete eval;if(typeof eval==="undefined")eval=e;f=eval(""+c);eval=e;return f},i=function(e,p,l){return 1*e.substr(p,l)},p=["","000","00","0",""],rc=null,rd=/^[0-9]{4}\-[0-9]{2}\-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/,rs=/(\x5c|\x2F|\x22|[\x0c-\x0d]|[\x08-\x0a])/g,rt=/^([0-9]+|[0-9]+[,\.][0-9]{1,3})$/,ru=/([\x00-\x07]|\x0b|[\x0e-\x1f])/g,s=function(i,d){return"\\".concat(c[d])},u=function(i,d){var n=d.charCodeAt(0).toString(16);return"\\u".concat(p[n.length],n)},v=function(k,v){return $[typeof result](result)!==Function&&(v.hasOwnProperty?v.hasOwnProperty(k):v.constructor.prototype[k]!==v[k])},$={"boolean":function(){return Boolean},"function":function(){return Function},"number":function(){return Number},"object":function(o){return o instanceof o.constructor?o.constructor:null},"string":function(){return String},"undefined":function(){return null}},$$=function(m){function $(c,t){t=c[m];delete c[m];try{e(c)}catch(z){c[m]=t;return 1}};return $(Array)&&$(Object)};try{rc=new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$')}
catch(z){rc=/^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/};this.decode=function(string, secure) {
if (typeof(string) != 'string' || !string.length) return new Object();
if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '')))
return new Object();
return eval('(' + string + ')');
}}
$.fn.exists = function () {
return this.length !== 0;
}
if (document.body) {
main();
}