/*
	search.js
	This contains all the client search code for this app
	DJEM Oct 2007
 */

 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    * read comment in search-ajax-response
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
 */

 //	Get AJAX object (is_ie and others defined in pwm_support.js)
var browserName = navigator.userAgent.toLowerCase();
if (browserName.indexOf('msie')!=-1) {
is_ie = true;
} else {
is_ie = false;
}

g_search_object = (is_ie==true) ? (new ActiveXObject("Microsoft.XMLHTTP")) : (new XMLHttpRequest());

g_ajax_respondent = null;

g_redraw_cmd='';

mj_max_search = 50;				//	DJEM 16-05-08
search_scroll_num = 5;		//	Max number of records to display in div_search_choice
search_scroll_index = 1;	//	Start position of search results (for scrolling)

function search_ready ( obj ) {

	//	This func clears the text field and updates the style colour...
	//	The initial text at start time is 'Postcode, street or place' so if the string 'Postcode'
	//	is found in the text field's value then we clear the field and change the text colour to black.
	//	Just a nice little device for looking professional...!

	if ( obj.value.indexOf('Postcode',0) == -1 )
		return;

	obj.value = '';
	obj.style.color = '#000000';

	}

function search_go ( id ) {

	var elem = document.getElementById ( id );
	if ( !elem ) {
		alert ( "Error: element ID (" + id + ") not found in search_go()" );
		return;
		}

	var resdiv = document.getElementById('div_search_choice');
	resdiv.innerHTML = '';
	resdiv.style.display = 'none';

	if ( elem.value.indexOf('Postcode',0) != -1 )
		return;	//	Means the default value is still there and nothing entered

	if ( elem.value == '' )
		return;	//	Empty field

	if ( elem.value.length < 2 ) {
		alert ( "Please enter a more meaningful search string!" );
		return;
		}

	var maxres = (typeof mj_max_search == "undefined" ) ? 3 : mj_max_search;

	
	//	Validation: see if we have a postcode...
	if ( search_is_postcode ( elem.value ) == true )
		var url = 'http://myjourney2.pieout.com/search.php?postcode=' + elem.value;
	else
		var url = 'http://myjourney2.pieout.com/search.php?loc=' + elem.value;

	url += '&maxres=' + maxres;
	
	//url2 = "http://217.196.1.182/bluebadge5/";
	
	//prompt('DEBUG:', url);
	
	search_spinner ( false );

	g_search_object.open ( 'get', url, true );
	g_search_object.onreadystatechange = search_ajax_response;
	g_search_object.send(null);

	}


function search_is_postcode ( str ) {

	//	This function determines whether the incoming string is a postcode. Valid patterns are;
	//
	//	AN NAA 		Eg: M1 1AA
	//	ANN NAA 		Eg: M60 1NW
	//	AAN NAA 		Eg: CR2 6XH
	//	AANN NAA 	Eg: DN55 1PT
	//	ANA NAA 		Eg: W1A 1HQ
	//	AANA NAA 	Eg: EC1A 1BB
	//
	//
	//	Do not check for partial postcodes (Eg, WC1) yet - maybe later?

	var is_postcode = false;
	var postcode = '';
	
	//	Strip all leading, trailing and other spaces...
	for ( var i=0; i<str.length; i++ )
		if ( str.charAt(i) != ' ' )
			postcode = postcode + str.charAt(i);

	//if ( postcode.length < 5 )
		//return false;

	if ( postcode.length > 8 ) 
		return false;

	if ( search_char_numeric ( postcode.charAt(0) ) == true )
		return false;

	if ( search_char_numeric ( postcode.charAt(postcode.length-1) ) == true && postcode.length < 5 )
		return true;

	if ( search_char_numeric ( postcode.charAt(postcode.length-2) ) == true && postcode.length < 5 )
		return true;


	//	Start by checking the last 3 chars as these are ALWAYS NAA...
	var postcode_end = postcode.substr ( postcode.length - 3, 3 );
	var postcode_start = postcode.substr ( 0, postcode.length - 3 );

	if ( search_char_numeric ( postcode_end.charAt(0) ) == false )
		return false;
	if ( search_char_numeric ( postcode_end.charAt(1) ) == true )
		return false;
	if ( search_char_numeric ( postcode_end.charAt(2) ) == true )
		return false;

	//	Check the front end...only check is to ensure that it contains at least 1 numeric value..
	var check = false;
	for ( i=0; i<postcode_start.length; i++ )
		if ( search_char_numeric ( postcode_start.charAt(i) ) == true )
			check = true;

	if ( check == false )
		return false;

	return true;

	}

function search_char_numeric ( c ) {

	if ( c == '0' ) return true;
	if ( c == '1' ) return true;
	if ( c == '2' ) return true;
	if ( c == '3' ) return true;
	if ( c == '4' ) return true;
	if ( c == '5' ) return true;
	if ( c == '6' ) return true;
	if ( c == '7' ) return true;
	if ( c == '8' ) return true;
	if ( c == '9' ) return true;

	return false;

	}


function search_ajax_response () {

	if ( g_search_object.readyState == 4 ) {	// ie, we have a complete response
		search_spinner ( false );
		var response = g_search_object.responseText;
		// Reset search
		reset_search();
		switch ( g_search_object.status ) {
			case 200: // Success
				if ( response.indexOf ( 'Error', 0 ) != -1 ) {
					alert ( response );
					return;
					}

				//	We (probably) have some results.
				var resdiv = document.getElementById('div_search_choice');
				if ( !resdiv ) {
					alert ( "Error in search_ajax_response: search_results element not found" );
					return;
					}

				//LKL Do not display if only one result
				//resdiv.style.display = 'block';
				//resdiv.innerHTML = response;
				
				search_scroll_index = 1;
				
				//Check if only 1 result and just go there
				//Note AJAX has no idea of global functions so need to set a timeout 
				var loc1 = response.indexOf('javascript:mj_set_search');
				var loc2 = response.lastIndexOf('javascript:mj_set_search');

				//LKL 131008 Added the (loc1 != -1) as No records found was being treated in this category
				// was comparing (Not found == Not found)
				if ( (loc1 != -1) && (loc1 == loc2 ) )
				{
					var cmd = response.slice(response.indexOf('mj_set_search'));
					var semicolon = cmd.indexOf(';');
					g_redraw_cmd= cmd.substr(0,semicolon+1);
					
					setTimeout ( search_redraw, 500 );					
				}
				else
				{
					resdiv.style.display = 'block';
					resdiv.innerHTML = response;
					//alert(resdiv.innerHTML);
				} 

				break;
			case 404: // Not found
				alert ( "AJAX error: url not found" );
				break;
			default:
				alert ( "AJAX error: " + g_search_object.status );
				break;
			}
		}

	}

function search_redraw()
{
	//execute the function using eval
	//alert(g_redraw_cmd);
	eval(g_redraw_cmd);
	
	//Need to reload all the data at this new redraw map
	//client_data_load();
	
	//Reset
	g_redraw_cmd = '';
}


function search_spinner ( what ) {

	if ( what==false)
		return;
		
	var elem = document.getElementById('spinner_img');
	if ( !elem ) {
		alert ( "Unable to locate spinner_img" );
		return;
		}

	elem.style.visibility = (what==true) ? 'visible' : 'hidden';
	elem.style.display = (what==true) ? 'inline' : 'none';

	}

function search_key_press (e) {

	if ( e && e.which ) {
		e = e
		characterCode = e.which //character code is contained in NN4's which property
		}
	else {
		e = event
		characterCode = e.keyCode //character code is contained in IE's keyCode property
		}

	if ( characterCode == 13 ) {
		search_go ( 'search_text_field' );
		return false
		}
	else {
		return true
		}


	}


function search_scroll ( what ) {

	//	what = 'prev' or 'next'

	var start_pos = (what=='next') ? (search_scroll_index+5) : (search_scroll_index-5);
	if ( start_pos < 1 ) return;

	var done = false;
	var numrecs = 1;
	while ( !done ) {
		var id = 'hidden_search_' + numrecs;
		var elem = document.getElementById(id);
		if ( !elem ) done = true; else numrecs++;
		}

	if ( start_pos >= numrecs ) return;

	var span_elems = new Array ();
	for ( var i=1; i<=search_scroll_num; i++ ) {
		var span_id = 'span_search_' + i;
		span_elems[i-1] = document.getElementById(span_id);
		if ( !span_elems[i-1] ) break;
		span_elems[i-1].innerHTML = '';
		}


	search_scroll_index = start_pos;
	var p = start_pos;

	for ( var i=1; i<=search_scroll_num; i++ ) {

		if ( !span_elems[i-1] ) return;	//	finished!

		var hidden_id = 'hidden_search_' + p;
		var hidden_elem = document.getElementById(hidden_id);
		if ( !hidden_elem ) return;

		var val_arr = hidden_elem.value.split ( '~' );
		var easting = val_arr[0];
		var northing = val_arr[1];
		var name = val_arr[2];
		var postcode = val_arr[3];

		if ( name != '' ) name = name + ', ';

		var html = "<a href=\"javascript:mj_set_search (" + easting + "," + northing + ",'" + name + "','" + postcode + "');\">" + name + postcode + "</a>";
		span_elems[i-1].innerHTML = html;
		p++;
		}


	}

