/***************************************************************************************************
* Program: objGlobalSearch
* Purpose: JavaScript object that manages searches from anywhere on the site
* Written on: 2011.11.08
***************************************************************************************************/
function objGlobalSearch(objName){
	this.selfName = objName;
	this.defaultSearchText = "search by address or city";
	this.headerSearchBox = "#h_textbox";
	this.headerSearchForm = "#frmHeaderSearch";
	this.headerProcessing = "#h_searching";
	this.searchFilters = new Object();
	this.searchFilters['search'] = new Object();
	this.geocoder = new google.maps.Geocoder();
	this.geoAddress = {formatted_address:"", street_number:"", street_name:"", city:"", neighborhood:"", state:"", postal_code:"", glat:"", glng:"", minLat:"", maxLat:"", minLng:"", maxLng:""};
	this.init();
}

objGlobalSearch.prototype.init = function(){
	var ref = this;
	// initialize the header search box
	$jQuery(this.headerSearchBox).val(this.defaultSearchText);
	$jQuery(this.headerSearchBox).focus(function(){if($jQuery(ref.headerSearchBox).val() == ref.defaultSearchText) $jQuery(ref.headerSearchBox).val("");});
	$jQuery(this.headerSearchBox).blur(function(){if($jQuery(ref.headerSearchBox).val() == "") $jQuery(ref.headerSearchBox).val(ref.defaultSearchText);});
}

objGlobalSearch.prototype.processSearch = function(formId, msgBox){
	var ref = this;
	var msgBox = msgBox || '';
	var tmpArray = $jQuery(formId).serializeArray();
	var tmpSpaceTypes = new Array();
	for(i = 0; i < tmpArray.length; i++){
		if(tmpArray[i]['name'] == "space_type") tmpSpaceTypes.push(tmpArray[i]['value']);
		else this.searchFilters['search'][tmpArray[i]['name']] = tmpArray[i]['value'];
	}
	if(tmpSpaceTypes.length > 0) this.searchFilters['search']['space_type'] = tmpSpaceTypes;

	if(this.searchFilters.search.address == this.defaultSearchText) this.searchFilters.search.address = "";
	if(this.searchFilters.search.address != ""){
		if(formId == this.headerSearchForm){
			$jQuery(this.headerSearchForm).hide();
			$jQuery(this.headerProcessing).show();
		}
		searchAddress = this.searchFilters.search.address + (this.searchFilters.search.address.indexOf(", USA") < 0 ? ", USA" : "");
		this.geocoder.geocode({'address': searchAddress, 'region':'US'}, function(results, status){
			if(status == google.maps.GeocoderStatus.OK){
				if(results.length > 1){
					var mr = new Object();
					mr['addrs'] = new Array();
					mr['addrs'].push(ref.searchFilters.search.address);
					for(i = 0; i < results.length; i++) mr['addrs'].push(results[i].formatted_address);
					window.location.assign("/search.html?" + $jQuery.param(mr));
				} else {
					addressParts = results[0].address_components;
					tmpStreetAddress = '';
					tmpRoute = '';
					tmpLocality = '';
					tmpAdminArea2 = '';
					for(i = 0; i < addressParts.length; i++){
						addressTypes = addressParts[i].types;
						for(x = 0; x < addressTypes.length; x++){
							if(addressTypes[x] == "political") break;
							if(addressTypes[x] == "street_number"){ref.geoAddress.street_number = addressParts[i]['long_name']; break;}
							if(addressTypes[x] == "street_address"){tmpStreetAddress = addressParts[i]['long_name']; break;}
							if(addressTypes[x] == "route"){tmpRoute = addressParts[i]['long_name']; break;}
							if(addressTypes[x] == "locality"){tmpLocality = addressParts[i]['long_name']; break;}
							if(addressTypes[x] == "administrative_area_level_2"){tmpAdminArea2 = addressParts[i]['long_name']; break;}
							if(addressTypes[x] == "neighborhood"){ref.geoAddress.neighborhood = addressParts[i]['short_name']; break;}
							if(addressTypes[x] == "administrative_area_level_1"){ref.geoAddress.state = addressParts[i]['short_name']; break;}
							if(addressTypes[x] == "postal_code"){ref.geoAddress.postal_code = addressParts[i]['long_name']; break;}
						}
					}
					ref.geoAddress.street_name = tmpStreetAddress == '' ? tmpRoute : tmpStreetAddress;
					ref.geoAddress.city = tmpLocality == '' ? tmpAdminArea2 : tmpLocality;
					ref.geoAddress.formatted_address = results[0].formatted_address;
					ref.geoAddress.glat = results[0].geometry.location.lat();
					ref.geoAddress.glng = results[0].geometry.location.lng();
					if(!jsIsEmpty(results[0].geometry.bounds)){
						ref.geoAddress.minLat = results[0].geometry.bounds.getSouthWest().lat();
						ref.geoAddress.minLng = results[0].geometry.bounds.getSouthWest().lng();
						ref.geoAddress.maxLat = results[0].geometry.bounds.getNorthEast().lat();
						ref.geoAddress.maxLng = results[0].geometry.bounds.getNorthEast().lng();
					} else if(!jsIsEmpty(results[0].geometry.viewport)){
						ref.geoAddress.minLat = results[0].geometry.viewport.getSouthWest().lat();
						ref.geoAddress.minLng = results[0].geometry.viewport.getSouthWest().lng();
						ref.geoAddress.maxLat = results[0].geometry.viewport.getNorthEast().lat();
						ref.geoAddress.maxLng = results[0].geometry.viewport.getNorthEast().lng();
					}
					if(ref.geoAddress.city != "" && ref.geoAddress.state != "") ref.doSearch();
				}
			} else {
				$jQuery(ref.headerSearchForm).show();
				$jQuery(ref.headerProcessing).hide();
			}
		});
	} else if(msgBox != "") $jQuery(msgBox).addClass('error').html("You need to enter at least an address or location to begin your search").show();
}

objGlobalSearch.prototype.doSearch = function(){
	var ref = this;
	this.searchFilters['event'] = "search";
	this.searchFilters['geodata'] = new Object();
	for(x in this.geoAddress) this.searchFilters['geodata'][x] = this.geoAddress[x];
	var data = $jQuery.param(this.searchFilters);
	$jQuery.ajax({
		type: "POST",
		cache: false,
		url: "/ajax/search.global.ajax.php",
		data: data,
		dataType: "json"
	}).done(function(data){
		for(x in ref.geoAddress) ref.geoAddress[x] = "";
		if(data.redirect != "") window.location.assign(data.redirect);
	}).fail(function(xhr){
		$jQuery(ref.headerSearchForm).show();
		$jQuery(ref.headerProcessing).hide();
	});
}

var _rofoSearch = new Object();
$jQuery(document).ready(function(){_rofoSearch = new objGlobalSearch('_rofoSearch')});
