/*
 * jrgp - 8/2/2010
 */

function show_lobby_form() {
	// Create form element
	var l_form = document.createElement('form');
	l_form.id = 'lobby_search_form';
	l_form.onsubmit = function() {load_servers(this.form.elements, false); return false; }

	// Generate more parts of the form
	var fieldset = document.createElement('fieldset');
	/*var legend = document.createElement('legend');
	legend.appendChild(document.createTextNode('Customize Your Search'));
	l_form.appendChild(legend);*/

	// Gametypes in menu
	var gtf = [['all', 'All']];
	for (var key in game_types)
		gtf.push([key, game_types[key]]);

	// Individual fields
	var form_fields = [
		//{key: 'be', name: 'BE', type: 'dropdown', options: [['all','All'],['yes','Yes'],['no','No']]},
		//{key: 'nm', name: 'Name', type: 'textbox'},
		{key: 'gt', name: 'Gametype', type: 'dropdown', options: gtf, def: defaults['gametype']},
		{key: 'c', name: 'Country', type: 'dropdown', options: lobby_countries, def: defaults['country']},
		{key: 'v', name: 'Version', type: 'dropdown', options: lobby_versions},
		{key: 'bots', name: 'Bots', type: 'dropdown', options: [['all','All'], ['yes', 'Yes'], ['no', 'No']]},
		{key: 'locked', name: 'Private', type: 'dropdown', options: [['all','All'], ['yes', 'Yes'], ['no', 'No']]},
		{key: 'r', name: 'Realistic', type: 'dropdown', options: [['all','All'], ['yes', 'Yes'], ['no', 'No']]},
		{key: 's', name: 'Survival', type: 'dropdown', options: [['all','All'], ['yes', 'Yes'], ['no', 'No']]},
		{key: 'a', name: 'Advanced', type: 'dropdown', options: [['all','All'], ['yes', 'Yes'], ['no', 'No']]},
		{key: 'w', name: 'Modded', type: 'dropdown', options: [['all','All'], ['yes', 'Yes'], ['no', 'No']]},
		//{key: 'ded', name: 'Dedicated', type: 'dropdown', options: [['all','All'], ['yes', 'Yes'], ['no', 'No']]},
		{key: 'os', name: 'OS', type: 'dropdown', options: [['all','All'],['lin','Linux'],['win','Windows']]},
		{key: 'pl', name: 'Players', type: 'dropdown',options: [['all','All'],['full','Full'],['empty','Empty'], ['nf', 'Not full'], ['ne', 'Not empy'], ['nor', 'Not empty or full']]}
	];

	// Do the individual fields
	for (var i in form_fields) {
		var field = form_fields[i];
		switch (field['type']) {
			
			// Handle a drop down menu
			case 'dropdown':
				var field_elem = document.createElement('select');
				field_elem.name = field['key']; 
				field_elem.id = 'lsf_'+field['key'];
				field_elem.onchange = function() {load_servers(this.form.elements, false); return false;}
				for (var i in field['options']) {
					var opt = document.createElement('option');
					if (field['def'] && field['def'] == field['options'][i][0]) 
						opt.setAttribute('selected', 'selected');
					opt.value = field['options'][i][0];
					opt.text = field['options'][i][1];
					field_elem.add(opt, null);
				}

			break;

			// Textbox. For keywords and shit
			case 'textbox':
				var field_elem = document.createElement('input');
				field_elem.setAttribute('type', 'textbox');
				field_elem.id = 'lsf_'+field['key'];
				field_elem.onkeypress = function() {load_servers(this.form.elements, this.value); return false;}
			break;
			
			// todo whenever?
			case 'radio':
			case 'checkbox':
			default:
				continue;
			break;
		}
				
		// Save this field in form
		var field_wrap = document.createElement('div');
		field_wrap.className = 'lsf_field';
		var field_label = document.createElement('label');
		field_label.setAttribute('for', 'lsf_'+field['key']);
		field_label.appendChild(document.createTextNode(field['name']+': '));
		field_wrap.appendChild(field_label);
		field_wrap.appendChild(field_elem);
		l_form.appendChild(field_wrap);
	}

	// Search button
	/*var search_btn = document.createElement('input');
	search_btn.type = 'submit';
	search_btn.value = 'Search';
	l_form.appendChild(search_btn);*/

	// Lastly, show form
	document.getElementById('lobby_form').appendChild(l_form);
}

function lobby_error(message) {
	// Empty holder
	kill_nodes(document.getElementById('lobby_holder'));
	
	// Show error
	var error_holder = document.createElement('p');
	error_holder.className = 'error_msg';
	error_holder.appendChild(document.createTextNode(message));
	document.getElementById('lobby_holder').appendChild(error_holder);
}

function lobby_loading() {
	// Empty holders
	kill_nodes(document.getElementById('lobby_holder'));
	kill_nodes(document.getElementById('lobby_server_count'));

	// Loading stuff
	var loader = document.createElement('p');
	loader.className = 'ajax_loader';
	loader.appendChild(document.createTextNode('Loading'));
	document.getElementById('lobby_holder').appendChild(loader);
	document.getElementById('lobby_server_count').appendChild(document.createTextNode('Loading..'));
}

// Thanks to: http://www.thefutureoftheweb.com/blog/defining-functions-in-a-loop
function attach_record(link, address, name) {
	link.onclick = function() {record_server_join(address, encode64(name))}
}
function attach_sort(index) {
	handle_sorting(index);
}

function show_servers(servers) {

	// No servers?
	if (servers.length == 0) {
		
		// Kill that fucker
		kill_nodes(document.getElementById('lobby_holder'));

		// A message saying so
		var msg = document.createElement('p');
		msg.style.textAlign = 'center';
		msg.appendChild(document.createTextNode('No Servers Found'));
		document.getElementById('lobby_holder').appendChild(msg);

		// Give number of players and ned here
		return 0;
	}
	
	// Construct table
	var lobby_table = document.createElement('table');
	lobby_table.id = 'lobby';
	var lobby_head_row = document.createElement('tr');
	var fields = ['Name', 'Mode', 'Map', 'Players', 'Version', 'P', /*'BE',*/ 'OS'];
	for (var i in fields) {
		var field = document.createElement('th');
		with({'i':i}) {field.onclick = function() {attach_sort(i)}}
		field.appendChild(document.createTextNode(fields[i]));
		lobby_head_row.appendChild(field);
	}
	var lobby_head = document.createElement('thead');
	lobby_head.appendChild(lobby_head_row);
	lobby_table.appendChild(lobby_head);
	
	var lobby_table_body = document.createElement('tbody');
	var frag = document.createDocumentFragment();


	// Get these out of the way now so we can just clone or append them instead of making them each time
	var td = document.createElement('td');
	var tr_e = document.createElement('tr');
	var span_e = document.createElement('span');
	var img_e = document.createElement('img');
	var a_e = document.createElement('a');
	var be_icon = span_e.cloneNode(false);
	be_icon.className = 'be_icon';
	var lock_icon = span_e.cloneNode(false);
	lock_icon.className = 'lock_icon';

	// Tally of online players
	var players_online = 0;

	// Show the servers
	var sn = servers.length;
	for (var i = 0; i < sn; i++) {
		var tr = tr_e.cloneNode(false);
		tr.title = servers[i]['info'];

		// Increase overall player count
		players_online += Number(servers[i]['pl']);

		// Name field
		var name = td.cloneNode(false);
		var flag = img_e.cloneNode(false);
		var link = a_e.cloneNode(false);
		link.href = 'soldat://'+servers[i]['ip'];
		link.appendChild(document.createTextNode(servers[i]['t']));
		attach_record(link, servers[i]['ip'], servers[i]['t']);
		flag.src = 'http://static.thd.vg/unified/images/flags/'+servers[i]['c']+'_off.png';
		flag.className = 'flag';
		name.appendChild(link);
		name.appendChild(flag);
		
		// Info
		if (servers[i]['info'] != '') {
			var info_wrap = span_e.cloneNode(false);
			info_wrap.className = 'info_wrap';
			var info_text = span_e.cloneNode(false);
			info_text.className = 'info_text';
			info_text.appendChild(document.createTextNode(servers[i]['info']));
			info_wrap.appendChild(info_text);
			name.appendChild(info_wrap);
		}

		// Save name and info
		tr.appendChild(name);


		// Mode field
		var mode = td.cloneNode(false);
		mode.className = 'center';
		mode.appendChild(document.createTextNode(game_types[servers[i]['gs']]));
		tr.appendChild(mode);
		
		// Map field
		var map = td.cloneNode(false);
		map.appendChild(document.createTextNode(servers[i]['map']));
		tr.appendChild(map);
		
		// Players field
		var players = td.cloneNode(false);
		players.className = 'center';
		players.appendChild(document.createTextNode(servers[i]['pl']+'/'+servers[i]['mp']+(servers[i]['bots'] > 0 ? ' (+'+servers[i]['bp']+')' : '')));
		tr.appendChild(players);
		
		// Version field
		var version = td.cloneNode(false);
		version.className = 'center';
		version.appendChild(document.createTextNode('1.'+servers[i]['v'][0]+'.'+servers[i]['v'][1]));
		tr.appendChild(version);
		
		// Password field
		var password = td.cloneNode(false);
		password.className = 'center';
		if (servers[i]['pw'] == true) {
			password.appendChild(lock_icon.cloneNode(true));
		}
		tr.appendChild(password);

		// BE field
		/*var be = td.cloneNode(false);
		be.className = 'center';
		if (servers[i]['be'] == true) {
			be.appendChild(be_icon.cloneNode(true));
		}
		tr.appendChild(be);*/

		// Last but not least, OS
		var os = td.cloneNode(false);
		os.className = 'center';
		os_icon = document.createElement('span');
		os_icon.className = servers[i]['os']+'_icon';
		os.appendChild(os_icon);
		tr.appendChild(os);


		// Save this row
		frag.appendChild(tr);
	}

	lobby_table_body.appendChild(frag);

	// Place tbody
	lobby_table.appendChild(lobby_table_body);

	// Empty holder
	kill_nodes(document.getElementById('lobby_holder'));

	// Place table
	document.getElementById('lobby_holder').appendChild(lobby_table);

	// Give number of online players
	return players_online;
}

function load_servers(options, desname) {
	var ajax_handle = grab_ajax_handle();
	
	var reqs = [];

	// Works in Firefox, Opera, Chrome, Safari, etc
	try {
		for (var i in options) {
			reqs.push(options[i].name+'='+options[i].value);
		}
	}
	
	// ... but fucks up on IE. Take a different approach
	catch (e) {
		var elements = document.getElementById('lobby_search_form').getElementsByTagName('select');

		for (var i in elements)
			if (typeof elements[i].value != 'undefined')
				reqs.push(i+'='+elements[i].value);
	}
	
	var url = unified_entry_point+'?site='+unified_current_site+'&language='+unified_current_lang+'&act=lobby&json=yes&reqs='+reqs.join('`');

	ajax_handle.onreadystatechange = function(){
		if (ajax_handle.readyState == 4 && ajax_handle.status == 200) {
			try {
				// using jquery for json since it allegedly works everywhere
				var info = jQuery.parseJSON(ajax_handle.responseText);
			}
			catch (e) {
				lobby_error('Error parsing response with json');
			}

			// filter the cunt
			if (desname && desname.length > 0) {
				var nl = [];
				var sl = info.servers.length;
				var des = desname.toLowerCase();
				for (var slc = 0; slc < sl; slc++ )
					if ((info.servers[slc]['t'].toLowerCase()).indexOf(des) > -1)
						nl.push(info.servers[slc]);
				var num_players = show_servers(nl);
			}
			else
				var num_players = show_servers(info.servers);
					
			
			kill_nodes(document.getElementById('lobby_server_count'));
			document.getElementById('lobby_server_count').appendChild(document.createTextNode(info['num']+' Servers; '+num_players+' Players'));
			handle_sorting(0);
		}
		else {
			lobby_loading();
		}
	}
	
	ajax_handle.open('GET', url, true);
	ajax_handle.send(null);
}

// jquery tablesorter plugin
function handle_sorting(index) {
	$('#lobby').tablesorter({sortList: [[index,0]], widgets: ['zebra']}); 
}

