var SEARCH_LIMIT = 10;
var COMING_LIMIT = 5;

var lang = 'en';

switch (lang) {
	case 'en' : var detailsURL = "/lung-cancer-clinical-trial.shtml"; break; // before "lung-cancer-clinical-trial.shtml"
	case 'fr' : var detailsURL = "details-du-centre-d-etude.shtml"; break;
}

google.load("maps", "2.x");
var gsk = {};
gsk.ROOT = "http://www.ascitrials.com/";

gsk.dummy = new Class({
	observeCenter: function(observedCenter, trigger, triggerType){
		switch (lang) {
			case 'en' : var moreInfoText = "More information about this center"; break;
			case 'fr' : var moreInfoText = "Plus d'informations à propos de ce centre"; break;
		}	
		var infoDiv = new Element('div').adopt(new Element('h3', {
			text: observedCenter.pi_site_institution_name
		})).adopt(new Element('address', {
			html: observedCenter.pi_site_city + ' - ' + observedCenter.country
		})).adopt(new Element('p').adopt(new Element('a', {
			href: detailsURL+"?center=" + observedCenter.site_account_number,
			html: "&raquo; "+moreInfoText
		})));
		var triggerCallback = function(center){
			//gsk.locator.load().moveToCenter(center, infoDiv);
			window.location.href = detailsURL+"?center="+center.site_account_number;
			return false;
		}
		if (triggerType === "marker") {
			GEvent.addListener(trigger, 'click', function(){
				return triggerCallback(observedCenter);
			});
		}
		else if (triggerType === "dom") {
			trigger.each(function(trigger){
				trigger.addEvent('click', function(){
					//return triggerCallback(observedCenter);
				});
			});
		}
	}
});
gsk.dummy.load = function(){
	if (!gsk.dummy.instance) {
		gsk.dummy.instance = new gsk.dummy();
	}
	return gsk.dummy.instance;
}

gsk.control = new Class({
	initialize: function(){
		this.observeZones();
		this.observeForm();
	},
	showWorld: function(){
		gsk.store.load().find(function(response){
			jsonData = JSON.decode(response).filter(function(center){
				return center.region.pi_site_latitude !== "notfound" && center.pi_site_longitude !== "notfound" && center.status !== "inactive";
			});
			gsk.locator.load().addMarkers(jsonData);
			gsk.lister.load().fillList(jsonData);
		});
	},
	observeCountry: function(country){
		gsk.locator.load().geocoder.getLatLng(country,function(point){
			gsk.locator.load().map.setZoom(7);
			gsk.locator.load().map.panTo(point);
		})
	},
	observeZones: function(){
		$$('ul#map_controls_continent li a').each(function(trigger){
			trigger.addEvent('click',function(){
				$('map_form_goto').setStyle('visibility','hidden');
				$$('.btn_green')[0].removeClass('btn_green');
				this.getParent().addClass('btn_green');
				var zone = trigger.get('id');
				if (zone==='world') {
					gsk.locator.load().moveToWorld();
				}
				else {
					gsk.locator.load().moveToZone(zone);
					gsk.store.load().find(function(response){
						jsonData = JSON.decode(response).filter(function(center){
							return center.region == gsk.locator.zones[zone].jsonKey && center.region.pi_site_latitude !== "notfound" && center.pi_site_longitude !== "notfound" && center.status !== "inactive";
						});
						gsk.locator.load().addMarkers(jsonData);
						gsk.lister.load().fillList(jsonData);
					});
				}
				return false;
			});
		});
		$$('#world_overlay_map area').each(function(trigger){
			trigger.addEvent('click',function(){
				var id = this.getProperty('id');
				var zone = id.substr(0,id.length-5);
				$('map_form_goto').setStyle('visibility','hidden');
				$$('.btn_green')[0].removeClass('btn_green');
				$(zone).getParent().addClass('btn_green');
				gsk.locator.load().moveToZone(zone);
				gsk.store.load().find(function(response){
					jsonData = JSON.decode(response).filter(function(center){
						return center.region == gsk.locator.zones[zone].jsonKey && center.region.pi_site_latitude !== "notfound" && center.pi_site_longitude !== "notfound" && center.status !== "inactive";
					});
					gsk.locator.load().addMarkers(jsonData);
					gsk.lister.load().fillList(jsonData);
				});
				return false;
			});
		});
	},
	observeForm: function(){
		$('map_form_input').addEvent('focus',function(){
			var fx = new Fx.Morph(this, {duration:500, transition:Fx.Transitions.Back.easeOut});
			fx.start({
				'width': [75, 150],
				'border-color': ["#187BA3", "#76B100"]
			});
		});
		$('map_form_input').addEvent('blur', function() {
			var fx = new Fx.Morph(this, {duration:500, transition:Fx.Transitions.Back.easeIn});
			fx.start({
				'width': [150, 75],
				'border-color': ["#76B100", "#187BA3"]
			});
		});
		$('map_form_input').addEvent('keypress', function(e) {
			var key = window.event ? e.event.keyCode : e.event.which;
			if (key===13) {
				gsk.locator.load().search();
				$('map_form_input').blur();
			}
		});
		$('map_form_submit').addEvent('click', function() {
			gsk.locator.load().search();
		});
	},
	showError: function() {
		new Fx.Tween($('map_form_error'), 'opacity', {duration:500}).start(0, 1);
	},
	hideError: function() {
		new Fx.Tween($('map_form_error'), 'opacity', {duration:500}).start(1, 0);
	},
	showGoTo: function() {
		new Fx.Tween($('map_form_goto'), 'opacity', {duration:500}).start(0, 1);
	},
	hideGoTo: function() {
		new Fx.Tween($('map_form_goto'), 'opacity', {duration:500}).start(1, 0);
	},
	findClosest: function(point) {
		gsk.store.load().find(function(response){
			var centers = new Array();
			var coming = new Array();
			jsonData = JSON.decode(response).each(function(center) {
				center.distance = Math.sqrt(Math.pow(point.y-center.pi_site_latitude,2)+Math.pow(point.x-center.pi_site_longitude,2)).toString();
				if (center.status === 'active') {
					centers.push(center);
				}
				else {
					coming.push(center);
				}
			});
			centers = gsk.control.load().sortCenters(centers);
			coming = gsk.control.load().sortCenters(coming);
			
			var bounds = new GLatLngBounds();
			bounds.extend(point);
			bounds.extend(new GLatLng(centers[0].pi_site_latitude,centers[0].pi_site_longitude));
			
			gsk.locator.load().addClosestMarkers(centers);
			//gsk.locator.load().addSearchMarker(point);
			gsk.locator.load().map.setZoom(gsk.locator.load().map.getBoundsZoomLevel(bounds)-1);
			gsk.locator.load().map.setCenter(bounds.getCenter());
			
			gsk.lister.load().fillClosest(centers);
			gsk.lister.load().fillComing(coming);
		});
	},
	sortCenters:function(centers) {
		var temp;
		for (var i=1; i<centers.length; i++) {
			for (var j=centers.length; j>i; j--) {
				if (parseFloat(centers[j-2].distance) > parseFloat(centers[j-1].distance)) {
					temp = centers[j-2];
					centers[j-2] = centers[j-1];
					centers[j-1] = temp;
				}
			}
		}
		return centers;
	}
});
gsk.control.load = function(){
	if (!gsk.control.instance) {
		gsk.control.instance = new gsk.control();
	}
	return gsk.control.instance;
}
gsk.locator = new Class({
	initialize: function(){
		
		this.map = new google.maps.Map2($('locator'));
		this.map.setCenter(new google.maps.LatLng(21, 17), 2);
		this.map.setMapType(G_PHYSICAL_MAP);
		this.map.addControl(new GSmallMapControl());
		this.map.addControl(new GMapTypeControl());
		
		this.geocoder = new GClientGeocoder();
		this.geocoder.setCache(new GFactualGeocodeCache());
		
		this.icon = new GIcon(G_DEFAULT_ICON);
		this.icon.image = gsk.ROOT+"_img/icon.png";
		this.icon.iconSize = new GSize(20, 34);
		this.icon.iconAnchor = new GPoint(11, 34);
		this.icon.infoWindowAnchor = new GPoint(11, 0);
		
		this.icon2 = new GIcon(G_DEFAULT_ICON);
		this.icon2.image = gsk.ROOT+"_img/icon2.png";
		this.icon2.iconSize = new GSize(20, 34);
		this.icon2.iconAnchor = new GPoint(11, 34);
		this.icon2.infoWindowAnchor = new GPoint(11, 0);
		
		this.searchPoint; 
		this.searchMarker;
		
		var params = window.location.search.substr(1).split("=");
		var site_account_number = params[1];
		var isLocator = window.location.pathname.indexOf('locator') != -1;
		if (site_account_number && isLocator) {
			this.backToCenter(site_account_number,this.map,this.icon);
		}
	},
	backToCenter: function(site_account_number,map,icon){
		$('lister').setStyle('display','block');
		$('locator').setStyle('visibility','visible');
		$('world_overlay').setStyle('visibility','hidden');
		gsk.store.load().find(function(response){
			switch (lang) {
				case 'en' : var moreInfoText = "More information about this center"; break;
				case 'fr' : var moreInfoText = "Plus d'informations à propos de ce centre"; break;
			}
			jsonData = JSON.decode(response).filter(function(center){
				return center.site_account_number == site_account_number;
			});
			var center = jsonData[0];
			var infoDiv = new Element('div').adopt(new Element('h3', {
				text: center.pi_site_institution_name
			})).adopt(new Element('address', {
				html: center.pi_site_city + ' - ' + center.country
			})).adopt(new Element('p').adopt(new Element('a', {
				href: detailsURL+"?center=" + center.site_account_number,
				html: "&raquo; "+moreInfoText
			})));
			if (map.getZoom() !== 10){
				map.setZoom(10);
			}
			var point = new google.maps.LatLng(center.pi_site_latitude,center.pi_site_longitude);
			var marker = new GMarker(point,icon);
			map.addOverlay(marker);
			marker.openInfoWindow(infoDiv.get('html')+'<br /><br />');
			map.panTo(point);
		});
	},
	moveToWorld: function(){
		if ($('coming')) {
			$('coming').dispose();
		}
		gsk.locator.load().map.clearOverlays();
		$('lister').empty();
		$('lister').setStyle('display','none');
		$('map').setStyle('width', '864px');
		$('locator').setStyle('visibility','hidden');
		$('world_overlay').setStyles({visibility:'visible',width:'864px'});
		this.map.setCenter(new google.maps.LatLng(21, 17), 2);
	},
	moveToZone: function(zone){
		if ($('coming')) {
			$('coming').dispose();
		}
		$('lister').setStyle('display','block');
		$('map').setStyle('width', '432px');
		$('locator').setStyle('visibility','visible');
		$('world_overlay').setStyles({visibility:'hidden',width:'432px'});
		if(this.map.getZoom() !== 3){
			this.map.setZoom(3);
		}
		this.map.panTo(new google.maps.LatLng(gsk.locator.zones[zone].center.lat,gsk.locator.zones[zone].center.lng));
	},
	moveToCenter: function(center,infoDiv){
		if (this.map.getZoom() !== 10){
			this.map.setZoom(10);
		}
		var point = new google.maps.LatLng(center.pi_site_latitude,center.pi_site_longitude);
		this.map.panTo(point);
		gsk.locator.markers[center.site_account_number].openInfoWindow(infoDiv.get('html')+'<br /><br />');
	},
	addMarkers: function(jsonData){
		gsk.locator.load().map.clearOverlays();
		jsonData.each(function(center){
			var marker = new GMarker(new GLatLng(center.pi_site_latitude,center.pi_site_longitude),gsk.locator.load().icon);
			gsk.locator.markers[center.site_account_number] = marker;
			gsk.locator.load().map.addOverlay(marker);
			gsk.dummy.load().observeCenter(center,marker,"marker");
		});
	},
	addMarker: function(center){
		var point = new GLatLng(center.pi_site_latitude,center.pi_site_longitude);
		var marker = new GMarker(point,gsk.locator.load().icon);
		gsk.locator.markers[center.study_local] = marker;
		gsk.locator.load().map.addOverlay(marker);
	},
	addSearchMarker: function(center){
		if (gsk.locator.load().searchMarker) {
			gsk.locator.load().map.removeOverlay(gsk.locator.load().searchMarker);
		}
		gsk.locator.load().searchPoint = new GLatLng(center.y,center.x);
		gsk.locator.load().searchMarker = new GMarker(gsk.locator.load().searchPoint,gsk.locator.load().icon2);
		gsk.locator.load().map.addOverlay(gsk.locator.load().searchMarker);
	},
	addClosestMarkers: function(jsonData){
		gsk.locator.load().map.clearOverlays();
		for (var i=0; i<SEARCH_LIMIT && i<jsonData.length; i++) {
			var marker = new GMarker(new GLatLng(jsonData[i].pi_site_latitude,jsonData[i].pi_site_longitude),gsk.locator.load().icon);
			gsk.locator.markers[jsonData[i].site_account_number] = marker;
			gsk.locator.load().map.addOverlay(marker);
			gsk.dummy.load().observeCenter(jsonData[i],marker,"marker");
		}
	},
	search: function(){
		$('map').setStyle('width', '432px');
		$('lister').setStyle('display','block');
		$('locator').setStyle('visibility','visible');
		$('world_overlay').setStyle('visibility','hidden');
		var address = $('map_form_input').value;
		gsk.locator.load().geocoder.getLatLng(address,function(point){
			if (!point) {
				if ($('map_form_goto').getStyle('visibility')==='visible') {
					gsk.control.load().hideGoTo();
				}
				gsk.control.load().showError();
			}
			else {
				if ($('map_form_error').getStyle('visibility')==='visible') {
					gsk.control.load().hideError();
				}
				gsk.control.load().showGoTo();
				gsk.control.load().findClosest(point);
			}
		});
	}
});
gsk.locator.load = function(){
	if (!gsk.locator.instance) {
		gsk.locator.instance = new gsk.locator();
	}
	return gsk.locator.instance;
}
gsk.locator.zones = {
	north_america: {
		center: {
			lat: 40,
			lng: -95
		},
		jsonKey: 'North America'
	},
	south_america: {
		center: {
			lat: -22.348230,
			lng: -60.029140
		},
		jsonKey: 'South America'
	},
	europe: {
		center: {
			lat: 47.517200697839414,
			lng: 18.017578125
		},
		jsonKey: 'Europe'
	},
	asia: {
		center: {
			lat: 31.353636941500987,
			lng: 93.69140625
		},
		jsonKey: 'Asia'
	},
	oceania: {
		center: {
			lat: -27.546530,
			lng: 135.447037
		},
		jsonKey: 'Oceania'
	},
	africa: {
		center: {
			lat: 12.104140,
			lng: 15.050550
		},
		jsonKey: 'Africa'
	}
}
gsk.locator.markers = {};
gsk.lister = new Class({
	fillList: function(jsonData){
		$('lister').empty();
		if (jsonData.length) {
			var countries = {};
			jsonData.each(function(center){
				if(countries[center.country] !== undefined){
					countries[center.country].push(center);
				}
				else{
					countries[center.country] = [center];
				}
			});
			for(country in countries){
				var essai = country;
				new Element('h3').adopt(new Element('a',{
					href: "#",
					text: country
				}).addEvent('click',function(){
					//gsk.control.load().observeCountry(this.getText());
					return false;
				})).inject($('lister'));
				var countryList = new Element('ul',{
					id: "lister"+(country.replace(/\s/,'')).hyphenate()
				}).inject($('lister'));
				countries[country].each(function(center){
					var centerLi = new Element('li');
					new Element('h4').adopt(new Element('a',{
						href: detailsURL+"?center="+center.site_account_number,
						html: center.pi_site_institution_name
					})).inject(centerLi);
					new Element('address',{
						html: center.pi_site_street_address+', '+center.pi_site_zipcode+' - '+center.pi_site_city+', '+center.country
					}).inject(centerLi);
					centerLi.inject(countryList);
					gsk.dummy.load().observeCenter(center,centerLi.getElements('a'),"dom");
				});
				countryList.inject($('lister'));
			}
		}
		else {
			$('lister').setStyle('display','none');
		}
	},
	fillClosest: function(jsonData){
		$('lister').empty();
		switch (lang) {
			case 'en' : var closestCentersText = "10 closest centers from this location"; break;
			case 'fr' : var closestCentersText = "10 centres les plus proches de ce lieu"; break;
		}
		new Element('h3',{
			text: closestCentersText
		}).inject($('lister'));
		var list = new Element('ul').inject($('lister'));
		for (var i=0; i<SEARCH_LIMIT; i++) {
			var centerLi = new Element('li');
			new Element('h4').adopt(new Element('a',{
				href: detailsURL+"?center="+jsonData[i].site_account_number,
				html: jsonData[i].pi_site_institution_name
			})).inject(centerLi);
			new Element('address',{
				html: jsonData[i].pi_site_street_address+', '+jsonData[i].pi_site_zipcode+' - '+jsonData[i].pi_site_city+', '+jsonData[i].country
			}).inject(centerLi);
			centerLi.inject(list);
			gsk.dummy.load().observeCenter(jsonData[i],centerLi.getElements('a'),"dom");
		}
	},
	fillComing: function(jsonData) {
		var cities = new Array();
		for (var i=0; cities.length<COMING_LIMIT; i++) {
			if (!cities.contains(jsonData[i].pi_site_city)) {
				cities.push(jsonData[i].pi_site_city);
			}
		}
		switch (lang) {
			case 'en' : var moreCentersText = "More centers to open soon in...";
						var comingCentersText = "This section of the website will be regularly updated as new centers are opened. So please visit again soon to see if there is a center that has opened in your area.";
						break;
			case 'fr' : var moreCentersText = "Plus de centres ouvriront bientôt ici...";
						var comingCentersText = "Cette section du site sera régulièrement mise à jour au fur et à mesure de l'ouverture de nouveaux centres. Merci de revenir régulièrement pour voir si un nouveau centre a été ouvert près de chez vous.";
						break;
		}
		if ($('coming')) {
			$('coming').dispose();
		}
		var coming = new Element('div', {id: 'coming'});
		var coming_title = new Element('h3', {text: moreCentersText});
		var coming_list = new Element('ul');
		var coming_list_item;
		for (var i=0; i<cities.length; i++) {
			coming_list_item = new Element('li', {text: cities[i]});
			coming_list_item.inject(coming_list);
		}
		var coming_p = new Element('p', {text: comingCentersText});
		coming_title.inject(coming);
		coming_list.inject(coming);
		coming_p.inject(coming);
		coming.inject($('main_content_larger'));
	}
});
gsk.lister.load = function(){
	if (!gsk.lister.instance) {
		gsk.lister.instance = new gsk.lister();
	}
	return gsk.lister.instance;
}
gsk.store = new Class({
	initialize: function(){
		this.request = new Request({
			url: '/_json/centers.js',
			method: 'get',
			headers: {
				'Content-type': 'text/plain',
				'Accept': 'text/plain'
			}
		});
	},
	find: function(successCallback){
		this.request.onSuccess = successCallback;
		this.request.send();
	}
});
gsk.store.load = function(){
	if (!gsk.store.instance) {
		gsk.store.instance = new gsk.store();
	}
	return gsk.store.instance;
}