KoCByte

A Kingdoms of Camelot Mod

目前為 2016-05-05 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name			KoCByte
// @version			0.4
// @description		A Kingdoms of Camelot Mod
// @namespace		kocbyte.com
// @icon			http://www.gravatar.com/avatar/f93cdced9c9b863a7d9e4b9988886015
// @include			http://www.kocbyte.therealmsbeyond.com/*
// @include			https://www.kocbyte.therealmsbeyond.com/*
// @include			*.kingdomsofcamelot.com/fb/e2/src/main_src.php*
// @include			http://*
// @grant			unsafeWindow
// @grant			GM_getValue
// @grant			GM_setValue
// @grant			GM_deleteValue
// @grant			GM_xmlhttpRequest
// @grant			GM_openInTab
// @grant			GM_log
// @grant			GM_listValues
// @grant			GM_getResourceText
// @grant			GM_addStyle
// @grant			GM_registerMenuCommand
// @require			http://code.jquery.com/jquery-latest.min.js
// @resource    	foundation https://www.kocbyte.therealmsbeyond.com/client/style.css
// ==/UserScript==

//============================================================================

var fdtn = GM_getResourceText("foundation");
GM_addStyle(fdtn);

var uW = unsafeWindow;
var Tabs = {};
var mainPop;
var kbPopUpTopClass = 'kbPopTop';

var Options = {
	kbWinIsOpen: false,
	currentTab: 'Mod',
};

var kb = {
	uid: 0,
	name: '',
	domain: 0,
	allianceId: 0,
	allianceName: '',
	misted: 0,
	cities: [],
	domains: [],
	seed: null,
	authedSites: null,
	currentUrl: document.location.toString(),
	currentWebFolder: document.location.host+document.location.pathname.replace(/\\/g, '/').replace(/\/[^\/]*\/?$/, '')+'/',
	removedMixPanel: false,
	site: 'http://www.kocbyte.therealmsbeyond.com/',
	url: 'http://www.kocbyte.therealmsbeyond.com/ajax/listener.php',
	storagePrefix: 'KoCByte_',
	citiesSaved: '',
	citiesLastSent: 0,
	sendInfoDelay: 1000*60*60*6,
	sendSeedDelay: 1000*60*60*24,
	updateCheckDelay: 1000*60*60*24,
	scriptId: 19269,
	scriptVer: 0.2,
	sendInfoTimer: null,
	taskTimer: null,
	imgs: [],
	generateRandomNumber: function(min, max){
		if(min >= max){
			return null;
		}else{
			return Math.round(min+((max-min)*Math.random()));
		}
	},
	createUrl: function(page){
		return 'https://www'+(uW.g_server)+'.kingdomsofcamelot.com/fb/e2/src/'+page;
	},
	createAjaxUrl: function(page){
		return 'https://www'+(uW.g_server)+'.kingdomsofcamelot.com/fb/e2/src/ajax/'+page+'.php';
	},
	getAjaxParams: function(){
		if(uW && uW.g_ajaxparams){
			return JSON.parse(JSON.stringify(uW.g_ajaxparams));
		}
	},
	setValueObject: function(k, v){
		v = JSON.stringify(v);
		GM_setValue(k, v);
	},
	getValueObject: function(k, dv){
		var v = GM_getValue(k, dv);
		if(!v || v === undefined){
			return null;
		}
		v = JSON.parse(v);
		if(!v){
			if(!dv){
				v = null;
			}
			else{
				v = dv;
			}	
		}
		return v;
	},
	setValue: function(k, v){
		GM_setValue(k, v);
	},
	getValue: function(k, dv){
		return(GM_getValue(k, dv));
	},
	deleteValue: function(k){
		GM_deleteValue(k);
	},
	getDomains: function(force){
		if(uW.g_ajaxparams){
			var now = new Date().getTime()*1;
			var wait = 86400000;//1 day
			var k = kb.storagePrefix+'getDomains_lastcheck';
			var lastsent = kb.getValue(k,0);
			if(force || 1*lastsent+wait < now){
				var args = {};
				args.v2 = true;
				var json = kb.sendToKabam(args,'myServers',null,true);
				if(json && json.selectableServers && json.selectableServers.servers){
					var domains = [];
					for(var i in json.selectableServers.servers){
						var d = json.selectableServers.servers[i].serverId;
						domains.push(1*d);
					}
					domains.sort(); 
					kb.log('getDomains();');
					kb.setValue(''+k,''+now);
					return domains;
				}
			}else{
				var playerdomains=kb.getValue('domains');
				if(!playerdomains){
					playerdomains = [];
					playerdomains.push(1*kb.domain);
					return playerdomains;
				}else{
					return JSON.parse(''+playerdomains);
				}
			}
		}
	},
	getSavedInfo: function(){
		return(kb.getValue('ajaxparams', null));
	},
	getSavedServerId: function(){
		return(kb.getValue('sid'));
	},
	getCurrentCityId: function(){
		if(uW && uW.currentcityid){
			return JSON.parse(JSON.stringify(uW.currentcityid));
		}
	},
	getCities: function(){
		var seed = kb.getSeed();
		if(seed && seed.cities){
			return JSON.parse(JSON.stringify(seed.cities));
		}
	},
	gameInfoSave: function(){
		if(uW && uW.seed){
			kb.setValue('domain', kb.domain);
			kb.setValue('uid', kb.uid);
			kb.setValue('name', kb.name);
			kb.setValue('allianceId', kb.allianceId);
			kb.setValue('allianceName',	kb.allianceName);
			kb.setValue('misted', kb.misted);
			kb.setValueObject('cities',	kb.cities);
			kb.setValueObject('domains', kb.domains);

			var current = null;
			var saved = null;
			var tmp = null;
			var thekey = '';
			
			//seed
			tmp = [];
			for(var i in kb.seed){
				thekey = kb.storagePrefix+'SEED_'+i;
				kb.setValueObject(thekey,kb.seed[i]);
				tmp.push(i);
				//console.log(kb.getValueObject(thekey));
			}
			kb.setValueObject(kb.storagePrefix+'SEEDKEYS',tmp);
			
			//cities
			current = kb.getValueObject('cities');
			thekey = kb.storagePrefix+'CITIES';
			saved = kb.getValueObject(thekey);
			if(current != saved){
				kb.setValueObject(				kb.storagePrefix+'CITIES',current);
			}
			kb.setValueObject('acctIds', kb.acctIds);
		}
	},
	gameInfoLoad: function(){
		if(uW && uW.seed){
			kb.uid = kb.getUserId();
			kb.name = kb.getUserName();
			kb.domain = kb.getServerId();
			kb.domains = kb.getDomains();
			kb.allianceId = kb.getPlayerAllianceId();
			kb.allianceName	= kb.getPlayerAllianceName();
			kb.misted = kb.getPlayerMist();
			kb.cities = kb.getCities();
			kb.authedSites = kb.authorizedWebsiteGet();
			kb.storagePrefix = kb.uid+'_'+kb.domain+'_';
			kb.seed	 = kb.getSeed();
			kb.acctIds = kb.getSavedUserIds(kb.uid);
		}else{
			kb.uid = kb.getValue('uid');
			kb.name = kb.getValue('name');
			kb.domain = kb.getValue('domain');
			kb.domains = kb.getValueObject('domains');
			kb.allianceId = kb.getValue('allianceId');
			kb.allianceName	= kb.getValue('allianceName');
			kb.misted = kb.getValue('misted');
			kb.cities = kb.getValueObject('cities');
			kb.authedSites = kb.authorizedWebsiteGet();
			kb.storagePrefix = kb.uid+'_'+kb.domain+'_';

			//the seed is too large to store as one string so we have to reassemble
			kb.seed = {};
			kb.seedKEYS = kb.getValueObject(kb.storagePrefix+'SEEDKEYS');
			if(kb.seedKEYS){
				var prefix = kb.storagePrefix+'SEED_';
				var k='';
				for(var i in kb.seedKEYS){
					k = kb.seedKEYS[i];
					kb.seed[k] = JSON.parse(kb.getValue(prefix+k));
				}
			}
			kb.acctIds = kb.getSavedUserIds();
		}
	},
	getServerId: function(){
		if(uW && uW.g_server){
			return (1*uW.g_server);
		}
	},
	getSavedUserIds: function(uid){
		var uids = kb.getValueObject('acctIds',[uid]);
		if(uid){
			if(!$.inArray(uid,uids)){
				uids.push(uid);
			}
		}
		return uids;
	},
	getUserId: function(){
		if(uW && uW.g_ajaxparams && uW.g_ajaxparams.tvuid){
			return JSON.parse(JSON.stringify(uW.g_ajaxparams.tvuid));
		}
	},
	getUserName: function(){
		if(uW && uW.seed && uW.seed.player && uW.seed.player.name){
			return JSON.parse(JSON.stringify(uW.seed.player.name));
		}
	},
	getSeed: function(){
		if(uW && uW.seed){
			return JSON.parse(JSON.stringify(uW.seed));
		}
	},
	getPlayerAllianceId: function(){
		if(uW && uW.seed && uW.seed.allianceDiplomacies && uW.seed.allianceDiplomacies.allianceId){
			return JSON.parse(JSON.stringify(uW.seed.allianceDiplomacies.allianceId));
		}
		return 0;
	},
	getPlayerAllianceName: function(){
		if(uW && uW.seed && uW.seed.allianceDiplomacies && uW.seed.allianceDiplomacies.allianceName){
			return JSON.parse(JSON.stringify(uW.seed.allianceDiplomacies.allianceName));
		}
		return '';
	},
	getPlayerMist: function(){
		var result=0;
		if(uW && uW.seed && uW.seed.playerEffects && uW.seed.playerEffects.fogExpire){
			result = uW.seed.playerEffects.fogExpire;
			var timestamp = Math.floor(new Date().getTime()/1000);
			if(timestamp > result){
				result=0;			
			}
		}
		return JSON.parse(JSON.stringify(result));
	},
	blockList: function(left, top, width){
		var grids = 3;
		var bl = [];
		for(var x=0; x<grids; x++){
			var xx = left + (x*5);
			if(xx > 745)
				xx -= 750;
			for(var y=0; y<grids; y++){
				var yy = top + (y*5);
				if(yy > 745)
					yy -= 750;
				bl.push ('bl_'+ xx +'_bt_'+ yy);
			}
		}
		return bl.join("%2C");
	},
	sendToKB: function(type,payload,callback){
		var url = kb.url;
		var obj = {};
		
		kb.log('building the object to send');
		if(type == 'info'){
			obj = {
				domain: (1*uW.g_server),
				uid: uW.g_ajaxparams.tvuid,
				name: uW.seed.player.name,
				prefix: uW.seed.player.prefix,
				might: uW.seed.player.might,
				glory: uW.seed.player.glory,
				gloryMax: uW.seed.player.maxGlory,
				alliance: {
					id: uW.seed.allianceDiplomacies.allianceId,
					name: uW.seed.allianceDiplomacies.allianceName
				},
				misted: (kb.getPlayerMist()) ? true : false,
				data: payload,
				wilds: uW.seed.wilderness,
				cities: uW.seed.cities,
			};
		}
		
		if(type == 'map'){
			var rawData = [];
			
			for(var i = 0; i < kb.cities.length; i++){
				var x = kb.cities[i][2];
				var y = kb.cities[i][3];
				var width = 75;
				
				var left = parseInt(x / 5) * 5;
				var top = parseInt(y / 5) * 5;
				width = parseInt((width+4) / 5) * 5;
				
				var blockString = kb.blockList(left, top, width);
				var params = uW.Object.clone(uW.g_ajaxparams);
				params.blocks = blockString;
				
				var block = kb.sendToKabam(params,'fetchMapTiles',null);
				rawData.push(block);
			}
			
			var alliances = {};
			var users = {};
			var tiles = {};
			tiles.city = {};
			tiles.wild = {};
			
			for(var a = 0; a < rawData.length; a++){
				var allis = JSON.parse(JSON.stringify(rawData[a].allianceNames));
				$.each(allis, function(k, v){
					var key = k.replace(/^a/, '');
					alliances[key] = v;
				});
				
				var us = JSON.parse(JSON.stringify(rawData[a].userInfo));
				$.each(us, function(u, uData){
					var uid = u.replace(/^u/, '');
					users[uid] = {
						might: uData.m,
						prefix: (uData.s == 'M') ? 'Lord' : 'Lady',
						name: uData.n,
						alliance: uData.a
					};
				});
				
				var theTiles = JSON.parse(JSON.stringify(rawData[a].data));
				$.each(theTiles, function(t, tData){
					if(tData.cityNum){ // is a city
						tiles.city[tData.tileCityId] = {
							owner: tData.tileUserId,
							x: tData.xCoord,
							y: tData.yCoord,
							name: tData.cityName,
							province: tData.tileProvinceId,
							misted: tData.misted,
							tid: tData.tileId
						};
					}else{ // not a city
						if(tData.tileUserId !== null && tData.tileUserId !== undefined && tData.tileUserId !== 0){ // if it's not owned, we don't care
							tiles.wild[tData.tileId] = {
								owner: tData.tileUserId,
								city: tData.tileCityId,
								x: tData.xCoord,
								y: tData.yCoord,
								province: tData.tileProvinceId,
								misted: tData.misted,
								level: tData.tileLevel,
								type: tData.tileType,
							};
						}
					}
				});
			}
			obj = {
				a: alliances,
				u: users,
				t: tiles,
				domain: (1*uW.g_server),
			};
		}
		
		if(type == 'seed'){
			obj = payload;
		}
		
		kb.log('do the send thing: GM_xmlhttpRequest');
		var args='mode='+type+'&data='+encodeURIComponent(JSON.stringify(obj));
		GM_xmlhttpRequest({
			"method": 'POST',
			"url": url,
			"data": args,
			"headers": {
				"Content-type" : "application/x-www-form-urlencoded"
			},
			"onreadystatechange": function(r) {
				
			},
			"onload": function(r) {
				if(r && r.status!=200){
					var s='';
					s=s+"\n"+'url='+url;
					s=s+"\n"+'data='+JSON.stringify(obj);
					if(r.status){s=s+"\n"+'status:'+r.status;}
					if(r.statusText){s=s+"\n"+'statusText'+r.statusText;}
					if(r.responseHeaders){s=s+"\n"+'responseHeaders'+r.responseHeaders;}
					if(r.responseText){s=s+"\n"+'responseText'+r.responseText;}
					if(r.readyState){s=s+"\n"+'readyState'+r.readyState;}
					kb.log(s);
				}
				if(callback) {
					callback(r);
				}
			}
		});	
	},
	sendToKabam: function(args,page,callback){
		var async = false;
		var data = JSON.parse(JSON.stringify(uW.g_ajaxparams));
		for(var i in args){
			data[i] = args[i];
		}
		var url = kb.createAjaxUrl(page);
		var str = '';
		for(var k in data){
			str = str+'&'+k+'='+data[k];
		}
		str = str.substr(1);
		if(callback){
			async = true;
		}
		var result = null;
		$.ajax({
			'type': "POST",
			'url': url,
			'data': str,
			'async': async,
			'success': function(str){
				result = JSON.parse(str);
				if(!result){
					result = str;
				}
			}
		});
		return result;
	},
	saveInfo: function(){
		var info = JSON.stringify(kb.getCurrentInfo());
		if(info){
			var sid = kb.getServerId();
			kb.setValue('ajaxparams',info);
			kb.setValue('sid',sid);	
		}
	},
	sendInfo: function(force){
		if(uW.g_ajaxparams && uW.g_server){
			kb.log('checking if time to send');
			var now = new Date().getTime();
			var k = kb.storagePrefix+'lastsent_ajaxparams';
			var lastsent = kb.getValue(k,0);
			if(force || 1*lastsent+kb.sendInfoDelay<now){
				kb.log('sending');
				var savedkey = kb.storagePrefix+'saved_ajaxparams';
				var saved = JSON.parse(kb.getValue(savedkey,null));
				var json = kb.getAjaxParams();
				if(force || saved != json){
					kb.setValue(k,''+now+'');
					kb.setValue(savedkey,''+JSON.stringify(json));
					kb.sendToKB('info',json);
					kb.sendToKB('map', json);
					kb.log('send_info() complete.');
				}
			}
		}
	},
	sendSeed: function(force){
		if(uW.g_ajaxparams && uW.g_server){
			var now = new Date().getTime();
			var k = kb.storagePrefix+'lastsent_seed';
			var lastsent = kb.getValue(k,0);
			if(force || 1*lastsent+kb.sendSeedDelay<now){
				kb.setValue(k,''+now+'');
				var json = kb.getSeed();
				kb.sendToKB('seed',json);
				kb.log('send_seed();');
			}
		}
	},
	doTask: function(){
		var now = new Date().getTime();
		kb.setValue('lasttaskrun',''+now+'');
		kb.setValue('currentdomain',''+kb.getServerId()+'');
		var command = kb.getValue('command', '');
		if (command !== '') {
			kb.setValue('command','');
			kb.log('command=' + command);
			var x = 0;
			var y = 0;
			var cmd = command.split('|');
			var s = cmd.shift();
			var type = cmd.shift();
			if(!s || s==='' || 1*s===kb.domain){
				switch (type) {
					case 'evalscript':
						kb.scriptAdd(cmd[0]);
					break;
					case 'includescript':
						kb.scriptInclude(cmd[0]);
					break;
					case 'location':
						x = kb.sanatizeInt(cmd[0]);
						y = kb.sanatizeInt(cmd[1]);
						kb.mapMove(x,y);
					break;
					case 'setbookmark':
						x = kb.sanatizeInt(cmd[0]);
						y = kb.sanatizeInt(cmd[1]);
						var n = 'loc';
						if(cmd[2]){
							n = kb.sanatizeString(cmd[2]);
						}
						kb.bookmarkAdd(x,y,n);
					break;
					case 'deletebookmark'://does not work
						x = kb.sanatizeInt(cmd[0]);
						y = kb.sanatizeInt(cmd[1]);
						kb.bookmarkDelete(x,y);
					break;
					default:
					break;
				}
			}
		}
	},
	showTime: function(timestamp,version){
		var now = null;
		if(timestamp){
			now = new Date(timestamp);
		}else{
			now = new Date();
		}
		var hours = now.getHours();
		var minutes = now.getMinutes();
		var seconds = now.getSeconds();
		var timeValue = "" + ((hours >12) ? hours -12 :hours);
		if (timeValue == "0") timeValue = 12;
		timeValue += ((minutes < 10) ? ":0" : ":") + minutes;
		timeValue += ((seconds < 10) ? ":0" : ":") + seconds;
		timeValue += (hours >= 12) ? " PM" : " AM";
		return timeValue;	
	},
	log: function(msg,targetId,replaceIt){
		var consoleStr = 'KoCByte: '+kb.domain+' @ '+kb.showTime()+': '+msg;
		uW.console.log(consoleStr);
		var elem = null;
		if(targetId){
			elem = $('#'+targetId);
		}else{
			elem = $('#'+kb.elemPrefix+'-tabs-kocbyte-log-generic-result');
		}
		if(elem && elem.length == 1){
			var html = '';
			var type = $.type(msg);
			if(type == 'string'){
				msg.replace(/</gi,"&lt;");
				msg.replace(/>/gi,"&gt;");
				html = '<div>'+kb.showTime()+' '+msg+'</div>';
			}else{
				msg = JSON.stringify(msg,null,"\t");
				msg = msg.replace(/</gi,'&lt;');
				msg = msg.replace(/>/gi,'&gt;');
				html = '<pre>'+kb.showTime()+"\n"+msg+'</pre>';
			}
			if(replaceIt == 1){
				elem.html(html);
			}else{
				var n = elem.children().length;
				if(n > 30){
					elem.children(':last').remove();
				}
				elem.prepend(html);
			}
		}
	},
	authorizedWebsiteGet: function(){
		var websites = JSON.parse(''+kb.getValue('authedSites',null));
		if(!websites){
			websites = ['www.kocbyte.therealmsbeyond.com'];
		}
		if($.inArray($(websites),'www.kocbyte.therealmsbeyond.com') != -1){
			websites.push('www.kocbyte.therealmsbeyond.com');
		}
		return websites;
	},
	authorizedWebsiteAdd: function(url){
		var websites = JSON.parse(''+kb.getValue('authedSites',null));
		if(!websites){
			websites = ['www.kocbyte.therealmsbeyond.com'];
		}
		if($.inArray($(websites),url) > -1){
			websites.push(url);
			var sites = websites.filter(function(elem, pos) {
				return websites.indexOf(elem) == pos;
			});
			kb.setValue('authedSites',''+JSON.stringify(sites));
			return true;
		}else{
			return false;
		}
	}
};

kb.imgs[0]='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAAXNSR0IArs4c6QAACWpJREFUSMdVVkmII1Ufr+XVviWVqkqq0ulJO91J1MZWGgfnIjkIA3oTRZwRvTh9mIPgTeYkghfHq6KCKDSMIIIXsb2K6MGlx4XRHjPdnb2SSipLVZba6zs8vuH73im8Cv/t/ZY/+uuvvzqO02q1zs/P+/2+67oAAE3TLl68uLOz8/jjj7/xxhvHx8cIgly6dOntt98eDoftdtuyrOVySZJkmqZnZ2eWZWUyma2tre3t7Uqlouu64zhpmgZBADY3N09OTuI49n1/sVi4rouiqCRJYRjGcRzHMcMwrus++eST169fj6JoMpkMh8NWq2XbtiAIxWLRMIxMJkPTtKqqoigyDNPv9995551Lly5tb2+DwWAgiqIkSZqmYRjmum4URbIs8zxPUVQcx/1+//XXX7969SqKouPxOAgCz/Pm87lpmlEU0TQNAEAQhCRJgiB837dtu1AoPP3007du3cIwDA+C4Pnnn/d9HwDAsizHcbIsq6qaz+eLxWK73d7f379y5YrjOO12u9vtOo6TJInneTiOMwwzHA5Ho9F8PscwLAiC9XqNIAhFUVtbW3fu3HEcB5/NZrIsP/HEEwzD8DwvCEI2m9V1Xdd1SZJc161UKv1+v9vtmqbZ6XSGw2EURTiO4zhOUVQURWmawt+maaZpStM0x3EbGxvHx8eWZQFJkt57771ms1mv1y9cuKDrehiGW1tbDMMgCFIoFO7duzccDmFoy7LG47Esy3BQBwcHV65cQRAEQZBvvvnm448/FkURPh6GYQzDEAQB8vk8RVFffvnl0dFRrVa7efOmIAhBEMAE4/HYdV3XdW3bbrfbtm3HcSyKIsdx169fr9frCIKEYfjBBx/8/PPPhUIhm82yLEtRVBAE0+kUx3EgSZKiKIIgNJvNIAg0Tbt37x5FUZIkIQgynU6n0ymCIGmaxnEMAFBVtVwuX7t2bWdnBwLxs88++/fffzc3N2VZFkVRVVVZli3LarVaDMMAQRAAAKZpuq772muvzefz4XBYKpVg4/P53LIsURSz2WypVPJ9v1AovPDCC5VKJU3TMAy///778Xi8vb3N8zxMkMvlBEG4ffu2ZVnVahW4rrterz3PQxCkVqu5rus4ThiGMAFEJIzOMAxN088888zm5iaCIFEUnZ2dLZfLarUKJ57JZHK5XC6XOzw8/PTTT3d2dnieBycnJ9PpFLIMxkVRFPn/g2HYxsZGqVSqVquyLMNL27bn8zlBEK7r+r4P34xhGJZlNzY2CoWCbdsAAIDj+MHBwebmpuu6GIZxHCeKIkEQMArLspIkcRxnGIZhGCRJJkkyHA5t2yYIYjKZdDod0zTX6zXHcbqur9drx3H29vY+/PDDd999948//sDv3Lmzu7ubz+d3dnY4jiMIIo5jTdMEQUAQBNKqVCptbW3BrN1u98aNGw899BDDMKZp9nq9VqvV7/fjOE6SBBINqtmLL7742GOPgW63OxqNfN/HcVwQhHw+r+s6x3GwA5Iki8VipVKBenD37t2Dg4P9/f3d3d1erxeGYZIkURR5nrdYLO7fv6/rOk3TaZrOZjPDMC5fvgza7bZpmsvlEgCgKEocxxcuXHgwomw2u7m5CaMHQXB8fDwYDF5++WXHcQaDAZQmCJvRaLRYLLLZrGma4/FYVVUURVerFYDSOJlMaJoOgoCmaUmSVFWF2JdlGcMwyLjz8/N6vf7111+LothsNqfTqWma3W4XQRBd1zVNy2QyCII0Gg2WZWFxaZpiq9VqOp12u93xeLxYLDzP830/jmPYAZQaBEEkSeJ5PooiFEU7nY7rup7nrdfr2WzmOE4UReVyuVwuJ0kym80Wi0UQBGEYep4HCIJ4ABWSJAEAGIZBpKIo+uOPPxqGUa1WCYKoVqvtdvv09HQymfi+7zjOYrFI05TneZZlZVlOkgTekCQJ5YQgCKAoiu/7kiRRFAVZLgjCAyqs1+svvvjilVde2d7eRlG0VCr1+/2ffvoJDpMkSZqmIfY5jqNpGnoJACCXyymKgiAIMAwD+gyshSAIHMdJkoQJNE1TVfW3334TRVHTNBzH9/f379+/f/v27Xw+XyqVMpkMRVGKooiiqCgKy7Lr9RrHcVEU8/l8HMdguVxOJhPLsoIgkCQpjmOCIDY2Nh6gqFwuoyjaaDSgAhIE8dJLL3W73X/++SdN02KxKAgCvE+SxDAMFEVhiTzPDwYD/Lnnnmu3281mczgc/q9dQOqbpnlycmLb9nQ6dV03l8uxLAsAuHz5crvdbjQamUyG47jpdDqZTJbLJYqiuVwujuPPP/9c13XP80AURWEYrlYr13VlWY6i6AGEIJNPT0+Xy6UgCGEYEgTx6KOP5vN5AMCNGze++uqrRqPR6/VGoxGGYRDcUGwEQWAYxvd9/OrVq6vVCn6QZVnTNEVRisUi7KDRaPzwww+dTgdFUZ7neZ6fz+cURYmiiGFYrVZLkuT3339vNpuO40DThdN/5JFH4KYCAADFYhECgOd5VVU9z1sul1A1URTF/nsgtFiW/euvvwiC0DSNoqh6vd5utzudDuQj/P9yubRtezKZhGEIzs/PNU0rl8sPTPz09PThhx9+oKbFYjGbzQqCkMlkYAU8z7daLZZleZ4nSfLVV19FUfTu3bsQSwzD2LbdarUsy/I8D4dCls1mDcPgeX44HJ6enlYqlUKhgCDIcDj0fT+TycBFxjAMAECn0ymVShDQ8Ozu7tI0jaJosVhkWRZKSKvV6vV6wLIsQRDgLgQAgNvcg0dO01SSJFmWKYqSZZmm6bfeeuuXX35RVTWXy33yySeappEkSZJkvV7vdDpxHM/nc9/3l8vldDrt9/tgvV77vg+lAzqfqqpHR0dHR0csywqCoGmaruskSZ6dnd26devvv/8WBGEwGFy7dg1BkD///NPzvCAIAAA8z2cyGUgCyHCCIIBhGFA3oigyTRPuQpPJZLVaQYNTFAXH8ffff//bb7+FXrS3t/fUU089++yzvV6v0+kMBoP1ek2SpKIopVIJmhVcVpIkARcvXoSbaL/fn81mCILwPJ/NZovFIqxI1/XDw8PvvvuOIAhd19988829vT0URUej0WQyGQwGrVZrPp+zLBuGIbR+RVGWy2WSJJIkgVqtRpLkeDyGtcC9SpblYrGoKIphGB999NHh4SHLsr7v37x5s1arDQYD27Y9z0vTdLFYQGdWVTWTyUC113U9TVOO41ar1X8AZeUL0lNLxw0AAAAASUVORK5CYII=';

var AutoUpdater = {
    id: 19269,
	URL: 'https://greasyfork.org/en/scripts/19269-kocbyte/code/KoCByte.user.js',
	name: 'KoCByte',
	homepage: 'https://greasyfork.org/en/scripts/19269-kocbyte',
    version: kb.scriptVer,
    call: function(response) { kb.log("Checking for "+this.name+" Update!");
		var _s = this;
		GM_xmlhttpRequest({
            method: 'GET',
			url: _s.URL,
			onload: function(xpr) {_s.compare(xpr,response);},
            onerror: function(xpr) {_s.compare({responseText:""},response);}
        });
    },
    compareVersion: function(remoteVer, localVer) {
		return (parseInt(remoteVer) > parseInt(localVer)) ? true :false;
    },
    compare: function(xpr,response) {
        this.xversion=(/@version\s*(.*?)\s*$/m.exec(xpr.responseText));   
        if(this.xversion){
			this.xversion = this.xversion[1];
		}else{
			if(response){
				uW.Modal.showAlert('<div align="center">Unable to check for updates to '+this.name+'.<br>Please change the update options or visit the<br><a href="'+this.homepage+'" target="_blank">script homepage</a></div>');
			}
			kb.log("Unable to check for updates");
			return;
		}
        this.xrelnotes=/\/\/\s*@releasenotes\s+(.+)\s*\n/i.exec(xpr.responseText);   
        if (this.xrelnotes) this.xrelnotes = this.xrelnotes[1];
        var updated = this.compareVersion(this.xversion, this.version);   
        if (updated) {
			kb.log('New Version Available!');                  
 			var body = '<BR><DIV align=center><FONT size=3><B>New version '+this.xversion+' is available!</b></font></div><BR>';
			if (this.xrelnotes){
				body+='<BR><div align="center" style="border:0;width:470px;height:120px;max-height:120px;overflow:auto"><b>New Features!</b><p>'+this.xrelnotes+'</p></div><BR>';
			}
 			body+='<BR><DIV align=center><a class="gemButtonv2 green" id="doBotUpdate">Update</a></div>';
 			this.ShowUpdate(body);
        }else{
			kb.log("No updates available");
			if(response){
				uW.Modal.showAlert('<div align="center">No updates available for '+this.name+' at this time.</div>');
			}
        } 		
    },
    check: function() {
    	var now = uW.unixtime();
    	var lastCheck = 0;
    	if (GM_getValue('updated_'+this.id, 0)) lastCheck = parseInt(GM_getValue('updated_'+this.id, 0));
		if (now > (lastCheck + 60*1)) this.call(false);
    },
	ShowUpdate: function (body) {
		var now = uW.unixtime();
		setUpdate = function(){
			GM_setValue('updated_'+AutoUpdater.id, now);
		};
		kb.modal(this.name, body, setUpdate);
		document.getElementById('doBotUpdate').addEventListener('click', this.doUpdate, false);   
	},
	doUpdate: function () {
		uW.cm.ModalManager.closeAll();
		uW.cm.ModalManager.close();
		var now = uW.unixtime();
		GM_setValue('updated_'+AutoUpdater.id, now);
		GM_openInTab(AutoUpdater.URL);
	},
};

var tabManager = {
	tabList : {},           // {name, obj, div}
	currentTab : null,
	init: function(mainDiv){
		var t = tabManager;
		var sorter = [];
		for(var k in Tabs){
			if(!Tabs[k].tabDisabled){  
				t.tabList[k] = {};
				t.tabList[k].name = k;
				t.tabList[k].obj = Tabs[k];
				if(Tabs[k].tabLabel != null)
					t.tabList[k].label = Tabs[k].tabLabel;
				else
					t.tabList[k].label = k;
				if(Tabs[k].tabOrder != null)
					sorter.push([Tabs[k].tabOrder, t.tabList[k]]);
				else
					sorter.push([1000, t.tabList[k]]);
				t.tabList[k].div = document.createElement('div');
			}
		}

		sorter.sort (function (a,b){return a[0]-b[0];});
		var m = '<table cellspacing="3" class="kbMainTab"><tr>';
		for (var i=0; i<sorter.length; i++) {
			m += '<td class="spacer"></td><td align="center" class="notSel" id="kbtc'+ sorter[i][1].name +'"><a><span>'+ sorter[i][1].label +'</span></a></td>';
			//m += '<td align="center" class="notSel" id="kbtc'+ sorter[i][1].name +'"><a><span>'+ sorter[i][1].label +'</span></a></td>';
			if((i+1)%9 === 0) m+='</tr><tr>';
		}
		m+='</tr></table>';  
		//m += '<td class=spacer width=90% align=right>'+ Version +'&nbsp;</td></tr></table>';
		mainPop.getMainTopDiv().innerHTML = m;
    
		for(var n in t.tabList){
			if(t.tabList[n].name == Options.currentTab)
				t.currentTab = t.tabList[n] ;
			document.getElementById('kbtc'+ n).addEventListener('click', this.e_clickedTab, false);
			var div = t.tabList[n].div;
			div.style.display = 'none';
			div.style.height = '100%';
			uW.console.log(div);
			mainDiv.appendChild(div);
			try{
				t.tabList[n].obj.init(div);
			}catch(e){
				div.innerHTML = "INIT ERROR: "+ e;
			}
		}
    
		if(t.currentTab == null)
			t.currentTab = sorter[0][1];    
		t.setTabStyle (document.getElementById('kbtc'+ t.currentTab.name), true);
		t.currentTab.div.style.display = 'block';
	},
	hideTab: function(){
		var t = tabManager;
		t.currentTab.obj.hide();
	},
	showTab: function(){
		var t = tabManager;
		t.currentTab.obj.show();
	},
	setTabStyle: function(e, selected){
		if(selected){
			e.className = 'sel';
		} else {
			e.className = 'notSel';
		}
	},
	e_clickedTab : function(e){
		var t = tabManager;
		var newTab = t.tabList[e.target.parentNode.parentNode.id.substring(4)];
		if(t.currentTab.name != newTab.name){
			t.setTabStyle(document.getElementById ('kbtc'+ t.currentTab.name), false);
			t.setTabStyle(document.getElementById ('kbtc'+ newTab.name), true);
			t.currentTab.obj.hide ();
			t.currentTab.div.style.display = 'none';
			t.currentTab = newTab;
			newTab.div.style.display = 'block';
			Options.currentTab = newTab.name;      
		}
		newTab.obj.show();
	},
};

var WinManager = {
	wins: {},    // prefix : kbPopup obj
	didHide: [],
	get: function(prefix){
		var t = WinManager;
		return t.wins[prefix];
	},
	add: function(prefix, pop){
		var t = WinManager;
		t.wins[prefix] = pop;
		if(uW.cpopupWins == null)
			uW.cpopupWins = {};
		uW.cpopupWins[prefix] = pop;
	},
	hideAll: function(){
		var t = WinManager;
		t.didHide = [];
		for(var k in t.wins){
			if(t.wins[k].isShown()){
				t.didHide.push (t.wins[k]);
				t.wins[k].show (false);
			}
		}
	},
	restoreAll: function(){
		var t = WinManager;
		for(var i=0; i<t.didHide.length; i++)
			t.didHide[i].show(true);
	},
	delete: function(prefix){
		var t = WinManager;
		delete t.wins[prefix];
		delete uW.cpopupWins[prefix];
	}    
};

// creates a 'popup' div
// prefix must be a unique (short) name for the popup window
function kbPopup(prefix, x, y, width, height, onClose) {
	var pop = WinManager.get(prefix);
	if(pop){
		pop.show (false);
		return pop;
	}
	this.BASE_ZINDEX = 111111;
    
	// protos ...
	this.show = show;
	this.toggleHide = toggleHide;
	this.getTopDiv = getTopDiv;
	this.getMainTopDiv = getMainTopDiv;
	this.getMainDiv = getMainDiv;
	this.getJQMainDiv = getJQMainDiv;
	this.getLayer = getLayer;
	this.setLayer = setLayer;
	this.getLocation = getLocation;
	this.setLocation = setLocation;
	this.focusMe = focusMe;
	this.isShown = isShown;
	this.unfocusMe = unfocusMe;
	this.centerMe = centerMe;
	this.destroy = destroy;
	this.autoHeight = autoHeight;
	
	// object vars ...
	this.div = document.createElement('div');
	this.prefix = prefix;
	this.onClose = onClose;
	
	var t = this;
	this.div.className = 'kbPopup '+ prefix +'_kbPopup';
	this.div.id = prefix +'_outer';
	this.div.style.background = "#fff";
	this.div.style.zIndex = this.BASE_ZINDEX;
	this.div.style.display = 'none';
	this.div.style.width = width + 'px';
	this.div.style.height = height + 'px';
	this.div.style.maxHeight = height + 'px';
	this.div.style.overflowY = 'show';
	this.div.style.position = "absolute";
	this.div.style.top = y +'px';
	this.div.style.left = x + 'px';
  
  var topClass = '';
	if(kbPopUpTopClass==null)
		topClass = 'kbPopupTop '+ prefix +'_kbPopupTop';
	else
		topClass = kbPopUpTopClass +' '+ prefix +'_'+ kbPopUpTopClass;
    
	var m = '<table cellspacing=0 width=100% ><tr id="'+ prefix +'_bar" class="'+ topClass +'"><td width=99% valign=bottom><SPAN id="'+ prefix +'_top"></span></td>';
	m = m + '<td id='+ prefix +'_X align=right valign=middle onmouseover="this.style.cursor=\'pointer\'" style="color:#fff; background:#333; font-weight:bold; font-size:14px; padding:0px 5px; -moz-border-radius-topright: 20px;">x</td></tr>';
	m = m + '</table><table cellspacing=0 width=100% ><tr><td height=100% valign=top class="kbPopMain '+ prefix +'_kbPopMain" colspan=2 id="'+ prefix +'_main"></td></tr></table>';
	document.body.appendChild(this.div);
	this.div.innerHTML = m;
	document.getElementById(prefix+'_X').addEventListener ('click', e_XClose, false);
  
	this.div.addEventListener('mousedown', e_divClicked, false);
	WinManager.add(prefix, this);
  
	function e_divClicked(){
		t.focusMe();
	}  
	function e_XClose(){
		t.show(false);
		if (t.onClose != null)
			t.onClose();
	}
	function autoHeight(onoff){
		if(onoff)
			t.div.style.height = '';  
		else
			t.div.style.height = t.div.style.maxHeight;
	}
	function focusMe(){
		t.setLayer(5);
		for(var k in uW.cpopupWins){
			if(k != t.prefix)
				uW.cpopupWins[k].unfocusMe();
		}
	}
	function unfocusMe(){
		t.setLayer(-5);
	}
	function getLocation(){
		return {x: parseInt(this.div.style.left), y: parseInt(this.div.style.top)};
	}
	function setLocation(loc){
		t.div.style.left = loc.x +'px';
		t.div.style.top = loc.y +'px';
	}
	function destroy(){
		document.body.removeChild(t.div);
		WinManager.delete (t.prefix);
	}
	function centerMe(parent){
    var coords;
		if(parent == null){
			coords = getClientCoords(document.body);
		}else
			coords = getClientCoords(parent);
		var x = ((coords.width - parseInt(t.div.style.width)) / 2) + coords.x;
		var y = ((coords.height - parseInt(t.div.style.height)) / 2) + coords.y;
		if(x<0)
			x = 0;
		if(y<0)
			y = 0;
		t.div.style.left = x +'px';
		t.div.style.top = y +'px';
	}
	function setLayer(zi){
		t.div.style.zIndex = ''+ (this.BASE_ZINDEX + zi);
	}
	function getLayer(){
		return parseInt(t.div.style.zIndex) - this.BASE_ZINDEX;
	}
	function getTopDiv(){
		return document.getElementById(this.prefix+'_top');
	}
	function getMainDiv(){
		return document.getElementById(this.prefix+'_main');
	}
	function getJQMainDiv(){
		return $('#'+this.prefix+'_main');
	}
	function getMainTopDiv(){
		return document.getElementById(this.prefix+'_top');
	}
	function isShown (){
		return t.div.style.display == 'block';
	}
	function show(tf){
		if (tf){
			t.div.style.display = 'block';
			t.focusMe ();
		} else {
			t.div.style.display = 'none';
		}
		return tf;
	}
	function toggleHide(t){
		if (t.div.style.display == 'block') {
			return t.show (false);
		} else {
			return t.show (true);
		}
	}
}

function getClientCoords(e){
	if (e==null)
		return {x:null, y:null, width:null, height:null};
	var ret = {x:0, y:0, width:e.clientWidth, height:e.clientHeight};
	while (e.offsetParent != null){
		ret.x += e.offsetLeft;
		ret.y += e.offsetTop;
		e = e.offsetParent;
	}
	return ret;
}

function eventHideShow(){
	if(mainPop.toggleHide(mainPop)){
		tabManager.showTab();
		Options.kbWinIsOpen = true;
	} else {
		tabManager.hideTab();
		Options.kbWinIsOpen = false;
	}
}

function createButton(label,id){
	var a=document.createElement('a');
	a.className='button20';
	a.id = id;
	a.innerHTML='<span style="color: #ff6">'+ label +'</span>';
	return a;
}

function AddMainTabLink(text, eventListener, mouseListener){
	var a = createButton(text,'botbutton');
	a.className='tab';
	var tabs=document.getElementById('main_engagement_tabs');
	if(!tabs){
		tabs=document.getElementById('topnav_msg');
		if(tabs)
			tabs=tabs.parentNode;
	}
	if(tabs){
		var e = tabs.parentNode;
		var gmTabs = null;
		for(var i=0; i<e.childNodes.length; i++){
			var ee = e.childNodes[i];
			if (ee.tagName && ee.tagName=='DIV' && ee.className=='tabs_engagement' && ee.id!='main_engagement_tabs'){
				gmTabs = ee;
				break;
			}
		}
		if(gmTabs == null){
			gmTabs = document.createElement('div');
			gmTabs.className='tabs_engagement';
			gmTabs.style.background='#ca5';
			tabs.parentNode.insertBefore (gmTabs, tabs);
			gmTabs.style.whiteSpace='nowrap';
			gmTabs.style.width='735px';
			gmTabs.lang = 'en_PB';
		}
		gmTabs.style.height='0%';
		gmTabs.style.overflow='auto';
		gmTabs.appendChild(a);
		a.addEventListener('click',eventListener, false);
		if(mouseListener != null)
			a.addEventListener('mousedown',mouseListener, true);
		return a;
	}
	return null;
}

Tabs.Mod = {
	tabOrder: 1,
	tabDisabled: false,
	tabLabel: 'Mod',
	myDiv: null,
	timer: null,  
	init: function(div){    // called once, upon script startup
		var t = Tabs.Mod;
		t.myDiv = div;
		
		var str = '';
		str = str + '<div class="row">';
		str = str + '	<div class="large-4 columns text-center">';
		str = str + '		<strong>Mod</strong><br />';
		str = str + '		<button id="'+kb.elemPrefix+'-main-update">Update</button>&nbsp;v<span id="'+kb.elemPrefix+'-main-version">'+kb.scriptVer+'</span>';
		str = str + '	</div>';
		str = str + '	<div class="large-4 columns end text-center">';
		str = str + '		<strong>Website</strong><br />';
		str = str + '		<button id="'+kb.elemPrefix+'-website-visit"><span>Visit Site</span></button><br />';
		str = str + '		<button id="'+kb.elemPrefix+'-website-updateinfo"><span>Send Info</span></button>';
		str = str + '	</div>';
		str = str + '</div>';
		str = str + '<div class="row">';
		str = str + '	<div class="large-12 columns">';
		str = str + '		&nbsp;';
		str = str + '	</div>';
		str = str + '</div>';
		str = str + '<div class="row">';
		str = str + '	<div class="large-12 columns">';
		str = str + '		&nbsp;';
		str = str + '	</div>';
		str = str + '</div>';
		str = str + '<div class="row">';
		str = str + '	<div class="large-12 columns text-center">';
		str = str + '		<strong>Log</strong>';
		str = str + '	</div>';
		str = str + '</div>';
		str = str + '<div class="row">';
		str = str + '	<div class="large-12 columns">';
		str = str + '		<pre id="'+kb.elemPrefix+'-log-result">Log text goes here</pre>';
		str = str + '	</div>';
		str = str + '</div>';
		str = str + '<div class="row">';
		str = str + '	<div class="large-12 columns">';
		str = str + '		&nbsp;';
		str = str + '	</div>';
		str = str + '</div>';
		str = str + '<div class="row">';
		str = str + '	<div class="large-12 columns">';
		str = str + '		&nbsp;';
		str = str + '	</div>';
		str = str + '</div>';
		str = str + '<div class="row">';
		str = str + '	<div class="large-12 columns text-center">';
		str = str + '		<strong>Debug</strong>';
		str = str + '	</div>';
		str = str + '</div>';
		str = str + '<div class="row">';
		str = str + '	<div class="large-12 columns">';
		str = str + '		<pre id="'+kb.elemPrefix+'-debug-result">Debug text goes here</pre>';
		str = str + '	</div>';
		str = str + '</div>';
		
		$container = mainPop.getJQMainDiv();
		$container.html(str);
		
		$('#'+kb.elemPrefix+'-main-update').click(function(){
			AutoUpdater.check(false);
		});
		
		$('#'+kb.elemPrefix+'-website-updateinfo').click(function(){
			kb.sendInfo(1);
		});
		
		$('#'+kb.elemPrefix+'-website-visit').click(function(){
			GM_openInTab(kb.site);
		});
	},
	hide: function(){         // called whenever the main window is hidden, or another tab is selected
		var t = Tabs.Mod;
	},
	show: function(){         // called whenever this tab is shown
		var t = Tabs.Mod;
	},
};

function init(){
	var styles = 'a.ptButton20 {color:#ffff80}';
	styles = styles + '	table.kbMainTab { empty-cells: show; margin-left: 5px; margin-top: 4px; padding: 1px;  padding-left:5px;}';
	styles = styles + '	table.kbMainTab tr td a {color:inherit }';
	styles = styles + '	table.kbMainTab tr td   {height:60%; empty-cells:show; padding: 0px 4px 0px 4px;  margin-top:5px; white-space:nowrap; border: 1px solid; border-style: none none solid none; -moz-border-radius:5px; }';
	styles = styles + '	table.kbMainTab tr td.spacer {padding: 0px 0px;}';
	styles = styles + '	table.kbMainTab tr td.notSel { color: #ffffff; font-size: 12px; font-weight:bold; -moz-border-radius: 10px; -moz-box-shadow: 0px 1px 3px #357544; text-shadow: -1px 1px 3px #666666; border: solid #615461 1px; background: -moz-linear-gradient(top, #6ff28e, #196b2c);}';
	styles = styles + '	table.kbMainTab tr td.sel { color: #000000; font-size: 12px; font-weight:bold; -moz-border-radius: 10px; -moz-box-shadow: 0px 1px 3px #357544; text-shadow: -1px 1px 3px #CECECE; border: solid #615461 1px; background: -moz-linear-gradient(top, #6ff28e, #196b2c);}';
	styles = styles + '	table.kbMainTab tr td:hover { color: #191919; font-size: 12px; font-weight:bold; text-shadow: -1px 1px 3px #CECECE; background: -moz-linear-gradient(top, #43cc7e, #20a129)}';
	styles = styles + '	tr.kbPopTop td { background-color:transparent; border:none; height: 21px; padding:0px;}';
	styles = styles + '	tr.kbretry_kbPopTop td { background-color:#a00; color:#fff; border:none; height: 21px;  padding:0px; }';
	styles = styles + '	tr.kbMainPopTop td { background-color:#ded; border:none; height: 42px; width:80%; padding:0px; }';
	styles = styles + '	tr.kbretry_kbMainPopTop td { background-color:#a00; color:#fff; border:none; height: 42px;  padding:0px; }';
	styles = styles + '	.kbPopMain  { border:1px solid #000000; -moz-box-shadow:inset 0px 0px 10px #6a6a6a; -moz-border-radius-bottomright: 20px; -moz-border-radius-bottomleft: 20px;}';
	styles = styles + '	.kbPopup  {border:5px ridge #666; opacity:'+(parseFloat(Options.Opacity)<'0.5'?'0.5':Options.Opacity)+'; -moz-border-radius:25px; -moz-box-shadow: 1px 1px 5px #000000; z-index:999999;}';
	styles = styles + '	span.kbTextFriendly {color: #080}';
	styles = styles + '	span.kbTextHostile {color: #800}';
	styles = styles + '	.kbButCancel {background-color:#a00; font-weight:bold; color:#fff}';
	styles = styles + '	div.indent25 {padding-left:25px}';
	styles = styles + '	.kbdivHeader       {transparent;height: 16px;border-bottom:0px solid #000000;font-weight:bold;font-size:11px;opacity:0.75;margin-left:0px;margin-right:0px;margin-top:1px;margin-bottom:0px;padding-top:4px;padding-right:10px;vertical-align:text-top;align:left;background-color:#335577;}';
	styles = styles + '	.kbdivLink         {color:#000;text-decoration:none;}';
	styles = styles + '	.kbdivLink:Hover   {color:#000;text-decoration:none;}';
	styles = styles + '	.kbdivLink:Active  {color:#000;text-decoration:none;}';
	styles = styles + '	.kbdivHide         {display:none}';
    
	mainPop = new kbPopup (kb.elemPrefix, 40, 40, 725,600, function (){
		tabManager.hideTab();
		Options.kbWinIsOpen=false;
	});
	mainPop.autoHeight (true);  

	mainPop.getMainDiv().innerHTML = '<style>'+ styles +'</style>';
	AddMainTabLink('KoCByte', eventHideShow, null);
	tabManager.init(mainPop.getMainDiv());
	
	kb.log('Gathering game info');
	kb.gameInfoLoad();
	if(!kb.uid || !kb.domain){
		return;
	}
	kb.log('Saving game info');
	kb.gameInfoSave();
	//kb.watchtraffic();
	//kb.interface_addcss();
	kb.log('send_info()');
	kb.sendInfo(1);
	kb.sendSeed(1);
	
	kb.sendInfoTimer=window.setInterval(function(){
		kb.sendInfo();
	}, kb.sendInfoDelay);
	kb.sendSeedTimer=window.setInterval(function(){
		kb.sendSeed();
	}, kb.sendSeedDelay);
	setTimeout(function(){AutoUpdater.check();},15000);
	kb.taskTimer=window.setInterval(function(){
		kb.doTask();
	},1000*1);
}

kb.elemPrefix = 'kb-'+kb.generateRandomNumber(0,65535);
init();