Mousehunt AutoHorn

Longtail AutoHorn

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, Greasemonkey alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey alebo Userscripts.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie správcu používateľských skriptov.

(Už mám správcu používateľských skriptov, nechajte ma ho nainštalovať!)

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

(Už mám správcu používateľských štýlov, nechajte ma ho nainštalovať!)

// ==UserScript==
// @name           Mousehunt AutoHorn
// @namespace      http://userscripts.org/scripts/show/74721
// @description    Longtail AutoHorn
// @version        4.2.1
// @include        http://*.mousehuntgame.com/*
// @include        https://*.mousehuntgame.com/*
// @exclude        http://*.mousehuntgame.com/images/*
// @exclude        https://*.mousehuntgame.com/images/*
// @grant          GM_getValue
// @grant          GM_setValue
// @require        http://code.jquery.com/jquery.min.js
// @author         are
// ==/UserScript==

/*  Global Variables  */
var defaultpage = 'http://www.mousehuntgame.com';
var hornpage = 'http://www.mousehuntgame.com/turn.php';
var origtitle = document.title;
var timerEvent;
var timerTitle;
var timerTrapCheck;
var waktuTrapCheck;
var waktuNextHorn;
var waktuRandom;
var waktuTitle;
var waktuTournament;
var msgTitle = 'Sound The Horn';
var alertShown = false;
var hornAllowed = false;
var currentTrap = {weapon:0, base:0, trinket:0, bait:0, cached:false, busy:false, effmeter:null};
var trapConfig = {TrapCheck:{enable:false,min:0,sec:5},SeasonalGarden:{autoTravel:false,'wr':{weapon:-1,base:-1,trinket:-1,bait:-1},'sg':{weapon:-1,base:-1,trinket:-1,bait:-1},'sr':{weapon:-1,base:-1,trinket:-1,bait:-1},'fl':{weapon:-1,base:-1,trinket:-1,bait:-1}},ZugzwangTower:{enabled:0,target:0,pawn:{weapon:-1,base:-1,trinket:-1,bait:-1},knight:{weapon:-1,base:-1,trinket:-1,bait:-1},bishop:{weapon:-1,base:-1,trinket:-1,bait:-1},rook:{weapon:-1,base:-1,trinket:-1,bait:-1},queen:{weapon:-1,base:-1,trinket:-1,bait:-1},king:{weapon:-1,base:-1,trinket:-1,bait:-1},chessmaster:{weapon:-1,base:-1,trinket:-1,bait:-1},minAmplifier:0},Iceberg:{enabled:0,altGeneralEnable:0,slushy_shoreline:{weapon:-1,base:-1,trinket:-1,bait:-1},phase1:{weapon:-1,base:-1,trinket:-1,bait:-1},phase2:{weapon:-1,base:-1,trinket:-1,bait:-1},phase3:{weapon:-1,base:-1,trinket:-1,bait:-1},phase4:{weapon:-1,base:-1,trinket:-1,bait:-1},phase5:{weapon:-1,base:-1,trinket:-1,bait:-1},generals:{weapon:-1,base:-1,trinket:-1,bait:-1},altgenerals:{weapon:-1,base:-1,trinket:-1,bait:-1}},BalackCove:{enabled:0,travel:0,jod:{weapon:-1,base:-1,trinket:-1,bait:98},low:{weapon:38,base:-1,trinket:-1,bait:119},mid:{weapon:38,base:-1,trinket:-1,bait:119},high:{weapon:38,base:-1,trinket:-1,bait:118}},FieryWarpath:{enabled:0,general:{weapon:-1,base:-1,trinket:-1,bait:-1},physical:{weapon:-1,base:-1,trinket:-1,bait:-1},tactical:{weapon:-1,base:-1,trinket:-1,bait:-1},hydro:{weapon:-1,base:-1,trinket:-1,bait:-1},arcane:{weapon:-1,base:-1,trinket:-1,bait:-1},gargantua:{weapon:-1,base:-1,trinket:-1,bait:-1},warden:{weapon:-1,base:-1,trinket:-1,bait:-1},warmonger:{weapon:-1,base:-1,trinket:-1,bait:-1},wave1:{superBrie:0,maxStreak:9,superCharm:0,gargantua:true,minGeneral:99,targetPhysical:true,charmNonPhysical:false,openSelection:true},wave2:{superBrie:0,maxStreak:9,superCharm:0,gargantua:true,minGeneral:99,targetPhysical:true,charmNonPhysical:true,targetNonPhysical:false,allowNonPhysical:false},wave3:{superBrie:0,maxStreak:9,superCharm:0,gargantua:true,minGeneral:99,targetPhysical:true,charmNonPhysical:true,targetNonPhysical:false,allowNonPhysical:false}}};
var availableTraps = {};
var AUDIO = {
	reward: 'data:audio/mid;base64,TVRoZAAAAAYAAQAQAeBNVHJrAAAAMAD/WAQBAhgIAP9ZAgAAAP9ZAgAAAP9UBSAAAAAAAP9RAwOpgINg/1EDBYx0AP8vAE1UcmsAAAAyAP8DCygxKSBPY2FyaW5hAP8ECkF1dG9t YXRpb24A/wENKEMpMjAwMSBOb2tpYQD/LwBNVHJrAAAAfgD/IAEBAP8DCygxKSBPY2FyaW5hAP8ECCpOZXcgICAgALF5AHjBSQWxB38ACkABC38EW38AXQBkZQAFZAAFBgcFZX8F ZH+BZpFaWQDhAECBQzVFD2FJDyJQDw5mgXB0f4FwAECBQzVFD2FJD01UDy9mgXB/f4NggVoAAP8vAE1UcmsAAACBAP8gAQIA/wMMKDEpIE9jYXJpbmEyAP8ECCpOZXcgICAgALJ5 AIFwwkkFsgt/AApAAQdaBF0AAFsogRFlAAVkAAUGBwVlfwVkf4Ixklo+AOIAQIFDNUUPYUkPIlAPDmaBcHR/gXAAQIFDNUUPYUkPTVQPL2aBcH9/g2CCWgAA/y8ATVRyawAAAH8A /yABAwD/AwwoMSkgT2NhcmluYTMA/wQIKk5ldyAgICAAs3kAeMNJBbMLfwAKQAEHQARdAABbKHhlAAVkAAUGBwVlfwVkf4Uyk1ouAOMAQIFDNUUPYUkPIlAPDmaBcHR/gXAAQIFD NUUPYUkPTVQPL2aBcH9/g2CDWgAA/y8ATVRyawAAAH8A/yABBAD/AwwoMSkgT2NhcmluYTQA/wQIKk5ldyAgICAAtHkAeMRJBbQLfwAKQAEHMgRdAABbKF9lAAVkAAUGBwVlfwVk f4c7lFogAOQAQIFDNUUPYUkPIlAPDmaBcHR/gXAAQIFDNUUPYUkPTVQPL2aBcH9/g2CEWgAA/y8ATVRyawAAAH8A/yABBQD/AwwoMSkgT2NhcmluYTkA/wQIKk5ldyAgICAAtXkA eMVJBbULfwAKQAEHKARdAABbKF9lAAVkAAUGBwVlfwVkf5BrlVoqAOUAQIFDNUUPYUkPIlAPDmaBcHR/gXAAQIFDNUUPYUkPTVQPL2aBcH9/g2CFWgAA/y8ATVRyawAAAIAA/yAB BgD/Aw0oMSkgT2NhcmluYTEwAP8ECCpOZXcgICAgALZ5AHjGSQW2C38ACkABBx4EXQAAWyhfZQAFZAAFBgcFZX8FZH+SW5ZaFgDmAECBQzVFD2FJDyJQDw5mgXB0f4FwAECBQzVF D2FJD01UDy9mgXB/f4NghloAAP8vAE1UcmsAAACAAP8gAQcA/wMNKDEpIE9jYXJpbmExMQD/BAgqTmV3ICAgIAC3eQB4x0kFtwt/AApAAQcUBF0AAFsoX2UABWQABQYHBWV/BWR/ lEuXWgIA5wBAgUM1RQ9hSQ8iUA8OZoFwdH+BcABAgUM1RQ9hSQ9NVA8vZoFwf3+DYIdaAAD/LwBNVHJrAAAAgAD/IAEIAP8DDSgxKSBPY2FyaW5hMTIA/wQIKk5ldyAgICAAuHkA eMhJBbgLfwAKQAEHFARdAABbKF9lAAVkAAUGBwVlfwVkf5Y7mFoBAOgAQIFDNUUPYUkPIlAPDmaBcHR/gXAAQIFDNUUPYUkPTVQPL2aBcH9/g2CIWgAA/y8ATVRyawAAAH4A/yAB CgD/AwsoMSkgT2NhcmluYQD/BAgqTmV3ICAgIAC6eQB4ylgFugd/AApAAQt/BFt/AF0AZGUABWQABQYHBWV/BWR/kGaaWlwA6gBAgUM1RQ9hSQ8iUA8OZoFwdH+BcABAgUM1RQ9h SQ9NVA8vZoFwf3+DYIpaAAD/LwBNVHJrAAAAgQD/IAELAP8DDCgxKSBPY2FyaW5hMgD/BAgqTmV3ICAgIAC7eQCBcMtYBbsLfwAKQAEHWgRdAABbKIERZQAFZAAFBgcFZX8FZH+R MZtaSADrAECBQzVFD2FJDyJQDw5mgXB0f4FwAECBQzVFD2FJD01UDy9mgXB/f4Ngi1oAAP8vAE1UcmsAAAB/AP8gAQwA/wMMKDEpIE9jYXJpbmEzAP8ECCpOZXcgICAgALx5AHjM WAW8C38ACkABB0AEXQAAWyh4ZQAFZAAFBgcFZX8FZH+UMpxaNADsAECBQzVFD2FJDyJQDw5mgXB0f4FwAECBQzVFD2FJD01UDy9mgXB/f4NgjFoAAP8vAE1UcmsAAAB/AP8gAQ0A /wMMKDEpIE9jYXJpbmE0AP8ECCpOZXcgICAgAL15AHjNWAW9C38ACkABBzIEXQAAWyhfZQAFZAAFBgcFZX8FZH+WO51aIADtAECBQzVFD2FJDyJQDw5mgXB0f4FwAECBQzVFD2FJ D01UDy9mgXB/f4NgjVoAAP8vAE1UcmsAAAB/AP8gAQ4A/wMMKDEpIE9jYXJpbmE5AP8ECCpOZXcgICAgAL55AHjOWAW+C38ACkABBygEXQAAWyhfZQAFZAAFBgcFZX8FZH+fa55a KgDuAECBQzVFD2FJDyJQDw5mgXB0f4FwAECBQzVFD2FJD01UDy9mgXB/f4NgjloAAP8vAE1UcmsAAACAAP8gAQ8A/wMNKDEpIE9jYXJpbmExMAD/BAgqTmV3ICAgIAC/eQB4z1gF vwt/AApAAQceBF0AAFsoX2UABWQABQYHBWV/BWR/oVufWhYA7wBAgUM1RQ9hSQ8iUA8OZoFwdH+BcABAgUM1RQ9hSQ9NVA8vZoFwf3+DYI9aAAD/LwA='
}

/* Begin script function list */
function tulisWaktu(){
	if (timerTitle) clearTimeout(timerTitle);
	var sekarang = new Date();
	if (loadParam('updateWindowTitle', true) && waktuTitle) {
		if ($('div#mobileHorn').length > 0) {
			if (sekarang >= waktuNextHorn)
				document.title = msgTitle + ' | ' + origtitle;
			else
				document.title = msgWaktu(sekarang, waktuNextHorn) + ' | ' + origtitle;
		} else {
			if (sekarang >= waktuTitle)
				document.title = msgTitle + ' | ' + origtitle;
			else
				document.title = msgWaktu(sekarang, waktuTitle) + ' | ' + origtitle;
		}
	}
	if (waktuNextHorn && sekarang <= waktuNextHorn)	$('div#AutoHorn li span[name="hornTime"]').html(msgWaktu(sekarang, waktuNextHorn));
	else $('div#AutoHorn li span[name="hornTime"]').html("00:00");
	if (waktuRandom && sekarang <= waktuRandom)
		$('div#AutoHorn li span[name="randomTime"]').html(msgWaktu(sekarang, waktuRandom));
	if 	(waktuTournament && sekarang < waktuTournament && $('div#tournamentStatusHud div.timer').length > 0){
		var tmp = msgWaktu(sekarang, waktuTournament, 1);
		try {
			if (unsafeWindow.user.viewing_atts.tournament.status == 'pending')
				tmp = 'Starts in: ' + tmp;
			else if (unsafeWindow.user.viewing_atts.tournament.status == 'active')
				tmp = tmp + ' remaining';
		} catch (err) {
		}
		$('div#tournamentStatusHud div.timer').html(tmp);
	}
	if (waktuTrapCheck && sekarang <= waktuTrapCheck) $('div#AutoHorn li span[name="trapCheckTime"]').html(msgWaktu(sekarang, waktuTrapCheck));
	else $('div#AutoHorn li span[name="trapCheckTime"]').html("00:00");
	timerTitle = setTimeout(function() { tulisWaktu(); } , 1000);
}

function openLink(link){
	if ($('a[href="' + link + '"]').length > 0) $('a[href="' + link + '"]').first().click();
	window.location.href = link;
}

function msgWaktu(awal, akhir, panjang){
	panjang = typeof panjang != "undefined" ? panjang : false;
	var detik = Math.round((akhir - awal) / 1000);
	var jam = Math.floor(detik / 3600);
	var menit = Math.floor(detik / 60);
	if (jam == 0) jam = null;
	menit = menit % 60;
	if (menit < 10) menit = '0' + menit;
	detik = detik % 60;
	if (detik < 10) detik = '0' + detik;
	if (jam) return (panjang ? jam + ' hrs ' + menit + ' mins ' + detik + ' secs' : jam + ':' + menit + ':' + detik);
	else return (panjang ? menit + ' mins ' + detik + ' secs' : menit + ':' + detik);
}

function soundAlarm(){
	var alarm = document.getElementById('alarm');
	if (!alarm)	{
		alarm = document.createElement("span");
		alarm.id = 'alarm';
		$('body').append(alarm);
	}
	alarm.innerHTML = '<embed src="' + AUDIO.reward + '" height="50" width="200" hidden="true" autostart="true" loop="true" volume="' + loadParam('alertVolume', 100) + '"></embed>';
}

function calculateRandomPage(){
	if (typeof unsafeWindow.user == 'undefined') { setTimeout(function() { calculateRandomPage(); }, 1000); return; }
	var mintime = loadParam('minRandomPage', 10) * 60000;
	var maxtime = loadParam('maxRandomPage', 20) * 60000;
	var timeoutvalue = Math.random() * (maxtime - mintime) + mintime;
	setTimeout(function() { randomLinks(); }, timeoutvalue);
	waktuRandom = new Date(new Date().getTime() + timeoutvalue);
}

function calculateTrapCheck(){
	if (timerTrapCheck) clearTimeout(timerTrapCheck);
	var sekarang = new Date();
	var checkTime = new Date();
	checkTime.setMinutes(trapConfig.TrapCheck.min, trapConfig.TrapCheck.sec, 0);
	if (checkTime < sekarang) checkTime.setTime(checkTime.getTime() + 3600000);	 
	timerTrapCheck = setTimeout(function() { 
		if (trapConfig.TrapCheck.enable) {
			if (currentTrap.bait > 0) randomLinks(); 
			else openLink('http://www.mousehuntgame.com/index.php');
		} else calculateTrapCheck();
	}, checkTime.getTime() - sekarang.getTime());
	waktuTrapCheck = checkTime;
}

function randomLinks(){
	if ($('div#mobileHorn').length > 0) {
		openLink(defaultpage);
		return;
	}
	var daftar = new Array();
	daftar.push('http://www.mousehuntgame.com/journal.php');
	daftar.push('http://www.mousehuntgame.com/profile.php');
	$('a[href*="www.mousehuntgame.com/inventory.php"]').add('a[href*="www.mousehuntgame.com/shops.php"]').add('a[href*="www.mousehuntgame.com/adversaries.php?"]').add('a[href*="www.mousehuntgame.com/item.php"]').add('a[href*="www.mousehuntgame.com/journal.php"]').add('a[href*="www.mousehuntgame.com/profile.php"]').add('a[href*="www.mousehuntgame.com/hunterprofile.php"]').add('a[href*="www.mousehuntgame.com/tournament.php"]').add('a[href*="www.mousehuntgame.com/tournamentlist.php"]').not('a[href*="&"]').not('a[href*="#"]').each(function(i){
		var link = $(this).attr('href');
		var sudahada = false;
		for (var x = 0; x < daftar.length; x++) if (daftar[x] == link) { sudahada = true; break; }
		if (!sudahada) daftar.push(link);
	});
	
	if (daftar.length > 0){
		var x = Math.floor(Math.random() * daftar.length);
		openLink(daftar[x]);
	}
}

function warpathGetTrinket(subgroup, useSuper){
	if (typeof subgroup == 'undefined') return 0;
	if (typeof useSuper == 'undefined') useSuper = false;
	if (subgroup == 'Warrior') {
		if (useSuper && getComponentQuantity(544) > 0) return 544;
		else if (getComponentQuantity(539) > 0) return 539;
	} else if (subgroup == 'Scout') {
		if (useSuper && getComponentQuantity(543) > 0) return 543;
		else if (getComponentQuantity(538) > 0) return 538;
	} else if (subgroup == 'Archer') {
		if (useSuper && getComponentQuantity(540) > 0) return 540;
		else if (getComponentQuantity(534) > 0) return 534;
	} else if (subgroup == 'Cavalry') {
		if (useSuper && getComponentQuantity(541) > 0) return 541;
		else if (getComponentQuantity(535) > 0) return 535;
	} else if (subgroup == 'Mage') {
		if (useSuper && getComponentQuantity(542) > 0) return 542;
		else if (getComponentQuantity(537) > 0) return 537;
	} else if (subgroup == 'Commander') {
		if (useSuper && getComponentQuantity(615) > 0) return 615;
		else if (getComponentQuantity(536) > 0) return 536;
	}
	return 0;
}

function warpathGetNumRetreat(){
	var streak = parseInt(unsafeWindow.user.viewing_atts.desert_warpath.streak.quantity);
	if (streak < 1) streak = 1;
	var pop = unsafeWindow.user.viewing_atts.desert_warpath.wave_population;
	var hasil = 0;
	for (var nama in pop){
		hasil += (parseInt(pop[nama].population) > streak ? streak : parseInt(pop[nama].population));
	}
	return hasil;
}

function warpathGetPhysical(isMax, isReverse, trywithtrinket){
	var pop = unsafeWindow.user.viewing_atts.desert_warpath.wave_population;
	var hasil;
	if (typeof trywithtrinket=='undefined') trywithtrinket = true;
	// try with trinket
	if (trywithtrinket)	for (var nama in pop){
		if (parseInt(pop[nama].population) < 1 || warpathGetTrinket(pop[nama].subgroup, true) < 1) continue;
		if (!hasil || ((isReverse ^ (pop[nama].weakness.name == 'Physical')) && (!isMax ^ (parseInt(pop[nama].population) > parseInt(pop[hasil].population))))) hasil = nama;
	}
	// try without trinket
	if (!hasil) for (var nama in pop){
		if (parseInt(pop[nama].population) < 1) continue;
		if (!hasil || ((isReverse ^ (pop[nama].weakness.name == 'Physical')) && (!isMax ^ (parseInt(pop[nama].population) > parseInt(pop[hasil].population))) && pop[nama].subgroup != 'Artillery')) hasil = nama;
	}
	return hasil;
}

function warpathGetGroupLeft(){
	var pop = unsafeWindow.user.viewing_atts.desert_warpath.wave_population;
	var hasil = 0;
	for (var nama in pop){
		if (parseInt(pop[nama].population) > 0) hasil++;
	}
	return hasil;
}

function checkLocation(){
	if (unsafeWindow.user.environment_id == 31 && trapConfig.ZugzwangTower.enabled) { // seasonal_garden
		if (trapConfig.SeasonalGarden.autoTravel && unsafeWindow.user.viewing_atts.zzt_amplifier >= unsafeWindow.user.viewing_atts.zzt_max_amplifier)
			return travelTo('seasonal_garden', 'zugzwang_tower');
		else
			return changeTrap(trapConfig.SeasonalGarden[unsafeWindow.user.viewing_atts.season]);
	} else if (unsafeWindow.user.environment_id == 14 && trapConfig.BalackCove.enabled) { // jungle_of_dread
		if (trapConfig.BalackCove.travel && (getComponentQuantity(119) > 0 || getComponentQuantity(118) > 0)) return travelTo('jungle_of_dread', 'balacks_cove');
		else return changeTrap(trapConfig.BalackCove.jod);
	} else if (unsafeWindow.user.environment_id == 2 && trapConfig.BalackCove.enabled) { // balacks_cove
		var desired = {base:-1,weapon:-1,trinket:-1,bait:-1};
		if (unsafeWindow.user.viewing_atts.tide == 'high') desired = trapConfig.BalackCove.high;
		else if (unsafeWindow.user.viewing_atts.tide == 'low') desired = trapConfig.BalackCove.low;
		else desired = trapConfig.BalackCove.mid;
		if (desired.bait > 0 && getComponentQuantity(desired.bait) < 1){
			if (desired.bait == 119 && getComponentQuantity(118) > 0) desired.bait = 118;
			else if (desired.bait == 118 && getComponentQuantity(119) > 0) desired.bait = 119;
			else return travelTo('balacks_cove', 'jungle_of_dread');
		}
		return changeTrap(desired);
	} else if (unsafeWindow.user.environment_id == 32 && trapConfig.ZugzwangTower.enabled) { // zugzwang_tower
		var zzt_mage_progress = unsafeWindow.user.viewing_atts.zzt_mage_progress;
		var zzt_tech_progress = unsafeWindow.user.viewing_atts.zzt_tech_progress;
		var zzt_progress = Math.max(zzt_mage_progress, zzt_tech_progress);
		if (trapConfig.ZugzwangTower.target == 1) zzt_progress = zzt_tech_progress;
		else if (trapConfig.ZugzwangTower.target == 2) zzt_progress = zzt_mage_progress;
		else if (trapConfig.ZugzwangTower.target == 3 && zzt_progress >= 16) zzt_progress = Math.min(zzt_mage_progress, zzt_tech_progress);
		var desired;
		
		if (zzt_progress < 8) desired = jQuery.extend(true, {}, trapConfig.ZugzwangTower.pawn);
		else if (zzt_progress < 10) desired = jQuery.extend(true, {}, trapConfig.ZugzwangTower.knight);
		else if (zzt_progress < 12) desired = jQuery.extend(true, {}, trapConfig.ZugzwangTower.bishop);
		else if (zzt_progress < 14) desired = jQuery.extend(true, {}, trapConfig.ZugzwangTower.rook);
		else if (zzt_progress < 15) desired = jQuery.extend(true, {}, trapConfig.ZugzwangTower.queen);
		else if (zzt_progress < 16) desired = jQuery.extend(true, {}, trapConfig.ZugzwangTower.king);
		else desired = jQuery.extend(true, {}, trapConfig.ZugzwangTower.chessmaster);
		if (waktuTournament && unsafeWindow.user.viewing_atts.tournament.status == 'active' && waktuTrapCheck < waktuTitle && zzt_progress > 7)  // jika mau trap check, lepas bait
			desired.bait = 0;
		
		if (trapConfig.ZugzwangTower.target == 3 && (desired.weapon == 354 || desired.weapon == 356) && zzt_mage_progress != zzt_tech_progress){
			if (zzt_mage_progress == zzt_progress && getComponentQuantity(354) > 0) desired.weapon = 354;
			if (zzt_tech_progress == zzt_progress && getComponentQuantity(356) > 0) desired.weapon = 356;
		} else if (trapConfig.ZugzwangTower.target == 3 && (desired.weapon == 369 || desired.weapon == 370) && zzt_mage_progress != zzt_tech_progress){
			if (zzt_mage_progress == zzt_progress && getComponentQuantity(369) > 0) desired.weapon = 369;
			if (zzt_tech_progress == zzt_progress && getComponentQuantity(370) > 0) desired.weapon = 370;
		}
		if (desired.bait == 371 && Math.max(zzt_mage_progress, zzt_tech_progress) >= 16 && getComponentQuantity(678) > 0) desired.trinket = 678;
		
		if (desired) return changeTrap(desired);
	} else if (unsafeWindow.user.environment_id == 33 && trapConfig.FieryWarpath.enabled) { // desert_warpath
		var wave = parseInt(unsafeWindow.user.viewing_atts.desert_warpath.wave);
		var pop = unsafeWindow.user.viewing_atts.desert_warpath.wave_population;
		var waveConf = trapConfig.FieryWarpath['wave' + wave];
		var sumPhysical = 0;
		if (wave < 4) for (var nama in pop){
			if (pop[nama].weakness.name == 'Physical') sumPhysical += parseInt(pop[nama].population);
		}
		$('div#hudLocationContent div[class^="opponent "][class$=" active"] img').css("border","none");
		if (wave == 4){
			var jum = 0;
			for (var boss in pop) if (parseInt(pop[boss].population) > 0) jum++;
			if (jum > 1) return changeTrap(trapConfig.FieryWarpath.warden);
			else return changeTrap(trapConfig.FieryWarpath.warmonger);
		}
		
		var streak = unsafeWindow.user.viewing_atts.desert_warpath.streak;
		var numStreak = parseInt(streak.quantity);
		var target;
		var jendral = unsafeWindow.user.viewing_atts.desert_warpath.common_population.desert_general;
		var weakness = 'Physical';
		if (!target) {
			if (jendral.status == 'active' && warpathGetTrinket('Commander', true) > 0 && warpathGetNumRetreat() >= waveConf.minGeneral){
				target = 'desert_general';
			} else if (numStreak > 0){
				weakness = pop[streak.mouse_type].weakness.name;
				if (numStreak < waveConf.maxStreak && parseInt(pop[streak.mouse_type].population) > 0){
					if ((weakness == 'Physical' || sumPhysical < 1 || (waveConf.allowNonPhysical && warpathGetTrinket(pop[streak.mouse_type].subgroup, true) > 0)) && weakness != 'Arcane') 
						target = streak.mouse_type;
				} else if (waveConf.gargantua && numStreak > 6) target = 'Gargantua';
			}
			
			if (!target){
				if (sumPhysical > 0) {
					if (waveConf.targetPhysical) target = warpathGetPhysical(true, false);
					else target = warpathGetPhysical(false, false);
				} else {
					if (waveConf.targetNonPhysical) target = warpathGetPhysical(true, true, waveConf.charmNonPhysical);
					else target = warpathGetPhysical(false, true, waveConf.charmNonPhysical);
				}
			}
		}
		if (target=='Gargantua') {
			return changeTrap(jQuery.extend(true, {}, trapConfig.FieryWarpath.gargantua));
		}
		$('div#hudLocationContent div[class="opponent ' + target + ' active"] img').first().css("border","2px solid red");
		if (target=='desert_general') {
			var dt = jQuery.extend(true, {}, trapConfig.FieryWarpath.general);
			var x = warpathGetTrinket('Commander', true);
			if (x > 0) dt.trinket = x;
			return changeTrap(dt);
		} else {
			var dt = {weapon:-1, base:-1, trinket:-1, bait:-1};
			weakness = pop[target].weakness.name;
			var subgroup = pop[target].subgroup;
			if (weakness == 'Physical') dt = jQuery.extend(true, {}, trapConfig.FieryWarpath.physical);
			else if (weakness == 'Tactical') dt = jQuery.extend(true, {}, trapConfig.FieryWarpath.tactical);
			else if (weakness == 'Hydro') dt = jQuery.extend(true, {}, trapConfig.FieryWarpath.hydro);
			else if (weakness == 'Arcane') dt = jQuery.extend(true, {}, trapConfig.FieryWarpath.arcane);
			if (warpathGetGroupLeft() > 1) {
				var tr = 0;
				if (wave == 1 && numStreak < 1 && waveConf.openSelection){
				} else if (wave > 1 && weakness != 'Physical' && !waveConf.charmNonPhysical) {
				} else if (Math.pow(2,numStreak) & waveConf.superCharm) tr = warpathGetTrinket(subgroup, true);
				else tr = warpathGetTrinket(subgroup, false);  
				if (tr > 0) dt.trinket = tr;
			}
			if ((Math.pow(2,numStreak) & waveConf.superBrie) && getComponentQuantity(114) > 0) dt.bait = 114;
			return changeTrap(dt);
		}
	} else if (unsafeWindow.user.environment_id == 39 && trapConfig.Iceberg.enabled) { // slushy_shoreline
		return changeTrap(trapConfig.Iceberg.slushy_shoreline);
	} else if (unsafeWindow.user.environment_id == 40 && trapConfig.Iceberg.enabled) { // iceberg
		var nextGeneral = 0;
		for (var x = 1; x <= 4 ; x++) {
			nextGeneral += unsafeWindow.user.quests.QuestIceberg.phases[x].length;
			if (unsafeWindow.user.quests.QuestIceberg.user_progress < nextGeneral) {
				switch (x) {
					case 1 : return changeTrap(trapConfig.Iceberg.phase1);
					case 2 : return changeTrap(trapConfig.Iceberg.phase2);
					case 3 : return changeTrap(trapConfig.Iceberg.phase3);
					case 4 : return changeTrap(trapConfig.Iceberg.phase4);
				}
			} else if (unsafeWindow.user.quests.QuestIceberg.user_progress == nextGeneral) {
				var dt = trapConfig.Iceberg.generals;
				if (trapConfig.Iceberg.altGeneralEnable) {
					if (!currentTrap.effmeter) {
						ajaxRequestEffMeter();
						return false;
					} else {
						dt = trapConfig.Iceberg.altgenerals;
						var count = 0;
						var mice;
						for (var d in currentTrap.effmeter){
							var diff = currentTrap.effmeter[d].mice;
							for (var m in diff) {
								count ++;
								mice = diff[m];
								if (count > 1) break;
							}
							if (count > 1) break;
						}
						if (count == 1 && mice.name==trapConfig.Iceberg.altGeneralEnable) dt = trapConfig.Iceberg.generals;
					}
				}
				return changeTrap(dt);
			}
		}
		return changeTrap(trapConfig.Iceberg.phase5);
	}
	return true;
}

function changeTrap(desired){
	var salah;
	if (desired.weapon > 0 && desired.weapon != currentTrap.weapon && getComponentQuantity(desired.weapon) > 0) salah = 'weapon';
	else if (desired.base > 0 && desired.base != currentTrap.base && getComponentQuantity(desired.base) > 0) salah = 'base';
	else if (desired.trinket > -1 && desired.trinket != currentTrap.trinket && getComponentQuantity(desired.trinket) > 0) salah = 'trinket';
	else if (desired.bait > -1 && desired.bait != currentTrap.bait && getComponentQuantity(desired.bait) > 0) salah = 'bait';

	if (salah) {
		if ($('div#mobileHorn').length > 0) {
			openLink('http://www.mousehuntgame.com/?switch_to=standard');
			return false;
		}
		if (typeof unsafeWindow.userTrapSelector == "undefined") {
			openLink('http://www.mousehuntgame.com/index.php');
			return false;
		}
		if (unsafeWindow.userTrapSelector.selectedComponentClass != salah) {
			if (salah === "weapon") {
				$('a#trapSelector-viewWeapon img').click();
			} else if (salah === "base") {
				$('a#trapSelector-viewBase img').click();
			} else if (salah === "trinket") {
				if ($('a#trapSelector-viewtrinket div.empty').length > 0) $('a#trapSelector-viewtrinket div.empty').click();
				else $('a#trapSelector-viewtrinket img').click();
			} else if (salah === "bait") {
				if ($('a#trapSelector-viewBait div.empty').length > 0) $('a#trapSelector-viewBait div.empty').click();
				else $('a#trapSelector-viewBait img').click();
			}
		}
		if (unsafeWindow.userTrapSelector.componentsCached == false) return false;
		var xDesired = desired[salah];
		var xCurrent = currentTrap[salah];
		if (xDesired == 0) {
			$('div[id="trapSelectorSelectedComponent"] div.content').click();
		} else {
			var nama = getComponentName(xDesired);
			if (nama){
				$('div[id="trapSelectorBrowser"] a[id="selectComponent-' + nama + '"] div.content').click();
			}
		}
		return false;
	} 
	return true;
}

function getComponentQuantity(itemid){
	if (itemid == 0) return 1;
	for (var nama in availableTraps){
		if (availableTraps[nama].item_id == itemid) {
			return availableTraps[nama].quantity;
		}
	}
	return 0;
}

function getComponentName(itemid){
	if (typeof unsafeWindow.userTrapSelector == "undefined" || typeof unsafeWindow.userTrapSelector.availableComponents == "undefined") return null;
	for (var nama in unsafeWindow.userTrapSelector.availableComponents){
		if (unsafeWindow.userTrapSelector.availableComponents[nama].item_id == itemid) {
			return unsafeWindow.userTrapSelector.availableComponents[nama].type;
		}
	}
	return null;
}

function travelTo(origin, destination) {
	if (origin === destination) return true;
	if ($('div#mobileHorn').length > 0) {
		openLink('http://www.mousehuntgame.com/?switch_to=standard');
		return false;
	}
	if (destination === 'meadow') {
		openLink('http://www.mousehuntgame.com/travel.php?freeTravel=true?&uh=' + unsafeWindow.user.unique_hash);
		return false;
	} else {
		var ajax=new unsafeWindow.Ajax();
		ajax.requireLogin=true;
		ajax.responseType=unsafeWindow.Ajax.JSON;
		ajax.ondone=function(resp){
			if(resp.success){
				try{
					unsafeWindow.eventRegistry.doEvent('ajax_response',resp);
					unsafeWindow.eventRegistry.doEvent('travel_complete',{'old':origin,'new':destination});
				} catch (err) {
				}
				try{
					unsafeWindow.app.views.HeadsUpDisplayView.hud.render(resp.user);
				} catch (err) {
				}
			}
		}
		var params={"origin":origin,"destination":destination,'uh':unsafeWindow.user.unique_hash};
		ajax.post(unsafeWindow.callbackurl+"managers/ajax/users/changeenvironment.php",params);
		return false;
	}
}

function soundTheHorn(){
	if (typeof unsafeWindow.user == 'undefined' || unsafeWindow.user.has_puzzle || !hornAllowed) return;
	if ($('div#hornArea div.hornbutton').css('display')=='block') 
		if (document.location.pathname == '/') document.location = hornpage;
		else $('div#hornArea div.hornbutton a').click();
	else if ($('div#mobileHorn').css('display')=='block') openLink(hornpage);
	else randomLinks();
}

function mulai(){
	clearTimeout(timerEvent);
	if (typeof unsafeWindow.user == "undefined") { setTimeout(function() { mulai(); }, 1000); return; }
	var waktu;
	var isKR = true;
	var userid = 0;
	var bait_quantity = 0;
    try {
        if (typeof unsafeWindow.HuntersHorn != "undefined")
            waktu = unsafeWindow.HuntersHorn.getSecondsRemaining(); 
        else
            waktu = parseInt(unsafeWindow.user.next_activeturn_seconds);
        isKR = unsafeWindow.user.has_puzzle;
        userid = parseInt(unsafeWindow.user.user_id);
        bait_quantity = parseInt(unsafeWindow.user.bait_quantity);
    } catch (err) {
        setTimeout(function() { mulai(); }, 1000); 
        return;
    }
	if (isNaN(userid) || userid < 1) {
		setTimeout(function() {		
			openLink(defaultpage);
		} , 60000);
		return;
	}
	if (waktu > 0) waktuTitle = new Date(new Date().getTime() + waktu * 1000);
	cleanupLink();
	if 	($('div#tournamentStatusHud div.timer').length > 0){
		waktuTournament = new Date(new Date().getTime() + unsafeWindow.user.viewing_atts.tournament.seconds_remaining * 1000);
	}
	
	if (isKR==true) {
		if (!alertShown) {
			alertShown = true;
			if (loadParam('enableAlert', false)) soundAlarm(); else alert('King Reward');
		}
		var timeoutvalue = Math.round(Math.random() * Math.abs((loadParam('maxKRWait', 180) - loadParam('minKRWait', 180)) * 60000)) + loadParam('minKRWait', 180) * 60000;
		timerEvent = setTimeout(function() { randomLinks(); } , timeoutvalue);
		waktuRandom = new Date(new Date().getTime() + timeoutvalue);
		waktuNextHorn = null;
		msgTitle = 'King Reward';
		waktuTitle = new Date();
		return;
	} 
	
	currentTrap.weapon = unsafeWindow.user.weapon_item_id;
	currentTrap.base = unsafeWindow.user.base_item_id;
	currentTrap.trinket = (parseInt(unsafeWindow.user.trinket_item_id) > 0 ? parseInt(unsafeWindow.user.trinket_item_id) : 0);
	currentTrap.bait = (parseInt(unsafeWindow.user.bait_item_id) > 0 ? parseInt(unsafeWindow.user.bait_item_id) : 0);
	if (currentTrap.trinket == 0) {
		$('span#hud_trinketName a').html('None&nbsp;');
		$('span#hud_trinketQuantity').html('0');
	} else {
		$('span#hud_trinketName a').html(unsafeWindow.user.trinket_name + '&nbsp;');
		$('span#hud_trinketQuantity').html(unsafeWindow.user.trinket_quantity);
	}

	calculateTrapCheck();
	$('span#hud_titlePercentage').html(unsafeWindow.user.title_percentage);

	hornAllowed = checkLocation();
	if (bait_quantity < 1) hornAllowed = false;
	if (waktu == 0 && hornAllowed) {
		soundTheHorn();
		return;
	} else if (waktu > 0){
		msgTitle = 'Sound The Horn';
		var timeoutvalue = waktu + Math.round(Math.random() * Math.abs(loadParam('maxHornDelay', 120) - loadParam('minHornDelay', 30))) + loadParam('minHornDelay', 30);
		waktuNextHorn = new Date(new Date().getTime() + timeoutvalue * 1000);
		timerEvent = setTimeout(function() { 
			if (!hornAllowed) return;
			if ($('div#hornArea div.hornbutton').css('display') == 'block' || $('div#mobileHorn').css('display') == 'block') {
				soundTheHorn();
			} else
				randomLinks();
		}, timeoutvalue * 1000);
	}
}

function populateComboTrap(obj){
	var list = [];
	for (var x in obj) list.push(obj[x]);
	list.sort(function(a, b){
		return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
	});
	for (var nama in list){
		var id = list[nama].item_id;
		var name = list[nama].name;
		var classification = list[nama].classification;
		if (classification === 'base')
			$('div#AutoHornWindow select[name^="cbo"][name$="Base"]').each(function(){
				$(this).append('<option value="' + id + '" title="' + name + '">' + name + '</option>');
			});
		else if (classification === 'weapon')
			$('div#AutoHornWindow select[name^="cbo"][name$="Weapon"]').each(function(){
				$(this).append('<option value="' + id + '" title="' + name + '">' + name + '</option>');
			});
		else if (classification === 'trinket')
			$('div#AutoHornWindow select[name^="cbo"][name$="Trinket"]').each(function(){
				$(this).append('<option value="' + id + '" title="' + name + '">' + name + ' (' + list[nama].quantity + ')</option>');
			});
		else if (classification === 'bait')
			$('div#AutoHornWindow select[name^="cbo"][name$="Bait"]').each(function(){
				$(this).append('<option value="' + id + '" title="' + name + '">' + name + ' (' + list[nama].quantity + ')</option>');
			});
	}	
}

function setSelectionComboTrap(name, trap){
	$('div#AutoHornWindow select[name="cbo' + name + 'Base"] option[value="' + trap.base + '"]').attr('selected', 'selected');
	$('div#AutoHornWindow select[name="cbo' + name + 'Weapon"] option[value="' + trap.weapon + '"]').attr('selected', 'selected');
	$('div#AutoHornWindow select[name="cbo' + name + 'Trinket"] option[value="' + trap.trinket + '"]').attr('selected', 'selected');
	$('div#AutoHornWindow select[name="cbo' + name + 'Bait"] option[value="' + trap.bait + '"]').attr('selected', 'selected');
}

function getSelectionComboTrap(name, trap){
	trap.base = $('div#AutoHornWindow select[name="cbo' + name + 'Base"]').val();
	trap.weapon = $('div#AutoHornWindow select[name="cbo' + name + 'Weapon"]').val();
	trap.trinket = $('div#AutoHornWindow select[name="cbo' + name + 'Trinket"]').val();
	trap.bait = $('div#AutoHornWindow select[name="cbo' + name + 'Bait"]').val();
}

function generateTrapSetupCombo(mid){
	return '<select name="cbo' + mid + 'Base"><option value="-1">Any</option></select> <select name="cbo' + mid + 'Weapon"><option value="-1">Any</option></select> <select name="cbo' + mid + 'Trinket"><option value="-1">Any</option><option value="0">None</option></select> <select name="cbo' + mid + 'Bait"><option value="-1">Any</option></select>';
}

function showBalackPage(){
	$('div#AutoHornWindow a[href="#save"]').unbind('click');
	$('div#AutoHornWindow a[href="#default"]').unbind('click');
	$('div#AutoHornWindow div[name="top"]').html('Balack\'s Cove Configuration');
	$('div#AutoHornWindow div[name="main"]').html('<ul><span class="groupTitle">General</span>' + 
	'<li tittle="toggle enable/disable setup on this page"><span class="paramDesc">Enable</span><input type="checkbox" name="chkEnable" />Use setup below for each conditions</li>' +
	'<li tittle="Auto travel to Balack Cove"><span class="paramDesc">Auto Travel</span><input type="checkbox" name="chkTravel" />Travel to Balack Cove when washed to JoD</li>' +
	
	'</ul><ul><span class="groupTitle">Trap Setup</span>' + 
	'<li title="You won\'t transferred automatically to Cove if you don\'t have Vengeful or Vanilla Stilton, hunt in JoD with this setup"><span class="paramDesc">Jungle of Dread</span>' + generateTrapSetupCombo('Jungle') + '</li>' +
	'<li title="Trap setup when high tide"><span class="paramDesc">High Tide</span>' + generateTrapSetupCombo('high') + '</li>' +
	'<li title="Trap setup when mid tide"><span class="paramDesc">Mid Tide</span>' + generateTrapSetupCombo('mid') + '</li>' +
	'<li title="Trap setup when low tide"><span class="paramDesc">Low Tide</span>' + generateTrapSetupCombo('low') + '</li>' +

	'</ul><br>');
	$('div#AutoHornWindow div[name="main"]').css({'overflow-y':'auto', 'height':'350px'});
	$('div#AutoHornWindow div[name="main"] ul').css({'list-style-type':'none','margin':'0px'});
	$('div#AutoHornWindow div[name="main"] .groupTitle').css({'font-weight':'bold','font-size':'1.2em'});
	$('div#AutoHornWindow div[name="main"] .paramDesc').css({'font-weight':'bold','float':'left','width':'150', 'padding-left':'20px'});
	$('div#AutoHornWindow div[name="main"] select').css({'width':'300px'});
	$('div#AutoHornWindow div[name="main"] input.short').css({'width':'20px'});
	$('div#AutoHornWindow div[name="main"] br').css({'clear':'left'});
	
	populateComboTrap(availableTraps);

	$('div#AutoHornWindow div[name="main"] select').css({'width':'100px'});

	if (trapConfig.BalackCove.enabled) $('div#AutoHornWindow input[name="chkEnable"]').attr('checked', 'checked');
	if (trapConfig.BalackCove.travel) $('div#AutoHornWindow input[name="chkTravel"]').attr('checked', 'checked');
	setSelectionComboTrap('Jungle', trapConfig.BalackCove.jod);
	setSelectionComboTrap('high', trapConfig.BalackCove.high);
	setSelectionComboTrap('mid', trapConfig.BalackCove.mid);
	setSelectionComboTrap('low', trapConfig.BalackCove.low);

	$('div#AutoHornWindow a[href="#save"]').click(function(e){
		e.preventDefault();
		trapConfig.BalackCove.enabled = $('div#AutoHornWindow input[name="chkEnable"]:checked').length;
		trapConfig.BalackCove.travel = $('div#AutoHornWindow input[name="chkTravel"]:checked').length;
		getSelectionComboTrap('Jungle', trapConfig.BalackCove.jod);
		getSelectionComboTrap('high', trapConfig.BalackCove.high);
		getSelectionComboTrap('mid', trapConfig.BalackCove.mid);
		getSelectionComboTrap('low', trapConfig.BalackCove.low);
	
		var str = JSON.stringify(trapConfig);
		saveParam('trapConfig', str);
		$('div#AutoHornWindow').hide();
		$('div#AutoHornMask').hide();
		checkLocation();
	});
	$('div#AutoHornWindow a[href="#default"]').click(function(e){
		e.preventDefault();
		$('div#AutoHornWindow input[name="chkEnable"]').removeAttr('checked');
		$('div#AutoHornWindow input[name="chkTravel"]').removeAttr('checked');
		$('div#AutoHornWindow select[name^="cbo"] option').each(function(){ $(this).removeAttr('selected'); });
	});
	var winH = $(window).height();
	var winW = $(window).width();
    $('div#AutoHornWindow').css({'top':(winH - $('div#AutoHornWindow').height())/2, 'left':(winW - $('div#AutoHornWindow').width())/2});
    $('div#AutoHornMask').css({'top':'0', 'left':'0', 'width':winW, 'height':winH});
	$('div#AutoHornMask').fadeTo(0,0.8);
	$('div#AutoHornWindow').fadeIn(2000);
}

function showWarpathPage(){
	$('div#AutoHornWindow a[href="#save"]').unbind('click');
	$('div#AutoHornWindow a[href="#default"]').unbind('click');
	$('div#AutoHornWindow div[name="top"]').html('Warpath Configuration');
	$('div#AutoHornWindow div[name="main"]').html('<ul><span class="groupTitle">General</span>' + 
	'<li tittle="toggle enable/disable setup on this page"><span class="paramDesc">Enable</span><input type="checkbox" name="chkEnable" />Use setup below for each conditions</li>' +
	
	'</ul><ul><span class="groupTitle">Trap Setup</span>' + 
	'<li title="Against Warrior, Scout, and Archer"><span class="paramDesc">Physical</span>' + generateTrapSetupCombo('Physical') + '</li>' +
	'<li title="Tactical setup against Cavalry"><span class="paramDesc">Cavalry</span>' + generateTrapSetupCombo('Tactical') + '</li>' +
	'<li title="Hydro setup against Mage"><span class="paramDesc">Mage</span>' + generateTrapSetupCombo('Hydro') + '</li>' +
	'<li title="Arcane setup against Artillery"><span class="paramDesc">Artillery</span>' + generateTrapSetupCombo('Arcane') + '</li>' +
	'<li title="Trap setup against Commander"><span class="paramDesc">Commander</span>' + generateTrapSetupCombo('General') + '</li>' +
	'<li title="Trap setup against Gargantua"><span class="paramDesc">Gargantua</span>' + generateTrapSetupCombo('Gargantua') + '</li>' +
	'<li title="Trap setup against Theurgy Warden"><span class="paramDesc">Theurgy Warden</span>' + generateTrapSetupCombo('Warden') + '</li>' +
	'<li title="Trap setup against Warmonger"><span class="paramDesc">Warmonger</span>' + generateTrapSetupCombo('Warmonger') + '</li>' +

	'</ul><ul><span class="groupTitle">Wave 1</span>' + 
	'<li title="Strategy used when no streak"><span class="paramDesc">No Streak</span><input type="radio" name="wave1openSelection" value="true" />don\'t waste charm <input type="radio" name="wave1openSelection" value="false" />use charm</li>' +
	'<li title="Strategy used against physical mouse"><span class="paramDesc">Physical Targeting</span><input type="radio" name="wave1targetPhysical" value="true" />max population <input type="radio" name="wave1targetPhysical" value="false" />min population</li>' +
	'<li title="Streak to use SuperBrie (if available)" class="wave1superBrie-eachstreak"><span class="paramDesc">SuperBrie</span></li>' +
	'<li title="Streak to use Super version of charm (if available)" class="wave1superCharm-eachstreak"><span class="paramDesc">SuperCharm</span></li>' +
	'<li title="Commander Charm use"><span class="paramDesc">Commander</span>Aim for commander if at least <input type="text" name="wave1minGeneral" class="short" /> mouse will retreat</li>' +
	'<li title="Target maximum streak"><span class="paramDesc">Max Streak</span><input type="text" name="wave1maxStreak" class="short" /> streaks, then <input type="radio" name="wave1gargantua" value="true" />aim for gargantua <input type="radio" name="wave1gargantua" value="false" />continue next cycle</li>' +

	'</ul><ul><span class="groupTitle">Wave 2</span>' + 
	'<li title="Strategy used against physical mouse"><span class="paramDesc">Physical Targeting</span><input type="radio" name="wave2targetPhysical" value="true" />max population <input type="radio" name="wave2targetPhysical" value="false" />min population</li>' +
	'<li title="Strategy used against non-physical mouse"><span class="paramDesc">Non-Physical Targeting</span><input type="radio" name="wave2targetNonPhysical" value="true" />max population <input type="radio" name="wave2targetNonPhysical" value="false" />min population</li>' +
	'<li title="Should cham used against non-physical mouse if any"><span class="paramDesc">Non-Physical Charm</span><input type="radio" name="wave2charmNonPhysical" value="true" />Yes, use charms <input type="radio" name="wave2charmNonPhysical" value="false" />No, keep those charms</li>' +
	'<li title="Allow targeting non-physical when accidentally cathed even if physical exist"><span class="paramDesc">Allow Non-Physical Streak</span><input type="radio" name="wave2allowNonPhysical" value="true" />Yes, only if I have required charm <input type="radio" name="wave2allowNonPhysical" value="false" />No, physical first</li>' +
	'<li title="Streak to use SuperBrie (if available)" class="wave2superBrie-eachstreak"><span class="paramDesc">SuperBrie</span></li>' +
	'<li title="Streak to use Super version of charm (if available)" class="wave2superCharm-eachstreak"><span class="paramDesc">SuperCharm</span></li>' +
	'<li title="Commander Charm use"><span class="paramDesc">Commander</span>Aim for commander if at least <input type="text" name="wave2minGeneral" class="short" /> mouse will retreat</li>' +
	'<li title="Target maximum streak"><span class="paramDesc">Max Streak</span><input type="text" name="wave2maxStreak" class="short" /> streaks, then <input type="radio" name="wave2gargantua" value="true" />aim for gargantua <input type="radio" name="wave2gargantua" value="false" />continue next cycle</li>' +

	'</ul><ul><span class="groupTitle">Wave 3</span>' + 
	'<li title="Strategy used against physical mouse"><span class="paramDesc">Physical Targeting</span><input type="radio" name="wave3targetPhysical" value="true" />max population <input type="radio" name="wave3targetPhysical" value="false" />min population</li>' +
	'<li title="Strategy used against non-physical mouse"><span class="paramDesc">Non-Physical Targeting</span><input type="radio" name="wave3targetNonPhysical" value="true" />max population <input type="radio" name="wave3targetNonPhysical" value="false" />min population</li>' +
	'<li title="Should cham used against non-physical mouse if any"><span class="paramDesc">Non-Physical Charm</span><input type="radio" name="wave3charmNonPhysical" value="true" />Yes, use charms <input type="radio" name="wave3charmNonPhysical" value="false" />No, keep those charms</li>' +
	'<li title="Allow targeting non-physical when accidentally cathed even if physical exist"><span class="paramDesc">Allow Non-Physical Streak</span><input type="radio" name="wave3allowNonPhysical" value="true" />Yes, only if I have required charm <input type="radio" name="wave3allowNonPhysical" value="false" />No, physical first</li>' +
	'<li title="Streak to use SuperBrie (if available)" class="wave3superBrie-eachstreak"><span class="paramDesc">SuperBrie</span></li>' +
	'<li title="Streak to use Super version of charm (if available)" class="wave3superCharm-eachstreak"><span class="paramDesc">SuperCharm</span></li>' +
	'<li title="Commander Charm use"><span class="paramDesc">Commander</span>Aim for commander if at least <input type="text" name="wave3minGeneral" class="short" /> mouse will retreat</li>' +
	'<li title="Target maximum streak"><span class="paramDesc">Max Streak</span><input type="text" name="wave3maxStreak" class="short" /> streaks, then <input type="radio" name="wave3gargantua" value="true" />aim for gargantua <input type="radio" name="wave3gargantua" value="false" />continue next cycle</li>' +

	'</ul><br>');
	for (var i = 0; i < 13; i++){
		$('div#AutoHornWindow div[name="main"] li[class$="-eachstreak"]').each(function(){
			var kelas = $(this).attr('class');
			kelas = kelas.substring(0,kelas.lastIndexOf('-'));
			var checked = trapConfig.FieryWarpath[kelas.substring(0,5)][kelas.substring(5)] & Math.pow(2,i);
			$(this).append('<input type="checkbox" name="' + (kelas + '-' + i) + '" ' + (checked ? 'checked="checked" ' : "") + '/>' + i + '  ');
		});
	}
	$('div#AutoHornWindow div[name="main"]').css({'overflow-y':'auto', 'height':'350px'});
	$('div#AutoHornWindow div[name="main"] ul').css({'list-style-type':'none','margin':'0px'});
	$('div#AutoHornWindow div[name="main"] .groupTitle').css({'font-weight':'bold','font-size':'1.2em'});
	$('div#AutoHornWindow div[name="main"] .paramDesc').css({'font-weight':'bold','float':'left','width':'150', 'padding-left':'20px'});
	$('div#AutoHornWindow div[name="main"] select').css({'width':'300px'});
	$('div#AutoHornWindow div[name="main"] input.short').css({'width':'20px'});
	$('div#AutoHornWindow div[name="main"] br').css({'clear':'left'});
	
	populateComboTrap(availableTraps);

	$('div#AutoHornWindow div[name="main"] select').css({'width':'100px'});

	if (trapConfig.FieryWarpath.enabled) $('div#AutoHornWindow input[name="chkEnable"]').attr('checked', 'checked');
	setSelectionComboTrap('Physical', trapConfig.FieryWarpath.physical);
	setSelectionComboTrap('Tactical', trapConfig.FieryWarpath.tactical);
	setSelectionComboTrap('Hydro', trapConfig.FieryWarpath.hydro);
	setSelectionComboTrap('Arcane', trapConfig.FieryWarpath.arcane);
	setSelectionComboTrap('General', trapConfig.FieryWarpath.general);
	setSelectionComboTrap('Gargantua', trapConfig.FieryWarpath.gargantua);
	setSelectionComboTrap('Warden', trapConfig.FieryWarpath.warden);
	setSelectionComboTrap('Warmonger', trapConfig.FieryWarpath.warmonger);
	$('div#AutoHornWindow div[name="main"] input[name^="wave"]').not('li[class$="-eachstreak"] input').each(function(){
		var nilai = trapConfig.FieryWarpath[$(this).attr('name').substring(0,5)][$(this).attr('name').substring(5)];
		if ($(this).attr('type') == "text") {
			$(this).val(nilai);
		} else if ($(this).attr('type') == "radio"){
			if (new String(nilai) == $(this).val()) $(this).attr("checked","checked");
		}
	});	

	$('div#AutoHornWindow a[href="#save"]').click(function(e){
		e.preventDefault();
		trapConfig.FieryWarpath.enabled = $('div#AutoHornWindow input[name="chkEnable"]:checked').length;
		getSelectionComboTrap('Physical', trapConfig.FieryWarpath.physical);
		getSelectionComboTrap('Tactical', trapConfig.FieryWarpath.tactical);
		getSelectionComboTrap('Hydro', trapConfig.FieryWarpath.hydro);
		getSelectionComboTrap('Arcane', trapConfig.FieryWarpath.arcane);
		getSelectionComboTrap('General', trapConfig.FieryWarpath.general);
		getSelectionComboTrap('Gargantua', trapConfig.FieryWarpath.gargantua);
		getSelectionComboTrap('Warden', trapConfig.FieryWarpath.warden);
		getSelectionComboTrap('Warmonger', trapConfig.FieryWarpath.warmonger);
		$('div#AutoHornWindow div[name="main"] input[name^="wave"]').not('li[class$="-eachstreak"] input').each(function(){
			var nilai;
			if ($(this).attr('type') == "text") {
				nilai = (isNaN($(this).val()) ? $(this).val() : parseInt($(this).val()));
				trapConfig.FieryWarpath[$(this).attr('name').substring(0,5)][$(this).attr('name').substring(5)] = nilai;
			} else if ($(this).attr('type') == "radio" && $(this).attr('checked')){
				if ($(this).val() == 'true') nilai = true;
				else if ($(this).val() == 'false') nilai = false;
				else nilai = $(this).val();
				trapConfig.FieryWarpath[$(this).attr('name').substring(0,5)][$(this).attr('name').substring(5)] = nilai;
			}
		});
		var tmp = {wave1:{superBrie:0,superCharm:0},wave2:{superBrie:0,superCharm:0},wave3:{superBrie:0,superCharm:0}};
		$('div#AutoHornWindow div[name="main"] li[class$="-eachstreak"] input:checked').each(function(){
			var nama = $(this).attr('name');
			tmp[nama.substring(0,5)][nama.substring(5, nama.lastIndexOf('-'))] += Math.pow(2,parseInt(nama.substring(nama.lastIndexOf('-') + 1)));
		});
		jQuery.extend(true, trapConfig.FieryWarpath, tmp);
	
		var str = JSON.stringify(trapConfig);
		saveParam('trapConfig', str);
		$('div#AutoHornWindow').hide();
		$('div#AutoHornMask').hide();
		checkLocation();
	});
	$('div#AutoHornWindow a[href="#default"]').click(function(e){
		e.preventDefault();
		$('div#AutoHornWindow input[name="chkEnable"]').removeAttr('checked');
		$('div#AutoHornWindow select[name^="cbo"] option').each(function(){ $(this).removeAttr('selected'); });
		var def = {wave1:{maxStreak:9,gargantua:true,minGeneral:99,targetPhysical:true,charmNonPhysical:false,openSelection:true},wave2:{maxStreak:9,gargantua:true,minGeneral:99,targetPhysical:true,charmNonPhysical:true,targetNonPhysical:false,allowNonPhysical:false},wave3:{maxStreak:9,gargantua:true,minGeneral:99,targetPhysical:true,charmNonPhysical:true,targetNonPhysical:false,allowNonPhysical:false}};
		$('div#AutoHornWindow div[name="main"] input[name^="wave"]').not('li[class$="-eachstreak"] input').each(function(){
			var nilai = def[$(this).attr('name').substring(0,5)][$(this).attr('name').substring(5)];
			if ($(this).attr('type') == "text") {
				$(this).val(nilai);
			} else if ($(this).attr('type') == "radio"){
				if (new String(nilai) == $(this).val()) $(this).attr("checked","checked");
			}
		});	
		$('div#AutoHornWindow div[name="main"] li[class$="-eachstreak"] input').each(function(){
			$(this).removeAttr('checked');
		});
	});
	var winH = $(window).height();
	var winW = $(window).width();
    $('div#AutoHornWindow').css({'top':(winH - $('div#AutoHornWindow').height())/2, 'left':(winW - $('div#AutoHornWindow').width())/2});
    $('div#AutoHornMask').css({'top':'0', 'left':'0', 'width':winW, 'height':winH});
	$('div#AutoHornMask').fadeTo(0,0.8);
	$('div#AutoHornWindow').fadeIn(2000);
}

function showIcebergPage(){
	$('div#AutoHornWindow a[href="#save"]').unbind('click');
	$('div#AutoHornWindow a[href="#default"]').unbind('click');
	$('div#AutoHornWindow div[name="top"]').html('Iceberg Configuration');
	$('div#AutoHornWindow div[name="main"]').html('<ul><span class="groupTitle">General</span>' + 
	'<li tittle="toggle enable/disable setup on this page"><span class="paramDesc">Enable</span><input type="checkbox" name="chkEnable" />Use setup below for each conditions</li>' +
	
	'</ul><ul><span class="groupTitle">Trap Setup</span>' + 
	'<li title="Trap setup for Slushy Shoreline"><span class="paramDesc">Slushy Shoreline</span>' + generateTrapSetupCombo('Slushy') + '</li>' +
	'<li title="Trap setup for phase 1 (Treacherous Tunnels)"><span class="paramDesc">Treacherous Tunnels</span>' + generateTrapSetupCombo('Phase1') + '</li>' +
	'<li title="Trap setup for phase 2 (Brutal Bulwark)"><span class="paramDesc">Brutal Bulwark</span>' + generateTrapSetupCombo('Phase2') + '</li>' +
	'<li title="Trap setup for phase 3 (Bombing Run)"><span class="paramDesc">Bombing Run</span>' + generateTrapSetupCombo('Phase3') + '</li>' +
	'<li title="Trap setup for phase 4 (The Mad Depths)"><span class="paramDesc">The Mad Depths</span>' + generateTrapSetupCombo('Phase4') + '</li>' +
	'<li title="Trap setup for phase 5 (Icewing\'s Lair)"><span class="paramDesc">Icewing\'s Lair</span>' + generateTrapSetupCombo('Phase5') + '</select></li>' +
	'<li title="Trap setup when meeting generals"><span class="paramDesc">Generals</span>' + generateTrapSetupCombo('General') + '</li>' +
	
	'</ul><ul><span class="groupTitle">Iceberg Generals</span>' + 
	'<li title="Try to catch specific general"><span class="paramDesc">Specific General</span><input type="checkbox" name="chkAltGeneral" />Try to get <select name="cboAltGeneral"><option value="General Drheller">General Drheller</option><option value="Princess Fist">Princess Fist</option><option value="Lady Coldsnap">Lady Coldsnap</option><option value="Lord Splodington">Lord Splodington</option></select></li>' +
	'<li title="Trap setup for general evasion, should be non-hydro"><span class="paramDesc">Evasion Setup</span>' + generateTrapSetupCombo('AltGeneral') + '</li>' +
	'</ul><br>');

	$('div#AutoHornWindow div[name="main"]').css({'overflow-y':'auto', 'height':'350px'});
	$('div#AutoHornWindow div[name="main"] ul').css({'list-style-type':'none','margin':'0px'});
	$('div#AutoHornWindow div[name="main"] .groupTitle').css({'font-weight':'bold','font-size':'1.2em'});
	$('div#AutoHornWindow div[name="main"] .paramDesc').css({'font-weight':'bold','float':'left','width':'150', 'padding-left':'20px'});
	$('div#AutoHornWindow div[name="main"] select').css({'width':'300px'});
	$('div#AutoHornWindow div[name="main"] br').css({'clear':'left'});
	
	populateComboTrap(availableTraps);

	$('div#AutoHornWindow div[name="main"] select').css({'width':'100px'});

	if (trapConfig.Iceberg.enabled) $('div#AutoHornWindow input[name="chkEnable"]').attr('checked', 'checked');
	if (trapConfig.Iceberg.altGeneralEnable) {
		$('div#AutoHornWindow input[name="chkAltGeneral"]').attr('checked', 'checked');
		$('div#AutoHornWindow select[name="cboAltGeneral"] option[value="' + trapConfig.Iceberg.altGeneralEnable + '"]').attr('selected', 'selected');
	}
	setSelectionComboTrap('Slushy', trapConfig.Iceberg.slushy_shoreline);
	setSelectionComboTrap('Phase1', trapConfig.Iceberg.phase1);
	setSelectionComboTrap('Phase2', trapConfig.Iceberg.phase2);
	setSelectionComboTrap('Phase3', trapConfig.Iceberg.phase3);
	setSelectionComboTrap('Phase4', trapConfig.Iceberg.phase4);
	setSelectionComboTrap('Phase5', trapConfig.Iceberg.phase5);
	setSelectionComboTrap('General', trapConfig.Iceberg.generals);
	setSelectionComboTrap('AltGeneral', trapConfig.Iceberg.altgenerals);

	$('div#AutoHornWindow a[href="#save"]').click(function(e){
		e.preventDefault();
		trapConfig.Iceberg.enabled = $('div#AutoHornWindow input[name="chkEnable"]:checked').length;
		if ($('div#AutoHornWindow input[name="chkAltGeneral"]:checked').length > 0) 
			trapConfig.Iceberg.altGeneralEnable = $('div#AutoHornWindow select[name="cboAltGeneral"]').val();
		else 
			trapConfig.Iceberg.altGeneralEnable = 0;
		getSelectionComboTrap('Slushy', trapConfig.Iceberg.slushy_shoreline);
		getSelectionComboTrap('Phase1', trapConfig.Iceberg.phase1);
		getSelectionComboTrap('Phase2', trapConfig.Iceberg.phase2);
		getSelectionComboTrap('Phase3', trapConfig.Iceberg.phase3);
		getSelectionComboTrap('Phase4', trapConfig.Iceberg.phase4);
		getSelectionComboTrap('Phase5', trapConfig.Iceberg.phase5);
		getSelectionComboTrap('General', trapConfig.Iceberg.generals);
		getSelectionComboTrap('AltGeneral', trapConfig.Iceberg.altgenerals);

		var str = JSON.stringify(trapConfig);
		saveParam('trapConfig', str);
		$('div#AutoHornWindow').hide();
		$('div#AutoHornMask').hide();
		checkLocation();
	});
	$('div#AutoHornWindow a[href="#default"]').click(function(e){
		e.preventDefault();
		$('div#AutoHornWindow input[name="chkEnable"]').removeAttr('checked');
		$('div#AutoHornWindow input[name="chkAltGeneral"]').removeAttr('checked');
		$('div#AutoHornWindow select[name^="cbo"] option').each(function(){ $(this).removeAttr('selected'); });
	});
		
	var winH = $(window).height();
	var winW = $(window).width();
    $('div#AutoHornWindow').css({'top':(winH - $('div#AutoHornWindow').height())/2, 'left':(winW - $('div#AutoHornWindow').width())/2});
    $('div#AutoHornMask').css({'top':'0', 'left':'0', 'width':winW, 'height':winH});
	$('div#AutoHornMask').fadeTo(0,0.8);
	$('div#AutoHornWindow').fadeIn(2000);
}

function showZugzwangPage(){
	$('div#AutoHornWindow a[href="#save"]').unbind('click');
	$('div#AutoHornWindow a[href="#default"]').unbind('click');
	$('div#AutoHornWindow div[name="top"]').html('Zugzwang Configuration');
	$('div#AutoHornWindow div[name="main"]').html('<ul><span class="groupTitle">General</span>' + 
	'<li tittle="toggle enable/disable setup on this page"><span class="paramDesc">Enable</span><input type="checkbox" name="chkEnable" />Use setup below</li>' +
	
	'</ul><ul><span class="groupTitle">Seasonal Garden</span>' + 
	'<li tittle="Automatically Travel to tower when amplifier full"><span class="paramDesc">Auto Travel</span><input type="radio" name="autoTravel" value="true" />Yes, travel when my amplifier full <input type="radio" name="autoTravel" value="false" />No, thanks</li>' +
	'<li title="Trap setup for winter season (hydro)"><span class="paramDesc">Winter</span>' + generateTrapSetupCombo('Winter') + '</li>' +
	'<li title="Trap setup for spring season (physical)"><span class="paramDesc">Spring</span>' + generateTrapSetupCombo('Spring') + '</li>' +
	'<li title="Trap setup for summer season (tactical)"><span class="paramDesc">Summer</span>' + generateTrapSetupCombo('Summer') + '</li>' +
	'<li title="Trap setup for fall season (shadow)"><span class="paramDesc">Fall</span>' + generateTrapSetupCombo('Fall') + '</li>' +

	'</ul><ul><span class="groupTitle">Zugzwang Tower</span>' + 
	'<li title="Side to determine phase"><span class="paramDesc">Side</span><input type="radio" name="optTarget" value="0" />Highest Progress <input type="radio" name="optTarget" value="1" />Technic <input type="radio" name="optTarget" value="2" />Mystic <input type="radio" name="optTarget" value="3" />Both Side</li>' +
	'<li title="Trap setup for pawn"><span class="paramDesc">Pawn</span>' + generateTrapSetupCombo('Pawn') + '</li>' +
	'<li title="Trap setup for knight"><span class="paramDesc">Knight</span>' + generateTrapSetupCombo('Knight') + '</li>' +
	'<li title="Trap setup for bishop"><span class="paramDesc">Bishop</span>' + generateTrapSetupCombo('Bishop') + '</li>' +
	'<li title="Trap setup for rook"><span class="paramDesc">Rook</span>' + generateTrapSetupCombo('Rook') + '</li>' +
	'<li title="Trap setup for queen"><span class="paramDesc">Queen</span>' + generateTrapSetupCombo('Queen') + '</li>' +
	'<li title="Trap setup for king"><span class="paramDesc">King</span>' + generateTrapSetupCombo('King') + '</li>' +
	'<li title="Trap setup for chessmaster"><span class="paramDesc">Chessmaster</span>' + generateTrapSetupCombo('Chessmaster') + '</li>' +
	'</ul><br>');
	$('div#AutoHornWindow div[name="main"]').css({'overflow-y':'auto', 'height':'350px'});
	$('div#AutoHornWindow div[name="main"] ul').css({'list-style-type':'none','margin':'0px'});
	$('div#AutoHornWindow div[name="main"] .groupTitle').css({'font-weight':'bold','font-size':'1.2em'});
	$('div#AutoHornWindow div[name="main"] .paramDesc').css({'font-weight':'bold','float':'left','width':'150', 'padding-left':'20px'});
	$('div#AutoHornWindow div[name="main"] select').css({'width':'300px'});
	$('div#AutoHornWindow div[name="main"] br').css({'clear':'left'});
	
	populateComboTrap(availableTraps);

	$('div#AutoHornWindow div[name="main"] select').css({'width':'100px'});
	// set selected values
	if (trapConfig.ZugzwangTower.enabled) $('div#AutoHornWindow input[name="chkEnable"]').attr('checked', 'checked');
	if (trapConfig.SeasonalGarden.autoTravel) $('div#AutoHornWindow input[name="autoTravel"][value="true"]').attr('checked', 'checked');
	else $('div#AutoHornWindow input[name="autoTravel"][value="false"]').attr('checked', 'checked');
	$('div#AutoHornWindow input[name="optTarget"][value="' + trapConfig.ZugzwangTower.target + '"]').attr('checked', 'checked'); 
	
	setSelectionComboTrap('Winter', trapConfig.SeasonalGarden.wr);
	setSelectionComboTrap('Spring', trapConfig.SeasonalGarden.sg);
	setSelectionComboTrap('Summer', trapConfig.SeasonalGarden.sr);
	setSelectionComboTrap('Fall', trapConfig.SeasonalGarden.fl);
	setSelectionComboTrap('Pawn', trapConfig.ZugzwangTower.pawn);
	setSelectionComboTrap('Knight', trapConfig.ZugzwangTower.knight);
	setSelectionComboTrap('Bishop', trapConfig.ZugzwangTower.bishop);
	setSelectionComboTrap('Rook', trapConfig.ZugzwangTower.rook);
	setSelectionComboTrap('Queen', trapConfig.ZugzwangTower.queen);
	setSelectionComboTrap('King', trapConfig.ZugzwangTower.king);
	setSelectionComboTrap('Chessmaster', trapConfig.ZugzwangTower.chessmaster);

	$('div#AutoHornWindow a[href="#save"]').click(function(e){
		e.preventDefault();
		trapConfig.ZugzwangTower.enabled = $('div#AutoHornWindow input[name="chkEnable"]:checked').length;
		if ($('div#AutoHornWindow input[name="autoTravel"]:checked').val() == 'true') trapConfig.SeasonalGarden.autoTravel = true;
		else trapConfig.SeasonalGarden.autoTravel = false;
		trapConfig.ZugzwangTower.target = parseInt($('div#AutoHornWindow input[name="optTarget"]:checked').val());
		getSelectionComboTrap('Winter', trapConfig.SeasonalGarden.wr);
		getSelectionComboTrap('Spring', trapConfig.SeasonalGarden.sg);
		getSelectionComboTrap('Summer', trapConfig.SeasonalGarden.sr);
		getSelectionComboTrap('Fall', trapConfig.SeasonalGarden.fl);
		getSelectionComboTrap('Pawn', trapConfig.ZugzwangTower.pawn);
		getSelectionComboTrap('Knight', trapConfig.ZugzwangTower.knight);
		getSelectionComboTrap('Bishop', trapConfig.ZugzwangTower.bishop);
		getSelectionComboTrap('Rook', trapConfig.ZugzwangTower.rook);
		getSelectionComboTrap('Queen', trapConfig.ZugzwangTower.queen);
		getSelectionComboTrap('King', trapConfig.ZugzwangTower.king);
		getSelectionComboTrap('Chessmaster', trapConfig.ZugzwangTower.chessmaster);
		
		var str = JSON.stringify(trapConfig);
		saveParam('trapConfig', str);

		$('div#AutoHornWindow').hide();
		$('div#AutoHornMask').hide();
		checkLocation();
	});
	$('div#AutoHornWindow a[href="#default"]').click(function(e){
		e.preventDefault();
		$('div#AutoHornWindow input[name="chkEnable"]').removeAttr('checked');
		$('div#AutoHornWindow input[name="autoTravel"][value="false"]').attr('checked', 'checked');
		$('div#AutoHornWindow input[name="optTarget"][value="0"]').attr('checked', 'checked');
		$('div#AutoHornWindow select[name^="cbo"] option').each(function(){ $(this).removeAttr('selected'); });
	});
		
	var winH = $(window).height();
	var winW = $(window).width();
    $('div#AutoHornWindow').css({'top':(winH - $('div#AutoHornWindow').height())/2, 'left':(winW - $('div#AutoHornWindow').width())/2});
    $('div#AutoHornMask').css({'top':'0', 'left':'0', 'width':winW, 'height':winH});
	$('div#AutoHornMask').fadeTo(0,0.8);
	$('div#AutoHornWindow').fadeIn(2000);
}

function showConfigPage(){
	$('div#AutoHornWindow a[href="#save"]').unbind('click');
	$('div#AutoHornWindow a[href="#default"]').unbind('click');
	$('div#AutoHornWindow div[name="top"]').html('AutoHorn Configuration');
	$('div#AutoHornWindow div[name="main"]').html('<ul><span class="groupTitle">General</span><li title="extra time to be added to horn time"><span class="paramDesc">Horn Delay</span>min <input type="text" name="txtMinHorn" class="short" /> max <input type="text" name="txtMaxHorn" class="short" /> seconds</li><li title="time to opening random link"><span class="paramDesc">Random Delay</span>min <input type="text" name="txtMinRandom" class="short" /> max <input type="text" name="txtMaxRandom" class="short" /> minutes</li><li title="When to checking page for TrapCheck (mm:ss). This will using your local time."><span class="paramDesc">Trap Check</span><input type="radio" name="optTrapCheck" value="true" />Enable at <input type="text" name="txtTrapCheckMin" class="short" /> : <input type="text" name="txtTrapCheckSec" class="short" /><input type="radio" name="optTrapCheck" value="false" />Disable</li><li title="time to wait when king\'s reward appears before opening random link"><span class="paramDesc">KR Delay</span>min <input type="text" name="txtMinKR" class="short" /> max <input type="text" name="txtMaxKR" class="short" /> minutes</li><li title="toggle update timer on window title"><span class="paramDesc">Update Window Title</span><input type="radio" name="optWinTitle" value="true" />Yes <input type="radio" name="optWinTitle" value="false" />No</li></ul><ul><span class="groupTitle">Sound</span><li title="use sound as king\'s reward alert"><span class="paramDesc">Alert Sound</span><input type="radio" name="optAlert" value="true" />Yes <input type="radio" name="optAlert" value="false" />No  <input type="button" name="testSound" value="Test" /></li><li title="volume for alert"><span class="paramDesc">Sound Volume</span><input type="text" name="txtVolume" class="short" /></li></ul><br />');
	$('div#AutoHornWindow div[name="main"]').css({'overflow-y':'auto', 'height':'350px'});
	$('div#AutoHornWindow div[name="main"] ul').css({'list-style-type':'none','margin':'0px'});
	$('div#AutoHornWindow div[name="main"] .groupTitle').css({'font-weight':'bold','font-size':'1.2em'});
	$('div#AutoHornWindow div[name="main"] .paramDesc').css({'font-weight':'bold','float':'left','width':'150', 'padding-left':'20px'});
	$('div#AutoHornWindow div[name="main"] input.short').css({'width':'30px','text-align':'right'});
	$('div#AutoHornWindow div[name="main"] input.long').css({'width':'150px'});
	$('div#AutoHornWindow div[name="main"] br').css({'clear':'left'});
	
	$('div#AutoHornWindow div[name="main"] input[name="txtMinHorn"]').val(loadParam('minHornDelay', 30));
	$('div#AutoHornWindow div[name="main"] input[name="txtMaxHorn"]').val(loadParam('maxHornDelay', 120));
	$('div#AutoHornWindow div[name="main"] input[name="txtMinKR"]').val(loadParam('minKRWait', 180));
	$('div#AutoHornWindow div[name="main"] input[name="txtMaxKR"]').val(loadParam('maxKRWait', 210));
	$('div#AutoHornWindow div[name="main"] input[name="txtMinRandom"]').val(loadParam('minRandomPage', 10));
	$('div#AutoHornWindow div[name="main"] input[name="txtMaxRandom"]').val(loadParam('maxRandomPage', 20));
	$('div#AutoHornWindow div[name="main"] input[name="txtTrapCheckMin"]').val(trapConfig.TrapCheck.min);
	$('div#AutoHornWindow div[name="main"] input[name="txtTrapCheckSec"]').val(trapConfig.TrapCheck.sec);
	$('div#AutoHornWindow div[name="main"] input[name="txtVolume"]').val(loadParam('alertVolume', 100));
	if (loadParam('enableAlert', false)) $('div#AutoHornWindow div[name="main"] input[name="optAlert"][value="true"]').prop("checked", true);
	else $('div#AutoHornWindow div[name="main"] input[name="optAlert"][value="false"]').prop("checked", true);
	if (loadParam('updateWindowTitle', true)) $('div#AutoHornWindow div[name="main"] input[name="optWinTitle"][value="true"]').prop("checked", true);
	else $('div#AutoHornWindow div[name="main"] input[name="optWinTitle"][value="false"]').prop("checked", true);
	if (trapConfig.TrapCheck.enable) $('div#AutoHornWindow div[name="main"] input[name="optTrapCheck"][value="true"]').prop("checked", true);
	else $('div#AutoHornWindow div[name="main"] input[name="optTrapCheck"][value="false"]').prop("checked", true);
	$('div#AutoHornWindow div[name="main"] input[name="testSound"]').click(function(){
		if ($(this).val() == 'Test'){
			soundAlarm();
			$(this).val('Stop');
		} else {
			$('span#alarm').remove();
			$(this).val('Test');
		}
	});

	$('div#AutoHornWindow a[href="#save"]').click(function(e){
		e.preventDefault();
		saveParam('minHornDelay', parseInt($('div#AutoHornWindow div[name="main"] input[name="txtMinHorn"]').val()));
		saveParam('maxHornDelay', parseInt($('div#AutoHornWindow div[name="main"] input[name="txtMaxHorn"]').val()));
		saveParam('minKRWait', parseInt($('div#AutoHornWindow div[name="main"] input[name="txtMinKR"]').val()));
		saveParam('maxKRWait', parseInt($('div#AutoHornWindow div[name="main"] input[name="txtMaxKR"]').val()));
		saveParam('alertVolume', parseInt($('div#AutoHornWindow div[name="main"] input[name="txtVolume"]').val()));
		saveParam('minRandomPage', parseInt($('div#AutoHornWindow div[name="main"] input[name="txtMinRandom"]').val()));
		saveParam('maxRandomPage', parseInt($('div#AutoHornWindow div[name="main"] input[name="txtMaxRandom"]').val()));
		saveParam('enableAlert', $('div#AutoHornWindow div[name="main"] input[name="optAlert"]:checked').val()=="true" ? true : false);
		saveParam('updateWindowTitle', $('div#AutoHornWindow div[name="main"] input[name="optWinTitle"]:checked').val()=="true" ? true : false);
		trapConfig.TrapCheck.enable = ($('div#AutoHornWindow div[name="main"] input[name="optTrapCheck"]:checked').val()=="true" ? true : false);
		trapConfig.TrapCheck.min = parseInt($('div#AutoHornWindow div[name="main"] input[name="txtTrapCheckMin"]').val());
		trapConfig.TrapCheck.sec = parseInt($('div#AutoHornWindow div[name="main"] input[name="txtTrapCheckSec"]').val());
		var str = JSON.stringify(trapConfig);
		saveParam('trapConfig', str);
		calculateTrapCheck();
		$('div#AutoHornWindow').hide();
		$('div#AutoHornMask').hide();
	});
	$('div#AutoHornWindow a[href="#default"]').click(function(e){
		e.preventDefault();
		$('div#AutoHornWindow div[name="main"] input[name="txtMinHorn"]').val(30);
		$('div#AutoHornWindow div[name="main"] input[name="txtMaxHorn"]').val(120);
		$('div#AutoHornWindow div[name="main"] input[name="txtMinKR"]').val(180);
		$('div#AutoHornWindow div[name="main"] input[name="txtMaxKR"]').val(210);
		$('div#AutoHornWindow div[name="main"] input[name="txtMinRandom"]').val(10);
		$('div#AutoHornWindow div[name="main"] input[name="txtMaxRandom"]').val(20);
		$('div#AutoHornWindow div[name="main"] input[name="txtTrapCheckMin"]').val(0);
		$('div#AutoHornWindow div[name="main"] input[name="txtTrapCheckSec"]').val(0);
		$('div#AutoHornWindow div[name="main"] input[name="txtVolume"]').val(100);
		$('div#AutoHornWindow div[name="main"] input[name="optAlert"][value="false"]').prop("checked", true);
		$('div#AutoHornWindow div[name="main"] input[name="optWinTitle"][value="true"]').prop("checked", true);
		$('div#AutoHornWindow div[name="main"] input[name="optTrapCheck"][value="false"]').prop("checked", true);
	});
		
	var winH = $(window).height();
	var winW = $(window).width();
    $('div#AutoHornWindow').css({'top':(winH - $('div#AutoHornWindow').height())/2, 'left':(winW - $('div#AutoHornWindow').width())/2});
    $('div#AutoHornMask').css({'top':'0', 'left':'0', 'width':winW, 'height':winH});
	$('div#AutoHornMask').fadeTo(0,0.8);
	$('div#AutoHornWindow').fadeIn(2000);
}

function cleanupLink(){
	$("a[href*='apps.facebook.com/mousehunt/profile.php']").add("a[href*='apps.facebook.com/mousehunt/adversaries.php?']").add("a[href*='apps.facebook.com/mousehunt/item.php']").add("a[href*='apps.facebook.com/mousehunt/inventory.php']").each(function(i){
		var link = $(this).attr('href');
		link = link.replace('apps.facebook.com/mousehunt/', 'www.mousehuntgame.com/');
		$(this).attr('href', link);
	});
    $("a[href^='https:\/\/www.mousehuntgame.com']").each(function() {
		var link = $(this).attr('href');
		link = link.replace('https:\/\/', 'http://');
		$(this).attr('href', link);
    });
	$("img[src^='https:\/\/www.mousehuntgame.com\/images\/']").each(function() {
		var link = $(this).attr('src');
		link = link.replace('https:\/\/', 'http://');
		$(this).attr('src', link);
    });
}

function saveParam(name, val){
	if (typeof unsafeWindow.user == "undefined") return;
	GM_setValue(unsafeWindow.user.user_id + ':' + name, val);
}

function loadParam(name, def){
	if (typeof unsafeWindow.user == "undefined" || typeof GM_getValue=="undefined") return def;
	return GM_getValue(unsafeWindow.user.user_id + ':' + name, def);
}

function updateAvailableTraps(newTrap){
	var tmp = {};
	for (var x in newTrap){
		if (newTrap[x].is_hidden) continue;
		tmp[newTrap[x].type] = {
			item_id : newTrap[x].item_id,
			name : newTrap[x].name,
			classification : newTrap[x].classification,
			quantity : newTrap[x].quantity
		};
		if (newTrap[x].power_type_name) tmp[newTrap[x].type].power_type_name = newTrap[x].power_type_name;
	}
	availableTraps = tmp;
	saveParam('availableTraps', JSON.stringify(availableTraps));
}

function updateAvailableQuantity(newTrap){
	var tmp = {};
	for (var x in newTrap){
		if (newTrap[x].classification != 'bait' && newTrap[x].classification != 'trinket' && newTrap[x].classification != 'weapon' && newTrap[x].classification != 'base') continue;
		if (newTrap[x].is_hidden) continue;
		tmp[newTrap[x].type] = {
			item_id : newTrap[x].item_id,
			name : newTrap[x].name,
			classification : newTrap[x].classification,
			quantity : newTrap[x].quantity
		};
		if (newTrap[x].power_type_name) tmp[newTrap[x].type].power_type_name = newTrap[x].power_type_name;
	}
	jQuery.extend(true, availableTraps, tmp);
	saveParam('availableTraps', JSON.stringify(availableTraps));
}

function ajaxRequestEffMeter(todo) {
	if (unsafeWindow.user.has_puzzle==true || currentTrap.busy) return;
	if (currentTrap.effmeter) { if (todo != undefined) todo(); return; }
	if (currentTrap.busy) setTimeout(ajaxRequestEffMeter(todo), 5000);
	currentTrap.busy = true;
	var ajax=new unsafeWindow.Ajax();
	ajax.requireLogin=true;
	ajax.responseType=unsafeWindow.Ajax.JSON;
	ajax.ondone = function(resp){
		currentTrap.busy = false;
		currentTrap.effmeter = resp.effectiveness;
		if (todo != undefined) todo();
	}
	var params={'uh':unsafeWindow.user.unique_hash};
	ajax.post(unsafeWindow.callbackurl+"managers/ajax/users/getmiceeffectiveness.php",params);
}

function ajaxRequestAvailableTraps(){
	if (unsafeWindow.user.has_puzzle==true) return;
	var ajax=new unsafeWindow.Ajax();
	ajax.requireLogin=true;
	ajax.responseType=unsafeWindow.Ajax.JSON;
	var params={'uh':unsafeWindow.user.unique_hash};
	ajax.post(unsafeWindow.callbackurl+"managers/ajax/users/gettrapcomponents.php",params);
}

function loadInitialParameters(){
	if (typeof unsafeWindow.user == "undefined") { setTimeout(function() { loadInitialParameters(); }, 500); return; }
	if (loadParam('trapConfig', null) == null) {
		saveParam('trapConfig', JSON.stringify(trapConfig));
	} else {
		jQuery.extend(true, trapConfig, jQuery.parseJSON(loadParam('trapConfig', null)));
	}
	if (loadParam('availableTraps', null) == null) {
		ajaxRequestAvailableTraps();
	} else {
		jQuery.extend(true, availableTraps, jQuery.parseJSON(loadParam('availableTraps', null)));
	}
}

function endsWith(str, suffix) {
    return str.indexOf(suffix, str.length - suffix.length) !== -1;
}

$(document).ready(function(){
	cleanupLink();
	if ($('a[href$="turn.php"]').length < 1 && $('div#mobilePuzzle').length < 1){
		setTimeout(function() { document.location = defaultpage; } , 3*60*1000);
		return;
	} else {
		loadInitialParameters();
		setTimeout(function() { mulai(); } , 1000);
	}
	
	if ($('div#header div.headsup div.hudstatlist').length > 2) {
		$('div#header div.headsup div.hudstatlist:last li:last').before('<li><span class="hudstatlabel">Charm:</span>&nbsp;<span id="hud_trinketName"><a href="http://www.mousehuntgame.com/inventory.php?tab=1">None&nbsp;</a></span><span id="hud_trinketQuantityLabel">(<span id="hud_trinketQuantity">0</span>)</span></li>');
	}

	$('div.hgSideBar').prepend('<div id="AutoHorn"><ul><li><a href="#conf">AutoHorn Setting</a></li><li>Horn Timer<span name="hornTime">00:00</span></li><li>Random Timer<span name="randomTime">00:00</span></li><li>Trap Check<span name="trapCheckTime">00:00</span></li></ul></div>');
	$('div#AutoHorn').append('<br><ul id="seqConfig">Defined Trap Setup');
	$('div#AutoHorn').append('<li><a href="#balack">Balack\'s Cove</a></li>');
	$('div#AutoHorn a[href="#balack"]').click(function(e){
		e.preventDefault();
		showBalackPage();
	});
	$('div#AutoHorn').append('<li><a href="#zugzwang">Seasonal Garden - Zugzwang</a></li>');
	$('div#AutoHorn a[href="#zugzwang"]').click(function(e){
		e.preventDefault();
		showZugzwangPage();
	});
	$('div#AutoHorn').append('<li><a href="#iceberg">Slushy - Iceberg</a></li>');
	$('div#AutoHorn a[href="#iceberg"]').click(function(e){
		e.preventDefault();
		showIcebergPage();
	});
	$('div#AutoHorn').append('<li><a href="#warpath">Fiery Warpath</a></li>');
	$('div#AutoHorn a[href="#warpath"]').click(function(e){
		e.preventDefault();
		showWarpathPage();
	});
	$('div#AutoHorn').append('</ul><br>');
	$('div#hgAppContainer').append('<div id="AutoHornWindow"><div name="top"></div><div name="main"></div><div name="bottom" style="position:absolute;bottom:10px;right:10px;"><a href="#save">Save</a> | <a href="#default">Restore Default</a> | <a href="#close">Close</a></div></div>');
	$('div#hgAppContainer').append('<div id="AutoHornMask"></div>');
	$('div#AutoHornWindow').css({'background-color':'#ffffff', 'position':'fixed', 'width':'600px', 'height':'400px', 'display':'none', 'z-index':'9999', 'padding':'20px'});
	$('div#AutoHornMask').css({'background-color':'#000', 'position':'fixed', 'display':'none', 'z-index':'9998', 'padding':'0px'});
	$(window).resize(function() {
		var winH = $(window).height();
		var winW = $(window).width();
		$('div#AutoHornWindow').css({'top':(winH - $('div#AutoHornWindow').height())/2, 'left':(winW - $('div#AutoHornWindow').width())/2});
		$('div#AutoHornMask').css({'top':'0', 'left':'0', 'width':winW, 'height':winH});
	});
	$('div#AutoHornWindow div[name="top"]').css({'font-weight':'bold','font-size':'18','text-align':'center','padding-bottom':'10px'});
	$('div#AutoHorn').css({'padding-bottom':'20px', 'margin-bottom':'20px', 'border-bottom':'2px solid black'});
	$('div#AutoHorn br').css({'clear':'right'});
	$('div#AutoHorn li span').css({'float':'right'});
	$('div#AutoHorn a[href="#conf"]').click(function(e){
		e.preventDefault();
		showConfigPage();
	});
	$('div#AutoHornWindow a[href="#close"]').click(function(e){
		e.preventDefault();
		$('div#AutoHornWindow').hide();
		$('div#AutoHornMask').hide();
	});
	unsafeWindow.$(document).ajaxSuccess(function(e, xhr, opt) {
		var obj = jQuery.parseJSON(xhr.responseText);
		if (obj.components) setTimeout(function() { updateAvailableTraps(obj.components); }, 1);
		else if (obj.inventory) setTimeout(function() { updateAvailableQuantity(obj.inventory); }, 1);
		if (obj.user.has_puzzle && !alertShown) {
			alertShown = true;
			setTimeout(function() { 
				if (GM_getValue(obj.user.user_id + ':enableAlert', false)) soundAlarm(); else alert('King Reward');
			}, 1);
		}
		if (endsWith(opt.url, 'activeturn.php')) {
			currentTrap.effmeter = null;
		}
		if (obj.user.user_id) {
			if (!obj.user.has_puzzle && alertShown) {
				$('span#alarm').remove();
				alertShown = false;
			}
			setTimeout(function() { mulai(); }, 1000);
		}
	});
	
	calculateRandomPage();
	tulisWaktu();
});