var toll = toll || {};
/*
lib.addLoadEvent(function(){
* 
	new toll.MapController(lib.$('map'));
});
*/
toll.SearchCriteriaController=function(){
	// Search criteria controls state, (TODO) zip, radius, etc...
	var searchParamMap=toll.Model.getSearchParamMap();
	
	//HTML form controls
	var stateSelect=toll.SelectControl($('select#state')[0], function(){
		//toll.Model.setState(this.getSelectedValue());
	});
	var zipTextField=$("#zip")[0];
	var radiusSelect=toll.SelectControl($('select#radius')[0], function(){
		toll.Model.setRadius(this.getSelectedValue());
	
	});
	
	
	$("#searchButton").click(function(){
		toll.Model.setState(stateSelect.getSelectedValue());
		toll.Model.setZip(zipTextField.value);
		toll.Model.setRadius(radiusSelect.getSelectedValue());
		toll.Model.getSearchResults();
	});
	
	
	
	toll.Model.addSearchResultsBeforeSendListener(function(){
		stateSelect.setEnabled(false);
		zipTextField.disabled=true;
		radiusSelect.setEnabled(false);
	});
	
	toll.Model.addSearchResultsErrorListener(function(errorMessage){
		stateSelect.setEnabled(true);
		zipTextField.disabled=false;
		radiusSelect.setEnabled(true);
	});

	toll.Model.addSearchResultsListener(function(communities, params){
		if(communities==null || communities.length<1){
			stateSelect.setEnabled(true);
			return;
		}
		stateSelect.setEnabled(true);
		zipTextField.disabled=false;
		radiusSelect.setEnabled(true);
		//
		
		//Update search criteria html controls:
		var state = params[searchParamMap.state];
		var zip = params[searchParamMap.zip];
		var radius = params[searchParamMap.radius]; 
		var isZipSearch = 
			zip != null &&
			zip != "" &&
			(radius != null && radius != "" && (Number(radius) > -1));
		
		var isStateSearch = 
			!isZipSearch &&
			state != null &&
			state != "";
			//TODO state value is actual state abreviation (all caps) that Toll builds in
		
		if(isZipSearch){
			zipTextField.value = zip;
			radiusSelect.setSelectedOption(radius);
		}else{
			zipTextField.value = "";
			radiusSelect.setSelectedOption("");
		}
		//
		if(isStateSearch){
			stateSelect.setSelectedOption(params[searchParamMap.state]);
		}else{
			stateSelect.setSelectionToFirstOption();
		}
	});

}

toll.TestGetResultsController=function(){
	//Testing only
	toll.Model.setState('PA');
	toll.Model.getSearchResults();
}

toll.URLQueryParamController=function(){
	//	Takes search criteria from URL ? query string to initiate search
	//   	Parse URL query string variables (if any) and initiate search
	//   	app=search&s_radius=30&sort=COMM_NAME&s_state=PA&s_zip=19144&s_county=Bucks&f_type=&Submit2=+Search+
	toll.Model.setSearchCriteriaFromQueryString();
	toll.Model.getSearchResults();
}


toll.SortController=function(){
	var comMap=toll.Model.getCommunityTOMap();
	var _sortField=comMap.communityName;
	
	var sortMap={
		//Map html select values to Model sort fields
		"default":"communityName",
		"communityName":comMap.communityName,
   		"price":comMap.price,
   		"sqft":comMap.sqft,
   		"home-type":comMap.home_type,
   		"county":comMap.county
	}
	
	
	var sortOrderControl = new toll.RadioGroup('sort_order',function(){
		//User changes sort order
		var sortAscending = this.getCheckedValue()=='asc';
		if(_sortField=='' || _sortField == null)return;
		toll.Model.sortCommunities(_sortField, sortAscending);
	});
	
	
	var sortFieldControl = toll.SelectControl($('select#sort-select')[0], function(){
		//User selects sort field
		var sortField=this.getSelectedValue();
		
		if(sortMap[sortField]==null)return;
		
		_sortField = sortMap[sortField];
		var sortAscending=sortOrderControl.getCheckedValue()=='asc';
		
		toll.Model.sortCommunities(sortMap[sortField], sortAscending);
	});
	toll.Model.addSearchResultsBeforeSendListener(function(){
		sortFieldControl.setEnabled(false);
		sortOrderControl.setEnabled(false);
	});
	toll.Model.addSearchResultsErrorListener(function(errorMessage){
		sortFieldControl.setEnabled(true);
		sortOrderControl.setEnabled(true);
	});
	toll.Model.addSearchResultsListener(function(communities, params){
		if(communities==null || communities.length<1){
			//If no results
			return;
		}
		sortFieldControl.setEnabled(true);
		sortOrderControl.setEnabled(true);
	});
	
	
}

toll.SearchResultsController=function(el/*Dom html element*/){
	//Preloader display
	var loadStatusMessageDiv = $('div#searchresultsloadstatus')[0];
	loadStatusMessageDiv.innerHTML = 'Getting search results..';
	el.style.visibility='hidden';
	toll.Model.addSearchResultsBeforeSendListener(function(){
		loadStatusMessageDiv.innerHTML='Getting search results..';
		el.style.visibility='hidden';
		//TODO stateSelect.setEnabled(false);
	});
	
	toll.Model.addSearchResultsErrorListener(function(errorMessage){
		loadStatusMessageDiv.innerHTML='Search results error: '+errorMessage;
		//TODO stateSelect.setEnabled(true);
	});
	
	toll.SearchResultsView.init(el);
	
	toll.Model.addSearchResultsListener(function(communities, params){
		if(communities==null || communities.length<1){
			//TODO stateSelect.setEnabled(true);
			loadStatusMessageDiv.innerHTML = '';
			return;
		}
		el.style.visibility='visible';
		loadStatusMessageDiv.innerHTML = '';
		toll.SearchResultsView.draw(communities, params);
	});
	
	toll.Model.addSortListener(function(communityProp, ascending){
		toll.SearchResultsView.sort(communityProp, ascending);
	});
}

toll.GMap2ScrollWheelZoomController=function(mapController){
	var gmap2 = mapController.getMap();
	//Scroll Wheel Zoom
	var enableScrollZoom=true;
	var enableScrollZoomCheckboxEl=$("#enableScrollZoomCheckbox")[0];
	var enableScrollZoomCheckboxJQueryObj=$("#enableScrollZoomCheckbox");
	var setScrollWheelZoomEnabled=function(enabled){
		if(enabled){
			enableScrollZoom=true;
			enableScrollZoomCheckboxEl.checked=true;
			//toll.Map.enableScrollWheelZoom();
			gmap2.enableScrollWheelZoom();
		}else{
			enableScrollZoom=false;
			enableScrollZoomCheckboxEl.checked=false;
			//toll.Map.disableScrollWheelZoom();
			gmap2.disableScrollWheelZoom();
		}
	}
	
	setScrollWheelZoomEnabled(false);
	
	enableScrollZoomCheckboxJQueryObj.click(function(){
		setScrollWheelZoomEnabled(!enableScrollZoom);
	});
	
	toll.Model.addSearchResultsBeforeSendListener(function(){
		setScrollWheelZoomEnabled(false);
		enableScrollZoomCheckboxEl.disabled=true;
	});
	
	toll.Model.addSearchResultsListener(function(communities){
		enableScrollZoomCheckboxEl.disabled=false;
	});
}

toll.MapController=function(el/*DOM html element*/){
	var mapPreloader = toll.Preloader($('div#mapPreloader')[0]);
	var errorDisplay=toll.ErrorDisplay($('div#mapError')[0]);
	
	errorDisplay.setVisible(false);
	
	var isDataLoaded=false;
	var isMapLoaded=false;
	
	var preloaderCleanup=function(){
		if(isDataLoaded && isMapLoaded){
			mapPreloader.setVisible(false);
		}
	};
	var _map=new GMap2(el);
	var map=toll.GMap2Wrapper(_map,function(){
		//Map done loading/rendering
		isMapLoaded=true;
		preloaderCleanup();
	});
	
	el.style.visibility='hidden';
	
	
	toll.Model.addSearchResultsBeforeSendListener(function(){
		isDataLoaded=false;
		el.style.visibility='hidden';
		mapPreloader.setVisible(true);
		errorDisplay.setVisible(false);
		
	});
	
	toll.Model.addSearchResultsErrorListener(function(errorMessage){
		isDataLoaded=true;
		preloaderCleanup();
		errorDisplay.setVisible(true,errorMessage);
		mapPreloader.setVisible(false);
	});	
	
	toll.Model.addSearchResultsListener(function(communities){
		if(communities==null || communities.length<1){
			//If no results
			isDataLoaded=true;
			mapPreloader.setVisible(false);
			errorDisplay.setVisible(true, 'Your search did not produce any results.');
			return;
		}
		isDataLoaded=true;
		preloaderCleanup();
		el.style.visibility='visible';
		//
		map.drawMarkers(
			communities, 
			toll.MapInfoWindowFactory.getContent,
			toll.MapMarkerFactory.createMarker,
			toll.MapMarkerFactory.removeMarkers,
			true
		);
		//alert(map.getBadLocations().length);
	});
	return {
		getMap:function(){
			return _map;
		}
	}
}




