LocationSearch = function( search_field, country, map, defaulttext, storesearch, otherstoresearch, callback, handle ,business) {
    window.locator = this;
    this.input_default = defaulttext;
    this.search_field = search_field;
    this.storeSearch = storesearch;
    this.otherStoreSearch = otherstoresearch;
    this.disamHandler = handle;
    this.callback = callback;
    this.country = country;
    this.map = map;
    this.business=business;
    this.init();
}

LocationSearch.prototype = {
    init: function() {
        var me = this;
        if ( this.search_field && this.search_field.form ) {
            this.search_field.form.onsubmit = function() {
                return false;
            }
            GEvent.addDomListener( this.search_field.form, 'submit', function() {
                me.onFormSubmit();
            } );
        }
	//	this.map.registerEventType( 'locationStart' );
    },
    onFormSubmit: function() {
     	Page.oDisam.toggleDisam( false );
        var cc, query, address, geocoder;
        cc = this.getCountryCode();
        query = this.search_field.value;
         MMElement.prototype.removeCssClass( 'RouteSearch', document.body );
        if ( this.getSearchParam )
	            
			query = this.getSearchParam( this.search_field );
			query=query.replace(/^\s+|\s+$/g,"");
			address = new Object;
			
	        address.qs = query;
	        address.country_code = cc;
			if (checkPostCode(address.qs)) {
							doPostcode(address.qs);			 
			} else {				
							geocoder = new GClientGeocoder();
							gaddress=address.qs+" GB";
							
		 	if (geocoder) {
		        geocoder.getLatLng(
		          gaddress,
		          function(point) {
		            if (!point) {
			              doGeonames(address.qs);
		            } else {
						 address = new Object;
						 address.qs=address.qs;
						 var lat=point.lat();
						 var lon=point.lng();
						 address.coords=new GLatLng(lat,lon);
						 locator.handleResult( address );	
		            }
		          }
		        );
		      }
		}  
    MMElement.prototype.removeCssClass( 'MoreDetails', document.body );
	//			this.map.handleEvent( 'locationStart' );
    },
    getCountryCode: function() {
        if ( typeof this.country == 'string' ) {
            this.getCountryCode = function() {
                return this.country;
            }
        } else {
            this.getCountryCode = function() {
                return this.country.options[this.country.selectedIndex].value;
            }
        }
        return this.getCountryCode();
    },
    handleResult: function( address ) {
        if ( this.storeSearch ) {
           this.storeSearch.getData( address.coords );

        } else {
            this.map.goToPosition( new MMLocation( address.coords, address.zoom_factor ) );
        }
        if ( this.callback && typeof this.callback == 'function' ) {
            this.callback( address );
        }
    }
}

GeocoderCallback = function() {
    if ( arguments[1] == 'MM_GEOCODE_MULTIPLE_MATCHES' || arguments[1] == 'MM_GEOCODE_NO_MATCHES' ) {
        if ( locator && locator instanceof LocationSearch && locator.disamHandler ) {
            return locator.disamHandler( arguments[0], arguments[1], 'location', function() {
                locator.handleResult( arguments[0] );
            } );
        }
    }
    var coords = arguments[0][0];

    locator.handleResult( coords );
}
function checkPostCode (toCheck) {

  // Permitted letters depend upon their position in the postcode.
  var alpha1 = "[abcdefghijklmnoprstuwyz]";                       // Character 1
  var alpha2 = "[abcdefghklmnopqrstuvwxy]";                       // Character 2
  var alpha3 = "[abcdefghjkstuw]";                                // Character 3
  var alpha4 = "[abehmnprvwxy]";                                  // Character 4
  var alpha5 = "[abdefghjlnpqrstuwxyz]";                          // Character 5
  
  // Array holds the regular expressions for the valid postcodes
  var pcexp = new Array ();

  // Expression for postcodes: AN NAA, ANN NAA, AAN NAA, and AANN NAA
  pcexp.push (new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1,2})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));
  
  // Expression for postcodes: ANA NAA
  pcexp.push (new RegExp ("^(" + alpha1 + "{1}[0-9]{1}" + alpha3 + "{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));

  // Expression for postcodes: AANA  NAA
  pcexp.push (new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1}" + alpha4 +"{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));
  
  // Exception for the special postcode GIR 0AA
  pcexp.push (/^(GIR)(\s*)(0AA)$/i);
  
  // Standard BFPO numbers
  pcexp.push (/^(bfpo)(\s*)([0-9]{1,4})$/i);
  
  // c/o BFPO numbers
  pcexp.push (/^(bfpo)(\s*)(c\/o\s*[0-9]{1,3})$/i);
  
  // Overseas Territories
  pcexp.push (/^([A-Z]{4})(\s*)(1ZZ)$/i);

  // Load up the string to check
  var postCode = toCheck;

  // Assume we're not going to find a valid postcode
  var valid = false;
  
  // Check the string against the types of post codes
  for ( var i=0; i<pcexp.length; i++) {
    if (pcexp[i].test(postCode)) {
    
      // The post code is valid - split the post code into component parts
      pcexp[i].exec(postCode);
      
      // Copy it back into the original string, converting it to uppercase and
      // inserting a space between the inward and outward codes
      postCode = RegExp.$1.toUpperCase() + " " + RegExp.$3.toUpperCase();
      
      // If it is a BFPO c/o type postcode, tidy up the "c/o" part
      postCode = postCode.replace (/C\/O\s*/,"c/o ");
      
      // Load new postcode back into the form element
      valid = true;
      
      // Remember that we have found that the code is valid and break from loop
      break;
    }
  }
  
  // Return with either the reformatted valid postcode or the original invalid 
  // postcode
  if (valid) {return postCode;} else return false;
}
function doPostcode(searchterm) {
		if (searchterm) {
			var h = new dopostcode(doPostcodeHandler);
			h.do_postcode(searchterm);

		} 
}
var doPostcodeHandler = {
	do_postcode: function(result) {
		eval(result);
		if (lat =="" && lon== "") {
			if ( locator && locator instanceof LocationSearch && locator.disamHandler ) {
	            return locator.disamHandler( arguments[0], arguments[1], 'location', function() {
	                locator.handleResult( arguments[0] );
	            } );
	        }
		}	 else {			
			address = new Object;
		  	address.qs=qs;
		 	address.coords=new GLatLng(lat,lon);
	  		locator.handleResult( address );
  		}	
	}
}
function doGeonames(searchterm) {
		if (searchterm) {
			var h = new dogeonames(doGeonamesHandler);
			h.do_geonames(searchterm);
		} 
}
var doGeonamesHandler = {
	do_geonames: function(result) {
		eval(result);
		if (lat =="" && lon== "") {
			if ( locator && locator instanceof LocationSearch && locator.disamHandler ) {
	            return locator.disamHandler( arguments[0], arguments[1], 'location', function() {
	                locator.handleResult( arguments[0] );
	            } );
	        }
		}	 else {			
		  	address = new Object;
		  	address.qs=qs;
		 	address.coords=new GLatLng(lat,lon);
	  		locator.handleResult( address );	
		}
	}
}
