function serialize (txt) {
	switch(typeof(txt)){
	case 'string':
		return 's:'+txt.length+':"'+txt+'";';
	case 'number':
		if(txt>=0 && String(txt).indexOf('.') == -1 && txt < 65536) return 'i:'+txt+';';
		return 'd:'+txt+';';
	case 'boolean':
		return 'b:'+( (txt)?'1':'0' )+';';
	case 'object':
		var i=0,k,ret='';
		for(k in txt){
			//alert(isNaN(k));
			if(!isNaN(k)) k = Number(k);
			ret += serialize(k)+serialize(txt[k]);
			i++;
		}
		return 'a:'+i+':{'+ret+'}';
	default:
		return 'N;';
		alert('var undefined: '+typeof(txt));return undefined;
	}
}

function unserialize(txt){
	var level=0;
	var arrlen=new Array();
	var del=0;
	var final_t =new Array();
	var key=new Array();
	var save=txt;
	while(1){
		switch(txt.substr(0,1)){
		case 'N':
			del = 2;
			ret = null;
		break;
		case 'b':
			del = txt.indexOf(';')+1;
			ret = (txt.substring(2,del-1) == '1')?true:false;
		break;
		case 'i':
			del = txt.indexOf(';')+1;
			ret = Number(txt.substring(2,del-1));
		break;
		case 'd':
			del = txt.indexOf(';')+1;
			ret = Number(txt.substring(2,del-1));
		break;
		case 's':
			del = txt.substr(2,txt.substr(2).indexOf(':'));
			ret = txt.substr( 1+txt.indexOf('"'),del);
			del = txt.indexOf('"')+ 1 + ret.length + 2;
		break;
		case 'a':
			del = txt.indexOf(':{')+2;
			ret = new Array();
			arrlen[level+1] = Number(txt.substring(txt.indexOf(':')+1, del-2))*2;
		break;
		case 'O':
			txt = txt.substr(2);
			var tmp = txt.indexOf(':"')+2;
			var nlen = Number(txt.substring(0, txt.indexOf(':')));
			name = txt.substring(tmp, tmp+nlen );
			//alert(name);
			txt = txt.substring(tmp+nlen+2);
			del = txt.indexOf(':{')+2;
			ret = new Object();
			arrlen[level+1] = Number(txt.substring(0, del-2))*2;
		break;
		case '}':
			txt = txt.substr(1);
			if(arrlen[level] != 0){alert('var missed : '+save); return undefined;};
			//alert(arrlen[level]);
			level--;
		continue;
		default:
			if(level==0) return final_t;
			alert('syntax invalid(1) : '+save+"\nat\n"+txt+"level is at "+level);
			return undefined;
		}
		if(arrlen[level]%2 == 0){
			if(typeof(ret) == 'object'){alert('array index object no accepted : '+save);return undefined;}
			if(ret == undefined){alert('syntax invalid(2) : '+save);return undefined;}
			key[level] = ret;
		} else {
			var ev = '';
			for(var i=1;i<=level;i++){
				if(typeof(key[i]) == 'number'){
					ev += '['+key[i]+']';
				}else{
					ev += '["'+key[i]+'"]';
				}
			}
			eval('final_t'+ev+'= ret;');
		}
		arrlen[level]--;//alert(arrlen[level]-1);
		if(typeof(ret) == 'object') level++;
		txt = txt.substr(del);
		continue;
	}
}

		var sleep_id;
		var typed_search;


		function add_row(fields)
		{
			if(fields[0] == 'server_list')
			{
				var paging = document.getElementById('paging');
				var total_pages = fields['total_pages'];
				var page_number = fields['page_number'];
				text = '';
				
				text = text + "<div style=\"width:33%; float: left;\">";
				if(page_number > 1)
				{
					text = text + "<a href=\"javascript:add_results('" + fields["prev_page_url"] + "')\">Previous Page</a>";
				} else {
					text = text + "<span style=\"color: #CCC;\">Previous Page</span>";	
				}
				text = text + "</div>";
				
				text = text + '<div style="width:33%; float: left; text-align: center; color: #000;">Page ' + page_number + ' of ' + total_pages + ' - ' + fields['total_servers'] + ' servers.</div>';
				//text = text + fields['total_servers'];
				text = text + "<div style=\"width:33%; float: left; text-align: right;\">";
				if(page_number < total_pages)
				{
					text = text + " <a href=\"javascript:add_results('" + fields["next_page_url"] + "')\">Next Page</a> ";
				} else {
					text = text + " <span style=\"color: #CCC;\">Next Page</span> ";		
				}
				text = text + "</div>";
				paging.innerHTML = text;
			} else {
				var table = document.getElementById('results');
				var last_row = table.rows.length;
				var cell = new Array();
				var row = table.insertRow(last_row);
				
				if(last_row > 0)
				{
					if(table.rows[0].cells[0].innerHTML == 'No results')
					{
						del_row(0);
						last_row--;
					}
				}
				
				if(last_row % 2 == 0)
				{
					row_class = 'odd_row';	
				} else {
					row_class = 'even_row';
				}
				
				row.setAttribute('class', row_class);
							
				for(var i = 0; i < fields.length; i++)
				{
					cell[i] = row.insertCell(i);
					var text = document.createTextNode(fields[i]);
					cell[i].appendChild(text);
					cell[i].setAttribute('id', 'result_' + last_row + '_' + i + '');
					document.getElementById('result_' + last_row + '_' + i + '').innerHTML = fields[i];			
				}
			}
		}
		
		function del_row(row)
		{
			var table = document.getElementById('results');
			table.deleteRow(row);
			if(table.rows.length == 0)
			{
				add_row(new Array('No results'));
			}
		}
		
		function del_last_row()
		{
			var table = document.getElementById('results');
			var last_row = table.rows.length;
			if (last_row > 0) del_row(last_row - 1);
		}
		
		function del_all_rows()
		{
			var table_rows = document.getElementById('results').rows.length;
			for(var i = 0; i < table_rows; i++)
			{
				del_row(0);
			}
		}
		
		function insert_data(data)
		{
			if(sleep_id)
			{
				window.clearTimeout(sleep_id);
			} else {
				//alert('failed');
				return;
			}			
			
			del_all_rows();
			data = unserialize(data);
			for(key in data)
			{
				add_row(data[key]);
			}
			
		}
		
		function cancel_request()
		{
			del_all_rows();
			add_row(new Array('Failed to receive data'));
			window.clearTimeout(sleep_id);
			sleep_id = false;
		}
		
		function show_loading()
		{
			document.getElementById('loading').style.display = 'inline';
		}
		
		function add_results(ajax_url)
		{
			// SHOW LOADING ICON
			sleep_id = window.setTimeout('cancel_request()', 2500);
			
			sleep_id_2 = window.setTimeout('show_loading()', 500);
			var http = false;
		
			if(navigator.appName == "Microsoft Internet Explorer") {
				http = new ActiveXObject("Microsoft.XMLHTTP");
			} else {
				http = new XMLHttpRequest();
			}
			
			if(ajax_url != '')
			{
				http.open("GET", ajax_url);
			} else {
				http.open("GET", "ajax/query_servers.ajax");	
			}
			http.onreadystatechange=function() {
				if(http.readyState == 4) {
					insert_data(http.responseText);
					window.clearTimeout(sleep_id_2);
					document.getElementById('loading').style.display = 'none';
					pageTracker._trackPageview(ajax_url);
				}
			}
			http.send(null);	
		}
		
		var js_filters = new Array();
		
		function add_server_filter(filter_name, filter_section)
		{
			url = 'ajax/query_servers';
			
			if(js_filters[filter_section] != undefined)
			{
				document.getElementById(js_filters[filter_section]).className = '';
			}
			
			if(js_filters[filter_section] == filter_name)
			{
				document.getElementById(js_filters[filter_section]).className = '';
				delete js_filters[filter_section];
			} else {
				js_filters[filter_section] = filter_name;
				document.getElementById(filter_name).className = 'selected';
			}
			
			for(filter in js_filters)
			{
				url = url + '/' + js_filters[filter];
			}
			
			url = url + '.ajax';
		
			add_results(url);
		}
		
		function update_search(el)
		{
			window.clearTimeout(typed_search);
			url = 'ajax/search/' + el.value + '.ajax';
			typed_search = window.setTimeout("add_results('" + url + "');", 1000);
			
			//add_results(url);
		}
		