
	//
	//	Loookup
	//	Josh Skidmore <josh@vorcado.com>
	//	/js/lookupcrap.js
	//
	
	
	//	Please note:

	//	I am not an expert on javascript or Ajax.
	//	Much of the code provided within this javascript file
	//	is inefficient and needs to be cleaned. Hell, some of
	//	the things seen here don't even make sense...

	//	If you have any suggestions, comments, or ideas, PLEASE
	//	let me know: ideas@loookup.com.

	//	Thanks,
	//	-Josh (josh.sc)
	
	
	//	Variables + globals
	var active_tab;
	var map;
	
	
	function lookup ()
	{
		//	Converts textarea into URL
			
		var host				=	$('query').value;
		var location			=	'http://loookup.com/' + host;
		document.location.href	=	location;
	}


	function start (lookup_id)
	{
		//	Starts the primary and secondary lookup
		
		//var main		=	'main(\'' + lookup_id + '\')';
		//setTimeout(main,250);
		
		main(lookup_id);
		
		var primary		=	'primary_lookup(\'' + lookup_id + '\')';
		setTimeout(primary,500);
	}
	
	
	function main (lookup_id)
	{
		//	Main
		
		var rand			=	Math.floor(Math.random()*9999999999999);
					
		var ajax_uri		=	'/ajax/main'
		var ajax_pars		=	'id=' + lookup_id + '&_tmp=' + rand;
			
		var ajax_request	=	new Ajax.Request(ajax_uri, {method: 'get', parameters: ajax_pars, onComplete: main__complete});
	}
			

	function main__complete (response)
	{
		var xml					=	xml_get_dom(response.responseText);
		var xml_root			=	xml.getElementsByTagName('ajax_response')[0];
	
		var data				=	xml_get_element(xml_root,'data');
		
		Element.update('databox',data);
	}
	
	
	function primary_lookup (lookup_id)
	{
		//	Lookup common information (ip + hostname + type)
		
		var rand			=	Math.floor(Math.random()*9999999999999);
					
		var ajax_uri		=	'/ajax/primary_lookup'
		var ajax_pars		=	'id=' + lookup_id + '&_tmp=' + rand;
			
		var ajax_request	=	new Ajax.Request(ajax_uri, {method: 'get', parameters: ajax_pars, onComplete: primary_lookup__complete});
	}
			

	function primary_lookup__complete (response)
	{
		var xml					=	xml_get_dom(response.responseText);
		var xml_root			=	xml.getElementsByTagName('ajax_response')[0];
	
		var ip					=	xml_get_element(xml_root,'ip');
		var hostname			=	xml_get_element(xml_root,'hostname');
		var cname				=	xml_get_element(xml_root,'cname');
		var ip_hostname			=	xml_get_element(xml_root,'ip_hostname');
		var type				=	xml_get_element(xml_root,'type');
		var lookup_id			=	xml_get_element(xml_root,'lookup_id');
		var	error				=	xml_get_element(xml_root,'error');
		var	error_msg			=	xml_get_element(xml_root,'error_msg');
		var asn					=	xml_get_element(xml_root,'asn');
		

		if (error == 1)
			{
				Element.update('error_msg',error_msg);
				Element.show('error');
			}
			
		else
			{
				var additional	=	"start_addtional_lookup(" + lookup_id + ")";
				setTimeout(additional,250);

				setTimeout("Effect.Appear('primary_info')",100);
					
				if (ip)
					{
						Element.update('primary_ip',ip);
						Element.show('fr_primary_ip');
					}
				
				if (hostname)
					{
						Element.update('primary_hostname',hostname);
						Element.show('fr_primary_hostname');
					}
					
				if (ip_hostname && hostname != ip_hostname)
					{
						Element.update('primary_ip_hostname',ip_hostname);
						Element.show('fr_primary_ip_hostname');
					}
					
				if (cname)
					{
						Element.update('cname',cname);
						Element.show('fr_cname');
					}
					
				if (asn)
					{
						var asn_w_link	=	'<a href="http://www.cidr-report.org/cgi-bin/as-report?as=AS' + asn + '" target="_blank">AS' + asn + '</a>';
						Element.update('asn',asn_w_link);
					}

				//	1: IP Address
				if (type == 1)
					{
						var whois				=	"whois('" + lookup_id + "')";
						var asn_records			=	"records('" + lookup_id + "','asn')";
						var aliases_records		=	"records('" + lookup_id + "','aliases')";
						var rbl_records			=	"records('" + lookup_id + "','rbl')";
						var traceroute_records	=	"records('" + lookup_id + "','traceroute')";
						var credits_records		=	"records('" + lookup_id + "','credits')";
						var faq_records			=	"records('" + lookup_id + "','faq')";
						var sites_records		=	"records('" + lookup_id + "','sites')";
						
						var nav_pre		=	$('nav_data').innerHTML;
							
						//	Wow, this is HORRIFICALLY inefficient - like a crackhead wrote it.
						//	If anyone can help rewrite this in a more OO fashion, I'd be grateful.
						var nav_post	=	'';
						nav_post		=	nav_post	+	'<ul>';
						nav_post		=	nav_post	+	'<li id="button_asn" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + asn_records + '; return(false);">Network Peers</a></li>';
						nav_post		=	nav_post	+	'<li id="button_aliases" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + aliases_records + '; return(false);">IP Aliases</a></li>';
						nav_post		=	nav_post	+	'<li id="button_rbl" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + rbl_records + '; return(false);">DNSBL/Blacklist</a></li>';
						nav_post		=	nav_post	+	'<li id="button_traceroute" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + traceroute_records + '; return(false);">Traceroute</a></li>';
						nav_post		=	nav_post	+	'<li id="button_whois" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + whois + '; return(false);">Whois</a></li>';
						nav_post		=	nav_post	+	'<li id="button_sites" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + sites_records + '; return(false);">Other Free Tools</a></li>';
						nav_post		=	nav_post	+	'<li id="button_credits" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + credits_records + '; return(false);">Site Credits</a></li>';
						nav_post		=	nav_post	+	'<li id="button_faq" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + faq_records + '; return(false);"><b>FAQ</b></a></li>';
						nav_post		=	nav_post	+	'<li id="button_blog" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="http://blog.loookup.com" target="_blank">Blog!</a></li>';
						nav_post		=	nav_post	+	'</ul>';
						var nav			=	nav_pre + nav_post;
							
						Element.update('nav_data',nav);
						
						//setTimeout(asn_records,1000);
					}
						
				//	2: Hostname
				else if (type == 2)
					{
						var traversal_dns			=	"traversal_dns('" + lookup_id + "')";
						var whois					=	"whois('" + lookup_id + "')";
						var a_records				=	"records('" + lookup_id + "','a')";
						var ns_records				=	"records('" + lookup_id + "','ns')";
						var mx_records				=	"records('" + lookup_id + "','mx')";
						var asn_records				=	"records('" + lookup_id + "','asn')";
						var aliases_records			=	"records('" + lookup_id + "','aliases')";
						var rbl_records				=	"records('" + lookup_id + "','rbl')";
						var traceroute_records		=	"records('" + lookup_id + "','traceroute')";
						var sites_records			=	"records('" + lookup_id + "','sites')";
						var credits_records			=	"records('" + lookup_id + "','credits')";
						var faq_records				=	"records('" + lookup_id + "','faq')";
						
						var nav_pre		=	$('nav_data').innerHTML;
							
						var nav_post	=	'';
						nav_post		=	nav_post	+	'<ul>';
						nav_post		=	nav_post	+	'<li id="button_asn" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + asn_records + '; return(false);">Network Peers</a></li>';
						nav_post		=	nav_post	+	'<li id="button_traversal_dns" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + traversal_dns + '; return(false);">Traversal DNS</a></li>';
						nav_post		=	nav_post	+	'<li id="button_a" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + a_records + '; return(false);">A</a></li>';
						nav_post		=	nav_post	+	'<li id="button_ns" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + ns_records + '; return(false);">NS</a></li>';
						nav_post		=	nav_post	+	'<li id="button_mx" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + mx_records + '; return(false);">MX</a></li>';
						nav_post		=	nav_post	+	'<li id="button_rbl" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + rbl_records + '; return(false);">DNSBL/Blacklist</a></li>';
						nav_post		=	nav_post	+	'<li id="button_aliases" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + aliases_records + '; return(false);">IP Aliases</a></li>';
						//nav_post		=	nav_post	+	'<li id="button_traceroute" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + traceroute_records + '; return(false);">Traceroute</a></li>';
						nav_post		=	nav_post	+	'<li id="button_whois" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + whois + '; return(false);">Whois</a></li>';
						nav_post		=	nav_post	+	'<li id="button_sites" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + sites_records + '; return(false);">Other Free Tools</a></li>';
						nav_post		=	nav_post	+	'<li id="button_credits" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + credits_records + '; return(false);">Site Credits</a></li>';
						nav_post		=	nav_post	+	'<li id="button_faq" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="#" onclick="' + faq_records + '; return(false);"><b>FAQ</b></a></li>';
						//nav_post		=	nav_post	+	'<li id="button_blog" onmouseover="this.className=\'msie_sucks\'" onmouseout="this.className=\'\'"><a href="http://blog.loookup.com" target="_blank">Blog!</a></li>';
						nav_post		=	nav_post	+	'</ul>';
						var nav			=	nav_pre + nav_post;
							
						Element.update('nav_data',nav);
						
						//setTimeout(asn_records,1000);
					}
						
				//	HTML <title>
				var title_hostname	=	'';
				if (hostname)	{	title_hostname	=	' - ' + hostname;	}
				document.title	=	'Loookup' + title_hostname + ' - ' + ip;
				
				Effect.Appear('toolbox_txt');
				Effect.Shake('toolbox_txt');
			}
	}
	
	
	function records (lookup_id,type)
	{
		//	Displays records in tabbed area
		
		var rand			=	Math.floor(Math.random()*9999999999999);
					
		var ajax_uri		=	'/ajax/records'
		var ajax_pars		=	'id=' + lookup_id + '&type=' + type + '&_tmp=' + rand;
	
		var tab	=	'button_' + type;
			
		if (active_tab)	{	document.getElementById('is_active').id = active_tab;	}
		document.getElementById(tab).id = 'is_active';
		active_tab =  tab;
			
		Element.hide('tabcontent');
		Element.show('indicator_bottom');
			
		var ajax_request	=	new Ajax.Request(ajax_uri, {method: 'get', parameters: ajax_pars, onComplete: records__complete});
	}
	
	
	function records__complete (response)
	{
		var xml					=	xml_get_dom(response.responseText);
		var xml_root			=	xml.getElementsByTagName('ajax_response')[0];
	
		var type				=	xml_get_element(xml_root,'type');
		var data				=	xml_get_element(xml_root,'data');
			
		Element.hide('indicator_bottom');
		Element.update('tabcontent',data);
		Effect.BlindDown('tabcontent');
	}
	
	
	function whois (lookup_id)
	{
		//	Whois
		var rand			=	Math.floor(Math.random()*9999999999999);
					
		var ajax_uri		=	'/ajax/whois'
		var ajax_pars		=	'id=' + lookup_id + '&_tmp=' + rand;
		
		if (active_tab)	{	document.getElementById('is_active').id = active_tab;	}
		document.getElementById('button_whois').id = 'is_active';
		active_tab = 'button_whois';
			
			
		Element.hide('tabcontent');
		Element.show('indicator_bottom');
			
		var ajax_request	=	new Ajax.Request(ajax_uri, {method: 'get', parameters: ajax_pars, onComplete: whois__complete});
	}


	function whois__complete (response)
	{
		var xml					=	xml_get_dom(response.responseText);
		var xml_root			=	xml.getElementsByTagName('ajax_response')[0];
	
		var data				=	xml_get_element(xml_root,'data');
			
		Element.hide('indicator_bottom');
		Element.update('tabcontent',data);
		Element.show('tabcontent');
	}
	

	function traversal_dns (lookup_id)
	{
		//	Traversal DNS
			
		var rand			=	Math.floor(Math.random()*9999999999999);
				
		var ajax_uri		=	'/ajax/traversal_dns'
		var ajax_pars		=	'id=' + lookup_id + '&_tmp=' + rand;
			
		if (active_tab)	{	document.getElementById('is_active').id = active_tab;	}
		document.getElementById('button_traversal_dns').id = 'is_active';
			
		active_tab = 'button_traversal_dns';
			
		Element.hide('tabcontent');
		Element.show('indicator_bottom');
			
		var ajax_request	=	new Ajax.Request(ajax_uri, {method: 'get', parameters: ajax_pars, onComplete: traversal_dns__complete});
	}
	
		
	function traversal_dns__complete (response)
	{
		var xml					=	xml_get_dom(response.responseText);
		var xml_root			=	xml.getElementsByTagName('ajax_response')[0];
	
		var data				=	xml_get_element(xml_root,'data');
			
		Element.hide('indicator_bottom');
		Element.update('tabcontent',data);
		Element.show('tabcontent');
	}


	function start_addtional_lookup (lookup_id)
	{
		//	Looks up more time consuming information
		
		Effect.Appear('secondary_indicator');
		
		var data	=	'additional_lookup(\'' + lookup_id + '\')';
		setTimeout(data,250);
	}
	
		
	function additional_lookup (lookup_id)
	{
		var rand			=	Math.floor(Math.random()*9999999999999);
					
		var ajax_uri		=	'/ajax/additional_lookup'
		var ajax_pars		=	'id=' + lookup_id + '&_tmp=' + rand;
			
		Element.update('mapContainer','<img src="/img/indicator.gif" style="padding: 190px 0px 0px 200px;" alt="Indicator" />');
			
		var ajax_request	=	new Ajax.Request(ajax_uri, {method: 'get', parameters: ajax_pars, onComplete: additional_lookup__complete});
	}
		
				
	function additional_lookup__complete (response)
	{
		var xml					=	xml_get_dom(response.responseText);
		var xml_root			=	xml.getElementsByTagName('ajax_response')[0];
			
		var has_http			=	xml_get_element(xml_root,'has_http');
		var has_https			=	xml_get_element(xml_root,'has_https');
		var has_smtp			=	xml_get_element(xml_root,'has_smtp');
		var has_dns				=	xml_get_element(xml_root,'has_dns');
		var city				=	xml_get_element(xml_root,'city');
		var region_name			=	xml_get_element(xml_root,'region_name');
		var country_code		=	xml_get_element(xml_root,'country_code');
		var country_name		=	xml_get_element(xml_root,'country_name');
		var latitude			=	xml_get_element(xml_root,'latitude');
		var longitude			=	xml_get_element(xml_root,'longitude');
		var isp					=	xml_get_element(xml_root,'isp');
		var org					=	xml_get_element(xml_root,'org');
		var postal_code			=	xml_get_element(xml_root,'postal_code');
		var msa_code			=	xml_get_element(xml_root,'msa_code');
		var msa_name			=	xml_get_element(xml_root,'msa_name');
		var area_code			=	xml_get_element(xml_root,'area_code');
		var http_software		=	xml_get_element(xml_root,'http_software');
		var http_title			=	xml_get_element(xml_root,'http_title');
		var http_os				=	xml_get_element(xml_root,'http_os');
		var query				=	xml_get_element(xml_root,'query');
		var asn_isp				=	xml_get_element(xml_root,'asn_isp');
		
		var active_servers		=	'';
		
		//	Status
		if (has_http == 1)		{	active_servers	=	active_servers + 'http/80 ';		}
		if (has_https == 1)		{	active_servers	=	active_servers + 'https/443 ';		}
		if (has_smtp == 1)		{	active_servers	=	active_servers + 'smtp/25 ';		}
		if (has_dns == 1)		{	active_servers	=	active_servers + 'dns/53 ';		}
		
		if (active_servers)		{	Element.show('fr_servers');							}
		
		if (http_software || http_title)
			{
				Element.update('http_software',http_software);
				Element.update('http_title',http_title);
				Element.update('http_os',http_os);
						
				Effect.Appear('secondary_info_web_server');
			}

		//	Add country flag
		var country_flag;
			
		if (country_code)
			{
				var country_code_l	=	country_code.toLowerCase();
				var url				=	'/img/flags/26x13/' + country_code_l + '.png';
				country_flag		=	'<img src="' + url + '" alt="' + country_name + '" class="flag" />';
			}

		// cityset
		var cityset;
		
		if (city && region_name)	{	cityset		=	city + ', ' + region_name;		}
		else if (city)				{	cityset		=	city;							}
		else						{	cityset		=	'Unknown';						}
		
		if (msa_name)
			{
				Element.update('msa_name',msa_name);
				Element.show('fr_msa_name');
			}
					

		//	span updates (inefficient)
		Element.update('active_servers',active_servers);
		Element.update('city',cityset);
		Element.update('country_code',country_code);
		Element.update('country_name',country_name);
		Element.update('country_flag',country_flag);
		Element.update('isp',isp);
		Element.update('org',org);
		
		if (asn_isp)
			{
				asn_isp	=	', ' + asn_isp;
				Element.update('asn_isp',asn_isp);
			}
		
			
		Element.hide('secondary_indicator');
		if (country_code)
			{
				Element.show('secondary_info');
				Element.show('info_ownership');
				add_map(latitude,longitude);
			}
		else
			{
				Element.update('mapContainer','');
			}
	}

	function add_map (latitude,longitude)
	{
		//	Initially adds one point to map and zooms

		map = new GMap2(document.getElementById('mapContainer'));
		map.setCenter(new GLatLng(latitude,longitude),4);
	
		map.addControl(new GSmallMapControl());
		map.addControl(new GMapTypeControl());
	        
		var point	=	new GLatLng(latitude,longitude);
			
		var marker	=	new GMarker(point);
		map.addOverlay(marker);
	}
	
	function add_phone_to_map (latitude,longitude)
	{
		add_map(latitude,longitude);
		return(true);
	}
	
	function add_to_map (latitude,longitude)
	{
		//	Adds additional points to the map (+ pans)

		var point	=	new GLatLng(latitude,longitude);
			
		var marker	=	new GMarker(point);
		map.addOverlay(marker);
	       	
		map.panTo(point);
	}
	
      
	function xml_get_element (xml_root,element)
	{
		//	Get XML element using getElementsByTagName
		
		var value		=	'';
		var xml_child	=	xml_root.getElementsByTagName(element)[0].firstChild;
		
		//	The shit is worthless to me if null
		if (xml_child != null)	{	value	=	xml_root.getElementsByTagName(element)[0].firstChild.nodeValue;		}
		
		return (value);
	}
	
		
	function xml_get_dom (data)
	{
		return Try.these
			(
				function() {var xmldom = (new DOMParser()).parseFromString(data,"text/xml"); return xmldom;},
				function() {var xmldom = new ActiveXObject('Microsoft.XMLDOM'); xmldom.loadXML(data); return xmldom;}
			);
	}
	

	function img_hover (img_name,type)
	{
		//	Hovers an image
		
		var img			=	$(img_name);	
		var	img_hover	=	'/img/' + img_name + '_h.gif';
		var img_off		=	'/img/' + img_name + '_i.gif';
				
		if (type == 'on')			{	img.src		=	img_hover;		}
		else if (type == 'off')		{	img.src		=	img_off;		}
					
		return(true);
	}
	
	
	function submit_on_enter (myfield,e)
	{
		var keycode;
		
		if (window.event)	{	keycode		=	window.event.keyCode;	}
		else
		{
			if (e)	{	keycode		=	e.which;	}
			else	{	return true;				}
		}
	
		if (keycode == 13)
		{
			lookup();
			return false;
		}
		else	{	return true;	}
	}