var mySearch;
var dev = /webappdev.partners.org|localhost|170\.223\.246\.70/;
var pageLocation = window.location.toString().search(dev); 
var assetsUrl = pageLocation == -1 ? '/assets/processing/' : 'processing/';

var config = {
	az			: 'all',
	type		: 'doctors',
	center		: '',
	program		: '', 
	location	: '', 
	language	: '', 
	age			: '',		
	gender 		: '',		
	links		: 7,
	query		: '',
	numPerPage 	: 50,
	href 		: assetsUrl + 'physicianXml.ashx',
	search		: 'doctors'
};

var physicianSearchFilters = (function(){

	var centers = (function(){	
		var controller = new com.mgh.CentersController('51879', assetsUrl);
		var view = new com.mgh.CentersView();
		var model = new com.mgh.CentersModel();	
		
		return {
			controller : controller,
			model : model,
			view : view
		};	
	})();
	
	var programs = (function(){
		var controller = new com.mgh.ProgramsController(assetsUrl);
		var view = new com.mgh.ProgramsView();
		var model = new com.mgh.ProgramsModel();	
		
		return {
			controller : controller,
			model : model,
			view : view
		};	
	})();
	
	var locations = (function(){	
		var controller = new com.mgh.LocationsController('51886', assetsUrl);
		var view = new com.mgh.LocationsView();
		var model = new com.mgh.LocationsModel();	
		
		return {
			controller : controller,
			model : model,
			view : view
		};	
	})();
	
	var languages = (function(){	
		var controller = new com.mgh.LanguagesController('51885', assetsUrl);
		var view = new com.mgh.LanguagesView();
		var model = new com.mgh.LanguagesModel();	
		
		return {
			controller : controller,
			model : model,
			view : view
		};	
	})();
	
	var ageGroup = (function(){	
		var controller = new com.mgh.AgeGroupController();
		var view = new com.mgh.AgeGroupView();
		
		return {
			controller : controller,		
			view : view
		};	
	})();
	
	var gender = (function(){	
		var controller = new com.mgh.GenderController();
		var view = new com.mgh.GenderView();
		
		return {
			controller : controller,		
			view : view
		};	
	})();
	
	return {
		centers : centers,
		programs : programs,
		locations : locations,
		languages : languages,
		ageGroup : ageGroup,
		gender : gender
	};
})();

var applicationState = (function(){
	var storeId = window.location.href.toString().replace("#","");
	var model = {
		"center"		: "",
		"program"		: "", 
		"location"		: "", 
		"language"		: "", 
		"age"			: "",		
		"gender" 		: "",
		"isCenter"		: false
	};
	
	return new ApplicationState(model, storeId);
})();

jQuery(document).ready(function(){
	dojo.subscribe('requestCentersData', physicianSearchFilters.centers.controller, 'GetData');
	dojo.subscribe('centersDataReady', physicianSearchFilters.centers.model, 'PopulateModel');
	dojo.subscribe('centersModelReady', physicianSearchFilters.centers.view, 'RenderInitialView');	

	dojo.subscribe('preSelectedCentersDataReady', physicianSearchFilters.centers.model, 'PopulatePreSelectedModel');
	dojo.subscribe('preSelectedCentersModelReady',physicianSearchFilters.centers.view,'RenderPreSelectedView');
	dojo.subscribe('getPreSelectedPrograms', physicianSearchFilters.programs.controller, 'GetData');
	
	dojo.subscribe('getCentersByLocation', physicianSearchFilters.centers.controller, 'GetCentersByLocation');
	dojo.subscribe('getPreSelectedLocations', physicianSearchFilters.locations.controller, 'GetCenterLocations');
	
	dojo.subscribe('centerClicked', physicianSearchFilters.locations.controller,'ResetLocations');	
	dojo.subscribe('centerClicked', physicianSearchFilters.programs.controller, 'GetData');
	dojo.subscribe('centerClicked', physicianSearchFilters.locations.controller, 'GetCenterLocations');	
	dojo.subscribe('centerClicked', physicianSearchFilters.centers.controller, 'Filter');
	dojo.subscribe('centerClicked', physicianSearchFilters.centers.view, 'RenderSelectedView');
	dojo.subscribe('centerClicked', physicianSearchFilters.locations.view,'ToggleCenterSelected');

	dojo.subscribe('showAllCenters', physicianSearchFilters.programs.controller, 'ResetPrograms');
	dojo.subscribe('showAllCenters', physicianSearchFilters.locations.controller,'ResetLocations');	
	
	dojo.subscribe('showAllCenters', physicianSearchFilters.centers.controller, 'Filter');	
	//dojo.subscribe('showAllCenters', physicianSearchFilters.centers.controller, 'GetData');	
	dojo.subscribe('showAllCenters', physicianSearchFilters.centers.view, 'RenderListViewFromExistingModel');	
	dojo.subscribe('showAllCenters', physicianSearchFilters.programs.view, 'ToggleProgramsView');
	dojo.subscribe('showAllCenters', physicianSearchFilters.locations.controller, 'GetAllLocations');
	dojo.subscribe('showAllCenters', physicianSearchFilters.locations.view,'ToggleCenterSelected');
	dojo.subscribe('showAllCenters', physicianSearchFilters.locations.view,'ToggleCenterSelected');
	
	/* programs events */
	dojo.subscribe('requestProgramsData', physicianSearchFilters.programs.controller, 'GetData');
	dojo.subscribe('programsDataReady', physicianSearchFilters.programs.model, 'PopulateModel');
	dojo.subscribe('programsModelReady', physicianSearchFilters.programs.view, 'RenderListView');
	dojo.subscribe('programClicked', physicianSearchFilters.programs.view, 'RenderSelectedView');
	dojo.subscribe('programClicked', physicianSearchFilters.programs.controller, 'Filter');
	dojo.subscribe('showAllPrograms', physicianSearchFilters.programs.view, 'RenderListViewFromExistingModel');
	dojo.subscribe('showAllPrograms', physicianSearchFilters.programs.controller, 'Filter');
	
	/* locations events */
	dojo.subscribe('requestAllLocationsData', physicianSearchFilters.locations.controller, 'GetAllLocations');
	dojo.subscribe('locationsDataReady', physicianSearchFilters.locations.model, 'PopulateModel');
	dojo.subscribe('locationsModelReady', physicianSearchFilters.locations.view, 'RenderListView');
	dojo.subscribe('locationClicked', physicianSearchFilters.locations.view, 'RenderSelectedView');
	dojo.subscribe('locationClicked', physicianSearchFilters.centers.controller, 'GetCentersByLocation');
	dojo.subscribe('locationClicked', physicianSearchFilters.centers.view, 'ToggleLocationSelected');
	dojo.subscribe('locationClicked', physicianSearchFilters.centers.view, 'EvaluateView');
	dojo.subscribe('locationClicked', physicianSearchFilters.locations.controller, 'Filter');
	dojo.subscribe('showAllLocations', physicianSearchFilters.centers.controller, 'GetData');	
	dojo.subscribe('showAllLocations', physicianSearchFilters.centers.view, 'ToggleLocationSelected');
	dojo.subscribe('showAllLocations', physicianSearchFilters.centers.view, 'EvaluateView');		
	dojo.subscribe('showAllLocations', physicianSearchFilters.locations.view, 'ToggleLocationSelected'); 	
	dojo.subscribe('showAllLocations', physicianSearchFilters.locations.view, 'EvaluateView');
	dojo.subscribe('showAllLocations', physicianSearchFilters.locations.controller, 'Filter');	
	
	/* languages events */
	dojo.subscribe('requestAllLanguagesData', physicianSearchFilters.languages.controller, 'GetAllLanguages');
	dojo.subscribe('languagesDataReady', physicianSearchFilters.languages.model, 'PopulateModel');
	dojo.subscribe('languagesModelReady', physicianSearchFilters.languages.view, 'RenderListView');
	
	dojo.subscribe('languageClicked', physicianSearchFilters.languages.view, 'RenderSelectedView');	
	dojo.subscribe('languageClicked', physicianSearchFilters.languages.controller, 'Filter');	
	dojo.subscribe('showAllLanguages', physicianSearchFilters.languages.view, 'RenderListViewFromExistingModel');
	dojo.subscribe('showAllLanguages', physicianSearchFilters.languages.controller, 'Filter');		
	
	/* age group events */
	dojo.subscribe('requestAllAgeGroupsData', physicianSearchFilters.ageGroup.view, 'RenderInitialView');
	dojo.subscribe('ageGroupClicked', physicianSearchFilters.ageGroup.view, 'RenderSelectedView');
	dojo.subscribe('ageGroupClicked', physicianSearchFilters.ageGroup.controller, 'Filter');
	dojo.subscribe('showAllAgeGroups', physicianSearchFilters.ageGroup.view, 'RenderListView');
	dojo.subscribe('showAllAgeGroups', physicianSearchFilters.ageGroup.controller, 'Filter');
	
	/* gender events */
	dojo.subscribe('requestAllGendersData', physicianSearchFilters.gender.view, 'RenderInitialView');
	dojo.subscribe('genderClicked', physicianSearchFilters.gender.view, 'RenderSelectedView');
	dojo.subscribe('genderClicked', physicianSearchFilters.gender.controller, 'Filter');
	dojo.subscribe('showAllGenders', physicianSearchFilters.gender.view, 'RenderListView');
	dojo.subscribe('showAllGenders', physicianSearchFilters.gender.controller, 'Filter');	
	
	/* 
	 * 
	 * Application events to update the state object with each element's id
	 * 	 
	 */
	
	dojo.subscribe('centerClicked', applicationState,'update');
	dojo.subscribe('locationClicked', applicationState,'update');
	dojo.subscribe('languageClicked', applicationState,'update');
	dojo.subscribe('programClicked', applicationState,'update');
	dojo.subscribe('ageGroupClicked', applicationState,'update');
	dojo.subscribe('genderClicked', applicationState,'update');
	
	/*
	 * If centers have state programs need to open and locations need to be selected.
	 */
	
	/* application events to update the state object with each element's id set to ''*/
	dojo.subscribe('showAllCenters', applicationState, 'update');
	dojo.subscribe('showAllLocations', applicationState,'update');
	dojo.subscribe('showAllPrograms', applicationState,'update');
	
	// showAllLanguages event checks whether the languages state is either null or '' in the view component.
	dojo.subscribe('showAllLanguages', applicationState,'update');
	dojo.subscribe('showAllAgeGroups', applicationState,'update');
	dojo.subscribe('showAllGenders', applicationState,'update');	
	
	
	/*
		Saves state before reloading or going to another page.
		State is saved in a session cookie and is erased automatically
		after quitting browser.
	*/	
	dojo.connect(window, 'unload', function(){
		applicationState.save();
	});
	
	/* start */
	var qs = new com.mgh.QueryString(null);
	var preSelectedCenter = qs.params["center"];
	var centerState = applicationState.getApplicationComponentState('Center');
	
	// with the query string present all elements return to their initial state;
	// To keep state it is necessary to allow all panels to load except and to tell each
	// to call their renderSelectedView method. It is important to call them in a left to right order.
	// so the hierarchy is kept.
	if (preSelectedCenter != undefined){
		dojo.publish('getPreSelectedLocations',[preSelectedCenter,'','Location']);
		dojo.publish('getPreSelectedPrograms',[preSelectedCenter,'','Program']);
		config.center = preSelectedCenter;	
		
		// only set the store's center value if it doesn't exist.
		if(!centerState){			
			applicationState.update(preSelectedCenter, 'Center', 'Center');
		}
	} else {
		var isCenter = applicationState.model.isCenter;
		if(centerState){
			// Centers has state, request center locations.
			var id = applicationState.model.center;
			dojo.publish('getPreSelectedLocations',[id,'','Location']);
			
			// Center has state and it is a center, not a program.
			if(isCenter){
				dojo.publish('getPreSelectedPrograms',[id,'','Program']);
			}
		} else {
			// Center has no state, request all locations.
			dojo.publish('requestAllLocationsData',['','','Location']);			
		}
	}
	
	// if a location is pre-selected from state act accordingly
	if (applicationState.getApplicationComponentState('Location')){
		var id = applicationState.model.location;
		dojo.publish('getCentersByLocation', [id, 'Center', 'Center']);
	} else {
		dojo.publish('requestCentersData',['','Center','Center']);	
	}
	
	// update persisten parameters
	config = applicationState.updateQueryParams(config);
	mySearch = new com.mgh.PhysicianSearch(config);		

	// Function found in Run.js
	registerEvents ();		
	
	
	/*
	 * centers controller uses the same query string to publish either preSelectedCenterDataReady or centerDataReady
	 * events. This needs to be revised. These events choose state based on the query string alone.
	 */
	dojo.publish('requestAllLanguagesData',['','','Language']);
	dojo.publish('requestAllAgeGroupsData',[]);
	dojo.publish('requestAllGendersData',[]);	
});

