var BonusCalculator = {
	casinos: {
		'titan': {
			name: 'Casino Titan',
			minimalDeposit: 25,
			bonuses: [
				{
					name: 'Sign-Up Deposit Bonus',
					url: '',
					games: {blackjack:1, slots:1, videopoker:1},
					codes: ['ELECTRIC400'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						result.deposits = [sum];
						result.bonus = Math.min(4 * sum, 1000);

						result.msg = 'ok';
						return result;
					}
				},{
					name: 'Welcome Package',
					url: '',
					games: {blackjack:1, slots:1, videopoker:1},
					codes: ['TITAN300,WELCOME200,PACKAGE100'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						if (sum <= 300) {
							result.deposits = [Math.min(3 * sum, 900)];
							result.bonus = Math.min(3 * sum, 900);
						} else if (sum <= 600) {
							result.deposits = [900, Math.min(2 * (sum-300), 600)];
							result.bonus = 900 + Math.min(2 * (sum-300), 600);
						} else if (sum <= 1100) {
							result.deposits = [900, 600, sum-600];
							result.bonus = 900 + 600 + sum-600;
						} else {
							result.deposits = [900, 600, 500, sum-2000];
							result.bonus = 900 + 600 + 500;
						}

						result.msg = 'ok';
						return result;
					}

				},{
					name: 'Special Blackjack Bonus',
					url: '',
					games: {blackjack:1, slots:0, videopoker:0},
					codes: ['BJ3000'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						if (sum <= 500) {
							result.deposits = [sum];
						} else if (sum <= 1000) {
							result.deposits = [500, sum-500];
						} else if (sum <= 1500) {
							result.deposits = [500, 500, sum-1000];
						} else if (sum <= 2000) {
							result.deposits = [500, 500, 500, sum-1500];
						} else if (sum <= 2500) {
							result.deposits = [500, 500, 500, 500, sum-2000];
						} else {
							result.deposits = [500, 500, 500, 500, 500, sum-2500];
						}
						result.bonus = Math.min(sum, 3000);

						result.msg = 'ok';
						return result;
					}
				}
			]
		},
		'rushmore':{
			name: 'Rushmore',
			minimalDeposit: 25,
			bonuses: [
				{
					name: 'Sign-Up Bonus',
					url: 'http://www.rushmoreonline.com/Promotions/888FreeBonus',
					games: {blackjack:1, slots:1, videopoker:1},
					codes: ['400FREE', '488FREE'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						if (sum <= 400) {
							result.bonus = sum;
							result.deposits = [sum];
						} else if (sum <= 888) {
							result.bonus = sum;
							result.deposits = [400, sum-400];
						} else {
							result.bonus = 888;
							result.deposits = [400, sum-400];
						}

						result.msg = 'ok';
						return result;
					}
				},{
					name: 'High Roller Bonus',
					url: 'http://www.rushmoreonline.com/Promotions/HighRollerBonus',
					games: {blackjack:1, slots:1, videopoker:1},
					codes: ['HIGHROLLER1', 'HIGHROLLER2'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};
						if (sum < 1000) return result;

						if (sum <= 2000) {
							result.bonus = 1500;
							result.deposits = [1000, sum-1000];
						} else {
							result.bonus = 3000;
							result.deposits = [1000, sum-1000];
						}

						result.msg = 'ok';
						return result;
					}
				},{
					name: 'Blackjack Special Bonus',
					url: 'http://www.rushmoreonline.com/Promotions/BlackjackBonus',
					games: {blackjack:1, slots:0, videopoker:0},
					codes: ['DOUBLEDOWN'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						result.bonus = Math.min(2 * sum, 1000);
						result.deposits = [sum];

						result.msg = 'ok';
						return result;
					}
				},{
					name: 'Slots Special Bonus',
					url: 'http://www.rushmoreonline.com/Promotions/SlotsBonus',
					games: {blackjack:0, slots:1, videopoker:0},
					codes: ['SLOTS400'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						result.bonus = Math.min(4 * sum, 2400);
						result.deposits = [sum];

						result.msg = 'ok';
						return result;
					}
				}
			]
		},
		'online-vegas': {
			name: 'Online Vegas',
			minimalDeposit: 25,
			bonuses: [
				{
					name: 'Sign-Up Bonus',
					url: 'http://www.onlinevegas.com/promotions.php',
					games: {blackjack:0, slots:1, videopoker:0},
					codes: ['auto', 'OV002', 'OV003', 'OV004', 'OV004B', 'OV004C', 'OV004D', 'OV004E', 'OV004F', 'OV005'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						if (sum == 25) {
							result.deposits = [25];
						} else if (sum <= 50) {
							result.deposits = [25, sum-25];
						} else if (sum <= 550) {
							result.deposits = [25, 25, sum-50];
						} else if (sum <= 583.35) {
							result.deposits = [25, sum-525, 500];
						} else if (sum <= 1225) {
							result.deposits = [25, 25, 25, 25, 25, 25, 25, 25, 25, sum-225];
						} else if (sum <= 1700) {
							result.deposits = [25, 25, sum-1200, 25, 25, 25, 25, 25, 25, 1000];
						} else if (sum <= 1975) {
							result.deposits = [25, sum-1675, 500, 25, 25, 25, 25, 25, 25, 1000];
						} else if (sum <= 2450) {
							result.deposits = [sum-1950, 300, 500, 25, 25, 25, 25, 25, 25, 1000];
						} else if (sum <= 8300) {
							var d49 = (sum-2300)/6;
							result.deposits = [500, 300, 500, d49, d49, d49, d49, d49, d49, 1000];
						} else {
							result.deposits = [500, 300, 500, 1000, 1000, 1000, 1000, 1000, 1000, sum-500-300-500-6000];
						}

						var d = [];
						for (var i=0; i<10; i++) {
							d[i] = (typeof(result.deposits[i])!='undefined') ? result.deposits[i]:0;
						}
						result.bonus = d[0] + 1.25*d[1] + 1.5*d[2] + 0.25*(d[3]+d[4]+d[5]+d[6]+d[7]+d[8]) + 2*Math.min(1000, d[9]);

						result.msg = 'ok';
						return result;
					}
				}
			]
		},
		'rome': {
			name: 'Rome Casino',
			minimalDeposit: 25,
			bonuses: [
				{
					name: 'Romulus\' Welcome Bonus',
					url: 'http://www.romecasino.com/promotions',
					games: {blackjack:0, slots:1, videopoker:0},
					codes: ['auto'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						if (sum <= 1000) {
							result.deposits = [sum];
						} else if (sum <= 2000) {
							result.deposits = [1000, sum-1000];
						} else if (sum <= 3000) {
							result.deposits = [1000, 1000, sum-2000];
						} else if (sum <= 4000) {
							result.deposits = [1000, 1000, 1000, sum-3000];
						} else {
							result.deposits = [1000, 1000, 1000, 1000, sum-4000];
						}
						result.bonus = Math.min(sum, 5000);

						result.msg = 'ok';
						return result;
					}
				},{
					name: 'Romulus\' Welcome Bonus',
					url: 'http://www.romecasino.com/promotions',
					games: {blackjack:0, slots:1, videopoker:0},
					codes: ['auto'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						result.deposits = [sum];
						result.bonus = Math.min(4 * sum, 3000);

						result.msg = 'ok';
						return result;
					}
				}
			]
		},
		'sloto-cash': {
			name: 'Sloto\'Cash',
			minimalDeposit: 0,
			bonuses: [
				{
					name: 'Sign-up Bonus',
					url: 'http://www.slotocash.com/casino-promotions-at-slotocash.html',
					games: {blackjack:0, slots:1, videopoker:0},
					codes: ['auto'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						if (sum == 0) {
							result.deposits = [];
							result.bonus = 7;
						} else if (sum<=100) {
							result.deposits = [sum];
							result.bonus = 7 + sum;
						} else if (sum<=500 /* 500 = 100 + 200/50% */) {
							result.deposits = [100, sum-100];
							result.bonus = 7 + 100 + 0.5 * result.deposits[1];
						} else if (sum<=1580 /* 1580 = 100 + 200/50% + 270/25% */) {
							result.deposits = [100, 400, sum-500];
							result.bonus = 7 + 100 + 0.5 * result.deposits[1] + 0.25 * result.deposits[2];
						} else {
							result.deposits = [100, 400, 1080, sum-1580];
							result.bonus = 570;
						}

						result.msg = 'ok';
						return result;
					}
				},{
					name: '50% up to $100 FREE for Video Poker, Carribean Stud, Three Card Poker and War',
					url: 'http://www.slotocash.com/casino-promotions-at-slotocash.html',
					games: {blackjack:0, slots:0, videopoker:1},
					codes: ['auto'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						result.deposits = [sum];
						result.bonus = Math.min(0.5*sum, 100);

						result.msg = 'ok';
						return result;
					}
				}
			]
		},
		'go-casino': {
			name: 'Go Casino',
			minimalDeposit: 25,
			bonuses: [
				{
					name: 'Sign-Up Bonus',
					url: 'http://www.gocasino.com/promotions.php',
					games: {blackjack:0, slots:1, videopoker:0},
					codes: ['auto', 'GO001', 'GO002', 'GO003', 'GO004', 'GO005', 'GO006', 'GO007', 'GO008', 'GO009', 'GO010', 'GO011', 'GO012', 'GO013', 'GO014', 'GO015', 'GO016', 'GO017', 'GO018', 'GO019'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						result.bonus = Math.min(sum, 20000);
						result.deposits = [];
						var sumTemp = sum;
						for (var i=0; i<20; i++) {
							result.deposits[result.deposits.length] = Math.min(sumTemp, 1000);

							sumTemp = sumTemp - 1000;
							if (sumTemp<=0) break;
						}
						if (sumTemp > 0) {
							result.deposits[result.deposits.length-1] += sumTemp;
						}

						result.msg = 'ok';
						return result;
					}
				}
			]
		},
		'harbour': {
			name: 'English Harbour',
			minimalDeposit: 25,
			bonuses: [
				{
					name: 'Sign-Up Bonus',
					url: 'http://www.englishharbour.com/promotions.php',
					games: {blackjack:1, slots:1, videopoker:1},
					codes: ['auto'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						if (sum <= 200) {
							result.deposits = [sum];
						} else if (sum <= 400) {
							result.deposits = [200, sum-200];
						} else if (sum <= 600) {
							result.deposits = [200, 200, sum-400];
						} else {
							result.deposits = [200, 200, 200, sum-600];
						}
						result.bonus = Math.min(sum, 800);

						result.msg = 'ok';
						return result;
					}
				}
			]
		},
		'win-palace': {
			name: 'Win Palace',
			minimalDeposit: 21,
			bonuses: [
				{
					name: 'Welcome Bonus',
					url: 'http://www.winpalace.com/en/promotions/.aspx#PALACEWELCOME',
					games: {blackjack:1, slots:1, videopoker:1},
					codes: ['PALACEWELCOME'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						/*WinPalace welcomes you to our exclusive casino with $1000 CASH !
Get a generous 200% bonus (up to $500) not only on your first but on your 2nd deposit too!
This incredible bonus awards you with $1,000 in BONUS CASH! */

						if (sum <= 250) {
							result.deposits = [sum];
						} else {
							result.deposits = [250, sum-250];
						}
						result.bonus = Math.min(2 * sum, 1000);

						result.msg = 'ok';
						return result;
					}
				},{
					name: 'Slots Bonus',
					url: 'http://www.winpalace.com/en/promotions/.aspx#WINSLOTS',
					games: {blackjack:0, slots:1, videopoker:0},
					codes: ['WINSLOTS'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						//GET a 300% bonus up to $3000 on your first deposit when you play SLOTS!
						result.bonus = Math.min(3 * sum, 1000);
						result.deposits = [sum];


						result.msg = 'ok';
						return result;
					}
				},{
					name: 'BlackJack Bonus',
					url: 'http://www.winpalace.com/en/promotions/.aspx#WIN21',
					games: {blackjack:1, slots:0, videopoker:0},
					codes: ['WINBJ'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						//100% bonus up to $500, Redeemable 10 Times.

						if (sum <= 500){
							result.deposits = [sum];
						} else if (sum <=1000){
							result.deposits = [500,sum-500];
						} else if (sum <=1500){
							result.deposits = [500,500,sum-1000]
						} else if (sum <=2000){
							result.deposits = [500,500,500,sum-1500];
						} else if (sum <=2500){
							result.deposits = [500,500,500,500,sum-2000];
						} else if (sum <=3000){
							result.deposits = [500,500,500,500,500,sum-2500];
						} else if (sum <=3500){
							result.deposits = [500,500,500,500,500,500,sum-3000];
						} else if (sum <=4000){
							result.deposits = [500,500,500,500,500,500,500,sum-3500];
						} else if (sum <=4500){
							result.deposits = [500,500,500,500,500,500,500,500,sum-4000];
						} else {
							result.deposits = [500,500,500,500,500,500,500,500,500,sum-4500];
						}

						result.bonus = Math.min(sum, 5000);


						result.msg = 'ok';
						return result;
					}
				},{
					name: 'Video Poker Bonus',
					url: 'http://www.winpalace.com/en/promotions/.aspx#VIDEO-POKER-BONUS',
					games: {blackjack:0, slots:0, videopoker:1},
					codes: ['WINVP'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						//100% bonus up to $500, Redeemable 10 Times.

						if (sum <= 500){
							result.deposits = [sum];
						} else if (sum <=1000){
							result.deposits = [500,sum-500];
						} else if (sum <=1500){
							result.deposits = [500,500,sum-1000]
						} else if (sum <=2000){
							result.deposits = [500,500,500,sum-1500];
						} else if (sum <=2500){
							result.deposits = [500,500,500,500,sum-2000];
						} else if (sum <=3000){
							result.deposits = [500,500,500,500,500,sum-2500];
						} else if (sum <=3500){
							result.deposits = [500,500,500,500,500,500,sum-3000];
						} else if (sum <=4000){
							result.deposits = [500,500,500,500,500,500,500,sum-3500];
						} else if (sum <=4500){
							result.deposits = [500,500,500,500,500,500,500,500,sum-4000];
						} else {
							result.deposits = [500,500,500,500,500,500,500,500,500,sum-4500];
						}

						result.bonus = Math.min(sum, 5000);

						result.msg = 'ok';
						return result;
					}
				},{
					name: 'High Roller Bonus',
					url: 'http://www.winpalace.com/en/promotions/.aspx#ULTIMATEWIN',
					games: {blackjack:1, slots:1, videopoker:1},
					codes: ['ULTIMATEWIN'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						/*For players who prefer to play BIG, we offer our special High Roller Bonus. Simply make your first deposit of $750 or more and receive a 200% bonus.
200% bonus up to $2,000
*/
						if (sum < 750) return result;

						result.bonus = Math.min(2 * sum, 2000);
						result.deposits = [sum];


						result.msg = 'ok';
						return result;
					}
				}
			]
		},
		'pure-vegas': {
			name: 'Pure Vegas',
			minimalDeposit: 25,
			bonuses: [
				{
					name: 'Blackjack Special Bonus',
					url: 'http://www.purevegascasino.com/Promos/2400WelcomeBonus.html',
					games: {blackjack:1, slots:0, videopoker:1},
					codes: ['800FREE1', '800FREE2', '800FREE3'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						if (sum <= 800) {
							result.deposits = [sum];
						} else if (sum <= 1600) {
							result.deposits = [800, sum-800];
						} else {
							result.deposits = [800, 800, sum-1600];
						}
						result.bonus = Math.min(sum, 2400);

						result.msg = 'ok';
						return result;
					}
				},{
					name: 'Slots Special Bonus',
					url: 'http://www.purevegascasino.com/Promos/SlotsSpecialBonus.html',
					games: {blackjack:0, slots:1, videopoker:0},
					codes: ['PURESLOTS1', 'PURESLOTS2'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};

						if (sum <= 600 /* 600 = 1200 / 200% */) {
							result.deposits = [sum];
						} else {
							result.deposits = [600, sum-600];
						}
						result.bonus = Math.min(2*sum, 2400);

						result.msg = 'ok';
						return result;
					}
				},{
					name: 'High Roller Bonus',
					url: 'http://www.purevegascasino.com/Promos/HighRollerBonus.html',
					games: {blackjack:1, slots:1, videopoker:1},
					codes: ['1776PURE1', '1776PURE2'],
					getDeposits: function(sum) {
						var result = {bonus:0, deposits:[], msg:'n/a'};
						if (sum < 1000) return result;

						if (sum <= 2000) {
							result.deposits = [sum];
							result.bonus = 1776;
						} else {
							result.deposits = [1000, 1000, sum-2000];
							result.bonus = 1776 + 1776;
						}

						result.msg = 'ok';
						return result;
					}
				}
			]
		}
	},
	calc: function(sum, game) {
		if (game!='slots' && game!='blackjack' && game!='roulette' && game!='videopoker') {
			game = 'all';
		}
		sum = 1*sum;
		var result = {};

		for (var casinoId in this.casinos) {
			var casino = this.casinos[casinoId];
			var best = {
				name: casino.name,
				url:'',
				bonus:0,
				sBonus: '',
				bonusName: '',
				deposits:[],
				msg:'n/a',
				codes:[]
			};

			if (sum < casino.minimalDeposit) {
				best.msg = 'Minimal deposit is $' + casino.minimalDeposit;
			} else {
				for (var i=0, len=casino.bonuses.length; i<len; i++) {
					var item = casino.bonuses[i];
					if (typeof(item.games[game])=='undefined' || item.games[game]==0) continue;

					var deposits = item.getDeposits(sum);
					if (deposits.bonus <= best.bonus) continue;

					best.bonus = Math.floor(deposits.bonus);
					best.deposits = deposits.deposits;
					best.msg = deposits.msg;

					best.bonusName = item.name;
					best.url = item.url;
					best.codes = item.codes;

					if (sum!=0) {
						best.sBonus = Math.round(deposits.bonus/sum*100*100)/100 + '%';
					} else {
						best.sBonus = '-';
					}
				}
			}

			result[casinoId] = best;
		}

		return result;
	},
	getBestCasinoIds: function(bonuses) {
		var bestBonus = 0.1;
		var bestCasino = [];

		for (var casino in bonuses) {
			var bonus = bonuses[casino].bonus;
			if (bonus >= bestBonus) {
				if (bonus == bestBonus) {
					bestCasino[bestCasino.length] = casino;
				} else {
					bestCasino = [casino];
				}
				bestBonus = bonus;
			}
		}
		return bestCasino;
	}
};
