
function grab_route_info_status()
{
	// get the automatic routes from rdata
	byte_array = convertFromBase64 (rdata);
	i = 0;
	num_entries = sU(2);
	sU(1);
	route = new Array();
	for (var j=0; j<num_entries; j++) {
		route[j] = new Object();
		route[j].dest_ip = sX();
		route[j].netmask = sX();
		route[j].gw = sX();
		route[j].metric = sU(1);
		route[j].is_static = sU(1);
		route[j].dlink = sU(1);
		sU(1);
		route[j].used = 1;
	}
	
	// initialize array editor
	ae = new arrayEditor (num_entries,route);
}


function grab_route_info_config()
{
	// get the automatic routes from rdata
	byte_array = convertFromBase64 (rdata);
	i = 0;
	num_entries = sU(2);
	sU(1);
	route = new Array();
	var k = 0;
	for (var j=0; j<num_entries; j++ ) {
		route[k] = new Object();
		route[k].dest_ip = sX();
		route[k].netmask = sX();
		route[k].gw = sX();
		route[k].metric = sU(1);
		route[k].is_static = sU(1);
		route[k].dlink = sU(1);
		sU(1);
		route[k].used = 1;
		if (route[k].is_static != 1) {
			k++;
		}
	}
	
	// initialize array editor
	ae1 = new arrayEditor (k,route);
	
	for (var j = 0; j < ARRAYSIZE_ROUTE_TABLE; j++) {
		if (data.route_table[j].is_static == 1) {
			data.route_table[j].used = 1;
		}
	}
}


function computeSchedulePulldown (starting_offset)
{
	if (typeof(starting_offset) == "undefined") starting_offset = 2;
	var scount = starting_offset;
	for (var i = 0; i < ARRAYSIZE_SCHED_TABLE; i++) {
		if (data.sched_table[i].used == 1) {
			document.mainform.schedule_names.options[scount++] = new Option (data.sched_table[i].sched_name, data.sched_table[i].sched_name);
		}
	}
}


function computeIngressFilterPulldown()
{
	var scount = 2;
	for (var i = 0; i < ARRAYSIZE_INGRESS_RULES; i++) {
		if (data.ingress_rules[i].used == 1) {
			document.mainform.ingress_filter_names.options[scount++] = new Option (data.ingress_rules[i].ingress_filter_name, data.ingress_rules[i].ingress_filter_name);
		}
	}
}


num_leases = 0;

function loadDHCPLeases()
{
	// get the leases from 'ddata'
	byte_array = convertFromBase64 (ddata);
	i = 0;
	// make arrays where we are going to put stuff
	dhcp_ip_to_mac = new Object;
	dhcp_ip_to_hostname = new Object;
	leases = new Array();

	var max = Math.floor((byte_array.length / 45));
	while ( num_leases < max) {
		// fill leases array
		leases[num_leases] = new Object;
		leases[num_leases].ip_addr = sX();
		leases[num_leases].mac_addr = sH(6,':');
		leases[num_leases].host_name = sS(29);
		leases[num_leases].state = sU(1);
		leases[num_leases].seconds_remain = sU(4);
		leases[num_leases].used = 1;

		/*
		 * Create a string describing the lease time remianing.
		 */
		var str = "";
		var remain = leases[num_leases].seconds_remain;
		if (remain == 0xffffffff) {
			str = "Never";
		} else {
			/*
			 * Days
			 */		
			var days = remain / 86400;
			days = Math.floor(days);
			remain %= 86400;
			if (days) {str += days + "&nbsp;Days ";}

			/*
			 * Hours
			 */
			var hours = remain / 3600;
			hours = Math.floor(hours);
			remain %= 3600;
			if (hours) {str += hours + "&nbsp;Hours ";}

			/*
			 * Minutes
			 */
			var mins = remain / 60;
			mins = Math.floor(mins);
			if (mins) {str += mins + "&nbsp;Minutes ";}
		}
		leases[num_leases].seconds_remain_string = str;

		// fill mapping arrays
		dhcp_ip_to_mac[leases[num_leases].ip_addr] = leases[num_leases].mac_addr;
		dhcp_ip_to_hostname[leases[num_leases].ip_addr] = leases[num_leases].host_name;
		num_leases++;
	}
}


function dhcpIPToMAC(ip)
{
	return (num_leases > 0) ? dhcp_ip_to_mac[ip] : '';
}


function dhcpIPToHostname(ip)
{
	return (num_leases > 0) ? dhcp_ip_to_hostname[ip] : '';
}


function computeDHCPLeasePulldown()
{
	document.mainform.dhcp_leases.options[0] = new Option ("Select Machine", "-1");
	for (var j=0; j<num_leases; j++) {
		// create lease pulldown options
		var option_label = leases[j].ip_addr;
		if (leases[j].host_name != '') {
			option_label += ' (' + leases[j].host_name + ')';
		}
		document.mainform.dhcp_leases.options[j+1] = new Option (option_label,leases[j].ip_addr);
	}
}

function computeDHCPLeaseMacPulldown()
{
	document.mainform.mac_leases.options[0] = new Option ("Select Machine", "-1");
	for (var j=0; j<num_leases; j++) {
		// create lease pulldown options
		var option_label = leases[j].mac_addr;
		if (leases[j].host_name != '') {
			option_label += ' (' + leases[j].host_name + ')';
		}
		document.mainform.mac_leases.options[j+1] = new Option (option_label,leases[j].mac_addr);
	}
}

/*
 * computeVirtualServerPulldown()
 *	Populates default virtual server entries into dropdown box
 */
function computeVirtualServerPulldown()
{
	document.mainform.default_virtual_servers.options[0] = new Option ("Select Virtual Server", -1);
	document.mainform.default_virtual_servers.options[1] = new Option ("TELNET", 0);
	document.mainform.default_virtual_servers.options[2] = new Option ("HTTP",1);	
	document.mainform.default_virtual_servers.options[3] = new Option ("HTTPS", 2);
	document.mainform.default_virtual_servers.options[4] = new Option ("FTP",3);	
	document.mainform.default_virtual_servers.options[5] = new Option ("DNS", 4);
	document.mainform.default_virtual_servers.options[6] = new Option ("SMTP",5);	
	document.mainform.default_virtual_servers.options[7] = new Option ("POP3", 6);
	document.mainform.default_virtual_servers.options[8] = new Option ("NETMEETING",7);
	document.mainform.default_virtual_servers.options[9] = new Option ("REMOTE DESKTOP",8);		
	document.mainform.default_virtual_servers.options[10] = new Option ("PPTP",9);	
	document.mainform.default_virtual_servers.options[11] = new Option ("L2TP",10);	
	document.mainform.default_virtual_servers.options[12] = new Option ("Wake-On-LAN",11);
}

/*
 * getVirtualServerEntry()
 *	Returns associated information of selected virtual server entry from dropdown box.
 *
 * NOTE: The 'alg_assoc' names MUST match (case sentitive) the name given to the ALG, unless no association is needed.
 */
function getVirtualServerEntry()
{
	virual_servers = new Array();
	
	virual_servers[0] = new Object;
	virual_servers[0].private_port = 23;
	virual_servers[0].protocol = 6;
	virual_servers[0].public_port = 23;
	virual_servers[0].alg_assoc = "";

	virual_servers[1] = new Object;
	virual_servers[1].private_port = 80;
	virual_servers[1].protocol = 6;
	virual_servers[1].public_port = 80;
	virual_servers[1].alg_assoc = "";
	
	virual_servers[2] = new Object;
	virual_servers[2].private_port = 443;
	virual_servers[2].protocol = 6;
	virual_servers[2].public_port = 443;
	virual_servers[2].alg_assoc = "";

	virual_servers[3] = new Object;
	virual_servers[3].private_port = 21;
	virual_servers[3].protocol = 6;
	virual_servers[3].public_port = 21;
	virual_servers[3].alg_assoc = "FTP";
	
	virual_servers[4] = new Object;
	virual_servers[4].private_port = 53;
	virual_servers[4].protocol = 17;
	virual_servers[4].public_port = 53;
	virual_servers[4].alg_assoc = "";

	virual_servers[5] = new Object;
	virual_servers[5].private_port = 25;
	virual_servers[5].protocol = 6;
	virual_servers[5].public_port = 25;
	virual_servers[5].alg_assoc = "";
	
	virual_servers[6] = new Object;
	virual_servers[6].private_port = 110;
	virual_servers[6].protocol = 6;
	virual_servers[6].public_port = 110;
	virual_servers[6].alg_assoc = "";

	virual_servers[7] = new Object;
	virual_servers[7].private_port = 1720;
	virual_servers[7].protocol = 6;
	virual_servers[7].public_port = 1720;
	virual_servers[7].alg_assoc = "H.323";

	virual_servers[8] = new Object;
	virual_servers[8].private_port = 3389;
	virual_servers[8].protocol = 6;
	virual_servers[8].public_port = 3389;
	virual_servers[8].alg_assoc = "";

	virual_servers[9] = new Object;
	virual_servers[9].private_port = 1723;
	virual_servers[9].protocol = 6;
	virual_servers[9].public_port = 1723;
	virual_servers[9].alg_assoc = "PPTP Control";
    
	virual_servers[10] = new Object;
	virual_servers[10].private_port = 1701;
	virual_servers[10].protocol = 17;
	virual_servers[10].public_port = 1701;
	virual_servers[10].alg_assoc = "";

	virual_servers[11] = new Object;
	virual_servers[11].private_port = 9;
	virual_servers[11].protocol = 17;
	virual_servers[11].public_port = 9;
	virual_servers[11].alg_assoc = "Wake-On-LAN";

	var index = document.mainform.default_virtual_servers.options[document.mainform.default_virtual_servers.selectedIndex].value;
	virual_servers[index].name = document.mainform.default_virtual_servers.options[document.mainform.default_virtual_servers.selectedIndex].text;
	return virual_servers[index];
}

/*
 * computeGamePulldown()
 *	Populates default gaming entries into dropdown box
 */
function computeGamePulldown()
{
	document.mainform.default_games.options[0] = new Option ("Select Game", -1);
	document.mainform.default_games.options[1] = new Option ("Age of Empires", 0);
	document.mainform.default_games.options[2] = new Option ("Aliens vs. Predator", 2);
	document.mainform.default_games.options[3] = new Option ("America's Army", 1);
	document.mainform.default_games.options[4] = new Option ("Asheron's Call", 3);
	document.mainform.default_games.options[5] = new Option ("Battlefield 1942", 4);
	document.mainform.default_games.options[6] = new Option ("Battlefield: Vietnam", 5);		
	document.mainform.default_games.options[7] = new Option ("BitTorrent", 63);
	document.mainform.default_games.options[8] = new Option ("Black and White", 6);	
	document.mainform.default_games.options[9] = new Option ("Call of Duty", 7);		
	document.mainform.default_games.options[10] = new Option ("Command and Conquer Generals", 8);
	document.mainform.default_games.options[11] = new Option ("Command and Conquer Zero Hour", 9);		
	document.mainform.default_games.options[12] = new Option ("Counter Strike", 10);
	document.mainform.default_games.options[13] = new Option ("Crimson Skies", 11);		
	document.mainform.default_games.options[14] = new Option ("D-Link DVC-1000", 83);
	document.mainform.default_games.options[15] = new Option ("Dark Reign 2", 12);
	document.mainform.default_games.options[16] = new Option ("Delta Force", 13);
	document.mainform.default_games.options[17] = new Option ("Diablo I and II", 14);
	document.mainform.default_games.options[18] = new Option ("Doom 3", 15);
	document.mainform.default_games.options[19] = new Option ("Dungeon Siege", 16);
	document.mainform.default_games.options[20] = new Option ("eDonkey", 65);
	document.mainform.default_games.options[21] = new Option ("eMule", 67);
	document.mainform.default_games.options[22] = new Option ("Everquest", 17);
	document.mainform.default_games.options[23] = new Option ("Far Cry", 18);
	document.mainform.default_games.options[24] = new Option ("Final Fantasy XI (PC)", 20);
	document.mainform.default_games.options[25] = new Option ("Final Fantasy XI (PS2)", 21);
	document.mainform.default_games.options[26] = new Option ("Gamespy Arcade", 76);
	document.mainform.default_games.options[27] = new Option ("Gamespy Tunnel", 77);
	document.mainform.default_games.options[28] = new Option ("Ghost Recon", 19);
	document.mainform.default_games.options[29] = new Option ("Gnutella", 64);
	document.mainform.default_games.options[30] = new Option ("Half Life", 22);
	document.mainform.default_games.options[31] = new Option ("Halo: Combat Evolved ", 23);
	document.mainform.default_games.options[32] = new Option ("Heretic II", 24);
	document.mainform.default_games.options[33] = new Option ("Hexen II", 25);
	document.mainform.default_games.options[34] = new Option ("Jedi Knight II: Jedi Outcast ", 26);
	document.mainform.default_games.options[35] = new Option ("Jedi Knight III: Jedi Academy ", 27);
	document.mainform.default_games.options[36] = new Option ("KALI", 75);
	document.mainform.default_games.options[37] = new Option ("Links", 28);
	document.mainform.default_games.options[38] = new Option ("Medal of Honor: Games", 29);
	document.mainform.default_games.options[39] = new Option ("MSN Game Zone", 73);
	document.mainform.default_games.options[40] = new Option ("MSN Game Zone (DX)", 74);
	document.mainform.default_games.options[41] = new Option ("Myth", 30);
	document.mainform.default_games.options[42] = new Option ("Need for Speed", 31);
	document.mainform.default_games.options[43] = new Option ("Need for Speed 3", 33);
	document.mainform.default_games.options[44] = new Option ("Need for Speed: Hot Pursuit 2", 32);
	document.mainform.default_games.options[45] = new Option ("Neverwinter Nights", 34);
	document.mainform.default_games.options[46] = new Option ("PainKiller ", 35);
	document.mainform.default_games.options[47] = new Option ("PlayStation2 ", 81);
	document.mainform.default_games.options[48] = new Option ("Postal 2: Share the Pain ", 36);
	document.mainform.default_games.options[49] = new Option ("Quake 2", 37);
	document.mainform.default_games.options[50] = new Option ("Quake 3", 38);
	document.mainform.default_games.options[51] = new Option ("Rainbow Six", 39);
	document.mainform.default_games.options[52] = new Option ("Rainbow Six: Raven Shield ", 40);
	document.mainform.default_games.options[53] = new Option ("Return to Castle Wolfenstein ", 41);
	document.mainform.default_games.options[54] = new Option ("Rise of Nations", 42);
	document.mainform.default_games.options[55] = new Option ("Roger Wilco", 78);
	document.mainform.default_games.options[56] = new Option ("Rogue Spear", 43);
	document.mainform.default_games.options[57] = new Option ("Serious Sam II", 44);
	document.mainform.default_games.options[58] = new Option ("Shareaza", 66);
	document.mainform.default_games.options[59] = new Option ("Silent Hunter II", 46);
	document.mainform.default_games.options[60] = new Option ("Soldier of Fortune", 47);
	document.mainform.default_games.options[61] = new Option ("Soldier of Fortune II: Double Helix", 48);
	document.mainform.default_games.options[62] = new Option ("Splinter Cell: Pandora Tomorrow",45);
	document.mainform.default_games.options[63] = new Option ("Star Trek: Elite Force II", 51);
	document.mainform.default_games.options[64] = new Option ("Starcraft", 49);
	document.mainform.default_games.options[65] = new Option ("Starsiege Tribes", 50);	
	document.mainform.default_games.options[66] = new Option ("Steam", 72);
	document.mainform.default_games.options[67] = new Option ("SWAT 4", 82);
	document.mainform.default_games.options[68] = new Option ("TeamSpeak", 79);
	document.mainform.default_games.options[69] = new Option ("Tiberian Sun", 52);
	document.mainform.default_games.options[70] = new Option ("Tiger Woods 2K4", 53);
	document.mainform.default_games.options[71] = new Option ("Tribes of Vengeance", 80);
	document.mainform.default_games.options[72] = new Option ("Ubi.com", 71);
	document.mainform.default_games.options[73] = new Option ("Ultima", 54);
	document.mainform.default_games.options[74] = new Option ("Unreal", 55);
	document.mainform.default_games.options[75] = new Option ("Unreal Tournament", 56);
	document.mainform.default_games.options[76] = new Option ("Unreal Tournament 2004", 57);
	document.mainform.default_games.options[77] = new Option ("Vietcong ", 58);
	document.mainform.default_games.options[78] = new Option ("Warcraft II", 59);
	document.mainform.default_games.options[79] = new Option ("Warcraft III", 60);
	document.mainform.default_games.options[80] = new Option ("WinMX", 68);
	document.mainform.default_games.options[81] = new Option ("Wolfenstein: Enemy Territory ", 61);
	document.mainform.default_games.options[82] = new Option ("WON Servers", 69);
	document.mainform.default_games.options[83] = new Option ("World of Warcraft", 62);	
	document.mainform.default_games.options[84] = new Option ("Xbox Live", 70);
}

/*
 * getGammingEntry()
 *	Returns associated information of selected game entry from dropdown box.
 */
function getGammingEntry()
{
	games = new Array();
	
	games[0] = new Object;
	games[0].tcp_port_to_open = "2302-2400,6073"							
	games[0].udp_port_to_open = "2302-2400,6073"
	
	games[1] = new Object;
	games[1].tcp_port_to_open = "20045"
	games[1].udp_port_to_open = "1716-1718,8777,27900"
	
	games[2] = new Object;
	games[2].tcp_port_to_open = "80,2300-2400,8000-8999"
	games[2].udp_port_to_open = "80,2300-2400,8000-8999"
	
	games[3] = new Object;
	games[3].tcp_port_to_open = "9000-9013"
	games[3].udp_port_to_open = "2001,9000-9013"
		
	games[4] = new Object;
	games[4].tcp_port_to_open = ""
	games[4].udp_port_to_open = "14567,22000,23000-23009,27900,28900"
	
	games[5] = new Object;
	games[5].tcp_port_to_open = ""
	games[5].udp_port_to_open = "4755,23000,22000,27243-27245"
	
	games[6] = new Object;
	games[6].tcp_port_to_open = "2611-2612,6500,6667,27900"
	games[6].udp_port_to_open = "2611-2612,6500,6667,27900"
	
	games[7] = new Object;
	games[7].tcp_port_to_open = "28960"
	games[7].udp_port_to_open = "28960"
	
	games[8] = new Object;
	games[8].tcp_port_to_open = "80,6667,28910,29900,29920"
	games[8].udp_port_to_open = "4321,27900"
	
	games[9] = new Object;
	games[9].tcp_port_to_open = "80,6667,28910,29900,29920"
	games[9].udp_port_to_open = "4321,27900"
	
	games[10] = new Object;
	games[10].tcp_port_to_open = "27030-27039"
	games[10].udp_port_to_open = "1200,27000-27015"
	
	games[11] = new Object;
	games[11].tcp_port_to_open = "1121,3040,28801,28805"
	games[11].udp_port_to_open = ""
	
	games[12] = new Object;
	games[12].tcp_port_to_open = "26214"	
	games[12].udp_port_to_open = "26214"
	
	games[13] = new Object;
	games[13].tcp_port_to_open = "3100-3999"
	games[13].udp_port_to_open = "3568"

	games[14] = new Object;
	games[14].tcp_port_to_open = "6112-6119,4000"
	games[14].udp_port_to_open = "6112-6119"

	games[15] = new Object;
	games[15].tcp_port_to_open = ""
	games[15].udp_port_to_open = "27666"

	games[16] = new Object;
	games[16].tcp_port_to_open = ""
	games[16].udp_port_to_open = "6073,2302-2400"

	games[17] = new Object;
	games[17].tcp_port_to_open = "1024-6000,7000"
	games[17].udp_port_to_open = "1024-6000,7000"

	games[18] = new Object;
	games[18].tcp_port_to_open = ""
	games[18].udp_port_to_open = "49001,49002"

	games[19] = new Object;
	games[19].tcp_port_to_open = "2346-2348"
	games[19].udp_port_to_open = "2346-2348"

	games[20] = new Object;
	games[20].tcp_port_to_open = "25,80,110,443,50000-65535"
	games[20].udp_port_to_open = "50000-65535"

	games[21] = new Object;
	games[21].tcp_port_to_open = "1024-65535"
	games[21].udp_port_to_open = "50000-65535"

	games[22] = new Object;
	games[22].tcp_port_to_open = "6003, 7002"
	games[22].udp_port_to_open = "27005,27010,27011,27015"

	games[23] = new Object;
	games[23].tcp_port_to_open = ""
	games[23].udp_port_to_open = "2302,2303"

	games[24] = new Object;
	games[24].tcp_port_to_open = "28910"
	games[24].udp_port_to_open = "28910"

	games[25] = new Object;
	games[25].tcp_port_to_open = "26900"
	games[25].udp_port_to_open = "26900"

	games[26] = new Object;	
	games[26].tcp_port_to_open = ""
	games[26].udp_port_to_open = "28060,28061,28062,28070-28081"

	games[27] = new Object;	
	games[27].tcp_port_to_open = ""
	games[27].udp_port_to_open = "28060,28061,28062,28070-28081"

	games[28] = new Object;	
	games[28].tcp_port_to_open = "2300-2400,47624"
	games[28].udp_port_to_open = "2300-2400,6073"

	games[29] = new Object;	
	games[29].tcp_port_to_open = "12203-12204"
	games[29].udp_port_to_open = ""

	games[30] = new Object;	
	games[30].tcp_port_to_open = "3453"
	games[30].udp_port_to_open = "3453"
	
	games[31] = new Object;
	games[31].tcp_port_to_open = "9442"
	games[31].udp_port_to_open = "9442"

	games[32] = new Object;
	games[32].tcp_port_to_open = "8511,28900"	
	games[32].udp_port_to_open = "1230,8512,27900,61200-61230"

	games[33] = new Object;
	games[33].tcp_port_to_open = "1030"	
	games[33].udp_port_to_open = "1030"

	games[34] = new Object;
	games[34].tcp_port_to_open = ""	
	games[34].udp_port_to_open = "5120-5300,6500,27900,28900"

	games[35] = new Object;
	games[35].tcp_port_to_open = ""	
	games[35].udp_port_to_open = "3455"

	games[36] = new Object;
	games[36].tcp_port_to_open = "80"	
	games[36].udp_port_to_open = "7777-7779,27900,28900"

	games[37] = new Object;
	games[37].tcp_port_to_open = "27910"	
	games[37].udp_port_to_open = "27910"

	games[38] = new Object;
	games[38].tcp_port_to_open = "27660,27960"	
	games[38].udp_port_to_open = "27660,27960"

	games[39] = new Object;
	games[39].tcp_port_to_open = "2346"	
	games[39].udp_port_to_open = "2346"

	games[40] = new Object;
	games[40].tcp_port_to_open = ""	
	games[40].udp_port_to_open = "7777-7787,8777-8787"

	games[41] = new Object;
	games[41].tcp_port_to_open = ""	
	games[41].udp_port_to_open = "27950,27960,27965,27952"

	games[42] = new Object;
	games[42].tcp_port_to_open = ""	
	games[42].udp_port_to_open = "34987"

	games[43] = new Object;
	games[43].tcp_port_to_open = "2346"	
	games[43].udp_port_to_open = "2346"

	games[44] = new Object;
	games[44].tcp_port_to_open = "25600-25605"
	games[44].udp_port_to_open = "25600-25605"

	games[45] = new Object;
	games[45].tcp_port_to_open = "40000-43000"	
	games[45].udp_port_to_open = "44000-45001,7776,8888"

	games[46] = new Object;
	games[46].tcp_port_to_open = "3000"	
	games[46].udp_port_to_open = "3000"

	games[47] = new Object;
	games[47].tcp_port_to_open = ""	
	games[47].udp_port_to_open = "28901,28910,38900-38910,22100-23000"

	games[48] = new Object;
	games[48].tcp_port_to_open = ""	
	games[48].udp_port_to_open = "20100-20112"

	games[49] = new Object;
	games[49].tcp_port_to_open = "6112-6119,4000"	
	games[49].udp_port_to_open = "6112-6119"

	games[50] = new Object;
	games[50].tcp_port_to_open = ""	
	games[50].udp_port_to_open = "27999,28000"

	games[51] = new Object;
	games[51].tcp_port_to_open = ""	
	games[51].udp_port_to_open = "29250,29256"

	games[52] = new Object;
	games[52].tcp_port_to_open = "1140-1234,4000"	
	games[52].udp_port_to_open = "1140-1234,4000"

	games[53] = new Object;
	games[53].tcp_port_to_open = "80,443,1791-1792,13500,20801-20900,32768-65535"	
	games[53].udp_port_to_open = "80,443,1791-1792,13500,20801-20900,32768-65535"

	games[54] = new Object;
	games[54].tcp_port_to_open = "5001-5010,7775-7777,7875,8800-8900,9999"	
	games[54].udp_port_to_open = "5001-5010,7775-7777,7875,8800-8900,9999"

	games[55] = new Object;
	games[55].tcp_port_to_open = "7777,8888,27900"	
	games[55].udp_port_to_open = "7777-7781"

	games[56] = new Object;
	games[56].tcp_port_to_open = "7777-7783,8080,27900"	
	games[56].udp_port_to_open = "7777-7783,8080,27900"

	games[57] = new Object;
	games[57].tcp_port_to_open = "28902"	
	games[57].udp_port_to_open = "7777-7778,7787-7788"

	games[58] = new Object;
	games[58].tcp_port_to_open = ""	
	games[58].udp_port_to_open = "5425,15425,28900"

	games[59] = new Object;
	games[59].tcp_port_to_open = "6112-6119,4000"	
	games[59].udp_port_to_open = "6112-6119"

	games[60] = new Object;
	games[60].tcp_port_to_open = "6112-6119,4000"	
	games[60].udp_port_to_open = "6112-6119"

	games[61] = new Object;
	games[61].tcp_port_to_open = ""	
	games[61].udp_port_to_open = "27950,27960,27965,27952"

	games[62] = new Object;
	games[62].tcp_port_to_open = "3724,6112,6881-6999"
	games[62].udp_port_to_open = ""

	games[63] = new Object;
	games[63].tcp_port_to_open = "6881-6889"	
	games[63].udp_port_to_open = ""

	games[64] = new Object;
	games[64].tcp_port_to_open = "6346"	
	games[64].udp_port_to_open = "6346"

	games[65] = new Object;
	games[65].tcp_port_to_open = "4661-4662"	
	games[65].udp_port_to_open = "4665"

	games[66] = new Object;
	games[66].tcp_port_to_open = "6346"	
	games[66].udp_port_to_open = "6346"

	games[67] = new Object;
	games[67].tcp_port_to_open = "4661-4662,4711"	
	games[67].udp_port_to_open = "4672,4665"

	games[68] = new Object;
	games[68].tcp_port_to_open = "6699"	
	games[68].udp_port_to_open = "6257"

	games[69] = new Object;
	games[69].tcp_port_to_open = "27000-27999"	
	games[69].udp_port_to_open = "15001,15101,15200,15400"

	games[70] = new Object;
	games[70].tcp_port_to_open = "3074"	
	games[70].udp_port_to_open = "88,3074"

	games[71] = new Object;
	games[71].tcp_port_to_open = "40000-42999"	
	games[71].udp_port_to_open = "41005"

	games[72] = new Object;
	games[72].tcp_port_to_open = "27030-27039"	
	games[72].udp_port_to_open = "1200,27000-27015"

	games[73] = new Object;
	games[73].tcp_port_to_open = "6667"	
	games[73].udp_port_to_open = "28800-29000"

	games[74] = new Object;
	games[74].tcp_port_to_open = "2300-2400,47624"	
	games[74].udp_port_to_open = "2300-2400"

	games[75] = new Object;
	games[75].tcp_port_to_open = ""
	games[75].udp_port_to_open = "2213,6666"

	games[76] = new Object;
	games[76].tcp_port_to_open = ""	
	games[76].udp_port_to_open = "6500"

	games[77] = new Object;
	games[77].tcp_port_to_open = ""	
	games[77].udp_port_to_open = "6700"

	games[78] = new Object;
	games[78].tcp_port_to_open = "3782"	
	games[78].udp_port_to_open = "27900,28900,3782-3783"

	games[79] = new Object;
	games[79].tcp_port_to_open = ""	
	games[79].udp_port_to_open = "8767"

	games[80] = new Object;
	games[80].tcp_port_to_open = "7777,7778,28910"
	games[80].udp_port_to_open = "6500,7777,7778,27900"

	games[81] = new Object;
	games[81].tcp_port_to_open = "4658,4659"
	games[81].udp_port_to_open = "4658,4659"

	games[82] = new Object;
	games[82].tcp_port_to_open = ""
	games[82].udp_port_to_open = "10480-10483"

	games[83] = new Object;
	games[83].tcp_port_to_open = "1720,15328-15333"
	games[83].udp_port_to_open = "15328-15333"

	var index = document.mainform.default_games.options[document.mainform.default_games.selectedIndex].value;
	games[index].name = document.mainform.default_games.options[document.mainform.default_games.selectedIndex].text;
	return games[index];
}

/*
 * computeSpecialApplicationPulldown()
 *	Populates default Special Application entries into dropdown box
 */
function computeSpecialApplicationPulldown()
{
	document.mainform.default_special_applications.options[0] = new Option ("Select Special Application", -1);
	document.mainform.default_special_applications.options[1] = new Option ("AIM Talk", 0);
	document.mainform.default_special_applications.options[2] = new Option ("BitTorrent", 1);
	document.mainform.default_special_applications.options[3] = new Option ("Calista IP phone", 2);
	document.mainform.default_special_applications.options[4] = new Option ("ICQ", 3);
	document.mainform.default_special_applications.options[5] = new Option ("MSN Messenger", 4);
	document.mainform.default_special_applications.options[6] = new Option ("PalTalk", 5);
}

/*
 * getSpecialApplicationEntry()
 *	Returns associated information of selected special application entry from dropdown box.
 */
function getSpecialApplicationEntry()
{
	special_application = new Array();
	
	special_application[0] = new Object;
	special_application[0].input_ports_port_range = "5190" 
	special_application[0].input_ports_protocol = 6
	special_application[0].trigger_ports_port_range = "4099"
	special_application[0].trigger_ports_protocol = 6;
	
	special_application[1] = new Object;
	special_application[1].input_ports_port_range = "6881-6889";
	special_application[1].input_ports_protocol = 6;
	special_application[1].trigger_ports_port_range = "6969";
	special_application[1].trigger_ports_protocol = 6;
	
	special_application[2] = new Object;
	special_application[2].input_ports_port_range = "3000";
	special_application[2].input_ports_protocol = 17;
	special_application[2].trigger_ports_port_range = "5190";
	special_application[2].trigger_ports_protocol = 6;
 
	special_application[3] = new Object;
	special_application[3].input_ports_port_range = "20000,20019,20039,20059";
	special_application[3].input_ports_protocol = 6;
	special_application[3].trigger_ports_port_range = "4000";
	special_application[3].trigger_ports_protocol = 17;

	special_application[4] = new Object;
	special_application[4].input_ports_port_range = "1863,5190,6891,6901";
	special_application[4].input_ports_protocol = 0;
	special_application[4].trigger_ports_port_range = "1863,5190,6891,6901";
	special_application[4].trigger_ports_protocol = 0;
	
	special_application[5] = new Object;
	special_application[5].input_ports_port_range = "2090,2091,2095";
	special_application[5].input_ports_protocol = 0;
	special_application[5].trigger_ports_port_range = "5001-5020";
	special_application[5].trigger_ports_protocol = 6;
	
	var index = document.mainform.default_special_applications.options[document.mainform.default_special_applications.selectedIndex].value;
	special_application[index].entry_name = document.mainform.default_special_applications.options[document.mainform.default_special_applications.selectedIndex].text;
	return special_application[index];
}

/*
 * computeBigpondServerPulldown()
 *	Populates default Bigpond server entries into dropdown box
 */
function computeBigpondServerPulldown()
{
	document.mainform.bigpond_servers.options[0] = new Option ("Select BigPond Server", -1);
	document.mainform.bigpond_servers.options[1] = new Option ("Name1", 0);
	document.mainform.bigpond_servers.options[2] = new Option ("Name2", 1);
	document.mainform.bigpond_servers.options[3] = new Option ("Name3", 2);
}

/*
 * DebugDisplayFields
 *	Dump the current wireless setting if the ctrlKey is pressed
 */
function DebugDisplayFields(when)
{
	if (!window || !window.event || !window.event.ctrlKey) {
		return;
	}	
	
	var s = "";
	s += when + ":\n";
	s += "SSID=" + data.wireless.SSID + "\n";
	s += "radio_control=" + data.wireless.radio_control + "\n";
	s += "region_id=" + data.wireless.region_id + "\n";
	s += "channel=" + data.wireless.channel + "\n";
	s += "wpa_enabled="	+ data.wireless.wpa_enabled + "\n";
	s += "wpa_psk=" + data.wireless.wpa_psk + "\n";
	s += "wpa_cipher=" + data.wireless.wpa_cipher + "\n";
	s += "wpa_rekey_time=" + data.wireless.wpa_rekey_time + "\n";
	s += "ieee8021x_enabled=" + data.wireless.ieee8021x_enabled + "\n";
	s += "wepon=" + data.wireless.wepon + "\n";
	s += "keylen=" + data.wireless.keylen + "\n";
	s += "wep_key[0]=" + data.wireless.wep_key[0] + "\n";
	s += "use_key=" + data.wireless.use_key + "\n";
	s += "auth=" + data.wireless.auth + "\n";
	alert(s);
}

/*
 * LoadActiveX
 *	Load the WCN ActiveX control
 */
function LoadActiveX(wcn_id, classid, codebase)
{
	document.getElementById("wcn_activex").innerHTML = '<object classid=\"clsid:' + classid + '\" ID=\"' + wcn_id + '\" VIEWASTEXT height=0 width=0 codebase=\"' + codebase + '\"></object>';
}

/*
 * GetIEVersion
 *	Get the major version of IE. Return -1 if it is not IE
 */
function GetIEVersion()
{
	var agt=navigator.userAgent.toLowerCase();
	var ie_ix = agt.indexOf("msie");
	if (ie_ix != -1) {
		return (agt.charAt(ie_ix + 5) - '0');
	}
	return -1;
}

/*
 * IsActiveXReady
 *	Is the ActiveX is ready to be used
 */
function IsActiveXReady(ax)
{
	return ax.ReadyState == 4;
}

function DebugAlert(msg)
{
	if (window && window.event && window.event.ctrlKey) {
		alert(msg);
	}	
}

/*
 * IsWCNSupported
 *	WCN is only supported on Windows XP/SP2 or later platforms, parse the userAgent string as much as possible to
 *	determin the os platform.
 *
 * check http://forums.devarticles.com/archive/t-1031/UserAgent for the list of userAgent formats
 * on different browsers/versions.
 */
function IsWCNSupported() 
{
	var agt = navigator.userAgent.toLowerCase();
	
	// msie 5.0 shows 'windows xp' instead of 'windows nt 5.1' and no sp version. 
	// the activex has to take care of the sp version check in this case
	if (agt.indexOf("windows xp") != -1) {
		return true;
	}
	
	// otherwise, the xp name string has to be 'windows nt 5.1;'
	var os_ix = agt.indexOf("windows nt ");
	if (os_ix == -1) {
		return false;
	}
	var major = agt.charAt(os_ix + 11);
	var minor = agt.charAt(os_ix + 13);
	// it's XP or newer version os
	if (major >= '5' && minor > '1') {
		return true;
	}
	
	// only MSIE 6.0 or later gives Service Pack version in userAgent string.
	// again, the activex has to take care of the sp version check in this case
	if (GetIEVersion >= 6) {
		// check SP version, SP2 should be shown as sv1
		var sp_ix = agt.indexOf("sv");
		if (sp_ix <= os_ix) {
			return false;
		}
		var sp_v = agt.charAt(sp_ix + 2);
		if (sp_v < '1') {
			return false;
		}
	}
	
	return true;
}

/*
 * IsActiveXSupported
 *	Whether the browser supports ActiveX
 *
 * To make things simpler, only IE4.0 or later is supported here
 */
function IsActiveXSupported()
{
	return (GetIEVersion() >= 4);
	
	/*
		Microsoft IE 4.0 or later supports ActiveX. Most of other browsers, like Netscape and Firefox,
		may have plugins to support ActiveX. However, very often Active is only enabled for a few controls
		and it needs the user to add the clsid to the allowed list, too complex for WCN.
	
	var pi = navigator.plugins;
	for (var i=0; i< pi.length; i++) {
		if (pi[i].name.toLowerCase().indexOf("activex") != -1) {
			return true;
		}
	}
	return false;
	*/
}

/*
 * LoadWCNObject
 *	Common procedure to dynamically load the ActiveX control and verify the state of the control
 */
function LoadWCNObject(wcn_id, classid, codebase) 
{
	// http://www.metalusions.com/backstage/articles/8/, for older versions of IE
	if(document.all && !document.getElementById) {
		document.getElementById = function(id) {
			return document.all[id];
		}
	}

	var wcn_obj = document.getElementById(wcn_id);
	
	if (!wcn_obj) {
		LoadActiveX(wcn_id, classid, codebase);
		wcn_obj = document.getElementById(wcn_id);
		if (!IsActiveXReady(wcn_obj)) {
			alert('Please accept and install the ActiveX, then try it again.');
			return false;
		}
	} else  {
		if (!IsActiveXReady(wcn_obj)) {
			alert('WCN ActiveX control is not available. Please check the security setting and refresh this page to install it.');
			return false;
		}
	}	
	return true;
}

/*
 * WCNValidateWSettings
 *	Check if the current wireless settings are supported by WCN
 */
function WCNValidateWSettings()
{
	if (data.wireless.wepon && data.wireless.use_key != 0) {
		alert('WCN does not support key index other than 1 now.');
		return false;
	}
	
	if (data.wireless.wpa_enabled) {
		if (data.wireless.wpa_mode >= 2) {
			alert('WCN does not support WPA2 mode now.');
			return false;
		}
		
		if (data.wireless.ieee8021x_enabled) {
			alert('WCN does not support WPA enterprise authentication now.');
			return false;
		}
	}

	// TODO: add more validation here	
	return true;
}

function calcDayList(x)
{
	var days = new Array ("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
	if (x==127) return "Every Day ";
	s = "";
	for (var i=0; i<7; i++) if (x&(1<<i)) s += days[i] + " ";
	return s;
}

function calcTimeFrame(i)
{
	if (data.sched_table[i].start_time==0 && data.sched_table[i].end_time==86400) return "(All Day)";
	var m = Math.floor (data.sched_table[i].start_time/60);
	var h = Math.floor (m/60);
	m = m - h*60;
	var sh;
	var sm = m * 1;
	var sampm;
	if ( h < 12) {
		if (h == 0) {
			sh = 12;
		} else {
			sh = h;
		}
		sampm = "AM";
	} else {
		if (h != 12) {
			sh = h - 12;
		} else {
			sh = h;
		}
		sampm = "PM";
	}

	m = Math.floor (data.sched_table[i].end_time/60);
	h = Math.floor (m/60);
	m = m - h*60;
	var eh;
	var em = m * 1;
	var eampm;
	if ( h < 12) {
		if (h == 0) {
			eh = 12;
		} else {
			eh = h;
		}
		eampm = "AM";
	} else {
		if (h != 12) {
			eh = h - 12;
		} else {
			eh = h;
		}
		eampm = "PM";
	}
	
	if (sh < 10) sh = "0"+sh;
	if (sm < 10) sm = "0"+sm;
	if (eh < 10) eh = "0"+eh;
	if (em < 10) em = "0"+em;
	return '(' + sh+':'+sm+' '+sampm+' - '+eh+':'+em+' '+eampm + ')';
}

function UpdateFilterDescription()
{
	for (var i = 0; i < ARRAYSIZE_INGRESS_RULES; i++) {
		if (data.ingress_rules[i].used == 1) {
			if (document.mainform.ingress_filter_names.options[document.mainform.ingress_filter_names.selectedIndex].text == data.ingress_rules[i].ingress_filter_name) {
				if (data.ingress_rules[i].action == 0) action = 'Allow';
				else action = 'Deny';
				document.mainform.filtext.value = action + '  ' + getAllIpRanges(i);
				return;
			}
		}
	}
	if (document.mainform.ingress_filter_names.selectedIndex == 0) document.mainform.filtext.value = "Everyone allowed";
	else if (document.mainform.ingress_filter_names.selectedIndex == 1) document.mainform.filtext.value = "No one allowed";
	else document.mainform.filtext.value = "";
}

function UpdateScheduleDescription()
{
	for (var i = 0; i < ARRAYSIZE_SCHED_TABLE; i++) {
		if (data.sched_table[i].used == 1) {
			if (document.mainform.schedule_names.options[document.mainform.schedule_names.selectedIndex].text == data.sched_table[i].sched_name) {
				document.mainform.schtext.value = calcDayList(data.sched_table[i].weekdays) + calcTimeFrame(i);
				return;
			}
		}
	}
	if (document.mainform.schedule_names.selectedIndex == 0) document.mainform.schtext.value = "Always";
	else if (document.mainform.schedule_names.selectedIndex == 1) document.mainform.schtext.value = "Never";
	else document.mainform.schtext.value = "";
}

/*
 * Return IP range in string format.  For example, 
 * (0.0.0.0, 255.255.255.255) returns '*'
 * (10.10.0.1, 10.10.0.1)  returns '10.10.0.1'
 * (10.10.0.1, 10.10.0.10) returns '10.10.0.1-10.10.0.10'
 */
function getIp (start, end)
{
	if ((start == '0.0.0.0') && (end == '255.255.255.255')) {
		return '*';
	}
	if (start == end) {
		return start;
	}
	return start+'-'+end;
}

/*
 * Get IP ranges in ingress filter rule in string format, comma separated.
 */
function getAllIpRanges (i)
{
	var str = '', firstItem=1;
	for (var j = 0; j < ARRAYSIZE_INGRESS_RULES_ITEM_IP_RANGE_TABLE; j++) {
		if (data.ingress_rules[i].ip_range_table[j].enabled) {
			if (firstItem == 1) {
				firstItem = 0; 
			}
			else {
				str += ',';
			}
			str += getIp(data.ingress_rules[i].ip_range_table[j].ip_start, data.ingress_rules[i].ip_range_table[j].ip_end);
		}
	}
	return str;
}

/* 
 * isNumberInRange
 * 	Return 1 if val is within ranges in input_string 
 */
function isNumberInRange(val, input_string)
{
	input_string = new String (input_string);
	var s = input_string;
	/* check individual port numbers */
	var got = s.match (/\d+/g);
	if (got) {
		for (var i=0; i<got.length; i++) {
			var n = parseInt(got[i],10);
			if (val == n) {
				return 1;
			}			
		}
	}
		
	/* check port ranges */
	got = s.match (/\d+\s*-\s*\d+/g);
	if (got) {
		for (var i=0; i<got.length; i++) {
			var got2 = got[i].match (/(\d+)\s*-\s*(\d+)/);
			if (got2) {
				var start = parseInt(got2[1]);
				var end = parseInt(got2[2]);
				if ((start <= val) && (val <= end)) {
					return 1;
				}				
			}
		}
	}
	return 0;
}

/*
 * isNumberOverlapped
 *	Return 1 if number in string1 overlapped with string2.
 */
function isStringOverlapped(string1, string2)
{
	/* check individual port numbers */
	input_string = new String (string1);
	var s = input_string;
	var got = s.match (/\d+/g);		
	if (got) {
		for (var j=0; j<got.length; j++) {
			var n = parseInt(got[j],10);
			if (isNumberInRange(n, string2)) {
				return 1;
			}	
		}
	}
	return 0;
}
	
/*
 * isPortOverlapped
 *	Returns 1 if port range in string1 is overlapped with string2.
 *  Protocol must match.  BOTH=0, TCP=6, UDP=17.
 */
function isPortOverlapped(protocol1, string1, protocol2, string2)
{
	/* check only if both protocols are the same or one of them is both (0) */
	if ((protocol1 == protocol2) || (protocol1 == 0) || (protocol2 == 0)) {
		/* check individual port numbers in string 1 against string2, and vice versa */
		if (isStringOverlapped(string1, string2) || isStringOverlapped(string2, string1)) {
			return 1;
		}		
	}
	return 0;
}


/*
 * isNumDuplicated
 *	Returns 1 if any number in string1 is overlapped with another.
 *  Examples are "10, 5-15" or "1,2,2".
 */
function isNumDuplicated(string1, error_string)
{
	var num_array = string1.split(",");

	for (var loop=0; loop < num_array.length; loop++) {
		for (var i=0; i < num_array.length; i++) {
			if ((i != loop) &&
					(isStringOverlapped(num_array[loop], num_array[i]) || 
				 	 isStringOverlapped(num_array[i], num_array[loop]))) {
				alert(error_string+' ['+string1+'] '+'should not contain duplicated numbers');
				return 1;
			}
		}		
	}
	return 0;
}
