Large

Mousehunt Helper

By DSXC Last update May 24, 2012 — Installed 45,607 times.

There are 112 previous versions of this script.

the source is over 100KB, syntax highlighting in the browser is too slow

// ==UserScript==
// @name        Mousehunt Helper
// @namespace   DSXC
// @description DSXC's Mousehunt helper script.
// @include     http://www.mousehuntgame.com/*
// @include     https://www.mousehuntgame.com/*
// @version     12.5
// @revision - Added travel to Iceberg and renamed the Huntington location.
// ==/UserScript==
//===============================================================================

var SCRIPT = {
	scripturl:   'http://userscripts.org/scripts/source/58464.user.js',
	version:     '12.5',
	versionurl:  'http://userscripts.org/scripts/source/58464.meta.js',
	lastupdate:  DSXC_getValue('Update - Script', 'never')
}

var STATE_OFF = 0, STATE_SOUND = 1, STATE_MESSAGE = 2;
var SETTINGS = {
	horn:        0,
	king:        0,
	cheese:      0,
	washed:      0,
	season:      0,
	confirm:     true,
	direct:      false,
	showall:     false,
	timers:      true,
	buttons:     false,
	auto:        false,
	adverts:     false,
	length:      5
}

var STATE = {
	title:        document.title,
	ready:        false,
	hash:         '',
	level:        -1,
	location:     -1,
	trap:         -1,
	base:         -1,
	cheese:       -1,
	route:        null,
	maintenance:  false,
	king:         false,
	redirect:     '',
	baseurl:      location.protocol + '//www.mousehuntgame.com/',
	hornstate:  	0, // 0 = countdown, 1 = ready, 2 = sounding
	travelscript: false,
	potionscript: false,
	userobject:   null,
	errorshown:   false
}

var IMAGE = {
	config:     'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oGDwceLTyDBTAAAAS1SURBVDjLTZRPaFRXFMa/c++dNzOdN2PrpCYTpw1xFUKtlHak2diq2KabGgoKLkKlK4m0QlpFQSmktG6qWFrdZNGKSCENWXRRRIjBSEi6SCFiQRo1VSfppPkzmcy/9959954unJHe1YVzOOd+3/fjwloLZoYxBs1TLpfBzIKZFQCEYSistTFjzBZmlswcN8wxZpYAEHh1Ya2VAKCIiIwxpJSyzJycnJzc4bruHAAeGxt7f2FhYVZKuWqtfVEIUfl95NLQ0r07+yxIBvXK01+Hv/kuEo3daQw3goh4enr6lXPnzv14/fr1pdnZ2StEBCLiu3fvto+Pj+cvXrz4W7lc0QCEXf5j8MAbLW+/uyPMvdcd+8hM/3D75++//Dj0gtBaC8HMuHbt2qeHDh062tra6haLxftNKVrr5M6dO2V3d/eBy1cu31rZqERUbQXVB1Pw/n3C9eWn7DoSxcLjd5wXYmytJQEglkgkSpVKBY7jIAzDDiJqGtqmtUYmk7Fevb5ttS4Cy8xBKOEHTH4AspbBEJKZBRFBAfA9z1sKwxCxWIxbW1v3Dw0NXWppaXmqlDqRTqfZGENBoP1a4cEWEwRSg6ANwJZhLAEwHgABwCoi4tOnT5cWFxeRy+Vo7969XKvVPiuXy8hms1BK8c2bN0UY6uWY5EQt0MIHQYcMywKWCUJG4kQUGmNIAMD58+dv5PP5G1evXoXv+5RKpZDNZtHwVxQKhXsnBr/Y15JOUhAEyg8YgRbQAWAsgYQAABARC2tt0lorT548+UFfX9+Rqampejweh5SSJiYmKBqN1vr7+z98dXumSiBlghBaCw4CwA/AbAWIwyoAWGshANSIyNFaq8HBwV/a2trmiYiEEOy6LjKZzGh3d/cCM2Pb9s4nNVDFDyx8X7Pva6rUV2HSrxUAQAgBQUSGiDaVUpGzZ89mlVJZIQRLKSkSiWBtbc00tkeIaNN5q//o7za5sdHVQ49aOvH365//9cmxwW+bAxUzN/VbAJxIJDwpJQFg13VpZWVlrVEPjTFKCHFr8s/C7f37j/StzMz4/tLSwXiUKsxMAJ6xAyAA4FcqFUSjURZCQEoJ13VRKpXKje1MRCERFX3P11IQjDW1f5YW15g5DoABQBARhBAMAJubmyIWi0EpBaUUXNdFtVq1zU+DmQUAVKuVZSklrLW2s7NTArAAiJkhrH3erzzPg+M4cBwHrus2XxhteChso7lcLrtSSpRKpZd2797dS0Q+MztEBCWEgLWWADhhGIpkMomZmRmsr69jz5498H0/x8wJAFoppU+dOnXQdd2jkUgEXV1dYmJioh/AT0TkExFE0x8Alplp69atGB0dRa1WQz6fh9a6DsA0JT18+PB+KpUKHMfh9vZ2hGE41wjtOYdoJO27rqvHx8fVmTNnsGvXLqpWq0in03ki8gBoAGJ0dPTR3NzcvVQqRfPz89ZxnLFGKM9oaV6MMeR5Ho4fP/51sVgciMfjpLVevXDhwpsdHR2bACwRgZkTAwMDX7mue2x1dbXQ29t74PDhw48bdUv/SxANhDAyMvJyoVBwcrlcvaenZ11rTUopMDMTERYWFrYNDw+7SqnSwMDARiaTMU0O/wOkOp5CS37/NAAAAABJRU5ErkJggg==',
	craft:      'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oGDwcnBQeyIHAAAAMRSURBVDjLlZNNbxtVFIafOzMZOxM74/FH7DglrkybpIpC0gRSIipFlFSVUlHEAqGKX4AEEhIr+AOAWLBB3cGGFUJi2W0RCkYEDJRClMgB1RX14BgZTzJ27Ik9l0XdEpmkdV/prO65j857PgTHS0xPT5+3LOtKvV4/W61WZwzD2Aaub21tfeH7fgGQvZ/UhwBjlmWtRKNRI5VKXZ2dnQ07jvPE6urqBUVR3ozFYpdt2/4skUi0G43Gf1XQh8Lh8Fw2m/1paWmJUChEJBIhl8vJcrm8nc/nJw7nKv0A6/V6xzRNKpWKrNVq0nEcFhcXhWVZp+bn53f6tfxAUsodz/M80zRXACGEkKqqkslkRDKZNJrN5sVyufwpgEafsm37+87BLgvPLEshBIqiUK1W5dTUlKhUKmtACHAf2cNBDfbbnDqR1DdCAVX721WYmT0n6nXX8zxPn5yc9HVdVzzPI5/Pv9/PULTsWPDueDKY2Gu0RX7TfTedTl8vlUqV0dHRl8Ph8MfpdFpOTEwQj8fFoyyrschAaXJ8KO5LKW4WmhvAe6VSCQDXdW8MDw8D4HmeWF9fX3vYUJSwoX51fi5yRlMU/txpNop/tTKHl9nzvEqr1SqYpvmibdv5XC538ViaEVQ+emk5IV95YcS/8LQlgVf/1wvtnkHTNAfu7/SRloO68sHl5+JvBXRF+h0pfvuj/gnweW9eu90GwHGcg2MvRdN4/dK52LWRaEAi4dtbNXez2EgBjX7Wq/dSriyfjV4bTw3KwIDCnfK+2Cw2FvuF9QIzz86YX06dHJIBXWGv0Ra5X5x3gE0eQ/d7OPbkieDtudNhf9jQ+Mc9EN/crG3st/wPuxcA4B+KTjeOBBpWWP1x4UzEH4npYtftsPZz7eC23ZwGgl0XC8BTgAfsA7uAC9wF7gB7D4C6xhvZtDGSSQblPVhV/Pq7u9IFpYHngThQB74Git23NjAGnOwC94CqpioiNmSoslhuUii64ta2+wPwGnC127/vgI1uVb0qHGX77aFBpWSGVFdVuNFd4NNdu4+tfwEQ0ipmhXPGJwAAAABJRU5ErkJggg==',
	potion:     'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oGDwciL6F+HeMAAAOLSURBVDjLhdRPbFRVFMfx77nv37xOHcoUOxApJGoRjYAaIKiRQCQYUwy6YePCpP5JCC5c6E42EBOjBKMLSNyJLowkRiMk/ktEkNjyJyKNWBcISFsozoxtp+3MvPfuPS6ABLQDZ//75NxzT47Qok58+drShYu6dxmR+4zQJurEuTRLm8lotVrZ92DvB3tmy/mtwLHhQbqKfq8XRKi1qEvRLGHi8oXuC+XsLLBn17f9vL5xzU05bzbsrYNHHljxxEuD7TO/C3gifogXFTBBHsXXRRt2Ll/2bJ+/bf3KH/6bldnAz44N6uqehRrUL5E6K+oyrLNkznLx71GSwhJsHT4+da6wv29T7casmQ1UBAPioqKoCVEvwnkx1svR9NrJBRG1pmV/36ba3r17uS04Upl4+7dzI4w3lXIaM5bkGEtCLjVCtG0htWqN0XK1D2Dr1q2tn6yq7DhwZOXau+86XirmtaMtlkaW0cgyUuew1vJPvU6aWc2ayNen/iiVOude2f7M2tk7FBGWloqfFGJfS4V2cQpj9YRyklFJLJOpBYR85FOIfVb1LH73Rux/He7+bmD1igXFgZFcRD6MODMxw8/lcVSERpJSrydMVibJpqZ5qDPWl5f1yIGhv+a9v2VDZdYO58bR5pqgPXMKWIXTE1OIMRgRPBEQwSJMp5bvz1dkuNHg/q6OLS0XuxAFT+eCgKJv8CKPh+OAVBUL1EPDVGioepbLeUM1SfmlOqnrOosrb/HLulg8T5xenWfB95gXBcyPArpyAZ1RQFsYIkZQYGhyWuLA3ApkGKfqGyE0BuTqkK1zOKfotS29XqlTgKAlOJXYA75aVJXUOYwIqsqCfEwpzoGC1eusUoojtU5/bQlemap/3mwkMtZIUGB+nANgJrMkziECmXMgoAqP39khI7X64ZbgG0+tOTk5k/SPVcY1EKN3hD5WlVqSEvsec8KAzCoCap3Te+NccvTspY9agjsPHuXEaPm5IEnkdGUcX0TbfY/MOS7WpinXG1hrdTq1smN5jwyVJ17c19c7c7trI9ve+3DVxnVrB0aMaBz4Mt5MSZ1jqDzO8MS0bu7ukuqf59/c/vzmdwALuFvdw/D4N19Vp+LCp490dy8JRebn0aBohC4jjcfyQf+Ph356ZferL3xx7Yf1Gtr6HgJGxPiqLjH3LO94dP2Tbb5v5NjhQ436mZNVIAZSILtpj4B/ATVLqIW4cZIuAAAAAElFTkSuQmCC',
	refresh:    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oHAQYoC7vvJQwAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAADk0lEQVQ4y52UX0xbVRzHP+f+K7ctLZYNDMPq6GRZxGyJ4MSJE3RkS0zUB+bDYrLsaeqDj5qYmBjjgwu+6ZuJvmwPLD4Q9WHGMAY4I7rMOHBKgcEK0qKFlraU3tue44O0KQjT+H065+acz/nd3+/7+8F/0Lm2Wv632pvs8lK0wKGesH0KMMofIwFR+3QDJwBzp/vGtr1o32ucef+N831KyaPJ+TuNH30+9BkwCmQBzjxz+PzhcOjC8Vu/DLx3Lf4akKwG6NuA2o8JR28T8bfE0lRjNrnM1Vj+SjIvhwEXsE4/2ngpMxetDemi7Ug48NTofHYQyFcA24Cy/+xzvR1dx+vtYC12jUViXS4CJYBjYd/R0kqi+b46L4ZtqkaLJ3v3+14HrB0jPNVS90hve+vAwo0R/YNvlz+JraxHJ/50RoGprrBPjt3NpaeT+TsdDwa6dfA4RUm9QffwUuEyiuV/AM92to6nY9HQ/LqKDt5OvTudci8CcSBzN+2iCQrJgrp9K5H/+fFm30s5p6QXMhvCrjFXZ1LuKCArv9xVr/eofPqhUtFlaCb9FTAJ/AEsAQpAKgDW51LON1Pp0qCQUuSlUrWa7AQCW3J4YF+gO5tKU5RwM77xPZC7h7uyl2c3+i2PiUAJvyWageAWoFF0I5apqWJRshmZ3I12f9Dm96XVSVcTWa/PxDQNG7CrfSgeaPR7jaIUhi4ov7ab4uk8gFNS2pqh636f33RgTVVHKBxXZWRJKk0TnIgEn9jB9NuldF0PeTwmqZybANYrQFMTKivFjJRSFFzJY032i8Cee9Eifg76vJ4aTdOYz7o/AakK0JVK/RDLjiilcEuSgCVae1vrzpXzUt2a1t+R66/29bztFCSJrCuvzma+ADJbfBhbcxItddZJDZqUEOz1mT11Hs0TXSmMvNzqL00mHQCr78i+TyPhBnGoKfRObHZOvzix+mHGVYNAegvQ1ERpOuVMtjXYr3gMoQkUXuQxIQh9PZ8fAoqA/9n9wUsvPH/y9MTYsLi2kP/y12ThYyBa9mrFNq5UMu2omzcSGxcsyxCmqeMgSuPxwvWqc96NzBrfDQ5g6mgO2jjwW7XFtlTSNkTu+uJ6P0LI7gPBNxcLjAE3yhXsjIQeNrQiqy6J1awzo8tig4Cg2hxtAGKXIgaBDo8ufIWSugJsADT4zLblnNux2Y4Lm32e2kzHv8qoHksH91Qawd5hjlb0F9+teenmFNIUAAAAAElFTkSuQmCC',
	travel:     'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oGDwcpBgA4XEQAAANuSURBVDjL3ZRvbBN1GMe/v7te/9H2uLVrV6eOplsIDl2E4DI3s5GBMRsQZ6aJjBA3A0bUF2pIjEGDG4MYEzEmxogJEiM6NQgOjYhTzAwLrgbrFljHAsOxbt3Rdru7ttdr7+7nC2JiE/8EX/J99TzfPM/n1fN9gFtCP36+p6QfPPTszUNe3roWlNIS74P+Tt+f9aHe7X+7R/4LfOztHTXlQX8P7/U9brXZPYm5hd71j+5965/mS4AcgKFjezm3x2NLiom1Pr//NYdzWTNhGOTUPKS0DCUlZvSi+lQ8nvzkuQMn6Pt9W7HjlY9LgUff3MWvaagPaKqyEsRstVmtWyg1Q2AYUEogLUpUN0EEwUXldIoUtKKeySjtfS8e/H50EcaHb/Rg++7DN4CnBvavX9e88QVZnKmlphoCKPJqHi63ixaLOliWJVdikwAMMAyBR/DSMn8luTY9WVAzudcf7Nr/KgC8u+cRPL3vC7CtjaurfV5hH1/mFVgGuHxhHAYlKPMKxCwukOTCFHKKBg4GKOeAmMwS0yhS0zQtgtfXtHFNwPnZqejQ18MTONzfBfaesPc6y5C2O0LhClMv0viVScJxDDTKQKhsQDDUiOtiFDY7oBacyGSyuHNFFbE73JRShtGy6VXtzbW5++8NR5/p/dRghyNThfrVVRMenu8M3Ba0uXgBLsEOPtCIvDyP+PQ4QquacOnCEMrcy+CvqIRpFCEvpQkKCmUtnJPQQhtLda6p7vYRFgC+/Wns97qacsntWd5SURGwatkxqiNILsfOITb2A/yVtXDYdGSVeVDDDkNTAMZCObudUFOHIslIpZcaFiU1wnY/XI9oLI5vzpyPrKwqF60c95BPiFsW01epbgkTh5uHlpvFxV+OYLnvblp9VwORZQmpuRmi5IqYm09J09OzAxenxHcmZ5bOEADo2rQOR7+KAACe7960c9u2+ve8wlU6G1chijIRFy5BlqzY3LEbWr6AkeGzS9dm4+czqnFckTJnjwyOTgDIlxz2hvtqMDQ6dSN2uzoOdPdseSkRH6UcpxOHqwaE+BD5OSqei4z3zc0nB5x2S/b46V81HTD/NXpPdDQhq+QsrRse+LJ9c2vb2G+xxMmTp7/LZHOJjwZH+gFI/+vDPNnZEt75WMtB3oKqv/p11cGbh1E6gVtXfwAxKYLl39hF2gAAAABJRU5ErkJggg==',
	journal:    'data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAP///zQTFCsVFnNRUxYLDBsHCTclKGJXWTQrLVRQUQgGB05MTTk4OVpbW4NqSZZ3UYNpSJd6V4tyVIFkRYBmSZN1VZR8Yop2X2xML31mUZmAa5eAb4NfRWlKNn5cSZiFe3xPO3lQPHZJNmc5KIU8LcdBK3MnGrxCLc1LM8pIMr5EL8RKNMZLNcdLNsRKNcdMN8BJNchQOcRNOclPO8hQO7BINoU2KcpUQLxPPMlVQcFSP7UrGMkzHbMvG4EhFLIuHKwwHLUxHqMrG7MxH5wrG8o8JcY6JLUzIa4yIa43JLc5Jqs0JL08KJ8xIro7KLk7KL88Krk6Kbk8Kbc7Kbo9K7o+LLY8K646KcFALrxBLbo+Lbk+LcREMbtAL688LLxDMIkyJMdJNas+Lo41J4gyJqpAMJE3K58+MNFTQKhDNMhTQMZSQL9RP6FCNblPPqBENp4XB4cVCGQPBpodD6MfEKMgEaAiEokcD7UlFaEhE2IWDnQbEV8WDqUoGbouHYkgFakrG6UqGrQvHp4nGoUiFrEvHpQmGYIhFqArHI8lGcM1I60uH5QoG28dFKwwIKMtHpYoHMs6J7UzI6MuIJ0rH4onG7Y3J706KrQ4KKkzJb07K54yJJowI4wsIKk2J4orILU7K7s9Lbs+Lrk+LqY6LLJANL9IOZU4Lr5VSZtHPqNXT655cnYPBaEYCm0PB1wOCIcZEFMSDYsgF3YbFHgcFYQjGZElHG0dFXkfGIIjGnUfGHIgGJYpIJguJIEnH6QzKHklHocuJ5o8M5I6MYo5MVwrJkoHAjwHA1QNCUEMCXAZE2cYE0IQDXMdF4MhG38hGognIGooJJlOSadXUWlbWi0FBDsIBj8MCmZKSUgBADQAACoAACUAACMAACIAABkAABYAABEAADcFBf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAOQALAAAAAAUABQAAAj/AMkJHEhwGcGDCAdKizUroUNVwHbR0oPKIUFiiZJU6cTsUZ1VDqmVuvXsihdSmRwNO2UHIYFWdxr9CsYEyhZMh4qlMkXo4IA5RWo502XJ0xQpk6LBYXWpF0EE3foEAqQIGigsojZp4qXkj6tpBAscK+Snkq9PoaygaOEpmaAecQgyCCdLyKAno7hEycLChS1luPLQIbgAGSJISKho6SJmxpo0kcY1kyNsoANw2CgRWbLiRQ0dbd7QYATL2rZsAxNw4+OkSQwcO9SgsSHDBI9cJD4QFHfNDJscbs6MgZHiSJASHSwcbOCNk7EbX8CoMAIkjIgHGBIaeLXnh6RFhsiMKKBwwaKCb3h8DCkTIsIEEBYFHtB2wkMFCRziExSQAcIG/QdVo4F+AQEAOw==',
	close:      'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBAYMCW+DdHoAAAN1SURBVDjLXZNNTNt1AIaf37+ltEUGBVaKmEyGCIrMTGogUYgzBi4wFzDFxMTFQHZSonFk6UXNTAzJjAvRA+GAB8UEiJjwMTEjIEbctBOTNkBBvrYCK1DStbT/fv9/HhYP23t+nyfv5YXH0tvbm+fz+a6GwuE/ImrsfjQe3w9HIn+vrKz09ff3lwNMTU09CjmdTgAmJiY+CQQC8mhrU/puLciNX6bk2sRPcv3nSelz/SkP/H65uLj4A8DMzAwA4n/J6OjocEN9nSO65EHGokhNoiUTaMkkmWSCtKqSSCQoePUc8RP5qzUvVFeNjY2hPIRHuurtdkfw93nSoQc89XoTUtNIHOyTDBwgFIXT7W8TXfPi7f2M5NZ6pcvl+ratre3hgrX19UTsr4Usbd8vKi69T47JBEJw59PLRDbWeO37cVKpJGoqzUiZhXg8RfPiv7hu3y7Wzc3NNZQUFXUdTo8LYlFWJ8fIq28gx2Si5FwTJa1vEQ6FCKkxZi9eoMC/jRGJvupFTp2tDehLS0vPxu7vkj7c58h9h/TdVeZ/u0HDjBsFSKfTiCwDy53NnNle5viEgXBSI73llZY3musUKaVZAIFbv5L0bZCrl1R/cAVN00ilUiiKgk5qPH/5Cyy5eqy5OgrNOgzZ2SLLYNArXq83Yn2umuD2DgY9lF7/Dsv5d9AJQTwaYdP9D6FQiIitjNg3s5iLT2LSaeTX1nEcDoeUgYGBDV22keLW84hsI/6sJ1DQ2PPdg4+aqPrqXXZXl7BYLIhCG8EsM8G8k1Q2teB2u+8JgKGhIflmS4ucfPlpUahL8uBiD5U3B6gwpBACohlwv/clRSPXMO5uol2fxlh6ir6+PrsOwGw2Z1XX1DTWdl/BO32DovkfMekUYhlBLANpqWBZGGcvmib44dfkP1Mll5eWXN3d3Vd1AG63e9ZkMrVmm3OebP38GsflZ/BHkgTUFIc6M/7iCu7WXyDd0Y05v0Cqqhrt6el5yeFwxAVATU0NHo+H9vb2Ybvd7mhsbJRlp8uFMScHVVUJHh2x5l2RUkqhquqK0+l8ZWdnJyiEQA/g8XgAsNlsXfPz83t7e3uXrFar2WazYTQaiUQiuFyuTDgcnj4+Pv54d3c3KIR49EwdHR0MDw8D0NnZaQkGg89Go1FbJpPBaDQeWq3W9cHBwYPHu/8B/IeoYeNzxNQAAAAASUVORK5CYII=',
	background: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oHBhcQBlLyFLQAAAU8SURBVEjHdZbPb1zVFcc/98d7M7Zngu04sg1xkkZylSBaqXGRKgSLyLYIQgEWqFJ3bRdd9T9A7LuGLTtYIEWpqpZWKSnKJpEKTSgEkWAIjsgPfiQhmWRmPPPuTxb3Ps84pU86uvf9Op/zPefc+57g4aO1Cr338skRxcHlNs7+EqVXmN51iKmJWYiR7uA297uX8fY8RfkRm1f6cMED0F6F7ns73IqdkHXonU7Xp48d5vDB51laPMYvDk3x0/2OVtPjYsR7sE7Q6So2vtJ8eqXDN7f/yub1d+mcupJga9D914+Atm8stjjwzG9Y+9WLrDw+x9LCEGsDxgqsB5/NeQgRYoQQBNe+bXJ58yb/vXyS6ydPAJbWGvQSTCXIeoY8NsfhtVf47QvP8eQTJRMNQ28Aw0pQWTAGjM3moDIwrGBQRQpt2TPTYmb6CN3dB7h3433MJUt7HcwmakRdanPo6Kv84eUVFuYilY1URuxwbt0YxI2uV1ZQWYGxgbIQ7JnZR2dyH/c/P4v5ItBeRWE2gVKyd/V3/PrZY8zvjsmpFSPnLo07zI6pGwMObSrJZHM/D6Yr+hufYK7m1O1a+xnPrPyRJ5Y1xkaMFdvOnU9Orc9A/xCwvu/YTm9lI0IofNhPf+5DzJd3NTyl2Lf4Esv7phlWA7wXhDhW6Agh5LkHn8/rhvB+DG7BeDBGYKxnsrmXR9rrmKNXNQu797B7ZpX21JD+QGwDiBCAGEbAGMGHMVAA/5BKY1OTVBaEHKD1cVqTb2qifIqlhZLeIKkhQuakeX1ew0KC+TCmqK5jBlQOhkZQmYjWs4Twc01RHOGRlqM/EEnJjx0PAWtQXTvrwI3VrbLJhgYq5xHqSc1k8yDOe4Id2y9Etv/l4UNaO/1BUuHdCBzJQDsyKRxKPq6BNr2tiJTJ8TYkmxRpAxFjkMoksFbpvvBATl9dQwFICUpFpJzXbA0VmzdhfhaaZXYus4M8F1masSl1ZZHV5S6s1deprztVZZNCaGLsc+/BJM5HZtrQmgCtczQivSzyqGRSQXbqBMgwSnHdMFqCV6ADeC8Q4q5Giq+Qch7nPd2t1EnNEholFBpUTM6VygHkvTiEFIz3GRR3NorOXSmlQvCZxNkPkbJAyYiSo6KHnAYloShSusoiBdDIY1mkYLROgSg5GqUAJSNSaqy9IHHuLMF7lBTpZn5Q5zRpnZyVRQKUZbIaXuj8XA2SIFVOvZQ420OJ85JG42uMOYeQJVJGlBiLLDso1JiiMSuKFEidWqVGtVUyAk2sPUWIXcmNPzu8O4E1Q5QUCBlzNFlZVlRoKHVS0yjyXI+BajUSpIxIKbHmDtb8g+/+5lNRrn78McPhO/igkSKlUEhGwFpZAQ09Sl2ttgbU604KgfeC4fAvXDt5GUAyvQ5sWD699BZbg4tERF4XMb+UnBQqqaqboa5NHVBad3F7KfT6H3Dp3NtApH0UxXATFo5D78wW35WX2DO7TLO5yEQjonWkKMR2M9Rdp+TYxpq/Wc5HQpAMhorv717gg7N/go0Oc89B53T+8PU+h6WXoHO6wzX/H2ZnC6Rcpj3VpCg8WkUKJbbrAaMN1PmIDwJjJ7hzr8+t70/w73++DhsdFo/Drb+P/ZwAPPgMHnsRume2uP71BaYWLtLvt9D6J+xqlWnxqtQoMYILAuc11jX45lbg2o13uXXnNc6/cQruVcw/D9++83/+6wCm16FzOs1Xfq+5e3+R2fbT7H30CO3WAcpiF4JIZR5wv/cl12+epzc4x2TjNhffyj+QR6F7ZofbHwBbOem8JzJyVgAAAABJRU5ErkJggg=='
}

var AUDIO = {
	cheese: 'data:audio/mid;base64,TVRoZAAAAAYAAQAIAeBNVHJrAAAAGQD/UQMGW5oA/1gEBAIYCAD/WQIAAAD/LwBNVHJrAAAAxQD/Aw9GaW5hbCBGYW50YXN5IDUA/yEBAAD/IAEAALAHfwCwCkAAwAQAkEZkgXCARlAAkEhkgXCASFAAkElkgXCASVAAkEtkgXCAS1AAkE1kAJBEZACQRmQAkDZkg2CATVAAkElkg2CARFAAgEZQAIA2UACASVAAkExkAJA1ZACQRWQAkENkg2CATFAAkEhkgmiAQ1AAkEFkPIBIUACQSGQ8gEVQAJBLZDyANVAAkDFkiWyAQVA8gEhQPIBLUDyAMVAA/y8ATVRyawAAABgA/wMLR29vZCBOaWdodCEA/yEBAAD/LwBNVHJrAAAAJgD/AxlPcmlnaW5hbCBieSBOb2J1byBVZW1hdHN1AP8hAQAA/y8ATVRyawAAACIA/wMVUzNNIGFuZCBtaWRpIGJ5IFlha3JhAP8hAQAA/y8ATVRyawAAAC4A/wMheWFrcmFAbmJyeWFuNzEuZG9ybS51c20ubWFpbmUuZWR1AP8hAQAA/y8ATVRyawAAABsA/wMOQXVndXN0IDQsIDE5OTcA/yEBAAD/LwBNVHJrAAAAKAD/AxtCZXN0IGhlYXJkIGluIEN1YmljIFBsYXllciEA/yEBAAD/LwA=',
	horn:   'data:audio/mid;base64,TVRoZAAAAAYAAQARA8BNVHJrAAAAXQD/AzZGaW5hbCBGYW50YXN5h1iBd4N0g0CDk4N0g0CBW4OMglCBeC9ieSCQX5azltiBmZdGlusvR00A/1EDB6EgAP9YBAQCGAgA8AV+fwkB9wD/WQIEAIG0AP8vAE1UcmsAAAD9nXDAOACwXVoAsFtAALAHf5Y0kDtkWIA7ZDKQPWRWgD1kMZA/ZFaAP2QxkEBkVoBAZDGQQmRWgEJkMZBEZFaARGQxkEVkVoBFZDGQR2QAkERkAJBAZIc8gEdkAIBEZACAQGQAkEdkAJBEZACQQGSBS4BHZACARGQAgEBkc5BHZACQRGQAkEBkgUuAR2QAgERkAIBAZHKQR2QAkERkAJBAZIFLgEdkAIBEZACAQGRykEhkAJBDZACQQGSHPIBIZACAQ2QAgEBkAJBKZACQRWQAkEJkhzyASmQAgEVkAIBCZACQTGQAkEdkAJBEZKUsgExkAIBHZACARGS1EP8vAE1UcmsAAABVnXDBKwCxXWQAsVtAALEHeJ1wkS9khzyBL2QAkS9kgUuBL2RzkS9kgUuBL2RykS9kgUuBL2RykTBkhzyBMGQAkTJkhzyBMmQAkTRkpSyBNGS1CP8vAE1UcmsAAADanXDCLwCyXUYAsltQALIHf51wkiNkhGOCI2SCWJIjZIFLgiNkc5IjZIFLgiNkcpIjZIFLgiNkcpIkaYRjgiRpgliSJm6EY4ImboJYkihzhGOCKHOCWJIjf3qCI39FkiN/eYIjf0WSI395giN/RZIjf3mCI39FkiN/eYIjf0WSI396giN/RZIjf3mCI39FkiN/eYIjf0WSI395giN/RZIjf3mCI39FkiN/eoIjf0WSI395giN/RZIjf3mCI39FkiN/eYIjf0WSI395giN/RZIjf4RjgiN/t3T/LwBNVHJrAAAAyJ1wwzAAs11aALNbQACzB26WNJM7ZFiDO2Qykz1kVoM9ZDGTP2RWgz9kMZNAZFaDQGQxk0JkVoNCZDGTRGRWg0RkMZNFZFaDRWQxk0dkAJNEZIRjg0dkAINEZIJYk0dkAJNEZIFLg0dkAINEZHOTR2QAk0RkgUuDR2QAg0RkcpNHZACTRGSBS4NHZACDRGRyk0hkAJNDZIRjg0hkAINDZIJYk0pkAJNCZIRjg0pkAINCZIJYk0xkAJNEZKJTg0xkAINEZLds/y8ATVRyawAAAAaBtAD/LwBNVHJrAAAABoG0AP8vAE1UcmsAAAAGgbQA/y8ATVRyawAAAAaBtAD/LwBNVHJrAAAABoG0AP8vAE1UcmsAAAA2nXDJAAC5XWQAuVtLALkHf51wyQAAmTFkiUeJMWSFMJkxZIlHiTFkhTCZMWSiU4kxZLdf/y8ATVRyawAAAAaBtAD/LwBNVHJrAAAABoG0AP8vAE1UcmsAAAAGgbQA/y8ATVRyawAAAAaBtAD/LwBNVHJrAAAABoG0AP8vAE1UcmsAAAAGgbQA/y8A',
	reward: 'data:audio/mid;base64,TVRoZAAAAAYAAQAJA8BNVHJrAAAAQAD/AzZGaW5hbCBGYW50YXN5h1iBd4N0g0CDk4N0g0CBW4OMglGBeC9ieSCQX5azltiBmZdGlusvR02B0gD/LwBNVHJrAAAAIwDwBX5/CQH3AP9RAwcK4gD/WAQEAhgIAP9ZAgAAgdIA/y8ATVRyawAAAVEAwTgAsQd/ALEKFACxW0C0QJE5RoEggTlGAJE7SIEggTtIAJE8SoEggTxKAJE+TIEggT5MAJFAToEggUBOAJFBUIEggUFQAJFDZINggUNkAJE8WoFwgTxaAJE+XIFwgT5cAJFAX4FwgUBfgXCRRWSBcIFFZIFwkUNijwCBQ2IAkUZpg2CBRmkAkT5fgXCBPl8AkT9hgXCBP2EAkUFkgXCBQWSBcJFIaYFwgUhpgXCRRmePAIFGZwCRSWSDYIFJZACRQV+BcIFBXwCRQmGBcIFCYQCRRGSBcIFEZIFwkUtpgXCBS2mBcJFMZIFwgUxkgXCRRF+BcIFEX4FwkUVigXCBRWKBcJFJZIFwgUlkgXCRTG6CQIFMbgCRSWmCQIFJaQCRTG6CQIFMbgCRTnOCQIFOcwCRS26CQIFLbgCRTnOCQIFOcwCRUHieAIFQeI8A/y8ATVRyawAAAT0AwkgAsgd/ALIKbgCyW0C0QJJRRoEgglFGAJJTSIEgglNIAJJUSoEgglRKAJJWTIEgglZMAJJYToEgglhOAJJZUIEggllQkmCST2SBcIJPZACSUWaBcIJRZgCSUmiBcIJSaACSUWaBcIJRZgCST2SDYIJPZJJgklJogXCCUmgAklRqgXCCVGoAklVsgXCCVWwAklRqgXCCVGoAklJog2CCUmgAklVpg2CCVWkAkk1kgXCCTWQAkk5mgXCCTmYAklBpgXCCUGmBcJJXboFwgldugXCSWG6BcIJYboFwklNpgXCCU2mBcJJVa4FwglVrgXCSWG6BcIJYboFwklVzgkCCVXMAklFugkCCUW4AklVzgkCCVXMAkld4gkCCV3gAklNzgkCCU3MAkld4gkCCV3gAkll/ngCCWX+PAP8vAE1UcmsAAAHGAMMwALMHeACzCkAAs1tQtECTOWSBIIM5ZACTO2aBIIM7ZgCTPGiBIIM8aACTPmqBIIM+agCTQGyBIINAbACTQW6BIINBbgCTPFoAk0BaAJNDWodAgzxaAINAWgCDQ1oAkzxeAJNCXgCTRV6HQIM8XgCDQl4Ag0Veg2CTP18Ak0NfAJNGX4dAgz9fAINDXwCDRl8Akz9fAJNGXwCTQ1+BcIM/XwCDRl8Ag0NfgXCTP18Ak0NfAJNGX4dAgz9fAINDXwCDRl8Akz9jAJNFYwCTSGOHQIM/YwCDRWMAg0hjg2CTRmQAk0JkAJNJZIdAg0ZkAINCZACDSWQAk0JkAJNGZACTSWSBcINCZACDRmQAg0lkgXCTQloAk0ZaAJNJWodAg0JaAINGWgCDSVoAk0RfAJNIXwCTS1+HQINEXwCDSF8Ag0tfAJNJZACTRWQAk0xkh0CDSWQAg0VkAINMZACTS2kAk05pAJNHaYdAg0tpAINOaQCDR2kAk0lkAJNFZACTTGSHQINJZACDRWQAg0xkAJNOaQCTS2kAk0dph0CDTmkAg0tpAINHaQCTUGkAk0lpAJNNaZ4Ag1BpAINJaQCDTWmPAP8vAE1UcmsAAACgAMQvALQHfwC0CkAAtFtkvACUMG6HQIQwbgCUMG6HQIQwboNglC1ph0CELWkAlC1pgXCELWmBcJQzc4dAhDNzAJQzc4dAhDNzg2CULm6HQIQubgCULm6BcIQuboFwlDZzh0CENnMAlDFuh0CEMW4AlC1ph0CELWkAlDFuh0CEMW4AlC1ph0CELWkAlC9uh0CEL24AlDF0ngCEMXSPAP8vAE1UcmsAAAFRAMU5ALUHeAC1ChQAtVtktECVOVqBIIU5WgCVO1yBIIU7XACVPF6BIIU8XgCVPmCBIIU+YACVQGKBIIVAYgCVQWSBIIVBZACVQ1qDYIVDWgCVPFCBcIU8UACVPlKBcIU+UgCVQFWBcIVAVYFwlUVagXCFRVqBcJVDWI8AhUNYAJVGaYNghUZpAJU+X4FwhT5fAJU/YYFwhT9hAJVBZIFwhUFkgXCVSGmBcIVIaYFwlUZnjwCFRmcAlUlkg2CFSWQAlUFfgXCFQV8AlUJhgXCFQmEAlURkgXCFRGSBcJVLaYFwhUtpgXCVTGSBcIVMZIFwlURfgXCFRF+BcJVFYoFwhUVigXCVSWSBcIVJZIFwlUxugkCFTG4AlUlpgkCFSWkAlUxugkCFTG4AlU5zgkCFTnMAlUtugkCFS24AlU5zgkCFTnMAlVB4ngCFUHiPAP8vAE1UcmsAAAK4AMkAALkHfwC5W2S8AJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkAJkmZIEgiSZkg2CZJmSHQIkmZACZJmSBcIkmZIFwmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmQAmSZkgSCJJmSDYJkmZIdAiSZkAJkmZIFwiSZkgXCZJmSDYIkmZACZJmSBcIkmZACZJmSBcIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSDYIkmZACZJmSBcIkmZACZJmSBcIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSBIIkmZACZJmSCQIkmZACZJmSCQIkmZACZJmSCQIkmZACZJmSCQIkmZACZJmSCQIkmZACZJmSCQIkmZACZJmSBIIkmZACZJmaBIIkmZgCZJmiBIIkmaACZJmeBIIkmZwCZJmaBIIkmZgCZJmSBIIkmZACZJmKBIIkmYgCZJmCBIIkmYACZJl6BIIkmXgCZJlyBIIkmXACZJlqBIIkmWgCZJliBIIkmWACZJleBIIkmVwCZJlWBIIkmVQCZJlWBIIkmVQCZJlOBIIkmUwCZJlGBIIkmUQCZJk+BIIkmTwCZJk2BIIkmTQCZJkuBIIkmSwCZJkmBIIkmSQCZJkeBIIkmRwCZJkWBIIkmRZAg/y8ATVRyawAAAEW8AJkxc54AiTFzAJkxc54AiTFzAJkxc48AiTFzAJkxc48AiTFzAJkxc4dAiTFzAJkxeIdAiTF4AJkxf54AiTF/jwD/LwA=',
	maxamp: 'data:audio/mid;base64,TVRoZAAAAAYAAQAMAeBNVHJrAAAA1wD/Aw9PcmNoZXN0cmFsIEhhcnAAwC4AsAd/AP9RAwOTh4NgkENggXBDAABHYIFwRwAASmCBcEoAAEdggXBHAABKYIFwSgAAT2CBcE8AAEpggXBKAABPYIFwTwAAU2CBcFMAAE9ggXBPAABTYIFwUwAAVmCBcFYAAFtggXBbAABWYIFwVgAAU2CBcFMAAFZggXBWAABTYIFwUwAAT2CBcE8AAFNggXBTAABPYIFwTwAASmCBcEoAAE9ggXBPAABKYIFwSgAAR2CBcEcAAENggXBDAIkw/y8ATVRyawAAAHwA/wMPU3RyaW5nIEVuc2VtYmxlAMEwiTCRQ2AAO2AAPmCBcEMAADsAAD4AAENgADtgAD5ggXBDAAA7AAA+AABDYAA7YAA+YIFwQwAAOwAAPgAARGAAPGAAP2CLIEQAADwAAD8AAENgADtgAD5gmDBDAAA7AAA+AIkw/y8ATVRyawAAAOkA/wMHVGltcGFuaQDCL4Ngkit/hVArAAArf4FwKwAAK3+BcCsAACt/gXArAAArf4JoKwAAK3+CaCsAACt/gmgrAAArf4JoKwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwAAK394KwCJMP8vAE1UcmsAAAA4AMM4AP8DB1RydW1wZXSJMJNHf4FwRwAAR3+BcEcAAEd/gXBHAABIf4sgSAAAR3+YMEcAiTD/LwBNVHJrAAAACQD/AwC8AP8vAE1UcmsAAAApAP8DIEx1ZmlhIElJOiBSaXNlIG9mIHRoZSBTaW5pc3RyYWxzvAD/LwBNVHJrAAAAGgD/AxFCbHVlIFRyZWFzdXJlIEJveLwA/y8ATVRyawAAAAkA/wMAvAD/LwBNVHJrAAAAGwD/AxJieSBZYXN1bm9yaSBTaGlvbm+8AP8vAE1UcmsAAAAfAP8DFnNlcXVlbmNlZCBieSBTaW5jbGFpckO8AP8vAE1UcmsAAAAcAP8DE3NpbmNsYWlyQGFjcm9zcy5jb228AP8vAE1UcmsAAAAYAP8DD2x1ZjJibHVlYm94Lm1pZLwA/y8A',
	season: 'data:audio/mid;base64,TVRoZAAAAAYAAQAOAeBNVHJrAAAAXgD/UQMFuNgA/wMRUGl6emljYXRvIFN0cmluZ3MAwC2HQLAHcABbUJZAkFRweFQAeEtoeEsAeE9geE8AeEhYeEgAeEtQeEsAeENIeEMAeEhAeEgAeD84eD8Aj3j/LwBNVHJrAAABIwD/Aw9TdHJpbmcgRW5zZW1ibGUAwTCHQLEHcABbUIdAkTxAAD8geDwAAD8AAD1DAEAjeD0AAEAAADxGAD8meDwAAD8AAD1JAEApeD0AAEAAAD9MAEIseD8AAEIAAEBQAEMweEAAAEMAAD9TAEIzeD8AAEIAAEBWAEM2eEAAAEMAAEFZAEQ5eEEAAEQAAEJcAEU8eEIAAEUAAEFgAERAeEEAAEQAAEJjAEVDeEIAAEUAAENmAEZGeEMAAEYAAERpAEdJeEQAAEcAAENsAEZMeEMAAEYAAERwAEdQeEhPACRQAEQAAEcAgXBIAAA/TIFwPwAAQ0iBcEMAADxEgXA8AAA/QIFwPwAANzyBcDcAADw4gXA8AAAzNIFwMwAAJACPAP8vAE1UcmsAAACmAP8DD1N0cmluZyBFbnNlbWJsZQDCMIdAsgdwAFtgh0CSMHCDYDAAACtwg2ArAAAncINgJwAAJHCDYCQAACRweCQAACRgeCQAACRweCQAACRgeCQAACRweCQAACRgeCQAACRweCQAACRgeCQAACRweCQAACRgeCQAACRweCQAACRgeCQAACRweCQAACRgeCQAACRweCQAACRgeCQAh0CyB3CHQP8vAE1UcmsAAAB9AP8DB1RpbXBhbmkAwy+HQLMHcABbYJZAkyR/eCQAACRyeCQAACRoeCQAACRfeCQAACRWeCQAACRNeCQAACRFeCQAACQ/eCQAACQ5eCQAACQzeCQAACQueCQAACQqeCQAACQneCQAACQleCQAACQjeCQAACQieCQAjwD/LwBNVHJrAAAAyADJMAD/AwpQZXJjdXNzaW9uh0C5B3AAW1CHQAcgAJkmcHgmAAAmQBi5ByZgmSYAACZQMLkHLEiZJgAAJmBIuQcyMJkmAAAmcGC5BzgYmSYAACZAeCYAALkHPgCZJlB4JgAAJmAYuQdEYJkmAAAmcDC5B0pImSYAACZASLkHUDCZJgAAJlBguQdWGJkmAAAmYHgmAAC5B1wAmSZweCYAACZAGLkHYmCZJgAAJlAwuQdoSJkmAAAmYEi5B24wmSYAALkHcJ4A/y8ATVRyawAAAAW8AP8vAE1UcmsAAAAbAP8DEk9ncmUgQmF0dGxlIChTTkVTKbwA/y8ATVRyawAAABIA/wMJRGFuZ2Vyb3VzvAD/LwBNVHJrAAAABbwA/y8ATVRyawAAABwA/wMTYnkgSGl0b3NoaSBTYWtpbW90b7wA/y8ATVRyawAAAB8A/wMWc2VxdWVuY2VkIGJ5IFNpbmNsYWlyQ7wA/y8ATVRyawAAABwA/wMTc2luY2xhaXJAYWNyb3NzLmNvbbwA/y8ATVRyawAAAAW8AP8vAE1UcmsAAAAUAP8DC29ibG9zZTIubWlkvAD/LwA=',
	washed: 'data:audio/mid;base64,TVRoZAAAAAYAAAABAYBNVHJrAAAB7wD/AwpES0MyLzNCRk5TAP9YBAQCGAgA/1EDB6EghSOZJmQBkk1kAJVBZHqJJgAAmSNkBMYgBoJNAADDOwCSSmQBk0ZkAcQ7BJRKZAGFQQAAlT5kA8YgA5YiZFeJIwABgkoAAJJNZAGDRgABhT4AAIRKAAGVQWQBhiIAboJNAACZJmQBkk9kAZNEZAGUSmQBhUEAAJVDZACWImRwgk8AAIkmAACSUGQBg0QAAYRKAAWFQwAAlURkbYJQAACZI2QBklFkAZNGZAGFRAAAlExkAZVFZAGGIgAAliRkbokjAAGCUQAAmSZkAJJUZAGDRgABhEwAAYVFAACVSGRxiSYAAJkmZAGCVAAAklZkAZNGZAGFSAAAlExkAZVKZAGGJAAAliRkb4kmAACZKGQBglYAAYNGAACSWWQBk0VkBIRMAAGGJAAAhUoAAJRNZACVTWQAlh1kZ4koAAGCWQB0g0UAAJJWZAGFTQABlUpkAYYdAHGZJmQBglYAAJJXZAGTRWQBhE0AAJRIZAGFSgABlUtkAZYdZGuJJgAAmSZkcokmAHWZMmQciTIAAZkwZByJMAABmS9kHIkvAACZLWQdiS0AAZkrZBuJKwAAmTFkAJkpZB2JKQAAiTEAOoYdAHaDRQAAglcAAYRIAAGFSwCIWv8vAA=='
}

var LEVEL = [ [ 'Novice' ], [ 'Recruit' ], [ 'Apprentice' ], [ 'Initiate' ], [ 'Journeyman' ], [ 'Master' ], [ 'Grandmaster' ], [ 'Legendary' ], [ 'Hero' ], [ 'Knight' ], [ 'Lord', 'Lady' ], [ 'Baron', 'Baroness' ], [ 'Count', 'Countess' ] ];
var LNAME = 0, LZONE = 1, LLINK = 2, LLVL = 3, LMAP = 4, LWARNING = 5, LID = 6;
var LOCATION = {
	region: [ 'Gnawnia', 'Valour', 'Whisker Woods', 'Burroughs', 'Furoma', 'Bristle Woods', 'Rodentia', 'Tribal Isles', 'Sandtail Desert' ],
	detail: [
		[ 'Meadow', 0, 'meadow', 0, 6, false ], // 0
		[ 'Town of Gnawnia', 0, 'town_of_gnawnia', 1, 6, false ],
		[ 'Windmill', 0, 'windmill', 2, 6, false ],
		[ 'Harbour', 0, 'harbour', 3, 6, false ], 
		[ 'Mountain', 0, 'mountain', 4, 6, false ], 
		[ 'Slushy Shoreline', 0, 'slushy_shoreline', 10, 856, false ],
		[ 'King\'s Arms', 1, 'kings_arms', 1, 6, false ],
		[ 'Tournament Hall', 1, 'tournament_hall', 2, 6, false ],
		[ 'King\'s Gauntlet', 1, 'kings_gauntlet', 3, 4, false ],
		[ 'Calm Clearing', 2, 'calm_clearing', 4, 16, false ],
		[ 'Great Gnarled Tree', 2, 'great_gnarled_tree', 5, 5, false ], 
		[ 'Lagoon', 2, 'lagoon', 6, 10, false ], // 10
		[ 'Laboratory', 3, 'laboratory', 5, 9, false ],
		[ 'Town of Digby', 3, 'town_of_digby', 5, 3, false ],
		[ 'Mousoleum', 3, 'mousoleum', 5, [ 15, 12 ], false ], 
		[ 'Bazaar', 3, 'bazaar', 6, 2, false ],
		[ 'Training Grounds', 4, 'training_grounds', 6, [ 13, 14 ], false ], 
		[ 'Dojo', 4, 'dojo', 6, 14, false ], 
		[ 'Meditation Room', 4, 'meditation_room', 6, 14, false ], 
		[ 'Pinnacle Chamber', 4, 'pinnacle_chamber', 6, 14, false ],
		[ 'Catacombs', 5, 'catacombs', 7, 12, false ],
		[ 'Forbidden Grove', 5, 'forbidden_grove', 7, 8, false ],  // 20
		[ 'Acolyte Realm', 5, 'acolyte_realm', 7, -1, true ], 
		[ 'S.S. Huntington II', 6, 'ss_huntington_ii', 7, 7, false ],
		[ 'Seasonal Garden', 6, 'seasonal_garden', 10, 347, false ],
		[ 'Zugzwang\'s Tower', 6, 'zugzwang_tower', 10, 348, true ],
		[ 'Crystal Library', 6, 'zugzwang_library', 10, 646, false ],
		[ 'Iceberg', 6, 'iceberg', 10, 856, false ],
		[ 'Cape Clawed', 7, 'cape_clawed', 7, 11, false ],
		[ 'Elub Shore', 7, 'elub_shore', 7, 11, false ],
		[ 'Nerg Plains', 7, 'nerg_plains', 7, 11, false ], 
		[ 'Derr Dunes', 7, 'derr_dunes', 7, 11, false ], 
		[ 'Jungle of Dread', 7, 'jungle_of_dread', 8, 11, false ], // 30
		[ 'Dracano', 7, 'dracano', 9, 11, false ], 
		[ 'Balack\'s Cove', 7, 'balacks_cove', 9, 1, false ],
		[ 'Fiery Warpath', 8, 'desert_warpath', 11, 529, false ],
		[ 'Muridae Market', 8, 'desert_city', 11, 528, false ],
		[ 'Living Garden', 8, 'desert_oasis', 11, 607, false ],
		[ 'Special Event Location', 0, 'special_event_location', 1, 6, false ],
		[ 'Ronza\'s Traveling Shoppe', 0, 'ronzas_traveling_shoppe', 1, 6, false ]
	],
	costs: [
	  [    0,    10,   260,   510,  1010,  1010,  1060,  1010,  1010,   250,   500,  1000,  2010,  2510,  2510,  2260,  3510,  3535,  3560,  3660,  4010,  5010,   -99,  2010,  4010,  9010,  9710,  4510,  3510,  4010,  4010,  4010,  4510,  6510,  6510,  2200,  4100,   -99,   520,   -99 ], // Meadow
	  [    0,     0,   250,   500,  1000,  1000,  1050,  1000,  1000,   260,   510,  1010,  2000,  2500,  2500,  2250,  3500,  3525,  3550,  3650,  4000,  5000,   -99,  2000,  4000,  9000,  9700,  4500,  3500,  4000,  4000,  4000,  4500,  6500,  6500,  2210,  4110,   -99,   510,   -99 ], // Town of Gnawnia
	  [    0,   250,     0,   250,  1250,   750,   800,   750,   750,   510,   760,  1260,  2250,  2750,  2750,  2500,  3750,  3775,  3800,  3900,  4250,  5250,   -99,  1750,  3750,  8750,  9450,  4250,  3250,  3750,  3750,  3750,  4250,  6250,  6250,  2460,  4360,   -99,   260,   -99 ], // Windmill
	  [    0,   500,   250,     0,  1500,   500,   550,   500,   500,   760,  1010,  1510,  2500,  3000,  3000,  2750,  4000,  4025,  4050,  4150,  4500,  5500,   -99,  1500,  3500,  8500,  9200,  4000,  3000,  3500,  3500,  3500,  4000,  6000,  6000,  2710,  4610,   -99,    10,   -99 ], // Harbour
	  [    0,  1000,  1250,  1500,     0,  2000,  2050,  2000,  2000,  1260,  1510,  2010,  1000,  1500,  1500,  1250,  2500,  2525,  2550,  2650,  3000,  4000,   -99,  3000,  5000, 10000, 10700,  5500,  4500,  5000,  5000,  5000,  5500,  7500,  7500,  3210,  5110,   -99,  1510,   -99 ], // Mountain
	  [    0,  1000,   750,   500,  2000,     0,  1050,  1000,  1000,  1260,  1510,  2010,  3000,  3500,  3500,  3250,  4500,  4525,  4550,  4650,  5000,  6000,   -99,  2000,  4000,  9000,  9700,  4500,  3500,  4000,  4000,  4000,  4500,  6500,  6500,  3210,  5110,   -99,   -99,   -99 ], // Slushy Shoreline
	  [    0,  1050,   800,   550,  2050,  1050,     0,    50,  1050,  1310,  1560,  2060,  3050,  3550,  3550,  3300,  4550,  4575,  4600,  4700,  5050,  6050,   -99,  2050,  4050,  9050,  9750,  4550,  3550,  4050,  4050,  4050,  4550,  6550,  6550,  3260,  5160,   -99,   550,   -99 ], // King's Arms
	  [    0,  1000,   750,   500,  2000,  1000,    50,     0,  1000,  1260,  1510,  2010,  3000,  3500,  3500,  3250,  4500,  4525,  4550,  4650,  5000,  6000,   -99,  2000,  4000,  9000,  9700,  4500,  3500,  4000,  4000,  4000,  4500,  6500,  6500,  3210,  5110,   -99,   510,   -99 ], // Tournament Hall
	  [    0,  1000,   750,   500,  2000,  1000,  1050,  1000,     0,  1260,  1510,  2010,  3000,  3500,  3500,  3250,  4500,  4525,  4550,  4650,  5000,  6000,   -99,  2000,  4000,  9000,  9700,  4500,  3500,  4000,  4000,  4000,  4500,  6500,  6500,  3210,  5110,   -99,   510,   -99 ], // King's Gauntlet
	  [    0,   260,   510,   760,  1260,  1260,  1310,  1260,  1260,     0,   250,   750,  2260,  2760,  2760,  2510,  3760,  3785,  3810,  3910,  4260,  5260,   -99,  2260,  4260,  9260,  9960,  4760,  3760,  4260,  4260,  4260,  4760,  6760,  6760,  1950,  3850,   -99,   770,   -99 ], // Calm Clearing
	  [    0,   510,   760,  1010,  1510,  1510,  1560,  1510,  1510,   250,     0,   500,  2510,  3010,  3010,  2760,  4010,  4035,  4060,  4160,  4510,  5510,   -99,  2510,  4510,  9510, 10210,  5010,  4010,  4510,  4510,  4510,  5010,  7010,  7010,  1700,  3600,   -99,  1020,   -99 ], // Great Gnarled Tree
	  [    0,  1010,  1260,  1510,  2010,  2010,  2060,  2010,  2010,   750,   500,     0,  3010,  3510,  3510,  3260,  4510,  4535,  4560,  4660,  5010,  6010,   -99,  3010,  5010, 10010, 10710,  5510,  4510,  5010,  5010,  5010,  5510,  7510,  7510,  1200,  3100,   -99,  1520,   -99 ], // Lagoon
	  [    0,  2000,  2250,  2500,  1000,  3000,  3050,  3000,  3000,  2260,  2510,  3010,     0,   500,   500,   250,  1500,  1525,  1550,  1650,  2000,  3000,   -99,  4000,  6000, 11000, 11700,  6500,  5500,  6000,  6000,  6000,  6500,  8500,  8500,  4210,  6110,   -99,  2510,   -99 ], // Laboratory
	  [    0,  2500,  2750,  3000,  1500,  3500,  3550,  3500,  3500,  2760,  3010,  3510,   500,     0,  1000,   750,  2000,  2025,  2050,  2150,  2500,  3500,   -99,  4500,  6500, 11500, 12200,  7000,  6000,  6500,  6500,  6500,  7000,  9000,  9000,  4710,  6610,   -99,  3010,   -99 ], // Town of Digby
	  [    0,  2500,  2750,  3000,  1500,  3500,  3550,  3500,  3500,  2760,  3010,  3510,   500,  1000,     0,   250,  1000,  1025,  1050,  1150,  1500,  2500,   -99,  4500,  6500, 11500, 12200,  7000,  6000,  6500,  6500,  6500,  7000,  9000,  9000,  4710,  6610,   -99,  3010,   -99 ], // Mousoleum
	  [    0,  2250,  2500,  2750,  1250,  3250,  3300,  3250,  3250,  2510,  2760,  3260,   250,   750,   250,     0,  1250,  1275,  1300,  1400,  1750,  2750,   -99,  4250,  6250, 11250, 11950,  6750,  5750,  6250,  6250,  6250,  6750,  8750,  8750,  4460,  6360,   -99,  2760,   -99 ], // Bazaar
	  [    0,  3500,  3750,  4000,  2500,  4500,  4550,  4500,  4500,  3760,  4010,  4510,  1500,  2000,  1000,  1250,     0,    25,    50,   150,  2500,  3500,   -99,  5500,  7500, 12500, 13200,  8000,  7000,  7500,  7500,  7500,  8000, 10000, 10000,  5710,  7610,   -99,  4010,   -99 ], // Training Grounds
	  [    0,  3525,  3775,  4025,  2525,  4525,  4575,  4525,  4525,  3785,  4035,  4535,  1525,  2025,  1025,  1275,    25,     0,    25,   125,  2525,  3525,   -99,  5525,  7525, 12525, 13225,  8025,  7025,  7525,  7525,  7525,  8025, 10025, 10025,  5735,  7635,   -99,  4035,   -99 ], // Dojo
	  [    0,  3550,  3800,  4050,  2550,  4550,  4600,  4550,  4550,  3810,  4060,  4560,  1550,  2050,  1050,  1300,    50,    25,     0,   100,  2550,  3550,   -99,  5550,  7550, 12550, 13250,  8050,  7050,  7550,  7550,  7550,  8050, 10050, 10050,  5760,  7660,   -99,  4060,   -99 ], // Meditation Room
	  [    0,  3650,  3900,  4150,  2650,  4650,  4700,  4650,  4650,  3910,  4160,  4660,  1650,  2150,  1150,  1400,   150,   125,   100,     0,  2650,  3650,   -99,  5650,  7650, 12650, 13350,  8150,  7150,  7650,  7650,  7650,  8150, 10150, 10150,  5860,  7760,   -99,  4160,   -99 ], // Pinnacle Chamber
	  [    0,  4000,  4250,  4500,  3000,  5000,  5050,  5000,  5000,  4260,  4510,  5010,  2000,  2500,  1500,  1750,  2500,  2525,  2550,  2650,     0,  1000,   -99,  6000,  8000, 13000, 13700,  8500,  7500,  8000,  8000,  8000,  8500, 10500, 10500,  6210,  8110,   -99,  4510,   -99 ], // Catacombs
	  [    0,  6500,  6750,  7000,  5500,  6000,  7550,  7500,  7500,  6760,  7010,  7510,  4500,  5000,  4000,  4250,  5000,  5025,  5050,  5150,  2500,     0,     0,  8500, 10500, 15500, 14700, 11000, 10000, 10500, 10500, 10500, 11000, 13000, 13000,  7210,  9110,   -99,  5510,   -99 ], // Forbidden Grove
	  [    0,  4500,  4750,  5000,  3500,   -99,  5550,  5500,  5500,  4760,  5010,  5510,  2500,  3000,  2000,  2250,  3000,  3025,  3050,  3150,   500,  1500,     0,  6500,  8500, 13500, 12700,  9000,  8000,  8500,  8500,  8500,  9000, 11000, 11000,  5210,  7110,   -99,  2510,   -99 ], // Acolyte Realm
	  [    0,  2000,  1750,  1500,  3000,  2000,  2050,  2000,  2000,  2260,  2510,  3010,  4000,  4500,  4500,  4250,  5500,  5525,  5550,  5650,  4000,  7000,   -99,     0,  2000,  7000,  7700,  2500,  1500,  2000,  2000,  2000,  2500,  4500,  4500,  4210,  6110,   -99,  1510,   -99 ], // S.S. Huntington II
	  [    0,  4000,  3750,  3500,  5000,  4000,  4050,  4000,  4000,  4260,  4510,  5010,  6000,  6500,  6500,  6250,  7500,  7525,  7550,  7650,  8000,  9000,   -99,  2000,     0,  5000,  5700,  4500,  3500,  4000,  4000,  4000,  4500,  6500,  6500,  6210,  8110,   -99,  3510,   -99 ], // Seasonal Garden
	  [    0,  9000,  8750,  8500, 10000,  9000,  9050,  9000,  9000,  9260,  9510, 10010, 11000, 11500, 11500, 11250, 12500, 12525, 12550, 12650, 13000, 14000,   -99,  7000,  5000,     0,   700,  9500,  8500,  9000,  9000,  9000,  9500, 11500, 11500, 11210, 13810,   -99,  8510,   -99 ], // Zugzwang's Tower
	  [    0,  9700,  9450,  9200, 10700,  9700,  9750,  9700,  9700,  9960, 10210, 10710, 11700, 12200, 12200, 11950, 13200, 13255, 13250, 13350, 13700, 14700,   -99,  7700,  5700,   700,     0, 10200,  9200,  9700,  9700,  9700, 10200, 12200, 12200, 11910, 13810,   -99,  9210,   -99 ], // Crystal Library
	  [    0,  4500,  4250,  4000,  5500,  4500,  4550,  4500,  4500,  4760,  5010,  5510,  6500,  7000,  7000,  6750,  8000,  8025,  8050,  8150,  8500, 11000,   -99,  2500,  4500,  9500, 10200,     0,  4000,  4500,  4500,  4500,  5000,  7000,  7000,  6710,  8610,   -99,  4010,   -99 ], // Iceberg
	  [    0,  3500,  3250,  3000,  4500,  3500,  3550,  3500,  3500,  3760,  4010,  4510,  5500,  6000,  6000,  5750,  7000,  7025,  7050,  7150,  7500,  8500,   -99,  1500,  3500,  8500,  9200,  4000,     0,   500,   500,   500,  1000,  3000,  3000,  5710,  7610,   -99,  3010,   -99 ], // Cape Clawed
	  [    0,  4000,  3750,  3500,  5000,  4000,  4050,  4000,  4000,  4260,  4510,  5010,  6000,  6500,  6500,  6250,  7500,  7525,  7550,  7650,  8000,  9000,   -99,  2000,  4000,  9000,  9700,  4500,   500,     0,  1000,  1000,  1500,  3500,  3500,  6210,  8110,   -99,  3510,   -99 ], // Elub Shore
	  [    0,  4000,  3750,  3500,  5000,  4000,  4050,  4000,  4000,  4260,  4510,  5010,  6000,  6500,  6500,  6250,  7500,  7525,  7550,  7650,  8000,  9000,   -99,  2000,  4000,  9000,  9700,  4500,   500,  1000,     0,  1000,  1500,  3500,  3500,  6210,  8110,   -99,  3510,   -99 ], // Nerg Plains
	  [    0,  4000,  3750,  3500,  5000,  4000,  4050,  4000,  4000,  4260,  4510,  5010,  6000,  6500,  6500,  6250,  7500,  7525,  7550,  7650,  8000,  9000,   -99,  2000,  4000,  9000,  9700,  4500,   500,  1000,  1000,     0,  1500,  3500,  3500,  6210,  8110,   -99,  3510,   -99 ], // Derr Dunes
	  [    0,  4500,  4250,  4000,  5500,  4500,  4550,  4500,  4500,  4760,  5010,  5510,  6500,  7000,  7000,  6750,  8000,  8025,  8050,  8150,  8500,  9500,   -99,  2500,  4500,  9500, 10200,  5000,  1000,  1500,  1500,  1500,     0,  2000,  2000,  6710,  8610,   -99,  4010,   -99 ], // Jungle of Dread
	  [    0,  6500,  6250,  6000,  6500,  6500,  6550,  6500,  6500,  6760,  7010,  7510,  8500,  9000,  9000,  8750, 10000, 10025, 10050, 10150, 10500, 11500,   -99,  4500,  6500, 11500, 12200,  7000,  3000,  3500,  3500,  3500,  2000,     0,  4000,  8710, 10610,   -99,  6010,   -99 ], // Dracano
	  [    0,  6500,  6250,  6000,  6500,  6500,  6550,  6500,  6500,  6760,  7010,  7510,  8500,  9000,  9000,  8750, 10000, 10025, 10050, 10150, 10500, 11500,   -99,  4500,  6500, 11500, 12200,  7000,  3000,  3500,  3500,  3500,  2000,  4000,     0,  8710, 10610,   -99,  6010,   -99 ], // Balack's Cove
	  [    0,  2210,  2460,  2710,  3210,  3210,  3260,  3210,  3210,  1950,  1700,  1200,  4210,  4710,  4710,  4460,  5710,  5735,  5760,  5860,  6210,  7210,   -99,  4210,  6210, 11210, 11910,  6710,  5710,  6210,  6210,  6210,  6710,  8710,  8710,     0,  1900,   -99,  2720,   -99 ], // Fiery Warpath
	  [    0,  4110,  4360,  4610,  5110,  5110,  5160,  5110,  5110,  3850,  3600,  3100,  6110,  6610,  6610,  6630,  7610,  7635,  7660,  7760,  8110,  9110,   -99,  6110,  8110, 13110, 13810,  8610,  7610,  8110,  8110,  8110,  8610, 10610, 10610,  1900,     0,   -99,  4620,   -99 ], // Muridae Market	
	  [    0,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,     0,   -99,   -99 ], // Living Garden
	  [    0,   510,   260,    10,  1510,   -99,   550,   510,   510,   770,  1020,  1520,  2510,  3010,  3010,  2760,  4010,  4035,  4060,  4160,  4510,  5510,   -99,  1510,  3510,  8510,  9210,  4010,  3010,  3510,  3510,  3510,  4010,  6010,  6010,  2720,  4620,   -99,     0,   -99 ], // Special Event Location
		[    0,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,     0 ]  // Ronza - needs cost checking
	],
	distance: null,
	previous: null
}

var PNAME = 0, PINGREDIENTS = 1;
var PATTERNS = [
	[ 'Ancient Box Trap Blueprints', { 'ancient_frayed_blueprint_piece_craft_item':'1', 'ancient_mangled_blueprint_piece_craft_item':'1', 'ancient_ripped_blueprint_piece_craft_item':'1', 'ancient_torn_blueprint_piece_craft_item':'1' } ],
	[ 'Balack\'s Lantern', { 'dragon_ember':'3', 'old_lantern':'1' } ],
	[ 'Master\'s Seal', { 'master_belt_shard_craft_item':'1', 'master_claw_shard_craft_item':'1', 'master_fang_shard_craft_item':'1' } ],
	[ 'Ocean Navigation Kit', { 'compass_craft_item':'1', 'sextant_craft_item':'1', 'telescope_craft_item':'1' } ],
	[ 'S.S. Huntington II', { 'bolt_of_cloth_craft_item':'70', 'kings_reserve_bubbleh_craft_item':'1', 'rope_craft_item':'100', 'scrap_metal_craft_item':'18', 'ship_blueprints_craft_item':'1', 'splintered_wood_craft_item':'900' } ],
	[ 'S.S. Huntington II', { 'kings_reserve_bubbleh_craft_item':'1', 'unchristened_ship_craft_item':'1' } ],
	[ 'Unchirstened Ship', { 'bolt_of_cloth_craft_item':'70', 'rope_craft_item':'100', 'scrap_metal_craft_item':'18', 'ship_blueprints_craft_item':'1', 'splintered_wood_craft_item':'900' } ],
	[ 'Unstable Curd', { 'curds_and_whey_craft_item':'1', 'ionized_salt_craft_item':'1', 'onyx_stone_craft_item':'1' } ],
	[ 'Zugzwang\'s Tower Key', { 'summer_key_shard_crafting_item':'1', 'fall_key_shard_crafting_item':'1', 'winter_key_shard_crafting_item':'1', 'spring_key_shard_crafting_item':'1' } ],
	[ 'Base - Dehydration Base', { 'dehydration_base_blueprints_craft_item':'1', 'salt_craft_item':'213', 'splintered_wood_craft_item':'4' } ],
	[ 'Base - Gingerbread Base', { 'candies_craft_item':'5', 'gingerbread_base_blueprints_craft_item':'1', 'icing_sugar_craft_item':'1', 'plank_of_gingerbread_craft_item':'1' } ],
	[ 'Base - Hearthstone Base', { 'hearthstone_base_blueprints_crafting_item':'1', 'wire_spool_crafting_item':'1', 'heating_oil_crafting_item':'1', 'frosty_metal_crafting_item':'1', 'disabled_pattern_item':'1' } ],
	[ 'Base - Magnet Base', { 'magnet_base_blueprints_crafting_item':'1', 'wire_spool_crafting_item':'1', 'heating_oil_crafting_item':'1', 'frosty_metal_crafting_item':'1', 'disabled_pattern_item':'1' } ],
	[ 'Base - Molten Shrapnel Base', { 'dragon_ember':'1', 'platinum_bar_crafting_item':'12', 'scrap_metal_craft_item':'200' } ],
	[ 'Base - Remote Detonator Base', { 'remote_detonator_base_blueprints_crafting_item':'1', 'wire_spool_crafting_item':'1', 'heating_oil_crafting_item':'1', 'frosty_metal_crafting_item':'1', 'disabled_pattern_item':'1' } ],
	[ 'Base - Spellbook Base', { 'spellbook_base_blueprints_crafting_item':'1', 'master_binding_crafting_item':'1', 'technic_page_crafting_item':'3', 'mystic_page_crafting_item':'3', 'platinum_bar_crafting_item':'6' } ],
	[ 'Base - Spiked Base', { 'spiked_base_blueprints_crafting_item':'1', 'wire_spool_crafting_item':'1', 'heating_oil_crafting_item':'1', 'frosty_metal_crafting_item':'1', 'splintered_wood_craft_item':'50', 'disabled_pattern_item':'1' } ],
	[ 'Base - Tiki Base', { 'tiki_base_blueprints_crafting_item':'1', 'tribal_timber_crafting_item':'3' } ],
	[ 'Base - Tribal Base', { 'tribal_timber_crafting_item':'3' } ],
	[ 'Charm - Antiskele Charm', { 'radioactive_sludge_craft_item':'1', 'simple_orb_crafting_item':'1', 'charmbit_crafting_item':'36' } ],
	[ 'Charm - Dragonbane Charm', { 'frozen_scroll_craft_item':'1', 'perfect_orb':'1', 'charmbit_crafting_item':'120' } ],
	[ 'Charm - Empowered Anchor Charm', { 'scrap_metal_craft_item':'1', 'flawless_orb_crafting_item':'1', 'charmbit_crafting_item':'40' } ],
	[ 'Charm - Prospector\'s Charm', { 'meteorite_piece_craft_item':'1', 'simple_orb_crafting_item':'1', 'charmbit_crafting_item':'16' } ],
	[ 'Charm - Rotten Charm', { 'stale_cheese_craft_item':'1', 'flawed_orb_crafting_item':'1', 'charmbit_crafting_item':'12' } ],
	[ 'Charm - Scientist\'s Charm', { 'living_shard_crafting_item':'1', 'flawless_orb_crafting_item':'1', 'charmbit_crafting_item':'4' } ],
	[ 'Charm - Super Rotten Charm', { 'stale_super_brie_craft_item':'1', 'flawed_orb_crafting_item':'1', 'charmbit_crafting_item':'12' } ],
	[ 'Charm - Super Warpath Cavalry Charm', { 'desert_horseshoe_crafting_item':'1', 'magic_essence_craft_item':'1', 'simple_orb_crafting_item':'1', 'charmbit_crafting_item':'2' } ],
	[ 'Charm - Super Warpath Mage Charm', { 'heatproof_mage_cloth_crafting_item':'1', 'magic_essence_craft_item':'1', 'simple_orb_crafting_item':'1', 'charmbit_crafting_item':'2' } ],
	[ 'Charm - Warpath Cavalry Charm', { 'desert_horseshoe_crafting_item':'1', 'ionized_salt_craft_item':'1', 'simple_orb_crafting_item':'1', 'charmbit_crafting_item':'2' } ],
	[ 'Charm - Warpath Mage Charm', { 'heatproof_mage_cloth_crafting_item':'1', 'ionized_salt_craft_item':'1', 'simple_orb_crafting_item':'1', 'charmbit_crafting_item':'2' } ],
	[ 'Cheese - Ancient (3 pieces)', { 'ionized_salt_craft_item':'6', 'stale_cheese_craft_item':'3' } ],
	[ 'Cheese - Ancient (6 pieces)', { 'ionized_salt_craft_item':'6', 'magic_essence_craft_item':'3', 'stale_cheese_craft_item':'3' } ],
	[ 'Cheese - Checkmate (3 pieces)', { 'mystic_curd_crafting_item':'1', 'tech_cheese_mould_crafting_item':'1', 'ionized_salt_craft_item':'12' } ],
	[ 'Cheese - Checkmate (9 pieces)', { 'mystic_curd_crafting_item':'1', 'tech_cheese_mould_crafting_item':'1', 'ionized_salt_craft_item':'12', 'magic_essence_craft_item':'6' } ],
	[ 'Cheese - Combat (3 pieces)', { 'curds_and_whey_craft_item':'5', 'paintbrand_paint_craft_item':'1', 'splintered_wood_craft_item':'1', 'token_of_the_cheese_fang_craft_item':'3' } ],
	[ 'Cheese - Creamy Havarti (6 pieces)', { 'coconut_milk_craft_item':'10', 'creamy_orange_pepper_craft_item':'6', 'curds_and_whey_craft_item':'18', 'salt_craft_item':'6' } ],
	[ 'Cheese - Crunchy Havarti (6 pieces)', { 'coconut_milk_craft_item':'4', 'crunchy_green_pepper_craft_item':'6', 'curds_and_whey_craft_item':'18', 'salt_craft_item':'6' } ],
	[ 'Cheese - Crunchy (15 pieces)', { 'coconut_milk_craft_item':'20', 'curds_and_whey_craft_item':'10', 'delicious_stone_craft_item':'30', 'salt_craft_item':'30' } ],
	[ 'Cheese - Crunchy (20 pieces)', { 'coconut_milk_craft_item':'20', 'curds_and_whey_craft_item':'10', 'delicious_stone_craft_item':'30', 'salt_craft_item':'30', 'magic_essence_craft_item':'5' } ],
	[ 'Cheese - Gumbo (15 pieces)', { 'coconut_milk_craft_item':'15', 'curds_and_whey_craft_item':'90', 'salt_craft_item':'1', 'savoury_vegetables_craft_item':'30' } ],
	[ 'Cheese - Gumbo (20 pieces)', { 'coconut_milk_craft_item':'15', 'curds_and_whey_craft_item':'90', 'salt_craft_item':'1', 'savoury_vegetables_craft_item':'30', 'magic_essence_craft_item':'5' } ],
	[ 'Cheese - Glutter (3 pieces)', { 'cheesy_fluffs_craft_item':'1', 'curds_and_whey_craft_item':'7', 'invisiglu_craft_item':'1', 'token_of_the_cheese_belt_craft_item':'3' } ],
	[ 'Cheese - Inferno Havarti (6 pieces)', { 'coconut_milk_craft_item':'16', 'curds_and_whey_craft_item':'18', 'fire_salt_craft_item':'6', 'inferno_pepper_craft_item':'6' } ],
	[ 'Cheese - Limelight (3 pieces)', { 'curds_and_whey_craft_item':'30', 'living_shard_crafting_item':'3', 'radioactive_sludge_craft_item':'3' } ],
	[ 'Cheese - Magical Havarti (6 pieces)', { 'coconut_milk_craft_item':'2', 'curds_and_whey_craft_item':'18', 'magical_blue_pepper_craft_item':'6', 'salt_craft_item':'6' } ],
	[ 'Cheese - Maki (3 pieces)', { 'curds_and_whey_craft_item':'3', 'magic_essence_craft_item':'3', 'nori_craft_item':'1' } ],
	[ 'Cheese - Moon (1 piece)', { 'curds_and_whey_craft_item':'3', 'magic_essence_craft_item':'2', 'meteorite_piece_craft_item':'1' } ],
	[ 'Cheese - Mountain Cheese', { 'mountain_cheese_ore_crafting_item':'10', 'curds_and_whey_craft_item':'5', 'salt_craft_item':'10' } ],
	[ 'Cheese - Onyx Gorgonzola (3 pieces)', { 'curds_and_whey_craft_item':'60', 'ionized_salt_craft_item':'6', 'onyx_stone_craft_item':'1' } ],
	[ 'Cheese - Pungent Havarti (6 pieces)', { 'coconut_milk_craft_item':'8', 'curds_and_whey_craft_item':'18', 'pungent_purple_pepper_craft_item':'6', 'salt_craft_item':'6' } ],
	[ 'Cheese - Rumble (1 piece)', { 'curds_and_whey_craft_item':'20', 'ionized_salt_craft_item':'1', 'masters_seal_craft_item':'1' } ],
	[ 'Cheese - Rumble (3 pieces)', { 'curds_and_whey_craft_item':'20', 'ionized_salt_craft_item':'1', 'master_belt_shard_craft_item':'1', 'master_claw_shard_craft_item':'1', 'master_fang_shard_craft_item':'1' } ],
	[ 'Cheese - Runic (1 piece)', { 'ionized_salt_craft_item':'3', 'rune_craft_item':'1', 'stale_cheese_craft_item':'1' } ],
	[ 'Cheese - Runic (2 pieces)', { 'ionized_salt_craft_item':'3', 'rune_craft_item':'1', 'stale_cheese_craft_item':'1', 'magic_essence_craft_item':'1' } ],
	[ 'Cheese - Shell (15 pieces)', { 'coconut_milk_craft_item':'10', 'curds_and_whey_craft_item':'60', 'salt_craft_item':'40', 'seashell_craft_item':'30' } ],
	[ 'Cheese - Shell (20 pieces)', { 'coconut_milk_craft_item':'10', 'curds_and_whey_craft_item':'60', 'salt_craft_item':'40', 'seashell_craft_item':'30', 'magic_essence_craft_item':'5' } ],
	[ 'Cheese - Spicy Havarti (6 pieces)', { 'coconut_milk_craft_item':'12', 'curds_and_whey_craft_item':'18', 'salt_craft_item':'6', 'spicy_red_pepper_craft_item':'6' } ],
	[ 'Cheese - SUPER|brie+ (1 piece)', { 'curds_and_whey_craft_item':'1', 'magic_essence_craft_item':'1', 'salt_craft_item':'1' } ],
	[ 'Cheese - Susheese (3 pieces)', { 'burroughs_salmon_craft_item':'1', 'curds_and_whey_craft_item':'3', 'nori_craft_item':'1', 'token_of_the_cheese_claw_craft_item':'3' } ],
	[ 'Cheese - Sweet Havarti (6 pieces)', { 'coconut_milk_craft_item':'6', 'curds_and_whey_craft_item':'18', 'salt_craft_item':'6', 'sweet_yellow_pepper_craft_item':'6' } ],
	[ 'Cheese - Vanilla Stilton (15 pieces)', { 'coconut_milk_craft_item':'15', 'curds_and_whey_craft_item':'15', 'salt_craft_item':'15', 'vanilla_bean_crafting_item':'15' } ],
	[ 'Cheese - V. Stilton using SB+ (15 pieces)', { 'coconut_milk_craft_item':'15', 'curds_and_whey_craft_item':'15', 'salt_craft_item':'15', 'vanilla_bean_crafting_item':'5', 'magic_essence_craft_item':'15' } ],
	[ 'Cheese - Vengeful Vanilla Stilton (1 piece)', { 'bottled_up_rage_crafting_item':'1', 'coconut_milk_craft_item':'1', 'curds_and_whey_craft_item':'1', 'ionized_salt_craft_item':'1', 'pinch_of_annoyance_crafting_item':'1', 'raisins_of_wrath':'1', 'vanilla_bean_crafting_item':'1' } ],
	[ 'Cheese - Vengeful Vanilla Stilton (3 pieces)', { 'bottled_up_rage_crafting_item':'1', 'coconut_milk_craft_item':'1', 'curds_and_whey_craft_item':'1', 'ionized_salt_craft_item':'1', 'magic_essence_craft_item':'3', 'pinch_of_annoyance_crafting_item':'1', 'raisins_of_wrath':'1', 'vanilla_bean_crafting_item':'1' } ],
	[ 'Cheese - White Cheddar (1 piece)', { 'curds_and_whey_craft_item':'1', 'salt_craft_item':'1' } ],
	[ 'Plant - Creamy Orange Pepper', { 'plant_pot_craft_item':'1', 'red_pepper_seed_craft_item':'1', 'yellow_pepper_seed_craft_item':'1' } ],
	[ 'Plant - Crunchy Green Pepper', { 'plant_pot_craft_item':'1', 'blue_pepper_seed_craft_item':'1', 'yellow_pepper_seed_craft_item':'1' } ],
	[ 'Plant - Inferno Pepper', { 'plant_pot_craft_item':'1', 'blue_pepper_seed_craft_item':'1', 'red_pepper_seed_craft_item':'1', 'yellow_pepper_seed_craft_item':'1' } ],
	[ 'Plant - Magical Blue Pepper', { 'plant_pot_craft_item':'1', 'blue_pepper_seed_craft_item':'2' } ],
	[ 'Plant - Pungent Purple Pepper', { 'plant_pot_craft_item':'1', 'blue_pepper_seed_craft_item':'1', 'red_pepper_seed_craft_item':'1' } ],
	[ 'Plant - Spicy Red Pepper', { 'plant_pot_craft_item':'1', 'red_pepper_seed_craft_item':'2' } ],
	[ 'Plant - Sweet Yellow Pepper', { 'plant_pot_craft_item':'1', 'yellow_pepper_seed_craft_item':'2' } ],
	[ 'Trap - A.C.R.o.N.Y.M.', { 'magic_essence_craft_item':'3', 'mysterious_blueprints_craft_item':'1', 'obelisk_parts_craft_item':'1', 'onyx_stone_craft_item':'1', 'scrap_metal_craft_item':'12' } ],
	[ 'Trap - Ambush', { 'ambush_trap_blueprints_craft_item':'1', 'droid_parts_craft_item':'8', 'masters_seal_craft_item':'1', 'rice_paper_craft_item':'3', 'splintered_wood_craft_item':'5' } ],
	[ 'Trap - Ancient Box', { 'ancient_box_trap_blueprints_craft_item':'1', 'ancient_relic_staff_craft_item':'1', 'encrusted_metal_of_time_craft_item':'1', 'engraved_solid_stone_slab_craft_item':'1', 'ethereal_rope_craft_item':'1', 'hinge_of_eternity_craft_item':'1', 'timeless_mystic_gem_craft_item':'1' } ],
	[ 'Trap - Ancient Spear Gun', { 'ancient_spear_craft_item':'1', 'ancient_spear_launcher_blueprints_craft_item':'1', 'launcher_parts_craft_item':'1' } ],
	[ 'Trap - Blackstone Pass', { 'blackstone_pass_blueprints_crafting_item':'1', 'coal_craft_item':'4', 'mystic_crystal_crafting_item':'1' } ],
	[ 'Trap - Cackle Lantern (LE)', { 'digby_drillbot_parts_craft_item':'1', 'dragon_ember':'1', 'obelisk_parts_craft_item':'1', 'smashed_pumpkin_crafting_item':'1', 'venus_mouse_trap_husk_craft_item':'1', 'platinum_bar_crafting_item':'24' } ],
	[ 'Trap - Chrome Nannybot (LE)', { 'chrome_nanite_coating_crafting_item':'1', 'nanny_glasses_crafting_item':'1', 'nannybot_parts_crafting_item':'1', 'timeout_upgrade_crafting_item':'1' } ],
	[ 'Trap - Digby Drillbot', { 'digby_drillbot_parts_craft_item':'1' } ],
	[ 'Trap - Double Diamond Adventure (LE)', { 'climbing_pitons_crafting_item':'1', 'mine_crafting_item':'1', 'lava_bucket_crafting_item':'1', 'missile_cone_crafting_item':'1', 'ski_sign_crafting_item':'1', 'toboggan_ride_parts_crafting_item':'1', 'platinum_bar_crafting_item':'18' } ],
	[ 'Trap - Enraged RhinoBot', { 'rhinobot_parts_crafting_item':'1', 'rhino_horn_craft_item':'3', 'stale_super_brie_craft_item':'48', 'platinum_bar_crafting_item':'6' } ],
	[ 'Trap - Fluffy DeathBot', { 'fluffy_deathbot_skin_crafting_item':'1', 'deathbot_parts_craft_item':'1' } ],
	[ 'Trap - Gingerbread House Surprise', { 'candies_craft_item':'10', 'gingerbread_house_plans_craft_item':'1', 'icing_sugar_craft_item':'5', 'plank_of_gingerbread_craft_item':'7' } ],
	[ 'Trap - Grungy DeathBot', { 'grungy_deathbot_skin_crafting_item':'1', 'deathbot_parts_craft_item':'1' } ],
	[ 'Trap - Harpoon Gun', { 'launcher_parts_craft_item':'1' } ],
	[ 'Trap - Heat Bath', { 'launcher_parts_craft_item':'2', 'heat_bath_blueprints_crafting_item':'1', 'scrap_metal_craft_item':'6', 'coal_craft_item':'36' } ],
	[ 'Trap - HitGrab Rainbow Rockin\' Horsey (LE)', { 'rainbow_mohawk_wig_of_awesomeness_craft_item':'1', 'hobby_horse_parts_craft_item':'1', 'invisiglu_craft_item':'1' } ],
	[ 'Trap - Horrific Venus Mouse Trap', { 'radioactive_sludge_craft_item':'20', 'thorned_venus_mouse_trap_husk_craft_item':'1' } ],
	[ 'Trap - Ice Maiden', { 'frozen_scroll_craft_item':'1', 'high_tension_spring_parts_craft_item':'1', 'rune_craft_item':'60' } ],
	[ 'Trap - Mouse DeathBot', { 'deathbot_parts_craft_item':'1' } ],
	[ 'Trap - Mutated Venus Mouse Trap', { 'radioactive_sludge_craft_item':'20', 'venus_mouse_trap_husk_craft_item':'1' } ],
	[ 'Trap - Net Cannon Trap', { 'launcher_parts_craft_item':'1', 'rope_craft_item':'1' } ],
	[ 'Trap - Oasis Water Node Trap', { 'oasis_water_node_blueprint_crafting_item':'1', 'oasis_bead_crafting_item':'1', 'living_shard_crafting_item':'1000', 'coconut_milk_craft_item':'1', 'flameshard_crafting_item':'150' } ],
	[ 'Trap - Obelisk of Incineration', { 'coal_craft_item':'1', 'obelisk_of_incineration_blueprints_craft_item':'1', 'obelisk_parts_craft_item':'1', 'scrap_metal_craft_item':'2', 'splintered_wood_craft_item':'3' } ],
	[ 'Trap - Obelisk of Slumber', { 'obelisk_parts_craft_item':'1', 'bead_of_slumber_craft_item':'1' } ],
	[ 'Trap - Onyx Mallet', { 'onyx_mallet_blueprints_crafting_item':'1', 'onyx_stone_craft_item':'12', 'platinum_bar_crafting_item':'10' } ],
	[ 'Trap - Obvious Ambush', { 'obvious_ambush_blueprints_crafting_item':'1', 'droid_jetpack_crafting_item':'1', 'droid_parts_craft_item':'1' } ],
	[ 'Trap - PartyBot (LE)', { 'deathbot_parts_craft_item':'1', 'party_hat_craft_item':'1' } ],
	[ 'Trap - Pumpkin Pummeler (LE)', { 'evil_pumpkin_seed_crafting_item':'1', 'pumpkin_pummeler_blueprints_crafting_item':'1' } ],
	[ 'Trap - Reaper\'s Perch', { 'droid_parts_craft_item':'1', 'repear_perch_blueprint_crafting_item':'1', 'monolithic_slab_crafting_item':'6', 'onyx_stone_craft_item':'6', 'rune_craft_item':'6' } ],
	[ 'Trap - RhinoBot', { 'digby_drillbot_parts_craft_item':'1', 'rhino_horn_craft_item':'1', 'rhinobot_blueprints_craft_item':'1', 'stale_super_brie_craft_item':'24' } ],
	[ 'Trap - RhinoBot', { 'rhinobot_parts_crafting_item':'1' } ],
	[ 'Trap - Sandstorm MonstroBot', { 'sandstormbot_weapon_blueprint_crafting_item':'1', 'flameshard_crafting_item':'400', 'sandblasted_metal_crafting_item':'2', 'rhinobot_parts_crafting_item':'1', 'digby_drillbot_parts_craft_item':'1', 'deathbot_parts_craft_item':'1' } ],
	[ 'Trap - Soul Catcher (LE)', { 'soul_catcher_parts_crafting_item':'1' } ],
	[ 'Trap - Soul Harvester (LE)', { 'soul_catcher_parts_crafting_item':'1', 'onyx_stone_craft_item':'2', 'monolithic_slab_crafting_item':'2', 'platinum_bar_crafting_item':'12', 'living_shard_crafting_item':'12' } ],
	[ 'Trap - Sphynx Wrath', { 'sphynx_weapon_blueprint_crafting_item':'1', 'sphynx_crystal_crafting_item':'1', 'gold_leaf_crafting_item':'28', 'flameshard_crafting_item':'200' } ],
	[ 'Trap - Thorned Venus Mouse Trap', { 'thorned_mouse_trap_plans_craft_item':'1', 'thorned_vine_craft_item':'1', 'venus_mouse_trap_husk_craft_item':'1' } ],
	[ 'Trap - Venus Mouse Trap', { 'venus_mouse_trap_husk_craft_item':'1' } ],
	[ 'Trap - Zugzwang\'s First Move', { 'magical_feather_crafting_item':'1', 'zugzwangs_first_move_crafting_item':'1', 'chess_pieces_crafting_item':'1' } ],
	[ 'Trap - Zurreal\'s Folly', { 'zzl_marchingflameresearch_crafting_item':'1', 'zzl_ripper_nail':'3', 'zzl_ectoplasm':'3', 'zzl_gnawniaresearch_crafting_item':'1', 'zzl_fine_wood_crafting_item':'6', 'zzl_stonework_runes':'3', 'zzl_mesh_netting':'1', 'zzl_lich_jewel':'1', 'zzl_draconic_book':'1' } ]
];

var INVID = 0, INVTYPE = 1, INVNAME = 2, INVDETAIL = 3, INVQTY = 4, INVEXTRA = 5;
var INVENTORY = Array();
var INV_TYPE_BAIT = 0, INV_TYPE_BASE = 1, INV_TYPE_BREAK = 2, INV_TYPE_CONVERT = 3, INV_TYPE_MAPS = 4, INV_TYPE_NOVELTY = 5, INV_TYPE_PLANKRUN = 6, INV_TYPE_POTION = 7, INV_TYPE_WEAPON = 8, INV_TYPE_NONE = 9;
var INVENTORY_TYPES_TEXT = [ 'bait', 'base', 'breakable', 'covertible', 'map_piece', 'collectible', 'torn_page', 'potion', 'weapon', 'none' ];

var CRAFTID = 0, CRAFTNAME = 1, CRAFTDETAIL = 2, CRAFTQTY = 3;
var CRAFTING = Array();

var LOCATION_TIMERS = [
	[ 'Seasonal Garden', { first: 1283616000, length: 288000, breakdown: [ 1, 1, 1, 1 ], name: [ 'Summer', 'Autumn', 'Winter', 'Spring' ], color: [ 'Red', 'Orange', 'Blue', 'Green' ], effective: [ 'tactical', 'shadow', 'hydro', 'physical' ] } ],
	[ 'Balack\'s Cove', { first: 1294680060, length: 1200, breakdown: [ 48, 3, 2, 3 ], name: [ 'Low', 'Medium', 'High', 'Medium' ], color: [ 'Green', 'Orange', 'Red', 'Orange' ] } ],
	[ 'Forbidden Grove', { first: 1285704000, length: 14400, breakdown: [ 4, 1 ], name: [ 'Open', 'Closed' ], color: [ 'Green', 'Red' ] } ]
];

var CurrentJournal;
var LastJournal;

var TotalCatches;
var TotalGold;
var TotalGoldStolen;
var TotalPoints;
var TotalPointsLost;
var TotalWeight;

var ArrayMouseName;
var ArrayMouseQty;
var ArrayLootName;
var ArrayLootQty;

if (typeof(unsafeWindow) == 'undefined')
{
	unsafeWindow = this['unsafeWindow'] || window;
}

var UseGMFunctions = true;

if (navigator.userAgent.toLowerCase().indexOf("firefox") == -1)
{
	UseGMFunctions = false;
}

function DSXC_setValue(name, value)
{
	if (UseGMFunctions)
	{
		GM_setValue(name, value);
	}
	else if (typeof(localStorage) != 'undefined')
	{
		localStorage.setItem('MHH ' + name, '' + value);
	}
	else if (!STATE.errorshown)
	{
		alert('We\'re very sorry, but your browser is currently not supported.  Upgrading to Firefox with Greasemonkey or any HTML5 compliant browser will add support for this script.');
	}
}

function DSXC_getValue(name, value, full)
{
	var DSXC_getValueReturn = value;
	
	if (typeof(full) != 'boolean') full = false;
	
	if (UseGMFunctions)
	{
		DSXC_getValueReturn = GM_getValue(name, value);
	}
	else if (typeof(localStorage) != 'undefined')
	{
		var getvalue = localStorage.getItem('MHH ' + name);
		
		if (getvalue)
		{
			if (getvalue == 'true')
				getvalue = true;
			else if (getvalue == 'false')
				getvalue = false;
			
			DSXC_getValueReturn = getvalue;
		}
	}
	else if (!STATE.errorshown)
	{
		alert('We\'re very sorry, but your browser is currently not supported.  Upgrading to Firefox with Greasemonkey or any HTML5 compliant browser will add support for this script.');
	}
	
	return DSXC_getValueReturn;
}

function ValueDetail(type, value)
{
	var ValueDetailReturn = '';
	
	switch (type)
	{
		case 'string':
		{
			ValueDetailReturn = value;
		} break;
		
		case 'boolean':
		{
			switch (value)
			{
				case 'true':
				{
					ValueDetailReturn = true;
				} break;
				
				case 'false':
				{
					ValueDetailReturn = false;
				} break;
			}
		} break;
		
		case 'number':
		{
			ValueDetailReturn = Number(value);
		}
	}
	
	return ValueDetailReturn;
}

function DSXC_log(text)
{
	if (UseGMFunctions)
	{
		GM_log(text);
	}
	// opera event
	else if (typeof(opera) == 'object')
	{
		opera.postError(text);
	}
	else if (typeof(console) == 'object')
	{
		console.log(text);
	}
}

function DSXC_registerMenuCommand(menu, func)
{
	if (UseGMFunctions)
	{
		GM_registerMenuCommand(menu, func);
	}
}

var XMLHttpFactories = [
	function () { return new XMLHttpRequest() },
	function () { return new ActiveXObject("Msxml2.XMLHTTP") },
	function () { return new ActiveXObject("Msxml3.XMLHTTP") },
	function () { return new ActiveXObject("Microsoft.XMLHTTP") }
];

function GetFullDomain(text)
{
	var FullDomainReturn = '';
	var StartPos = text.indexOf('//');
	
	if (StartPos != -1)
	{
		var EndPos = text.indexOf('/', StartPos + 2);
		if (EndPos == -1) EndPos = text.length;
		
		FullDomainReturn = text.substring(StartPos + 2, EndPos);
		
		if (FullDomainReturn.substring((FullDomainReturn.length - 1)) == '/')
		{
			FullDomainReturn = FullDomainReturn.substring(0, (FullDomainReturn.length - 1));
		}
	}
	
	return FullDomainReturn;
}

function DSXC_xmlHttpRequest(options)
{
	if (UseGMFunctions)
	{
		GM_xmlhttpRequest(options);
	}
	else
	{
		var request = null;
		
		if (typeof(opera) == 'object' && options.url.indexOf(GetFullDomain(location.href)) == -1)
		{
			// opera doesn't support cross-site XML requests - this modified version does
	  	request = new opera.XMLHttpRequest();
		}
		else
		{
			for (var iCount = 0; iCount < XMLHttpFactories.length; iCount++)
			{
				try
				{
		  		request = XMLHttpFactories[iCount]();
		  	}
		  	catch(e)
		  	{
		  		continue;
		  	}
		  	// valid one found
		  	break;
		  }
		}
		
		if (request != null)
		{	  
			request.onload = function() {
	    	var response = {
	        responseText: request.responseText,
	        readyState: request.readyState,
	        responseHeaders: (request.readyState == 4 ? request.getAllResponseHeaders() : ''),
	        status: request.readyState == 4 ? request.status : 0,
	        statusText: request.readyState == 4 ? request.statusText : ''
	      };
	      
				options.onload(response);
			}
			
		  request.open(options.method, options.url, true);
		
			if (options.headers)
			{
				if (!options.headers["X-Requested-With"])
				{
					options.headers["X-Requested-With"] = "XMLHttpRequest";
				}
			}
			
		  // set the headers
		  for (var header in options.headers) {
		    request.setRequestHeader(header, options.headers[header]);
		  }
		  
		  // send the data
		  request.send(options.data);
		  //return request;
		}
	}
}

serialize = function(obj)
{
  var str = [];
  
  for (var item in obj)
  {
  	if (typeof obj[item] === "object")
  	{
  		for (var subitem in obj[item])
  		{
  			str.push(encodeURIComponent(item) + "[" + encodeURIComponent(subitem) + "]=" + encodeURIComponent(obj[item][subitem]));
  		}
  	}
  	else
  	{
    	str.push(encodeURIComponent(item) + "=" + encodeURIComponent(obj[item]));
    }
  }
  
  return str.join("&");
}

DSXC_registerMenuCommand('Mousehunt Helper - Reset Windows', ResetWindows);

function ReadSettings()
{
	SETTINGS.horn = DSXC_getValue('SETTINGS.horn', STATE_OFF);
	SETTINGS.king = DSXC_getValue('SETTINGS.king', STATE_OFF);
	SETTINGS.cheese = DSXC_getValue('SETTINGS.cheese', STATE_OFF);
	SETTINGS.washed = DSXC_getValue('SETTINGS.washed', STATE_OFF);
	SETTINGS.season = DSXC_getValue('SETTINGS.season', STATE_OFF);

	SETTINGS.confirm = DSXC_getValue('SETTINGS.confirm', true);
	SETTINGS.direct = DSXC_getValue('SETTINGS.direct', false);
	SETTINGS.showall = DSXC_getValue('SETTINGS.showall', false);
	SETTINGS.timers = DSXC_getValue('SETTINGS.timers', true);
	SETTINGS.title = DSXC_getValue('SETTINGS.title', true);
	SETTINGS.auto = DSXC_getValue('SETTINGS.auto', false);
	SETTINGS.buttons = DSXC_getValue('SETTINGS.buttons', false);
	SETTINGS.adverts = DSXC_getValue('SETTINGS.adverts', false);
	SETTINGS.length = DSXC_getValue('SETTINGS.length', 10);
}

function SaveSettings()
{
	DSXC_setValue('SETTINGS.horn', SETTINGS.horn);
	DSXC_setValue('SETTINGS.king', SETTINGS.king);
	DSXC_setValue('SETTINGS.cheese', SETTINGS.cheese);
	DSXC_setValue('SETTINGS.washed', SETTINGS.washed);
	DSXC_setValue('SETTINGS.season', SETTINGS.season);

	DSXC_setValue('SETTINGS.confirm', SETTINGS.confirm);
	DSXC_setValue('SETTINGS.direct', SETTINGS.direct);
	DSXC_setValue('SETTINGS.showall', SETTINGS.showall);
	DSXC_setValue('SETTINGS.timers', SETTINGS.timers);
	DSXC_setValue('SETTINGS.title', SETTINGS.title);
	DSXC_setValue('SETTINGS.auto', SETTINGS.auto);
	DSXC_setValue('SETTINGS.buttons', SETTINGS.buttons);
	DSXC_setValue('SETTINGS.adverts', SETTINGS.adverts);
	DSXC_setValue('SETTINGS.length', SETTINGS.length);
}

function ResetSettings()
{
	SETTINGS.horn = STATE_OFF;
	SETTINGS.king = STATE_OFF;
	SETTINGS.cheese = STATE_OFF;
	SETTINGS.washed = STATE_OFF;
	SETTINGS.season = STATE_OFF;

	SETTINGS.confirm = true;
	SETTINGS.direct = false;
	SETTINGS.showall = false;
	SETTINGS.timers = true;
	SETTINGS.title = true;
	SETTINGS.auto = false;
	SETTINGS.buttons = false;
	SETTINGS.adverts = false;
	SETTINGS.length = 5;
	
	ResetWindows();
}

function Initialize()
{
	DSXC_log('MHH v' + SCRIPT.version + ' - startup');
	
	// initialize the user object
	InitUserObject(document.documentElement.innerHTML);
	
	// determine current base
	DetermineBase();
	// determine current cheese
	DetermineCheese();
	// determine the unique hash
	DetermineHash();
	// determine current level
	DetermineLevel();
	// determine current location
	DetermineLocation();
	// determine current trap
	DetermineTrap();
	
	ReadSettings();

	// read the saved inventory from settings
	LoadCrafting();
	LoadInventory();
	
	InitWindow();

	StartTimers();
}

Initialize();

function InitUserObject(text)
{
	DSXC_log('Init UserObject');
	
	var OldUserObject = STATE.userobject;
	var StartPos = text.indexOf('user = ');
	var EndPos = text.indexOf('};', StartPos) + 2;
	
	if (StartPos != -1)
	{
		var FullObjectText = text.substring(StartPos + 7, EndPos); //.replace(/\\\\\\\"/g, '');
		var UserObjectText = "STATE.userobject = " + FullObjectText + ";"; //.replace(/\\/g, '') + ";";
		
		eval(UserObjectText);

		if (OldUserObject != null)
		{
			if (OldUserObject.location != STATE.userobject.location)
			{
				DSXC_log('Not at expected location, expected ' + OldUserObject.location + ' but at ' + STATE.userobject.location);
			}
		}
	}
	
	if (STATE.userobject != null)
	{
		UpdatePercentage(STATE.userobject.title_percentage);
	}
}

function LoadInventory()
{
	var TotalItems = DSXC_getValue('Inventory - Max ID', -1);
	
	DSXC_log('Load Inventory Items');
	
	for (iCount1 = 0; iCount1 <= TotalItems; iCount1++)
	{
		var InventoryDetail = DSXC_getValue('Inventory Item - ' + iCount1, 'INVALID');
		INVENTORY[iCount1] = Array();
		
		if (InventoryDetail != 'INVALID')
		{
			var InvValues = InventoryDetail.split(',');
			
			INVENTORY[iCount1][INVID] = iCount1;
			INVENTORY[iCount1][INVTYPE] = InvValues[0];
			INVENTORY[iCount1][INVNAME] = InvValues[1];
			INVENTORY[iCount1][INVDETAIL] = InvValues[2];
			INVENTORY[iCount1][INVQTY] = Number(InvValues[3]);
			
			if (InvValues.length == 5)
			{
				INVENTORY[iCount1][INVEXTRA] = InvValues[4];
			}
		}
		else
		{
			INVENTORY[iCount1][INVID] = -1;
			INVENTORY[iCount1][INVTYPE] = INVENTORY_TYPES_TEXT[INV_TYPE_NONE];
			INVENTORY[iCount1][INVQTY] = 0;
		}
	}
	
	DSXC_log(' - ' + iCount1 + ' loaded');
}

function LoadCrafting()
{
	var TotalItems = DSXC_getValue('Crafting - Max ID', -1);
	var NextItem = 0;
	
	DSXC_log('Load Crafting Items');
	
	for (iCount1 = 0; iCount1 <= TotalItems; iCount1++)
	{
		var CraftDetail = DSXC_getValue('Crafting Item - ' + iCount1, 'INVALID');
		
		if (CraftDetail != 'INVALID')
		{
			var CraftValues = CraftDetail.split(',');
			
			CRAFTING[NextItem] = Array();
			CRAFTING[NextItem][CRAFTID] = iCount1;
			CRAFTING[NextItem][CRAFTNAME] = CraftValues[0];
			CRAFTING[NextItem][CRAFTDETAIL] = CraftValues[1];
			CRAFTING[NextItem][CRAFTQTY] = Number(CraftValues[2]);
			
			NextItem++;
		}
	}
	
	DSXC_log(' - ' + NextItem + ' loaded');
}

function InitWindow()
{
	// display the windows
	DisplayState();
	DisplayTimers();
	DisplayDetail();
}

function DetermineLevel()
{
	STATE.level = -1;
	
	if (STATE.userobject != null)
	{
		DSXC_log("Determine Level");
		
		for (count1 = 0; count1 < LEVEL.length && STATE.level == -1; count1++)
		{
			for (count2 = 0; count2 < LEVEL[count1].length; count2++)
			{
				if (STATE.userobject.title_name == LEVEL[count1][count2])
				{
					STATE.level = count1;
				}
			}
		}
		
		DSXC_log(" - Level is " + STATE.userobject.title_name);
	}
	
	if (STATE.level == -1)
	{
		setTimeout(DetermineLevel, 500);
	}
}

function DetermineCheese()
{
	if (STATE.userobject != null && STATE.userobject.bait_item_id != null)
	{
		DSXC_log("Determine Cheese");
		
		STATE.cheese = STATE.userobject.bait_item_id;

		if (STATE.cheese != -1 && STATE.cheese < INVENTORY.length)
		{
			DSXC_log(" - Cheese is " + INVENTORY[STATE.cheese][INVNAME]);
		}
		else
		{
			setTimeout(DetermineCheese, 500);
		}
	}
	else
	{
		setTimeout(DetermineCheese, 500);
	}
}

function DetermineLocation()
{
	STATE.location = -1;
	
	if (STATE.userobject != null)
	{
		DSXC_log("Determine Location");
		
		for (count = 0; count < LOCATION.detail.length && STATE.location == -1; count++)
		{
			if (STATE.userobject.location == LOCATION.detail[count][LNAME])
			{
				STATE.location = count;
			}
		}
	
		if (STATE.location != -1)
		{
			// update expected location, this is updated when the page is loaded or you use travel
			DSXC_setValue('STATE.location', STATE.userobject.location);
			DSXC_log(" - Location is " + LOCATION.detail[STATE.location][LNAME]);
		}
	}
	else
	{
		setTimeout(DetermineLocation, 500);
	}
}

function CalculateRouteCosts()
{
	var TotalLocations = LOCATION.costs.length;

	LOCATION.distance = new Array(TotalLocations);
	LOCATION.previous = new Array(TotalLocations);
	
	for (var iCount1 = 0; iCount1 < TotalLocations; iCount1++)
	{
		LOCATION.distance[iCount1] = new Array(TotalLocations);
		LOCATION.previous[iCount1] = new Array(TotalLocations);
		
		for (var iCount2 = 0; iCount2 < TotalLocations; iCount2++)
		{
			LOCATION.previous[iCount1][iCount2] = -99;
			LOCATION.distance[iCount1][iCount2] = -99;
			
			if (CheckMap(LOCATION.detail[iCount2][LMAP]))
			{
				LOCATION.distance[iCount1][iCount2] = LOCATION.costs[iCount1][iCount2];
			}
		}
	}
	
	for (var iCount1 = 0; iCount1 < TotalLocations; iCount1++)
	{
		for (var iCount2 = 0; iCount2 < TotalLocations; iCount2++)
		{
			for (var iCount3 = 0; iCount3 < TotalLocations; iCount3++)
			{
				if ((LOCATION.distance[iCount2][iCount1] + LOCATION.distance[iCount1][iCount3] < LOCATION.distance[iCount2][iCount3] || LOCATION.distance[iCount2][iCount3] == -99) && LOCATION.distance[iCount2][iCount1] != -99 && LOCATION.distance[iCount1][iCount3] != -99)
				{
					LOCATION.distance[iCount2][iCount3] = LOCATION.distance[iCount2][iCount1] + LOCATION.distance[iCount1][iCount3];
					LOCATION.previous[iCount2][iCount3] = iCount1;
				}
			}
		}
	}
}

function CalculateRoute(wherefrom, whereto, route)
{
	if (route == null)
	{
		route = new Array();
		route.push(whereto);
	}
	
	if (LOCATION.previous[wherefrom][whereto] == -99)
	{
		route.reverse();
		return route;
	}
	else
	{
		route.push(LOCATION.previous[wherefrom][whereto]);
	}
	
	return CalculateRoute(wherefrom, LOCATION.previous[wherefrom][whereto], route);
}

function DetermineHash()
{
	if (STATE.userobject != null)
	{
		DSXC_log('Determine Hash');
	
		STATE.hash = STATE.userobject.unique_hash;
		
		DSXC_setValue('STATE.hash', STATE.hash);
		DSXC_log(' - Hash is ' + STATE.hash);
	}
	else
	{
		setTimeout(DetermineHash, 500);
	}
}

function DetermineTrap()
{
	STATE.trap = -1;
	
	if (STATE.userobject != null)
	{
		DSXC_log("Determine Trap");
		
		STATE.trap = STATE.userobject.weapon_item_id;
		DSXC_log(" - Trap is " + STATE.userobject.weapon_name);
	}
	else
	{
		setTimeout(DetermineTrap, 500);
	}
}

function DetermineBase()
{
	STATE.base = -1;
	
	if (STATE.userobject != null)
	{
		DSXC_log("Determine Base");
	
		STATE.base = STATE.userobject.base_item_id;
		DSXC_log(" - Base is " + STATE.userobject.base_name);
	}
	else
	{
		setTimeout(DetermineBase, 500);
	}
}

function CalculatePower(trap, base)
{
	var total_power = 0;
	var multiplier = 1.0;
	
	if (trap != -1 && base != -1)
	{
		total_power = total_power + TRAPS[trap][TPOWER] + BASES[base][BPOWER];
		multiplier = multiplier + ((TRAPS[trap][TBONUS] + BASES[base][BBONUS]) / 100);
		total_power = Math.round((total_power * multiplier) * 10) / 10; // round to 1 decimal place
		total_power = Math.round(total_power);
	}
	
	return total_power;
}

function CreateOverlayWindow(name, id, display)
{
	// disabled
	return false;
	
	if (display == null) display = true;
	var OverlayWindow = document.getElementById(id);
		
	if (OverlayWindow != null && document.getElementById(name + '_Message') == null)
	{
		if (display)
		{
			/*
			var Browser = document.getElementById('trapSelectorBrowserContainer');
			Browser.className = 'showBlock';
			
			var Image = document.getElementById('trapSelectorImage');
			Image.className = 'hide';
			*/

			var CloseButton = "<A HREF='#' ID='" + name + "_Close'><IMG SRC='" + IMAGE.close + "' border='0' TITLE='Close' ALT='X' /></A>";
			var PopupWindow = document.createElement("div");
			
			PopupWindow.style.position = 'absolute';
			PopupWindow.style.top = getPosition(OverlayWindow.parentNode).y + 'px';
			PopupWindow.style.left = getPosition(OverlayWindow.parentNode).x + 'px';
			
			var h = OverlayWindow.clientHeight;
			var w = OverlayWindow.clientWidth;
			
			PopupWindow.id = name + "_Message";
			PopupWindow.innerHTML = "<DIV STYLE='position:absolute; z-index:100; background: white; padding: 0px 0px; color: black; border: 1px solid; font:10pt Verdana; width: " + w + "px; height: " + h + "px;'><DIV ID='" + name + "_Titlebar' STYLE='background: navy; color: white; cursor:move; font-weight: bold'>&nbsp;" + name + " <DIV STYLE='position:absolute; right:0px; top: 0px'>" + CloseButton + "</DIV></DIV><DIV ID='" + name + "' STYLE='padding: 5px 5px; text-align: left; overflow: auto; height: " + (h - 26) + "px;'></DIV></DIV>";
			
			document.body.appendChild(PopupWindow);
			document.getElementById(name + '_Close').addEventListener("click", function() { document.getElementById(name + '_Message').parentNode.removeChild(document.getElementById(name + '_Message')) }, false);
			
			return document.getElementById(name);
		}
	}
	else
	{
		if (document.getElementById(name + '_Message') != null)
		{
			document.getElementById(name + '_Message').parentNode.removeChild(document.getElementById(name + '_Message'));
			return null;
		}
	}
		
	return false;
}

/************************ Drag n drop*******************************/
function CreatePopupWindow(name, w, h, display)
{
	if (display == null) display = true;
	
	if (document.getElementById(name + '_Message') == null)
	{
		if (display)
		{
			var CloseButton = "<A HREF='#' ID='" + name + "_Close'><IMG SRC='" + IMAGE.close + "' border='0' TITLE='Close' ALT='X' /></A>";
			var PopupWindow = document.createElement("div");
			
			var WindowPosition = DSXC_getValue("Position - " + name, "90px_300px");
			WindowPosition = WindowPosition.split("_");
			
			PopupWindow.style.position = 'absolute';
			PopupWindow.style.top = WindowPosition[0];
			PopupWindow.style.left = WindowPosition[1];	
			
			PopupWindow.id = name + "_Message";
			PopupWindow.innerHTML = "<DIV STYLE='position:absolute; z-index:100; background: white; padding: 0px 0px; color: black; border: 1px solid; font:10pt Verdana; width: " + w + "px; height: " + h + "px;'><DIV ID='" + name + "_Titlebar' STYLE='background: navy; color: white; cursor:move; font-weight: bold'>&nbsp;" + name + " <DIV STYLE='position:absolute; right:0px; top: 0px'>" + CloseButton + "</DIV></DIV><DIV ID='" + name + "' STYLE='padding: 5px 5px; text-align: left; overflow: auto; height: " + (h - 26) + "px;'></DIV></DIV>";
			
			document.body.appendChild(PopupWindow);
			
			makeDraggable(document.getElementById(name + '_Titlebar'));
			document.getElementById(name + '_Close').addEventListener("click", function() { document.getElementById(name + '_Message').parentNode.removeChild(document.getElementById(name + '_Message')) }, false);
			
			return document.getElementById(name);
		}
	}
	else
	{
		document.getElementById(name + '_Message').parentNode.removeChild(document.getElementById(name + '_Message'));
	}
		
	return null;
}

function CreateSlider(node, width, minimum, maximum, show)
{
	var SliderCtrl = document.getElementById(node);
	
	if (SliderCtrl != null)
	{
		SliderCtrl.setAttribute('SliderCtrl', 'idle');
		SliderCtrl.setAttribute('RangeMin', minimum);
		SliderCtrl.setAttribute('RangeMax', maximum);
		SliderCtrl.setAttribute('SliderTrack', 'Slider_Track_' + node);
		SliderCtrl.setAttribute('SliderThumb', 'Slider_Thumb_' + node);
		
		if (show != null) SliderCtrl.setAttribute('SliderValue', show);
		
		SliderCtrl.innerHTML = '<DIV ID="Slider_Track_' + node + '" STYLE="width: 200px; left: 2px; height: 1px; border: 1px solid black"><DIV ID="Slider_Thumb_' + node + '" STYLE="z-index:100; margin-top: -3px; width: 5px; height: 6px; border: 1px solid black; background-color: white"></DIV></DIV>';
		
		SliderCtrl.addEventListener("mousedown", function(ev) { this.setAttribute('SliderCtrl', 'drag'); return false; }, false);
		SliderCtrl.addEventListener("mouseup", function(ev) { this.setAttribute('SliderCtrl', 'idle'); return false; }, false);
		SliderCtrl.addEventListener("mousemove", function(ev) {
			if (this.getAttribute('SliderCtrl') == 'drag')
			{
				var SliderTrack = document.getElementById(this.getAttribute('SliderTrack'));
				var SliderThumb = document.getElementById(this.getAttribute('SliderThumb'));
				
				var MousePos = mouseCoords(ev);
				var TrackPos = getPosition(SliderTrack);
				var ThumbPos = getPosition(SliderThumb);
				
				var Range = {
					min: (TrackPos.x + 2),
					max: (TrackPos.x + parseFloat(SliderTrack.style.width) - 6)
				};
				
				SliderThumb.style.position = 'relative';

				if (Range.min > MousePos.x)
				{
					SliderThumb.style.left = '0px';
				}
				else if (Range.max < MousePos.x)
				{
					SliderThumb.style.left = (Range.max - Range.min) + 'px';
				}
				else
				{
					SliderThumb.style.left = (MousePos.x - Range.min) + 'px';
				}
				
				if (this.getAttribute('SliderValue') != null && document.getElementById(this.getAttribute('SliderValue')) != null)
				{
					document.getElementById(this.getAttribute('SliderValue')).innerHTML = Math.ceil(((parseFloat(SliderThumb.style.left) + 1) * this.getAttribute('RangeMax')) / parseFloat(SliderTrack.style.width));
				}
				
				return false;
			}
		}, false);
	}
}

var mouseOffset = null;
var mousePos    = [ 0, 0 ];
var iMouseDown  = false;
var lMouseState = false;
var dragObject  = null;
var curTarget   = null;

function mouseCoords(ev)
{
	return { x: ev.pageX, y: ev.pageY };
}

function makeClickable(object)
{
	object.onmousedown = function()
	{
		dragObject = this;
	}
}

function getMouseOffset(target, ev)
{
	var dPos = getPosition(target.parentNode);
	var mPos = mouseCoords(ev);
	
	return { x:mPos.x - dPos.x, y:mPos.y - dPos.y };
}

function getPosition(e)
{
	var border_left;
	var border_top;
	var left = 0;
	var top  = 0;
	
	while (e.offsetParent)
	{
		border_left = (e.currentStyle ? parseInt(e.currentStyle.borderLeftWidth) : 0);
		border_top =  (e.currentStyle ? parseInt(e.currentStyle.borderTopWidth)  : 0);
		
		left += e.offsetLeft + (typeof(border_left) == "number" ? border_left : 0);
		top  += e.offsetTop  + (typeof(border_top)  == "number" ? border_top  : 0);
		e     = e.offsetParent;
	}
	
	border_left = (e.currentStyle ? parseInt(e.currentStyle.borderLeftWidth) : 0);
	border_top =  (e.currentStyle ? parseInt(e.currentStyle.borderTopWidth)  : 0);
	
	left += e.offsetLeft + (typeof(border_left) == "number" ? border_left : 0);
	top  += e.offsetTop  + (typeof(border_top)  == "number" ? border_top  : 0);
	
	return { x: left, y: top };
}

function mouseMove(ev)
{
	var target   = ev.target;
	mousePos = mouseCoords(ev);

	if (dragObject)
	{
		dragObject.parentNode.style.position = 'absolute';
		dragObject.parentNode.style.top      = Math.max(0, (mousePos.y - mouseOffset.y)) +"px";
		dragObject.parentNode.style.left     = Math.max(0, (mousePos.x - mouseOffset.x)) +"px";
	}
	
	lMouseState = iMouseDown;
	
	return false;
}

function mouseUp(ev)
{
	if (dragObject != null)
	{
		if (dragObject.parentNode.id.indexOf('_Message') != -1)
		{
			var item_name = dragObject.parentNode.id.substring(0, dragObject.parentNode.id.indexOf('_Message'));
			DSXC_setValue("Position - " + item_name, dragObject.parentNode.style.top + "_" + dragObject.parentNode.style.left);
		}
		
		dragObject = null;
	}
	
	iMouseDown = false;
}

function mouseDown(ev)
{
	var mousePos = mouseCoords(ev);
	var target = ev.target;
	
	iMouseDown = true;	
	
	if (target.getAttribute('DragObj'))
	{
		return false;
	}	
}

function makeDraggable(item)
{
	if (!item) return;
	
	item.addEventListener("mousedown",
		function(ev)
		{
			dragObject = this.parentNode;
			mouseOffset = getMouseOffset(this.parentNode, ev);
			return false;
		},
		false);
}

document.addEventListener("mousemove", mouseMove, false);
document.addEventListener("mousedown", mouseDown, false);
document.addEventListener("mouseup", mouseUp, false);

function getElementById(search, node, tag)
{
	var FoundElement = null;
	
	if (node == null) node = document;
	if (tag == null) tag = '*';
	
	var AllElements = node.getElementsByTagName(tag);
	
	for (count = 0; count < AllElements.length && FoundElement == null; count++)
	{
		if (AllElements[count].id != null)
		{
			if (AllElements[count].id.indexOf(search) != -1)
			{
				FoundElement = AllElements[count];
			}
		}
	}
	
	return FoundElement;
}

function getElementsByPartialId(search, node, tag)
{
	var FoundElements = new Array();
	
	if (node == null) node = document;
	if (tag == null) tag = '*';
	
	var AllElements = node.getElementsByTagName(tag);
	
	for (count = 0; count < AllElements.length; count++)
	{
		if (AllElements[count].id != null)
		{
			if (AllElements[count].id.indexOf(search) != -1)
			{
				FoundElements.push(AllElements[count]);
			}
		}
	}
	
	return FoundElements;
}

function getElementsByClass(search, node, tag)
{
	var FoundElements = new Array();
	
	if (node == null) node = document;
	if (tag == null) tag = '*';
	
	var AllElements = node.getElementsByTagName(tag);
	
	for (count = 0; count < AllElements.length; count++)
	{
		if (AllElements[count].className != null)
		{
			if (AllElements[count].className == search)
			{
				FoundElements.push(AllElements[count]);
			}
		}
	}
	
	return FoundElements;
}

function getElementsByPartialClass(search, node, tag)
{
	var FoundElements = new Array();
	
	if (node == null) node = document;
	if (tag == null) tag = '*';
	
	var AllElements = node.getElementsByTagName(tag);
	
	for (count = 0; count < AllElements.length; count++)
	{
		if (AllElements[count].className != null)
		{
			if (AllElements[count].className.indexOf(search) != -1)
			{
				FoundElements.push(AllElements[count]);
			}
		}
	}
	
	return FoundElements;
}

function GetMessageText(text)
{
	var StartPos = text.indexOf('pagemessage');
	var EndPos = text.indexOf('<div id="tabbarContent');

	var MessageText = "";
	
	if (StartPos != -1)
	{
		MessageText = text.substring(StartPos + 53, EndPos);
	}
	
	return MessageText;
}

var MessageTimeout;

function ShowMessageWindow(text, time)
{
	clearTimeout(MessageTimeout);
	
	if (time == null) time = 0;
	
	var CurrentMessage = document.getElementById('pagemessage');
	if (typeof text != 'string') text = '';
	
	if (CurrentMessage != null)
	{
		CurrentMessage.innerHTML = text;
		
		if (time > 0)
		{
			MessageTimeout = setTimeout(ShowMessageWindow, (time * 1000));
		}
	}
}

function ShowConfigWindow(display)
{
	var ConfigWindow = CreateOverlayWindow('Configuration', 'trapSelectorImage', display);
	if (ConfigWindow === false) ConfigWindow = CreatePopupWindow('Configuration', 275, 350, display);
	
	if (ConfigWindow != null)
	{
	  ConfigWindow.innerHTML = "<TABLE HEIGHT='100%'><TR><TD WIDTH='200'>Alerts</TD><TD STYLE='text-align: right; width: 100'><SPAN STYLE='font-size: 8px'>Snd&nbsp;&nbsp;&nbsp;Msg</SPAN></TD></TR><TR><TD WIDTH='200'>&nbsp;&nbsp;&nbsp;Horn Ready</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Hunter_Horn_Sound'><INPUT TYPE='Checkbox' ID='Hunter_Horn_Popup'></TD></TR><TR><TD WIDTH='200'>&nbsp;&nbsp;&nbsp;King's Reward</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Kings_Reward_Sound'><INPUT TYPE='Checkbox' ID='Kings_Reward_Popup'></TD></TR><TR><TD WIDTH='200'>&nbsp;&nbsp;&nbsp;Cheese Empty</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Out_of_Cheese_Sound'><INPUT TYPE='Checkbox' ID='Out_of_Cheese_Popup'></TD></TR><TR><TD WIDTH='200'>&nbsp;&nbsp;&nbsp;Washed Away</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Washed_Away_Sound'><INPUT TYPE='Checkbox' ID='Washed_Away_Popup'></TD></TR><TR><TD WIDTH='200'>&nbsp;&nbsp;&nbsp;Season Change / Tower Amp</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Season_Change_Sound'><INPUT TYPE='Checkbox' ID='Season_Change_Popup'></TD></TR><TR><TD WIDTH='200'>Direct Travel</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Direct_Travel'></TD></TR><TR><TD WIDTH='200'>Display Timers</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Display_Timers'></TD></TR><TR><TD WIDTH='200'>Timer in Title</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Timer_Title'></TD></TR><TR><TD WIDTH='200'>Show All Crafting Items</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Show_All_Craft'></TD></TR><TR><TD WIDTH='200'>Automatic Inventory Update</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Inventory_Update'></TD></TR><TR><TD WIDTH='200'>Change Button Style</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Checkbox' ID='Display_Button'></TD></TR><TR><TD WIDTH='200'>Update Timer Length</TD><TD STYLE='text-align: right; width: 100'><INPUT TYPE='Text' ID='Update_Length' SIZE='3'></TD></TR><TR HEIGHT='100%'><TD COLSPAN='2' style='vertical-align: bottom'>Version " + SCRIPT.version + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"#\" ajaxify=\"/ajax/pages/fan_status.php?fbpage_id=134975893200179&add=1&reload=1&preserve_tab=1&use_primer=1\" rel=\"async-post\">Like</a>&nbsp;&nbsp;&nbsp;&nbsp;<A HREF='#' ID='Reset_to_Default'>Defaults</A>&nbsp;&nbsp;&nbsp;&nbsp;<A HREF='" + SCRIPT.scripturl + "'>Update</A></TD></TR></TABLE>";

		document.getElementById('Hunter_Horn_Sound').checked = SETTINGS.horn & STATE_SOUND;
		document.getElementById('Hunter_Horn_Popup').checked = SETTINGS.horn & STATE_MESSAGE;
		document.getElementById('Kings_Reward_Sound').checked = SETTINGS.king & STATE_SOUND;
		document.getElementById('Kings_Reward_Popup').checked = SETTINGS.king & STATE_MESSAGE;
		document.getElementById('Out_of_Cheese_Sound').checked = SETTINGS.cheese & STATE_SOUND;
		document.getElementById('Out_of_Cheese_Popup').checked = SETTINGS.cheese & STATE_MESSAGE;
		document.getElementById('Washed_Away_Sound').checked = SETTINGS.washed & STATE_SOUND;
		document.getElementById('Washed_Away_Popup').checked = SETTINGS.washed & STATE_MESSAGE;
		document.getElementById('Season_Change_Sound').checked = SETTINGS.season & STATE_SOUND;
		document.getElementById('Season_Change_Popup').checked = SETTINGS.season & STATE_MESSAGE;
	  
		document.getElementById('Direct_Travel').checked = SETTINGS.direct;
		document.getElementById('Show_All_Craft').checked = SETTINGS.showall;
		document.getElementById('Display_Timers').checked = SETTINGS.timers;
		document.getElementById('Timer_Title').checked = SETTINGS.title;
		document.getElementById('Inventory_Update').checked = SETTINGS.auto;
		document.getElementById('Display_Button').checked = SETTINGS.buttons;
		document.getElementById('Update_Length').value = SETTINGS.length;

		document.getElementById('Hunter_Horn_Sound').addEventListener('click', function () { SETTINGS.horn = SETTINGS.horn ^ STATE_SOUND; SaveSettings(); }, true);
		document.getElementById('Hunter_Horn_Popup').addEventListener('click', function () { SETTINGS.horn = SETTINGS.horn ^ STATE_MESSAGE; SaveSettings(); }, true);
		document.getElementById('Kings_Reward_Sound').addEventListener('click', function () { SETTINGS.king = SETTINGS.king ^ STATE_SOUND; SaveSettings(); }, true);
		document.getElementById('Kings_Reward_Popup').addEventListener('click', function () { SETTINGS.king = SETTINGS.king ^ STATE_MESSAGE; SaveSettings(); }, true);
		document.getElementById('Out_of_Cheese_Sound').addEventListener('click', function () { SETTINGS.cheese = SETTINGS.cheese ^ STATE_SOUND; SaveSettings(); }, true);
		document.getElementById('Out_of_Cheese_Popup').addEventListener('click', function () { SETTINGS.cheese = SETTINGS.cheese ^ STATE_MESSAGE; SaveSettings(); }, true);
		document.getElementById('Washed_Away_Sound').addEventListener('click', function () { SETTINGS.washed = SETTINGS.washed ^ STATE_SOUND; SaveSettings(); }, true);
		document.getElementById('Washed_Away_Popup').addEventListener('click', function () { SETTINGS.washed = SETTINGS.washed ^ STATE_MESSAGE; SaveSettings(); }, true);
		document.getElementById('Season_Change_Sound').addEventListener('click', function () { SETTINGS.season = SETTINGS.season ^ STATE_SOUND; SaveSettings(); }, true);
		document.getElementById('Season_Change_Popup').addEventListener('click', function () { SETTINGS.season = SETTINGS.season ^ STATE_MESSAGE; SaveSettings(); }, true);

		document.getElementById('Direct_Travel').addEventListener('click', function () { SETTINGS.direct = !SETTINGS.direct; SaveSettings(); }, true);
		document.getElementById('Show_All_Craft').addEventListener('click', function () { SETTINGS.showall = !SETTINGS.showall; SaveSettings(); }, true);
		document.getElementById('Display_Timers').addEventListener('click', function () { SETTINGS.timers = !SETTINGS.timers; SaveSettings(); }, true);
		document.getElementById('Timer_Title').addEventListener('click', function () { SETTINGS.title = !SETTINGS.title; SaveSettings(); }, true);
		document.getElementById('Inventory_Update').addEventListener('click', function () { SETTINGS.auto = !SETTINGS.auto; SaveSettings(); }, true);
		document.getElementById('Display_Button').addEventListener('click', function () { SETTINGS.buttons = !SETTINGS.buttons; SaveSettings(); }, true);
		document.getElementById('Update_Length').addEventListener('change', function () { SETTINGS.length = parseInt(document.getElementById('Update_Length').value); SaveSettings(); }, true);
		
		document.getElementById('Reset_to_Default').addEventListener('click', function () { ResetSettings(); SaveSettings(); ShowConfigWindow(false); }, true);
	}
}

function DisplayState()
{
	var AllHUDs = getElementsByClass('headsup');
	var HUD = AllHUDs[0];
	var iCount = 1;

	if (HUD != null)
	{
		var HUDStatLists = getElementsByClass('hudstatlist');
		
		for (iCount = 1; iCount < HUDStatLists.length; iCount++)
		{
			var Embedded = document.createElement('li');
			Embedded.id = 'MHH_Display_' + (iCount + 1);
			
			HUDStatLists[iCount].firstChild.appendChild(Embedded);
		}
	}	
	
  if (document.getElementById('header') != null)
	{
		if (DSXC_getValue('Alert - Kings Reward', false))
		{
			ResetTimeout('Update - Kings Reward');
			DSXC_setValue('Alert - Kings Reward', false);
		}
		
		DSXC_setValue('Alert - Cheese', false);
		
		STATE.ready = true;
	}
	else
	{
		STATE.maintenance = true;
		STATE.ready = true;
	}
}

function DisplayTimers()
{
	if (!STATE.maintenance)
	{
		if (SETTINGS.timers)
		{
			SetDisplayText(2, '<span class="hudstatlabel">Reward:</span>&nbsp;&nbsp;<span id="MHH_Kings_Reward_Timer"></span>');

			var MHHornTimer = document.getElementById('huntTimer');
			MHHornTimer.style.display = 'none';
			
			var HornTimer = document.createElement('div');
			HornTimer.id = 'MHH_Display_1';
			HornTimer.className = 'hunttimer';
			HornTimer.innerHTML = '<span style="font-size: 12px"><B>Horn:</B></span>&nbsp;&nbsp;<span style="font-size: 12px" id="MHH_Horn_Timer"></span>';
			MHHornTimer.parentNode.appendChild(HornTimer);
		}
	}
}

function HeaderDetail(text, stylestart, styleend, link, linktext)
{
	var HeaderText = "<div class='uiHeader uiHeaderTopAndBottomBorder mbs uiSideHeader'><div class='clearfix uiHeaderTop'>";
	
	if (link != null) HeaderText = HeaderText + "<a href='" + link + "' class='uiHeaderActions rfloat'>" + linktext + "</a>";
	HeaderText = HeaderText + "<div>";
	if (stylestart != null) HeaderText = HeaderText + stylestart;
	HeaderText = HeaderText + text;
	if (styleend != null) HeaderText = HeaderText + styleend;
	HeaderText = HeaderText + "</div></div></div>"
	return HeaderText;
}

function DisplayDetail()
{
	var TopBanner = getElementById("hgBanner");
	
	if (TopBanner != null && !STATE.maintenance)
	{
		var sBackground = (SETTINGS.buttons ? " style='padding: 3px; background: url(" + IMAGE.background + ") no-repeat'" : "");
		
		var sConfigOpen = "<a href='#' id='Config_Open' class='config_open_btn'><img" + sBackground + " src='" + IMAGE.config + "' border=0 title='Configuration' /></a>";
		var sRefresh = "<a href='#' id='Refresh_Inventory' class='refresh_btn'><img" + sBackground + " src='" + IMAGE.refresh + "' border=0 title='Refresh Inventory' /></a>";
		var sTravelOpen = "<a href='#' id='Travel_Open' class='config_open_btn'><img" + sBackground + " src='" + IMAGE.travel + "' border=0 title='Travel' /></a>";
		var sCraftingOpen = "<a href='#' id='Crafting_Open' class='crafting_open_btn'><img" + sBackground + " src='" + IMAGE.craft + "' border=0 title='Crafting' /></a>";
		var sPotionsOpen = "<a href='#' id='Potions_Open' class='potion_open_btn'><img" + sBackground + " src='" + IMAGE.potion + "' border=0 title='Potions' /></a>";
		var sJournalOpen = "<a href='#' id='Journal_Open' class='journal_open_btn'><img" + sBackground + " src='" + IMAGE.journal + "' border=0 title='Journal' /></a>";
		
		var sMHHButtons = "<div style=\"float: left\"><table id='MHH_Buttons' style='width: 245px'>";
		sMHHButtons = sMHHButtons + "<tr height=\"25\"><th colspan=\"6\" style=\"text-align: center;\"><b><a target=\"_new\" href=\"http://www.facebook.com/pages/DSXCs-Mousehunt-Helper/134975893200179\">MouseHunt Helper</a></b></th></tr>";
		//sMHHButtons = sMHHButtons + "<tr><td style='width: 20%; text-align: center'>" + sCraftingOpen + "</td><td style='width: 20%; text-align: center'>" + sTravelOpen + "</td><td style='width: 20%; text-align: center'>" + sJournalOpen + "</td><td style='width: 20%; text-align: center'>" + sRefresh + "</td><td style='width: 20%; text-align: center'>" + sConfigOpen + "</td></tr>";
		sMHHButtons = sMHHButtons + "<tr><td style='width: 20%; text-align: center'>" + sCraftingOpen + "</td><td style='width: 20%; text-align: center'>" + sPotionsOpen + "</td><td style='width: 20%; text-align: center'>" + sTravelOpen + "</td><td style='width: 20%; text-align: center'>" + sJournalOpen + "</td><td style='width: 20%; text-align: center'>" + sRefresh + "</td><td style='width: 20%; text-align: center'>" + sConfigOpen + "</td></tr>";
		//sMHHButtons = sMHHButtons + "<tr><td style='font-size: 8px; width: 20%; text-align: center'>Craft</td><td style='font-size: 8px; width: 20%; text-align: center'>Travel</td><td style='font-size: 8px; width: 20%; text-align: center'>Journal</td><td style='font-size: 8px; width: 20%; text-align: center'>Refresh</td><td style='font-size: 8px; width: 20%; text-align: center'>Config</td></tr>";
		sMHHButtons = sMHHButtons + "<tr><td style='font-size: 8px; width: 20%; text-align: center'>Craft</td><td style='font-size: 8px; width: 20%; text-align: center'>Potion</td><td style='font-size: 8px; width: 20%; text-align: center'>Travel</td><td style='font-size: 8px; width: 20%; text-align: center'>Journal</td><td style='font-size: 8px; width: 20%; text-align: center'>Refresh</td><td style='font-size: 8px; width: 20%; text-align: center'>Config</td></tr>";
		sMHHButtons = sMHHButtons + "</table><p /></div>";
		
		var sMHHTimers = "<div style=\"float: right\"><table id='MHH_Buttons' style='width: 350px'>";
		sMHHTimers = sMHHTimers + "<tr height=\"25\"><th colspan=\"5\" style=\"text-align: center; font-size: 9px;\">";
		
		if (STATE.userobject.has_shield)
		{
			var expiry = new Date(STATE.userobject.shield_expiry);
			var now = new Date();
			
			var days = days_between(expiry, now);
			
			if (days > 0)
				sMHHTimers = sMHHTimers + "Lucky shield expires in " + days + " days";
			else
				sMHHTimers = sMHHTimers + "Lucky shield expires today!";
		}
		
		sMHHTimers = sMHHTimers + "</th></tr><tr>";
				
		var ColumnWidth = 100 / LOCATION_TIMERS.length;

		for (iCount1 = 0; iCount1 < LOCATION_TIMERS.length; iCount1++)
		{
			sMHHTimers = sMHHTimers + "<td style=\"font-size: 9px;\"><b>" + LOCATION_TIMERS[iCount1][0] + "</b><br>";
			sMHHTimers = sMHHTimers + "&nbsp;&nbsp;State: <span id='MHH_Location_" + iCount1 + "_State'></span><br>";
			sMHHTimers = sMHHTimers + "&nbsp;&nbsp;Changes: <span id='MHH_Location_" + iCount1 + "_Change'>the future</span></td>";
		}
		
		sMHHTimers = sMHHTimers + "</tr></table><p /></div>";
		
		TopBanner.innerHTML = sMHHButtons + sMHHTimers + "<div style=\"clear: both\"></div>";
		TopBanner.id = 'MHH_modified';
		
		if (document.getElementById('Crafting_Open') != null) document.getElementById('Crafting_Open').addEventListener("click", ShowCraftingWindow, false);
		if (document.getElementById('Potions_Open') != null) document.getElementById('Potions_Open').addEventListener("click", ShowPotionsWindow, false);
		if (document.getElementById('Travel_Open') != null) document.getElementById('Travel_Open').addEventListener("click", ShowTravelWindow, false);
		if (document.getElementById('Journal_Open') != null) document.getElementById('Journal_Open').addEventListener("click", ShowJournalWindow, false);
		if (document.getElementById('Refresh_Inventory') != null) document.getElementById('Refresh_Inventory').addEventListener("click", ForceRefresh, false);
		if (document.getElementById('Config_Open') != null) document.getElementById('Config_Open').addEventListener("click", ShowConfigWindow, false);
	}
}

function days_between(date1, date2)
{
	// The number of milliseconds in one day
	var ONE_DAY = 1000 * 60 * 60 * 24;
	
	// Convert both dates to milliseconds
	var date1_ms = date1.getTime();
	var date2_ms = date2.getTime();
	
	// Calculate the difference in milliseconds
	var difference_ms = Math.abs(date1_ms - date2_ms);
	
	// Convert back to days and return
	return Math.round(difference_ms / ONE_DAY);
}

function AlertSound(sound)
{
	var SoundAlert = document.createElement("div");
	SoundAlert.innerHTML = '<embed src="' + sound + '" height="50" width="200" hidden=true autostart="true" loop="false"></embed>';
	
	if (document.getElementById('hgAppContainer') != null)
		document.getElementById('hgAppContainer').appendChild(SoundAlert);
	else
		document.body.appendChild(SoundAlert);
}

function SoundHorn()
{
	var sound_now = false;
	var auto_horn_sound = true;
	var confirm_horn_sound = false;

	if (!DSXC_getValue('Alert - Sound', false))
	{
		DSXC_setValue('Alert - Sound', true);
		
		if (SETTINGS.confirm)
		{
			if (SETTINGS.horn & STATE_SOUND)
			{
				AlertSound(AUDIO.horn);
			}
				
			if (SETTINGS.horn & STATE_MESSAGE)
			{
				alert('The horn is ready to be sounded');
			}
		}
		else
		{
			timer_sound_in = (5 + (Math.floor(Math.random() * 10)));
			SetDisplayText(3, 'Horn in ' + timer_sound_in + ' seconds');
			
			setTimeout(SoundTheHorn, 1000);
		}
	}
}

function SoundTheHorn()
{
	// check if someone clicked without waiting
	if (STATE.hornstate == 1)
	{
		timer_sound_in--;
		SetDisplayText(3, 'Horn in ' + timer_sound_in + ' seconds');
		
		if (timer_sound_in <= 0)
		{
			var HornLink = document.getElementById('hornLink');
			
			if (HornLink == null)
			{
				var AllHorns = getElementsByClass('hornbutton');
				HornLink = AllHorns[0].childNodes[0];
			}
			
			if (HornLink != null)
			{
				SimulateEvent('click', HornLink);
			}
			else
			{
				window.location = STATE.baseurl + 'soundthehorn.php';
			}
		}
		else
		{
			setTimeout(SoundTheHorn, 1000);
		}
	}
	else
	{
		SetDisplayText(3, '');
	}
}

function SimulateEvent(event, item)
{
	// IE - why can't they do anything like the others?!?
	if (document.createEventObject)
	{
		var EventObject = document.createEventObject();
		return item.fireEvent('on' + event, EventObject)
	}
	else
	{
		var EventObject = document.createEvent("HTMLEvents");
		EventObject.initEvent(event, true, true);
		return !item.dispatchEvent(EventObject);
	}
}

function UpdateTimer(timeleft, inhours)
{
	var ReturnValue = "";
	
	var FirstPart;
	var SecondPart;
	var Size;
	
	if (timeleft > 0)
	{
		if (inhours != null && inhours == true)
		{
			FirstPart = Math.floor(timeleft / (60 * 60));
			SecondPart = Math.floor(timeleft / 60) % 60;
			Size = 'hrs';
		}
		else
		{
			FirstPart = Math.floor(timeleft / 60);
			SecondPart = timeleft % 60;
			Size = 'mins';
		}
		
		
		if (SecondPart < 10)
		{
			SecondPart = '0' + SecondPart;
		}
		
		ReturnValue = FirstPart + ':' + SecondPart + ' ' + Size;
	}
	else
	{
		ReturnValue = 'Soon...';
	}
	
	return ReturnValue;
}

function Get(url, callback)
{	
	// DO NOT OPEN OTHER PAGES DURING KINGS REWARD OR MAINTENANCE
	if (!STATE.king && !STATE.maintenance)
	{
		DSXC_log('Get - ' + url);
		
		try
		{
			DSXC_xmlHttpRequest({
				method: 'GET',
				url: url,
				onload: function(result) {
					if (result.status != 200)
					{
						throw("GET failed - " + url + " " + Flatten(result));
					}
					else
					{
						InitUserObject(result.responseText);
						DetermineHash();
						
						if (result.responseText.indexOf("Claim Your Reward!") != -1)
						{
							window.location = STATE.baseurl;
						}
						else
						{
							callback(result.responseText);
						}
					}
				}
			});
		}
		catch (ex)
		{
			DSXC_log(ex);
		}
	}
}

function Post(url, data, callback)
{
	// DO NOT OPEN OTHER PAGES DURING KINGS REWARD OR MAINTENANCE
	if (!STATE.king && !STATE.maintenance)
	{
		DSXC_log('Post - ' + url + ' - ' + data);
		
		try
		{
			if (!data)
				data = {}
				
			data.hg_is_ajax = 1;
			data.sn = 'Facebook';
			
			DSXC_xmlHttpRequest({
				method: 'POST',
				data: serialize(data).replace(" ", "+"),
				headers: { "Content-Type": "application/x-www-form-urlencoded" },
				url: url,
				onload: function(result) {
					if (result.status != 200)
					{
						throw("POST failed - " + url);
					}
					else
					{
						responseData = JSON.parse(result.responseText);
						STATE.userobject = responseData.user;
						
						if (document.getElementById('headerTop') != null) 
							document.getElementById('headerTop').style.backgroundImage = "url(\'" + STATE.userobject.location_header + "\')";
						
						DetermineHash();
						
						if (STATE.userobject.has_puzzle)
						{
							window.location = STATE.baseurl;
						}
						else
						{
							callback(responseData);
						}
					}
				}
			});
		}
		catch (ex)
		{
			DSXC_log(ex);
		}
	}
}

function CheckTimeout(timer, minutes, hours)
{
	var Today = new Date();
	
	var iReturnValue = 0;  
	var szLastCheck = DSXC_getValue(timer, 'never');
	
	if (minutes == null) minutes = 0;
	if (hours == null) hours = 0;
	
	var WaitLength = ((minutes * 60) + (hours * 60 * 60));
	
	if (szLastCheck != 'never')
	{
		var CurrentTime = Today.getTime();
		var PreviousTime = new Date(szLastCheck).getTime();
		
		var Interval = Math.floor((CurrentTime - PreviousTime) / 1000);
		
		if (Interval >= WaitLength)
		{
			iReturnValue = 0;
		}
		else
		{
			iReturnValue = (WaitLength - Interval);
		}
	}
	else
	{
		iReturnValue = 0;
	}
	
	return iReturnValue;
}

function ResetTimeout(timer)
{
	var Today = new Date();
	DSXC_setValue(timer, String(Today));
}

function UpdateScript()
{
	window.location = SCRIPT.scripturl;
}

function CheckForUpdate()
{
	var szPageText;
	var szOnlineVersion = 'none';
	var fCurrentVersion, fOnlineVersion, fLastVersion;
	
	// check for an update every 30 minutes
	if (CheckTimeout('Update - Script', 30) == 0)
	{
		ResetTimeout('Update - Script');
		
		var today = new Date();
		var current_time = today.getTime();	
		
		Get(SCRIPT.versionurl + '?' + current_time, function(text) {
			szPageText = text;
			
			szOnlineVersion = text.substring(text.indexOf('@version') + 13, text.indexOf('@version') + 17);
			
			fLastVersion = parseFloat(DSXC_getValue('Script - Last Revision', '0.0'));
			fOnlineVersion = parseFloat(szOnlineVersion);
			fCurrentVersion = parseFloat(SCRIPT.version);
	
			if (fOnlineVersion > fCurrentVersion && fOnlineVersion != fLastVersion)
			{
				DSXC_setValue('Script - Last Revision', szOnlineVersion);
				var szMessageText = 'DSXC\'s MouseHunt Helper (' + szOnlineVersion + ') is available!\n\n';
				
				var iStartPos = text.indexOf('@revision');
				var iEndPos;
				
				while (iStartPos != -1)
				{
					iEndPos = text.indexOf('//', iStartPos);
					szMessageText = szMessageText + text.substring(iStartPos + 10, iEndPos);
					
					iStartPos = text.indexOf('@revision', iEndPos);
				}
	
				szMessageText = szMessageText + '\nDo you want to upgrade now?';
				
				if (window.confirm(szMessageText))
				{
					UpdateScript();
				}
			}
		});
	}
}

function ResetInventory()
{
	var MaxItemID = DSXC_getValue('Inventory - Max ID', -1);
	
	for (iCount1 = 0; iCount1 < MaxItemID; iCount1++)
	{
		var InventoryDetail = DSXC_getValue('Inventory Item - ' + iCount1, 'INVALID');
		
		if (InventoryDetail != 'INVALID')
		{
			var InvValues = InventoryDetail.split(',');
			DSXC_setValue('Inventory Item - ' + iCount1, InvValues[0] + ',' + InvValues[1] + ',' + InvValues[2] + ',0');
		}
	}
}

var CurrentTab;
var LastTab;

function ForceRefresh()
{
	CheckInventory(0);
}

function CheckInventory(when)
{
	if (when == 0 || SETTINGS.auto)
	{
		if (CheckTimeout('Update - Inventory', when) == 0)
		{
			ResetTimeout('Update - Inventory');
			ResetInventory();
	
			ShowMessageWindow('<div class="pagemessage s"><div class="messagetop"></div><div class="messagebody"><div class="messagetitle">Updating Inventory</div><div class="messagecontent">This window will disappear once the update has occurred.</div></div><div class="messagebottom"></div></div></div>');
	
			CurrentTab = -1;
			LastTab = 6;
			
			Get(STATE.baseurl + 'travel.php', UpdateInventory);
		}
	}
}

function UpdateInventoryQuantity(item_id, quantity)
{
	INVENTORY[item_id][INVQTY] = Number(quantity);
	DSXC_setValue('Inventory Item - ' + item_id, INVENTORY[item_id][INVTYPE] + ',' + INVENTORY[item_id][INVNAME] + ',' + INVENTORY[item_id][INVDETAIL] + ',' + INVENTORY[item_id][INVQTY]);
}

function UpdateCraftingQuantity(item_id, quantity)
{
	CRAFTING[item_id][CRAFTQTY] = Number(quantity);
	DSXC_setValue('Crafting Item - ' + item_id, CRAFTING[item_id][CRAFTNAME] + ',' + CRAFTING[item_id][CRAFTDETAIL] + ',' + CRAFTING[item_id][CRAFTQTY]);
}

function UpdateInventory(text)
{
	if (text.indexOf('inventoryItemView1.populate([]);') == -1)
	{
		var StartPos = text.indexOf('inventoryItemView1.populate');
		var EndPos = 0;
		
		if (StartPos != -1)
		{
			var MaxItemID = -1;
			
			DSXC_log('Update Inventory');
			
			StartPos = text.indexOf('{', StartPos);
			EndPos = text.indexOf(');', StartPos);
			
			var ExtractedData = text.substring(StartPos, EndPos); //.replace(/\\\\\"/g, '');
			var ItemText = "var ItemArray = " + ExtractedData + ";"; //ExtractedData.replace(/\\/g, '') + ";";
			eval(ItemText);
			
			var LocationDetail = '';
	
		  for (var ItemName in ItemArray) 
		  {
		    if (ItemArray.hasOwnProperty(ItemName)) 
		    {
		    	var ItemDetail = ItemArray[ItemName];
	      
		      if (null === ItemDetail || undefined === ItemDetail) 
		      {
		        continue;
		      } 
		      else
		      {
						switch (ItemDetail.classification)
						{
							case INVENTORY_TYPES_TEXT[INV_TYPE_POTION]:
							{
								var PotionDetails = ItemDetail.produced_item.name;
								
								if (ItemDetail.is_enabled)
								{
									for (iCount = 0; iCount < ItemDetail.recipe_list.length; iCount++)
									{
										PotionDetails = PotionDetails + "#" + ItemDetail.recipe_list[iCount].item.name + "_" + ItemDetail.recipe_list[iCount].yield + "_" + ItemDetail.recipe_list[iCount].cost;
									}
								}
								else
								{
									PotionDetails = 'disabled';
								}
			
								DSXC_setValue('Inventory Item - ' + ItemDetail.item_id, ItemDetail.classification + ',' + ItemDetail.name + ',' + ItemDetail.type + ',' + ItemDetail.quantity + ',' + PotionDetails);
							} break;
							
							case INVENTORY_TYPES_TEXT[INV_TYPE_BASE]:
							case INVENTORY_TYPES_TEXT[INV_TYPE_WEAPON]:
							{
								DSXC_setValue('Inventory Item - ' + ItemDetail.item_id, ItemDetail.classification + ',' + ItemDetail.name + ',' + ItemDetail.type + ',' + ItemDetail.quantity + ',' + ItemDetail.power_type_name + '_' + ItemDetail.power + '_' + ItemDetail.power_bonus + '_' + ItemDetail.attraction_bonus + '_' + ItemDetail.luck + '_' + ItemDetail.cheese_effect);
							} break;
			
							default:
							{
								DSXC_setValue('Inventory Item - ' + ItemDetail.item_id, ItemDetail.classification + ',' + ItemDetail.name + ',' + ItemDetail.type + ',' + ItemDetail.quantity);
							}
						}
						
						if (parseInt(ItemDetail.item_id) > MaxItemID)
						{
							MaxItemID = parseInt(ItemDetail.item_id);
						}
		      }
		    }
		  }
			
			if (MaxItemID > DSXC_getValue('Inventory - Max ID', -1))
			{
				DSXC_setValue('Inventory - Max ID', MaxItemID);
			}
		  
		  LoadInventory();
		}
	}
	
	var ItemText = "";
	var StartPos = text.indexOf('CraftingInstance.init');
	var EndPos = 0;
	
	if (StartPos != -1)
	{
		var MaxItemID = -1;
		
		DSXC_log('Update Crafting Items');
		
		StartPos = text.indexOf('[', StartPos);
		EndPos = text.indexOf('], ', StartPos);

		var ExtractedData = text.substring(StartPos, EndPos); //.replace(/\\\\\\\"/g, '');
		ItemText = "var ItemArray = " + ExtractedData + "];"; //.replace(/\\/g, '') + "];";
		
		eval(ItemText);
		
		for (id = 0; id < ItemArray.length; id++)
		{
			DSXC_setValue('Crafting Item - ' + id, ItemArray[id].name + ',' + ItemArray[id].type + ',' + ItemArray[id].quantity);
			
			if (id > MaxItemID)
			{
				MaxItemID = id;
			}
		}
		
		if (MaxItemID > DSXC_getValue('Crafting - Max ID', -1))
		{
			DSXC_setValue('Crafting - Max ID', MaxItemID);
		}
		
		LoadCrafting();
	}		
	
	if (CurrentTab < LastTab)
	{
		CurrentTab++;
		Get(STATE.baseurl + 'inventory.php?tab=' + CurrentTab, UpdateInventory);
	}
	else
	{
		ShowMessageWindow('');
	}
}

Array.prototype.indexOf = function(test)
{
	var ReturnValue = -1;
	
	for (iCount = 0; iCount < this.length && ReturnValue == -1; iCount++)
	{
		if (this[iCount] == test)
		{
			ReturnValue = iCount;
		}
	}
	
	return ReturnValue;
}

Array.prototype.has = function(test)
{
	var ReturnValue = false;
	
	for (iCount = 0; iCount < this.length && !ReturnValue; iCount++)
	{
		if (this[iCount] == test)
		{
			ReturnValue = true;
		}
	}
	
	return ReturnValue;
}

function Flatten(obj)
{
  var flat = "{ ";
  
  for (var key in obj) 
  {
  	if (flat != "{ ") flat = flat + ", ";
  	
    if (obj.hasOwnProperty(key)) 
    {
      var value = obj[key];
      
      if (null === value || undefined === value) 
      {
        continue;
      } 
      else
      {
      	if (typeof value == "object")
      	{
        	flat = flat + key + ": " + Flatten(value);
      	}
      	else
      	{
        	flat = flat + key + ": " + value;
        }
      } 
    }
  }
  
  return flat + " }";
}

function Craft()
{
	var crafting_item = this.id.substring(8);
	
	if (crafting_item != -1)
	{
		var total_to_craft = document.getElementById('Craft_Qty').innerHTML;
		ShowCraftingWindow(false);
		
		CraftItem(crafting_item, total_to_craft);
	}
}

function CraftItem(pattern, qty)
{
	params = { "parts": PATTERNS[pattern][PINGREDIENTS], "uh": STATE.hash, "craftQty": qty };
	Post(STATE.baseurl + "managers/ajax/users/crafting.php", params, function(response) 
	{ 
		ShowCraftingMessage(response);
		
		if (response.success == 1)
		{
			for (var detail in response.inventory)
			{
				var mat_id = CraftingLookup(response.inventory[detail].type);
				UpdateCraftingQuantity(mat_id, response.inventory[detail].quantity);
			}
		}
	});
}

function TravelTo(destination)
{
	if (destination == 0)
	{
		Get(STATE.baseurl + 'travel.php?freeTravel=true?&uh=' + STATE.hash, function() { STATE.location = 0; });
	}
	else
	{
		if (STATE.location == -1)
			STATE.location = 0;

		params = { "origin": LOCATION.detail[STATE.location][LLINK], "destination": LOCATION.detail[destination][LLINK], "uh": STATE.hash };
		Post(STATE.baseurl + "managers/ajax/users/changeenvironment.php", params, function() { STATE.location = destination; });
	}
}

function Travel()
{
	var destintation_location = this.className.substring(4);

	if (this.className.indexOf('Buy_') != -1)
	{
		STATE.redirect = 'generalstore.php';
	}
	
	if (destintation_location != -1)
	{
		CalculateRouteCosts();
		
		ShowCraftingWindow(false);
		ShowTravelWindow(false);
		
		if (destintation_location != STATE.location)
		{
			if (STATE.location != -1 && LOCATION.detail[STATE.location][LWARNING])
			{
				var continue_travel = confirm("WARNING: You are in a special location, are you sure you want to leave?");
				
				if (continue_travel == false)
					return;
			}
			
			if (STATE.location != -1 && !SETTINGS.direct)
			{
				STATE.route = CalculateRoute(STATE.location, destintation_location);
			}
			else
			{
				STATE.route = [ destintation_location ];
			}
				
			SetDisplayText(3, 'Travelling');
			
			TravelTo(STATE.route[0]);
			setTimeout(AutoTravel, 1000);
		}
	}
}

var auto_count = 0;
	
function AutoTravel()
{
	if (auto_count >= 5)
	{
		auto_count = 0;
		SetDisplayText(3, 'Travelling');
	}
	else
	{
		auto_count++;
		SetDisplayText(3, GetDisplayText(3) + '.');
	}
	
	DetermineLocation();
	
	if (STATE.location == STATE.route[0])
	{
		STATE.route.shift();
		
		if (STATE.route.length == 0)
		{
			SetDisplayText(3, '');
			ShowMessageWindow('<div class="pagemessage s"><div class="messagetop"></div><div class="messagebody"><div class="messagetitle">Travel</div><div class="messagecontent">You have arrived at your destination.</div></div><div class="messagebottom"></div></div></div>', 5);
			
			return;
		}
		else
		{
			TravelTo(STATE.route[0]);
		}
	}
	
	setTimeout(AutoTravel, 1000);
}

function SortCraftingArray(a, b)
{
	var x = a[CRAFTNAME];
	var y = b[CRAFTNAME];
	
	return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}

function ShowCraftingWindow(display)
{
	var CraftingWindow = CreatePopupWindow('Crafting', 325, 420, display);
	
	if (CraftingWindow != null)
	{
		var WindowTable = "<TABLE CELLSPACING='0' CELLPADDING='1'>";
		var MaxToCraft = 0;
		
		var pattern_is_craftable = new Array();
		var travel_craftable = new Array();
		
		for (count1 = 0; count1 < PATTERNS.length; count1++)
		{
			var can_craft = true;
			var missing_item = -1;
			
			var total_to_craft = 10000000; // 10 million
			var total_mats = 0;
			
			var ingredients = PATTERNS[count1][PINGREDIENTS];
			
			DSXC_log("Cratable State: " + PATTERNS[count1][PNAME]);
			
			for (var key in ingredients)
			{
				if (ingredients.hasOwnProperty(key)) 
				{
					var mat_name = key;
					var mat_id = CraftingLookup(mat_name);
					var mat_qty = Number(ingredients[key]);
					
					total_mats++;
					
					if (mat_id != -1)
					{
						var current_qty = Number(CRAFTING[mat_id][CRAFTQTY]);
		
						if (current_qty < mat_qty)
						{
							DSXC_log(" - low quantity of " + mat_name + " (" + CRAFTING[mat_id][CRAFTQTY] + ")");
							
							total_to_craft = 0;
							can_craft = false;
						}
						else
						{
							mat_to_craft = Math.floor(current_qty / mat_qty);
							total_to_craft = Math.min(mat_to_craft, total_to_craft);
							
							DSXC_log(" - enough of " + mat_name + " (" + mat_to_craft + ")");
						}
					}
					else
					{
						DSXC_log(" - unknown material " + mat_name);
							
						total_to_craft = 0;
						can_craft = false;
					}
				}
			}
			
			if (can_craft || SETTINGS.showall)
			{
				MaxToCraft = Math.max(MaxToCraft, total_to_craft);
				
				if ((STATE.level + 1) >= total_mats)
				{
					pattern_is_craftable.push( [ count1, total_to_craft ] );
				}
			}
		}
		
		if (pattern_is_craftable.length > 0)
		{
			var PatternTable = "<TR><TH COLSPAN='2'><I>Craftable</I><br /><br /></TH></TR>";
			PatternTable += "<TR><TD><DIV ID='Craft_Scroll'></DIV><br /></TD><TD STYLE='text-align: right;'><SPAN ID='Craft_Qty'>1</SPAN><br /></TD></TH></TR>";

			for (count1 = 0; count1 < pattern_is_craftable.length; count1++)
			{
				if (pattern_is_craftable[count1][1] == 0)
				{
					PatternTable += "<TR STYLE='font-size: 8px'><TD WIDTH='240'><A HREF='#' ID='Pattern_" + pattern_is_craftable[count1][0] + "' STYLE='color: red'>" + PATTERNS[pattern_is_craftable[count1][0]][PNAME] + "</A></TD><TD STYLE='text-align: right; font-size: 7px; font-weight: bold' WIDTH='50'>" + pattern_is_craftable[count1][1] + "</TD></TR>";
				}
				else
				{
					PatternTable += "<TR STYLE='font-size: 8px'><TD WIDTH='240'><A HREF='#' ID='Pattern_" + pattern_is_craftable[count1][0] + "'>" + PATTERNS[pattern_is_craftable[count1][0]][PNAME] + "</A></TD><TD STYLE='text-align: right; font-size: 7px; font-weight: bold' WIDTH='50'>" + pattern_is_craftable[count1][1] + "</TD></TR>";
				}
			}			
		
			WindowTable += PatternTable;
			WindowTable += "<TR><TD><BR></TD></TR>";
		}

		var IngredientsTable = "<TR><TH COLSPAN='2'><I>Ingredients</I></TH></TR>";
		total_ingredients = 0;
		
		var SortedArray = CRAFTING.slice(0, CRAFTING.length);
		SortedArray.sort(SortCraftingArray);
		
		for (count1 = 0; count1 < SortedArray.length; count1++)
		{
			if (SortedArray[count1][CRAFTQTY] > 0 || SETTINGS.showall)
			{
				total_ingredients++;
				IngredientsTable += "<TR STYLE='font-size: 8px;'><TD WIDTH='190'><A HREF=\"" + STATE.baseurl + "canvas/item.php?item_type=" + SortedArray[count1][CRAFTDETAIL] + "\">" + SortedArray[count1][CRAFTNAME] + "</A></TD><TD STYLE='text-align: right; font-size: 7px; font-weight: bold' WIDTH='50'><SPAN ID='Crafting_Qty_" + SortedArray[count1][CRAFTID] + "'>" + SortedArray[count1][CRAFTQTY] + "</SPAN></TD></TR>";
			}
		}

		if (total_ingredients > 0)
		{
			WindowTable += IngredientsTable;
		}
		
		WindowTable += "</TABLE>";	
		
		CraftingWindow.innerHTML = WindowTable;

		if (document.getElementById('Craft_Scroll') != null)
		{
			CreateSlider('Craft_Scroll', 250, 1, Math.min(MaxToCraft, 100), 'Craft_Qty');
		}

		for (count1 = 0; count1 < pattern_is_craftable.length; count1++)
		{
			var Pattern = document.getElementById('Pattern_' + pattern_is_craftable[count1][0]);
			
			if (Pattern != null)
			{
				Pattern.addEventListener("click", Craft, false);
				Pattern.addEventListener("mouseover", ShowIngredients, false);
				Pattern.addEventListener("mouseout", HideIngredients, false);
			}
		}
	}
	else
	{
		var RecipeWindows = getElementsByPartialId('PatternWindow_');
		
		for (count1 = 0; count1 < RecipeWindows.length; count1++)
		{
			RecipeWindows[count1].parentNode.removeChild(RecipeWindows[count1]);
		}
	}
}

function ShowIngredients()
{
	var pattern_id = -1;
	
	if (this.id.indexOf('Pattern') != -1)
	{
		pattern_id = this.id.substring(8);		
	}
	else if (this.id.indexOf('Cft') != -1)
	{
		pattern_id = this.id.substring(4);		
	}
	
	if (pattern_id != -1)
	{
		if (document.getElementById('PatternWindow_' + pattern_id) == null)
		{
			var PopupWindow = document.createElement("div");
			
			PopupWindow.style.position = 'absolute';
			PopupWindow.style.top = (mousePos.y + 18) + "px";
			PopupWindow.style.left = (mousePos.x) + "px";
			
			PopupWindow.id = "PatternWindow_" + pattern_id;
			
			var pattern_detail = "<B>" + PATTERNS[pattern_id][PNAME] + "</B><BR><TABLE><TR><TH WIDTH=\"180\">Ingredient</TH><TH WIDTH=\"35\" STYLE='text-align: center;'>Needs</TH><TH WIDTH=\"35\" STYLE='text-align: center;'>Stock</TH></TR>";
			var total_mats = 0;
			var ingredients = PATTERNS[pattern_id][PINGREDIENTS];
			
			for (var key in ingredients)
			{
				if (ingredients.hasOwnProperty(key)) 
				{
					total_mats++;

					var mat_name = key;
					var mat_id = CraftingLookup(mat_name);
					var mat_qty = Number(ingredients[key]);
					
					if (mat_id != -1)
					{
						var current_qty = Number(CRAFTING[mat_id][CRAFTQTY]);
						
						if (current_qty < mat_qty)
						{
							pattern_detail = pattern_detail + "<TR><TD STYLE='font: 6pt Verdana; color: red'>" + CRAFTING[mat_id][CRAFTNAME] + "</TD><TD STYLE='font: 6pt Verdana; text-align: center;'>" + mat_qty + "</TD><TD STYLE='font: 6pt Verdana; text-align: center;'>" + current_qty + "</TD></TR>";
						}
						else
						{
							pattern_detail = pattern_detail + "<TR><TD STYLE='font: 6pt Verdana; color: black'>" + CRAFTING[mat_id][CRAFTNAME] + "</TD><TD STYLE='font: 6pt Verdana; text-align: center;'>" + mat_qty + "</TD><TD STYLE='font: 6pt Verdana; text-align: center;'>" + current_qty + "</TD></TR>";
						}
					}
					else
					{
						pattern_detail = pattern_detail + "<TR><TD STYLE='font: 6pt Verdana; color: red'>" + mat_name + "</TD><TD STYLE='font: 6pt Verdana; text-align: center;'>" + mat_qty + "</TD><TD STYLE='font: 6pt Verdana; text-align: center;'>0</TD></TR>";
					}
				}
			}
			
			pattern_detail = pattern_detail + "</TABLE>";
			
			var height = 30 + (total_mats * 10);
			var width = 250;
			
			PopupWindow.innerHTML = "<DIV STYLE='position:absolute; z-index:100; background: white; padding: 0px 0px; color: black; border: 1px solid; font: 6pt Verdana; width: " + width + "px; height: " + height + "px;'><DIV STYLE='padding: 5px 5px; text-align: left; overflow: auto; height: 100%; font: 6pt Verdana;'>" + pattern_detail + "</DIV></DIV>";
			
			document.body.appendChild(PopupWindow);
		}
	}
}

function HideIngredients()
{
	var pattern_id = -1;
	
	if (this.id.indexOf('Pattern') != -1)
	{
		pattern_id = this.id.substring(8);		
	}
	else if (this.id.indexOf('Cft') != -1)
	{
		pattern_id = this.id.substring(4);		
	}
	
	if (pattern_id != -1)
	{
		if (document.getElementById('PatternWindow_' + pattern_id) != null)
		{
			document.getElementById('PatternWindow_' + pattern_id).parentNode.removeChild(document.getElementById('PatternWindow_' + pattern_id));
		}
	}
}

function CraftingLookup(name)
{
	var ReturnValue = -1;

	for (counter = 0; counter < CRAFTING.length && ReturnValue == -1; counter++)
	{
		if (CRAFTING[counter][CRAFTDETAIL] == name)
		{
			ReturnValue = counter
		}
	}
	
	return ReturnValue;
}

function InventoryLookup(name, detail)
{
	var ReturnValue = -1;
	
	for (counter = 0; counter < INVENTORY.length && ReturnValue == -1; counter++)
	{
		if (INVENTORY[counter][INVNAME] == name || INVENTORY[counter][INVDETAIL] == detail)
		{
			ReturnValue = counter;
		}
	}
	
	return ReturnValue;
}

function ShowPotionsWindow(display)
{
	var PotionsWindow = CreateOverlayWindow('Potions', 'trapSelectorImage', display);
	if (PotionsWindow === false) PotionsWindow = CreatePopupWindow('Potions', 250, 320, display);
	
	if (PotionsWindow != null)
	{
		var PotionsAvailable = new Array();
		
		var WindowTable = "<TABLE CELLSPACING='0' CELLPADDING='1'>";
		var MaxToCraft = 0;
	
		var PotionsTable = "<TR><TH COLSPAN='2'><I>Potions</I></TH></TR><TR><TD><DIV ID='Potion_Scroll'></DIV></TD><TD STYLE='text-align: right;'><SPAN ID='Potion_Qty'>1</SPAN></TD></TH></TR>";
		var TotalPotions = 0;
		
		for (count1 = 0; count1 < INVENTORY.length; count1++)
		{
			if (INVENTORY[count1][INVQTY] > 0 && INVENTORY[count1][INVTYPE] == INVENTORY_TYPES_TEXT[INV_TYPE_POTION])
			{
				MaxToCraft = Math.max(INVENTORY[count1][INVQTY], MaxToCraft);
				
				PotionsTable += "<TR STYLE='font-size: 8px'><TD WIDTH='190'>" + INVENTORY[count1][INVNAME] + "</TD><TD STYLE='text-align: right; font-size: 7px; font-weight: bold' WIDTH='50'>" + INVENTORY[count1][INVQTY] + "</TD></TR>";
				PotionsTable += "<TR><TD STYLE='font-size: 7px; font-weight: bold;'>&nbsp;";

				var PotionDetail = INVENTORY[count1][INVEXTRA];
				
				if (PotionDetail == "disabled")
				{
						PotionsTable += "&nbsp;&nbsp;&nbsp;&nbsp;Not yet available";
				}
				else
				{
					var PotionsArray = PotionDetail.split('#');
					
					for (count2 = 1; count2 < PotionsArray.length; count2++)
					{
						var ConvertDetail = PotionsArray[count2].split('_');
						PotionsTable += "&nbsp;&nbsp;&nbsp;&nbsp;<A HREF='#' ID='Potion_" + count1 + "_" + (count2 - 1) + "' CLASS='" + ConvertDetail[0] + "_" + INVENTORY[count1][INVNAME] + "'>" + ConvertDetail[1] + "x" + ConvertDetail[0] + "</A>";
						
						PotionsAvailable.push( [ count1, (count2 - 1) ] );
					}
				}
				
				PotionsTable += "</TD><TD ID='Potion_Cost_" + count1 +"' STYLE='text-align: right; font-size: 7px; font-weight: bold' WIDTH='50'></TD></TR>";
				
				TotalPotions++;
			}
		}
		
		if (TotalPotions > 0)
		{
			WindowTable += PotionsTable;
			WindowTable += "<TR><TD><BR></TD></TR>";
		}
	
		WindowTable += "</TABLE>";	
		PotionsWindow.innerHTML = WindowTable;
	
		if (document.getElementById('Potion_Scroll') != null)
		{
			CreateSlider('Potion_Scroll', 200, 1, Math.min(MaxToCraft, 50), 'Potion_Qty');
		}
	
		for (count1 = 0; count1 < PotionsAvailable.length; count1++)
		{
			var PotionLink = document.getElementById('Potion_' + PotionsAvailable[count1][0] + '_' + PotionsAvailable[count1][1]);
			
			if (PotionLink != null)
			{
				PotionLink.addEventListener("mouseover", UpdatePotionCost, false);
				PotionLink.addEventListener("mouseout", UpdatePotionCost, false);
				PotionLink.addEventListener("click", CraftPotion, false);
			}
		}
	}
}

function UpdatePotionCost(ev)
{
	var PotionType = Number(this.id.substring(7, this.id.indexOf('_', 7)));
	var CheeseType = Number(this.id.substring(this.id.indexOf('_', 7) + 1));
	
	if (ev.type == 'mouseover')
	{
		var PotionDetail = INVENTORY[PotionType][INVEXTRA];
		
		if (PotionDetail != "disabled")
		{
			var PotionsArray = PotionDetail.split('#');
			var ConvertDetail = PotionsArray[(CheeseType + 1)].split('_');
			
			var ConvPrice = Number(ConvertDetail[2]);
			var TotalCheese = Number(ConvertDetail[1]) * Number(document.getElementById('Potion_Qty').innerHTML);
	
			if (ConvPrice > 0)
			{
				document.getElementById('Potion_Cost_' + PotionType).innerHTML = (TotalCheese * ConvPrice) + 'g';
			}
			else
			{
				document.getElementById('Potion_Cost_' + PotionType).innerHTML = TotalCheese + ' pieces';
			}
		}
	}
	else if (ev.type == 'mouseout')
	{
		document.getElementById('Potion_Cost_' + PotionType).innerHTML = '';
	}
}

function CraftPotion()
{
	var PotionType = this.id.substring(7, this.id.indexOf('_', 7));
	var CheeseType = this.id.substring(this.id.indexOf('_', 7) + 1);
	
	if (INVENTORY[PotionType][INVTYPE] == INVENTORY_TYPES_TEXT[INV_TYPE_POTION])
	{
		var TotalToCraft = document.getElementById('Potion_Qty').innerHTML;
		ShowPotionsWindow(false);

		UsePotion(INVENTORY[PotionType][INVDETAIL], CheeseType, TotalToCraft);
	}
}

function UsePotion(potion, cheese, qty)
{
	params = { "tab": 3, "potion": potion, "uh": STATE.hash, "num_potions": qty, "recipe_index": cheese };	
	Post(STATE.baseurl + "managers/ajax/users/usepotion.php", params, function(response) 
	{ 
		ShowCraftingMessage(response);
		
		if (response.success == 1)
		{
			var detail = response.inventory;
			
			for (var item in detail)
			{
				UpdateInventoryQuantity(response.inventory[item].item_id, response.inventory[item].quantity);
			}
		}
	});
}

function ShowCraftingMessage(response)
{
		if (response.success == 1)
		{
			ShowMessageWindow('<div class="pagemessage msgsuccess"><div class="messagetop"></div><div class="messagebody"><div class="messagetitle">' + response.jsDialog.tokens.title.value + '</div><div class="messagecontent">' + response.jsDialog.tokens.content.value + '</div></div><div class="messagebottom"></div></div></div>', 5);
		}
		else
		{
			ShowMessageWindow('<div class="pagemessage msgerror"><div class="messagetop"></div><div class="messagebody"><div class="messagetitle">' + response.jsDialog.tokens.title.value + '</div><div class="messagecontent">' + response.jsDialog.tokens.content.value + '</div></div><div class="messagebottom"></div></div></div>');
		}
}

function ResetWindows()
{
	DSXC_setValue("Position - Configuration", "90px_300px");
	DSXC_setValue("Position - Crafting", "90px_300px");
	DSXC_setValue("Position - Potions", "90px_300px");
	DSXC_setValue("Position - Travel", "90px_300px");
}

function CheckMap(mapdetail)
{
	var MapAvailable = false;
	
	if (mapdetail instanceof Array)
	{
		for (var count = 0; count < mapdetail.length && !MapAvailable; count++)
		{
			MapAvailable = CheckMap(mapdetail[count]);
		}
	}
	else
	{
		if (mapdetail != -1 && INVENTORY[mapdetail] != null && INVENTORY[mapdetail][INVQTY] > 0)
		{
			MapAvailable = true;
		}
	}
	
	return MapAvailable;
}

function ShowTravelWindow(display)
{
	var TravelWindow = CreateOverlayWindow('Travel', 'trapSelectorImage', display);
	if (TravelWindow === false) TravelWindow = CreatePopupWindow('Travel', 250, 320, display);
	
	if (TravelWindow != null)
	{
		CalculateRouteCosts();
		
		var newHTML = "<TABLE>";
		var region_name = "None";
		var total_found;
		
		for (count1 = 0; count1 < LOCATION.region.length; count1++)
		{
			newHTML = newHTML + "<TR><TH COLSPAN='2'><I>" + LOCATION.region[count1] + "</I></TH></TR>";
			total_found = 0;
		
			for (count2 = 0; count2 < LOCATION.detail.length; count2++)
			{
				if (LOCATION.detail[count2][LZONE] == count1 && count2 != STATE.location && LOCATION.detail[count2][LLVL] <= STATE.level && CheckMap(LOCATION.detail[count2][LMAP]))
				{
					var travel_cost = 0;
					
					if (STATE.location == -1)
					{
						// force travel via Meadow
						travel_cost = LOCATION.costs[0][count2];
					}
					else if (SETTINGS.direct)
					{
						travel_cost = LOCATION.costs[STATE.location][count2];
					}
					else
					{
						travel_cost = LOCATION.distance[STATE.location][count2];
					}
					
					if (LOCATION.distance[STATE.location][count2] != -99)
					{
						newHTML = newHTML + "<TR STYLE='font-size: 8px'><TD WIDTH='170'><A HREF='#' ID='Loc_" + count2 + "' CLASS='Loc_" + count2 + "'>" + LOCATION.detail[count2][LNAME] + "</A></TD><TD STYLE='text-align: right; font-size: 7px; font-weight: bold' WIDTH='70'>" + travel_cost + " gold</TD></TR>";
						total_found++;
					}
				}
			}
			
			if (total_found == 0)
			{
				newHTML = newHTML + "<TR><TD COLSPAN='2'>Not available<P></TD></TR>";
			}
			else
			{
				newHTML = newHTML + "<TR><TD><BR></TD></TR>";
			}
		}
			
		newHTML = newHTML + "</TABLE>";	
		
		TravelWindow.innerHTML = newHTML;
		
		for (count1 = 0; count1 < LOCATION.detail.length; count1++)
		{
			if (document.getElementById('Loc_' + count1) != null) document.getElementById('Loc_' + count1).addEventListener("click", Travel, false);
		}
	}
}

function CheckHornState()
{
	var HornState = getElementsByPartialClass("hornready");
	
	if (HornState.length > 0)
	{
		if (STATE.hornstate != 1)
		{
			if (SETTINGS.title)
			{
				document.title = 'Now! | ' + STATE.title;
			}
			else
			{
				document.title = STATE.title;
			}
			
			document.getElementById('MHH_Horn_Timer').innerHTML = '<B>Now!</B>';
			SoundHorn();
			
			STATE.hornstate = 1;
		}
	}
	else
	{
		if (DSXC_getValue('Alert - Sound', false))
		{
			DSXC_setValue('Alert - Sound', false);
			SetDisplayText(3, '');
		}
		
		HornState = getElementsByPartialClass("hornsounding");

		if (HornState.length > 0)
		{
			if (STATE.hornstate != 2)
			{
				setTimeout(RefreshUserObject, 10000); // refresh the user object after 10 seconds
				STATE.hornstate = 2;
			}
		}
		else
		{
			if (STATE.hornstate != 0)
			{
				SetDisplayText(3, '');
				STATE.hornstate = 0;
			}
		}
	}
	
	setTimeout(CheckHornState, 500);
}

function GetTimeout()
{
	return new Date().valueOf(); // milliseconds since 1 Jan 1970
}

function KingsRewardTimer()
{
	var TimeLeft = CheckTimeout('Update - Kings Reward', 0, 3);
	var KRTimerString = UpdateTimer(TimeLeft, true);
	
	var KRTimer = document.getElementById('MHH_Kings_Reward_Timer');
	if (KRTimer != null) KRTimer.innerHTML = KRTimerString;
	
	if (TimeLeft > 0)
	{
		setTimeout(KingsRewardTimer, 10000);
	}
}

function InventoryTimer()
{
	CheckInventory(5);
	CheckForUpdate();
	
	setTimeout(InventoryTimer, 30000);
}

function CurrentTimeStamp()
{
	return parseInt(new Date().getTime().toString().substring(0, 10));	
}

function HornCountdownTimer()
{
	var Start = GetTimeout();
	
	if (STATE.hornstate == 0)
	{
		if (STATE.userobject != null)
		{
			if (STATE.userobject.has_puzzle)
			{
				STATE.king = true;
				DSXC_setValue('Alert - Sound', false);
				
				if (!DSXC_getValue('Alert - Kings Reward', false))
				{
					DSXC_setValue('Alert - Kings Reward', true);
					
					if (SETTINGS.king & STATE_SOUND)
					{
						AlertSound(AUDIO.reward);
					}
					
					if (SETTINGS.king & STATE_MESSAGE)
					{
						alert('Claim a King\'s Reward to continue hunting');
					}
				}
			}
			else
			{
				DSXC_setValue('Alert - Kings Reward', false);
			}

			var TimeRemaining = STATE.userobject.activeturn_wait_seconds - (CurrentTimeStamp() - STATE.userobject.last_activeturn_timestamp);
			var HornTimerString = UpdateTimer(TimeRemaining, false);
			
			if (SETTINGS.title)
			{
				document.title = HornTimerString + ' | ' + STATE.title;
			}
			else
			{
				document.title = STATE.title;
			}
			
			var HornTimer = document.getElementById('MHH_Horn_Timer');
			if (HornTimer != null) HornTimer.innerHTML = HornTimerString;
		}
	}

	var End = GetTimeout();
	setTimeout(HornCountdownTimer, ((SETTINGS.length * 1000) - (End - Start)));
}

function BaitTimer()
{
	var BaitValue = document.getElementById('hud_baitName');
	
	if (BaitValue != null)
	{
		if (BaitValue.innerHTML.indexOf('None!') != -1)
		{
			if (!DSXC_getValue('Alert - Cheese', false))
			{
				DSXC_setValue('Alert - Cheese', true);
				
				if (SETTINGS.cheese & STATE_SOUND)
				{
					AlertSound(AUDIO.cheese);
				}
					
				if (SETTINGS.cheese & STATE_MESSAGE)
				{
					alert('You are out of cheese.  Rebait to continue hunting.');
				}
			}
		}
		else
		{
			DSXC_setValue('Alert - Cheese', false);
		}
	}
	
	setTimeout(BaitTimer, (SETTINGS.length * 1000));
}

function LocationCheckTimer()
{
	if (SETTINGS.washed > 0)
	{
		if (STATE.userobject != null)
		{
			var ExpectedLocation = DSXC_getValue('STATE.location', 'None');
			
			if (ExpectedLocation == 'Balack\'s Cove' && ExpectedLocation != STATE.userobject.location)
			{
				if (!DSXC_getValue('Alert - Washed Away', false))
				{
					DSXC_setValue('Alert - Washed Away', true);
					
					if (SETTINGS.washed & STATE_SOUND)
					{
						AlertSound(AUDIO.washed);
					}
						
					if (SETTINGS.washed & STATE_MESSAGE)
					{
						alert('You have been washed away from Balack\'s Cove.  I would recomend changing your bait before continuing to hunt.');
					}
				}
			}
			else
			{
				DSXC_setValue('Alert - Washed Away', false);
			}
		}
	}
	
	var CurrentTime = CurrentTimeStamp();
	
	for (iCount1 = 0; iCount1 < LOCATION_TIMERS.length; iCount1++)
	{
		var CurrentName = -1;
		var CurrentBreakdown = 0;
		var TotalBreakdown = 0;
		
		for (iCount2 = 0; iCount2 < LOCATION_TIMERS[iCount1][1].breakdown.length; iCount2++)
		{
			TotalBreakdown += LOCATION_TIMERS[iCount1][1].breakdown[iCount2];
		}

		var CurrentValue = Math.floor((CurrentTime - LOCATION_TIMERS[iCount1][1].first) / LOCATION_TIMERS[iCount1][1].length) % TotalBreakdown;
		
		for (iCount2 = 0; iCount2 < LOCATION_TIMERS[iCount1][1].breakdown.length && CurrentName == -1; iCount2++)
		{
			CurrentBreakdown += LOCATION_TIMERS[iCount1][1].breakdown[iCount2];
			
			if (CurrentValue < CurrentBreakdown)
			{
				CurrentName = iCount2;
			}
		}

		var SeasonLength = (LOCATION_TIMERS[iCount1][1].length * LOCATION_TIMERS[iCount1][1].breakdown[CurrentName]);
		var CurrentTimer = (CurrentTime - LOCATION_TIMERS[iCount1][1].first);
		var SeasonRemaining = 0;
		
		while (CurrentTimer > 0)
		{
			for (iCount2 = 0; iCount2 < LOCATION_TIMERS[iCount1][1].breakdown.length && CurrentTimer > 0; iCount2++)
			{
				SeasonRemaining = CurrentTimer;
				CurrentTimer -= (LOCATION_TIMERS[iCount1][1].length * LOCATION_TIMERS[iCount1][1].breakdown[iCount2])
			}
		}
		
		SeasonRemaining = SeasonLength - SeasonRemaining;
		
		document.getElementById('MHH_Location_' + iCount1 + '_State').innerHTML = '<font color="' + LOCATION_TIMERS[iCount1][1].color[CurrentName] + '">' + LOCATION_TIMERS[iCount1][1].name[CurrentName] + '</font>';
		if (LOCATION_TIMERS[iCount1][1].effective != null)
		{
			document.getElementById('MHH_Location_' + iCount1 + '_State').innerHTML += ' (' + LOCATION_TIMERS[iCount1][1].effective[CurrentName] + ')';
		}
		
		document.getElementById('MHH_Location_' + iCount1 + '_Change').innerHTML = UpdateTimer(SeasonRemaining, true);
	}
	
	if (STATE.userobject != null)
	{
		if (STATE.userobject.location == 'Seasonal Garden')
		{
			if (STATE.userobject.viewing_atts.zzt_amplifier == STATE.userobject.viewing_atts.zzt_max_amplifier)
			{
				if (!DSXC_getValue('Alert - Max Amplifier', false))
				{
					DSXC_setValue('Alert - Max Amplifier', true);
					
					if (SETTINGS.season & STATE_SOUND)
					{
						AlertSound(AUDIO.maxamp);
					}
						
					if (SETTINGS.season & STATE_MESSAGE)
					{
						alert('You have reached your maximum for Zugzwang\'s Tower Amplifier.  Time to head inside!');
					}
				}
			}
			else
			{
				DSXC_setValue('Alert - Max Amplifier', false);
			}
		}
		
		var SeasonIcon = document.getElementById('hud_seasonIcon');
		
		if (SeasonIcon != null)
		{
			var CurrentSeason = DSXC_getValue('Current Season', 'none');
			
			if (CurrentSeason != 'none' && CurrentSeason != SeasonIcon.className)
			{
				if (!DSXC_getValue('Alert - Season Change', false))
				{
					DSXC_setValue('Alert - Season Change', true);
					
					if (SETTINGS.season & STATE_SOUND)
					{
						AlertSound(AUDIO.season);
					}
						
					if (SETTINGS.season & STATE_MESSAGE)
					{
						var AlertText = 'The season has changed, make sure you change your trap. ';
						
						switch (SeasonIcon.className)
						{
							case ' seasonicon sr': AlertText = AlertText + 'It is now Summer, using a Tactical trap is most effective.'; break;
							case ' seasonicon fl': AlertText = AlertText + 'It is now Fall, using a Shadow trap is most effective.'; break;
							case ' seasonicon wr': AlertText = AlertText + 'It is now Winter, using a Hydro trap is most effective.'; break;
							case ' seasonicon sg': AlertText = AlertText + 'It is now Spring, using a Physical or Tactical trap is most effective.'; break;
						}
						
						alert(AlertText);
					}
				}
			}
			else
			{
				DSXC_setValue('Alert - Season Change', false);
			}
			
			DSXC_setValue('Current Season', SeasonIcon.className);
		}
	}
	else
	{
		DSXC_setValue('Current Season', 'none');
	}
	
	setTimeout(LocationCheckTimer, 10000);
}

function StartTimers()
{
	if (STATE.maintenance)
	{
		// if in maintenance, do nothing
	}
	else
	{
		// check every 30 seconds
		InventoryTimer();
		
		// check every 10 seconds
		KingsRewardTimer();
		LocationCheckTimer();
	
		// check every second
		BaitTimer();
		HornCountdownTimer();
		
		// background timer for horn sounding
		CheckHornState();
	}
}

function GetDisplayText(id)
{
	var DisplayWindowText = 'MHH_Display_' + id;
	var DisplayWindow = document.getElementById(DisplayWindowText);
	
	if (DisplayWindow != null)
	{
		return DisplayWindow.innerHTML;
	}
	else
	{
		return '';
	}
}

function SetDisplayText(id, text)
{
	var DisplayWindowText = 'MHH_Display_' + id;
	var DisplayWindow = document.getElementById(DisplayWindowText);
	
	if (DisplayWindow != null)
	{
		DisplayWindow.innerHTML = text;
	}
	else
	{
		DisplayState();
		DisplayTimers();
		
		SetDisplayText(id, text);
	}
}

function UpdatePercentage(percent)
{
	var DisplayProgress = document.getElementById('hud_titlePercentage');
	if (DisplayProgress != null) DisplayProgress.innerHTML = percent;
}

function ShowJournalWindow(display)
{
	var JournalWindow = CreatePopupWindow('Journal Summary', 275, 380, display);
	
	if (JournalWindow != null)
	{
	  JournalWindow.innerHTML = "<B>Catches:</B><BR /><DIV ID=\"MH_Journal_Catches\" STYLE=\"font: 8pt Verdana\"><I>Updating...</I></DIV><BR /><B>Gold and Points:</B><BR /><DIV ID=\"MH_Journal_Gains\" STYLE=\"font: 8pt Verdana\"><I>Updating...</I></DIV><BR /><B>Loot:</B><BR /><DIV ID=\"MH_Journal_Loot\" STYLE=\"font: 8pt Verdana\"><I>Updating...</I></DIV><BR />";
	  JournalSummary();
	}
}

function JournalSummary()
{
	TotalCatches = 0;
	TotalGold = 0;
	TotalGoldStolen = 0;
	TotalPoints = 0;
	TotalPointsLost = 0;
	TotalWeight = 0;
	
	ArrayMouseName = Array();
	ArrayMouseQty = Array();
	ArrayLootName = Array();
	ArrayLootQty = Array();
	
	CurrentJournal = 1;
	LastJournal = 3;
	
	Get(STATE.baseurl + 'canvas/journal.php', UpdateJournalSummary);
}

function UpdateJournalSummary(text)
{
	DSXC_log("UpdateJournalSummary");
	
	var iStartPos = text.indexOf("<div class='journaltext'>");
	var iEndPos;
	
	var iJournalStartPos;
	var iJournalEndPos;
	
	while (iStartPos != -1)
	{
		iEndPos = text.indexOf('</div>', iStartPos);
		szJournalText = text.substring(iStartPos + 25, iEndPos);
		
		if (szJournalText.indexOf('I caught a') != -1)
		{
    	TotalCatches++;
    	
			iJournalStartPos = szJournalText.indexOf('I caught a') + 11;
			iJournalEndPos = szJournalText.indexOf(' lb.', iJournalStartPos);
			
			if (iJournalEndPos != -1)
			{
				TotalWeight = TotalWeight + (Number(szJournalText.substring(iJournalStartPos, iJournalEndPos)) * 16);
				iJournalStartPos = iJournalEndPos + 5;
			}
			
			iJournalEndPos = szJournalText.indexOf(' oz.', iJournalStartPos);
			TotalWeight = TotalWeight + Number(szJournalText.substring(iJournalStartPos, iJournalEndPos));
			
			iJournalStartPos = szJournalText.indexOf('">', iJournalEndPos) + 2;
			iJournalEndPos = szJournalText.indexOf('</a>', iJournalStartPos);
			szCurrentMouse = szJournalText.substring(iJournalStartPos, iJournalEndPos);
			AddMouse(szCurrentMouse);

			iJournalStartPos = szJournalText.indexOf(' worth ', iJournalEndPos) + 7;
			iJournalEndPos = szJournalText.indexOf(' points and ', iJournalStartPos);
    	TotalPoints = TotalPoints + Number(szJournalText.substring(iJournalStartPos, iJournalEndPos).replace(/,/g, ""));
    	
    	iJournalStartPos = iJournalEndPos + 12;
			iJournalEndPos = szJournalText.indexOf(' gold', iJournalStartPos);
    	TotalGold = TotalGold + Number(szJournalText.substring(iJournalStartPos, iJournalEndPos).replace(/,/g, ""));
    	
    	iJournalStartPos = szJournalText.indexOf('dropped the following loot', iJournalEndPos)
    	
    	if (iJournalStartPos != -1)
    	{
    		iJournalStartPos = szJournalText.indexOf('</b><br />', iJournalStartPos) + 10;
    		iJournalEndPos = szJournalText.indexOf('<a', iJournalStartPos);
    		
    		while (iJournalEndPos != -1)
    		{
    			DSXC_log(szJournalText.substring(iJournalStartPos, iJournalEndPos));
    			iQuantity = Number(szJournalText.substring(iJournalStartPos, iJournalEndPos));
	    		iJournalStartPos = szJournalText.indexOf("'>", iJournalEndPos) + 2;
	    		iJournalEndPos = szJournalText.indexOf('</a>', iJournalStartPos);
	    		szItemName = szJournalText.substring(iJournalStartPos, iJournalEndPos);
	    		
	    		AddLoot(szItemName, iQuantity);
    			
    			iJournalStartPos = szJournalText.indexOf(',', iJournalEndPos);
    			
    			if (iJournalStartPos != -1)
    			{
    				iJournalStartPos++;
	    			iJournalEndPos = szJournalText.indexOf('<a', iJournalStartPos);
	    		}
	    		else
    			{
	    			iJournalStartPos = szJournalText.indexOf(' and ', iJournalEndPos);

	    			if (iJournalStartPos != -1)
	    			{
	    				iJournalStartPos += 5;
		    			iJournalEndPos = szJournalText.indexOf('<a', iJournalStartPos);
		    		}
		    		else
	    			{
	    				iJournalEndPos = -1;
	    			}
    			}
    		}
    	}
		}
		else if (szJournalText.indexOf('Additionally, ') != -1)
		{
			iJournalStartPos = szJournalText.indexOf(' pillaged ');
			
			if (iJournalStartPos != -1)
			{
				iJournalStartPos = iJournalStartPos + 10;
				iJournalEndPos = szJournalText.indexOf(' gold');
	    	TotalGoldStolen = TotalGoldStolen + Number(szJournalText.substring(iJournalStartPos, iJournalEndPos).replace(/,/g, ""));
			}
			
			iJournalStartPos = szJournalText.indexOf(' setting me back ');
			
			if (iJournalStartPos != -1)
			{
				iJournalStartPos = iJournalStartPos + 17;
				iJournalEndPos = szJournalText.indexOf(' points!');
	    	TotalPointsLost = TotalPointsLost + Number(szJournalText.substring(iJournalStartPos, iJournalEndPos).replace(/,/g, ""));
			}
		}
		
		iStartPos = text.indexOf("<div class='journaltext'>", iEndPos);
	}
	
	if (CurrentJournal < LastJournal)
	{
		CurrentJournal++;
		Get(STATE.baseurl + 'canvas/journal.php?page=' + CurrentJournal, UpdateJournalSummary);
	}
	else
	{
		szJournalText = "";
		for (iCount = 0; iCount < ArrayMouseName.length; iCount++)
		{
			if (iCount > 0) szJournalText = szJournalText + ", ";
			szJournalText = szJournalText + ArrayMouseQty[iCount] + " " + ArrayMouseName[iCount];
		}
		szJournalText = szJournalText + "<BR /><BR />Total catches: " + TotalCatches + "<BR />Average weight: " + Math.round(TotalWeight / TotalCatches) + " oz.";
		if (document.getElementById('MH_Journal_Catches') != null) document.getElementById('MH_Journal_Catches').innerHTML = szJournalText;
		
		szJournalText = addCommas(TotalGold) + " gold gained, " + addCommas(TotalGoldStolen) + " gold lost<BR />";
		szJournalText = szJournalText + addCommas(TotalPoints) + " points gained, " + addCommas(TotalPointsLost) + " points lost<BR />";
		szJournalText = szJournalText + addCommas((TotalGold - TotalGoldStolen)) + " net gold, " + addCommas((TotalPoints - TotalPointsLost)) + " net points<BR />";
		if (document.getElementById('MH_Journal_Gains') != null) document.getElementById('MH_Journal_Gains').innerHTML = szJournalText;

		szJournalText = "None";
		if (ArrayLootName.length > 0)
		{
			szJournalText = "";
			for (iCount = 0; iCount < ArrayLootName.length; iCount++)
			{
				szJournalText = szJournalText + ArrayLootName[iCount] + " (x" + ArrayLootQty[iCount] + ")<BR />";
			}
		}
		if (document.getElementById('MH_Journal_Loot') != null) document.getElementById('MH_Journal_Loot').innerHTML = szJournalText;
	}
}

function AddMouse(szMouseName)
{
	var MouseIndex = ArrayMouseName.indexOf(szMouseName);
	
	if (MouseIndex == -1)
	{
		ArrayMouseName.push(szMouseName);
		MouseIndex = ArrayMouseName.indexOf(szMouseName);
		
		ArrayMouseQty[MouseIndex] = 0;
	}
	
	ArrayMouseQty[MouseIndex]++;
}

function AddLoot(szItemName, iQty)
{
	if (iQty > 1)
	{
		if (szItemName.substr(-3) == "ies")
			szItemName = szItemName.substr(0, szItemName.length - 3)+"y";
		if (szItemName.substr(-2) == "'s")
			szItemName = szItemName.substr(0, szItemName.length - 2);
		if (szItemName.substr(-1) == "s")
			szItemName = szItemName.substr(0, szItemName.length - 1);
	}
	
	var LootIndex = ArrayLootName.indexOf(szItemName);
	
	if (LootIndex == -1)
	{
		ArrayLootName.push(szItemName);
		LootIndex = ArrayLootName.indexOf(szItemName);
		
		ArrayLootQty[LootIndex] = 0;
	}
	
	ArrayLootQty[LootIndex] += iQty;
}

function addCommas(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

function RefreshUserObject()
{
	Post(STATE.baseurl + 'managers/ajax/abtest.php', {}, function(data) {});
}