var SEARCH_LIMIT = 10;
var COMING_LIMIT = 5;
google.load("maps", "2.x");
var gsk = {};
//gsk.ROOT = "http://localhost:8888/neo-traffic4/";
gsk.ROOT = "http://www.neo-traffic.com/";

function changeBodyClass(from, to) {
	document.body.className = document.body.className.replace(from, to);
	
	return false;
}

gsk.dummy = new Class({
	observeCenter: function(observedCenter, trigger, triggerType){
		
		var infoDiv = new Element('div').adopt(new Element('h3', {
			text: observedCenter.name
		})).adopt(new Element('address', {
			html: observedCenter.city + ' - ' + observedCenter.country
		//})).adopt(new Element('div', {
			//html: "<div style='text-align:center'><img src='_img/icone_pdf.jpg'><br>Download PDF<p>&nbsp;</p></div>"
		})).adopt(new Element('div', {
				html: "<div style='text-align:center;padding-bottom:10px'><a href='pdf/network/en/"+ observedCenter.account +".pdf' target='_blank'><img src='_imgcenters/picture"+ observedCenter.account +".jpg' width='250' height='180' /></a></br></div>"
		})).adopt(new Element('p').adopt(new Element('a', {
			//href: "'./pdf/network/en/" + observedCenter.account + ".pdf' " + "target='_blank'",
			//html: "&raquo; More information about this center"
			html: "&raquo; Click<strong> + </strong> or <strong> the picture </strong>to have more information about this center!"
		})));
		var triggerCallback = function(center){
			gsk.locator.load().moveToCenter(center, infoDiv);
			return false;
		}
		if (triggerType === "marker") {
			GEvent.addListener(trigger, 'infowindowclose', function() { 
			var point = new GLatLng(parseFloat(observedCenter.latitude), parseFloat(observedCenter.longitude));
			//alert(point);
			//gsk.locator.load().map.setZoom(7);
			gsk.locator.load().map.panTo(point); 
				});
			GEvent.addListener(trigger, 'click', function(){
				return triggerCallback(observedCenter);
				//return triggerCallback(trigger.showMapBlowup(15));
				
			});
		}
		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.latitude !== "notfound" && center.longitude !== "notfound" && center.status !== "inactive";
			});
			gsk.locator.load().addMarkers(jsonData);
			gsk.lister.load().fillList(jsonData);
		});
	},
	observeCountry: function(statecounty){
			gsk.locator.load().geocoder.getLatLng(statecounty,function(point){
			gsk.locator.load().map.setZoom(5);
			gsk.locator.load().map.panTo(point);
		})
	},
	observeCity: function(city){
		gsk.locator.load().geocoder.getLatLng(city,function(point){
			gsk.locator.load().map.setZoom(5);
			gsk.locator.load().map.panTo(point);
		})
	},
	observeZones: function(){
		//changeBodyClass('standby', 'loading');
		$$('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==='Canada') {
					
					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.latitude !== "notfound" && center.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.latitude !== "notfound" && center.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': ["#0E2442", "#0E2442"]
			});
		});
		$('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", "#76B100"]
			});
		});
		$('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.latitude,2)+Math.pow(point.x-center.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].latitude,centers[0].longitude));
			
			gsk.locator.load().addClosestMarkers(centers);
			gsk.locator.load().addSearchMarker(point);
			gsk.locator.load().map.setZoom(gsk.locator.load().map.getBoundsZoomLevel(bounds));
			gsk.locator.load().map.setCenter(bounds.getCenter(),9);
			
			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(45, -90), 2);
		//this.map.setMapType(G_PHYSICAL_MAP);
		this.map.addMapType(G_PHYSICAL_MAP);
		this.map.addControl(new GSmallMapControl());
		this.map.addControl(new GMapTypeControl());
		this.map.enableScrollWheelZoom();
		
		this.geocoder = new GClientGeocoder();
		this.geocoder.setCache(new GFactualGeocodeCache());
		
		this.icon = new GIcon(G_DEFAULT_ICON);
		this.icon.image = gsk.ROOT+"_img/vert.png";
		this.icon.iconSize = new GSize(12, 20);
		this.icon.iconAnchor = new GPoint(6, 20);
		this.icon.infoWindowAnchor = new GPoint(5, 0);
		
		this.icon2 = new GIcon(G_DEFAULT_ICON);
		this.icon2.image = gsk.ROOT+"_img/rouge.png";
		this.icon2.iconSize = new GSize(12, 20);
		this.icon2.iconAnchor = new GPoint(6, 20);
		this.icon2.infoWindowAnchor = new GPoint(5, 0);
		
		this.searchPoint; 
		this.searchMarker;
		
		var params = window.location.search.substr(1).split("=");
		var account = params[1];
		var isLocator = window.location.pathname.indexOf('locator') != -1;
		if (account && isLocator) {
			this.backToCenter(account,this.map,this.icon);
		}
	},
	
	//loadMaps: function() {
	// google.load("maps", "2", {"callback" : initialize});
	//},
	
	
	
	backToCenter: function(account,map,icon){
		$('locator').setStyle('visibility','visible');
		$('world_overlay').setStyle('visibility','hidden');
		gsk.store.load().find(function(response){
			jsonData = JSON.decode(response).filter(function(center){
				return center.account == account;
			});
			var center = jsonData[0];
			var infoDiv = new Element('div').adopt(new Element('h3', {
				text: center.name
			})).adopt(new Element('address', {
				html: center.city + ' - ' + center.country
			})).adopt(new Element('p').adopt(new Element('a', {
				href: "center-details.shtml?center=" + center.account,
				html: "&raquo; More information about this center"
			})));
			if (map.getZoom() !== 9){
				map.setZoom(9);
			}
			var point = new google.maps.LatLng(center.latitude,center.longitude);
			var marker = new GMarker(point,icon);
			map.addOverlay(marker);
			marker.openInfoWindowHtml(infoDiv.get('html')+'<br /><br />');
			map.panTo(point);
		});
	},
	moveToWorld: function(){
		gsk.locator.load().map.clearOverlays();
		$('lister').empty();
		$('lister').setStyle('display','none');
		$('locator').setStyle('visibility','hidden');
		$('world_overlay').setStyle('visibility','visible');
		this.map.setCenter(new google.maps.LatLng(45, -90), 2);
	},
	moveToZone: function(zone){
		$('locator').setStyle('visibility','visible');
		$('world_overlay').setStyle('visibility','hidden');
		
		if(this.map.getZoom() !== 7){
			this.map.setZoom(7);
		}
		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() !== 9){
			this.map.setZoom(9);
		}
		var point = new google.maps.LatLng(center.latitude,center.longitude);
		this.map.panTo(point);
		var maxContentDiv = new Element('div');
		maxContentDiv.innerHTML = 'Loading...';
		
		gsk.locator.markers[center.account].openInfoWindowHtml(infoDiv.get('html')+'<br /><br />',{maxContent: maxContentDiv, maxTitle: "More information" });
	maxContentDiv.innerHTML = "<div style='height:550px;'><iframe src =center-details.shtml?center=" + center.account + " width = 99% height = 95% frameborder = 0 scrolling = no> </iframe></div>";
	},
	addMarkers: function(jsonData){
		gsk.locator.load().map.clearOverlays();
		jsonData.each(function(center){
			var marker = new GMarker(new GLatLng(center.latitude,center.longitude),{icon:gsk.locator.load().icon,title:center.name});
			gsk.locator.markers[center.account] = marker;
			gsk.locator.load().map.addOverlay(marker);
			gsk.dummy.load().observeCenter(center,marker,"marker");
			changeBodyClass('loading', 'standby');
		});
	},
	addMarker: function(center){
		var point = new GLatLng(center.latitude,center.longitude);
		var marker = new GMarker(point,{icon:gsk.locator.load().icon,title:center.name});
		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].latitude,jsonData[i].longitude),{icon:gsk.locator.load().icon,title:jsonData[i].name});
			gsk.locator.markers[jsonData[i].account] = marker;
			gsk.locator.load().map.addOverlay(marker);
			gsk.dummy.load().observeCenter(jsonData[i],marker,"marker");
			changeBodyClass('loading', 'standby');
		}
	},
	search: function(){
		changeBodyClass('standby', 'loading');
		$('locator').setStyle('visibility','visible');
		$('world_overlay').setStyle('visibility','hidden');
		var address = $('map_form_input').value + ", CANADA";
		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 = {
	britishcolumbia: {
		center: {
			lat: 49.8,
			lng: -121.5
		},
		jsonKey: 'British Columbia'
	},
	alberta: {
		center: {
			lat: 52.4,
			lng: -114.166666
		},
		jsonKey: 'Alberta'
	},
	saskatchewan: {
		center: {
			lat: 52.166666,
			lng: -106.683333
		},
		jsonKey: 'Saskatchewan'
	},
	manitoba: {
		center: {
			lat: 50,
			lng: -97.166666
		},
		jsonKey: 'Manitoba'
	},
	ontario: {
		center: {
			lat: 44.266666,
			lng: -76.8
		},
		jsonKey: 'Ontario'
	},
	quebec: {
		center: {
			lat: 46,
			lng: -72.166666
		},
		jsonKey: 'quebec'
	},
	newbrunswick: {
		center: {
			lat: 46,
			lng: -66.166666
		},
		jsonKey: 'New Brunswick'
	},
	novascotia: {
		center: {
			lat: 45,
			lng: -63.166666
		},
		jsonKey: 'Nova Scotia'
	}
}
gsk.locator.markers = {};
gsk.lister = new Class({
	fillList: function(jsonData){
		$('lister').empty();
		if (jsonData.length) {
			$('lister').setStyle('display','block');
			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()+ " - CANADA");
					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: "#",
						html: center.name
					})).inject(centerLi);
					new Element('address',{
						html: center.address+', '+center.zipcode+' - <strong>'+center.city+'</strong>, '+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();
		$('lister').setStyle('display','block');
		new Element('h3',{
			text: "10 closest shopping centers from this location: " + $('map_form_input').value
		}).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: "#",
				html: jsonData[i].name
			})).inject(centerLi);
			new Element('address',{
				html: jsonData[i].address+', '+jsonData[i].zipcode+' - <strong>'+jsonData[i].city+'</strong>, '+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++) {
			//alert (cities);
			
			
			if (!cities.contains(jsonData[i].city)) {
				//alert (jsonData[i].city);
				cities.push(jsonData[i].city);
			}
		}
		var coming = new Element('div', {id: 'coming'});
		var coming_title = new Element('h3', {text: 'More shopping centers to open soon in...'});
		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: '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.'});
		coming_title.inject(coming);
		coming_list.inject(coming);
		coming_p.inject(coming);
		coming.inject($('map_lister'));
		(function(){ $('coming').dispose() }).delay(10000);
		
	}
});
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: 'http://localhost:8888/neo-traffic4/_js/_json/centerstraffic.js',
			url: 'http://www.neo-traffic.com/_js/_json/centerstraffic.js',
			method: 'get',
			headers: {
				'Content-type': 'text/plain',
				'Accept': 'text/plain'
			}
		});
	
	$('loader').set('html', '<p>Loading...</p>');
	//changeBodyClass('standby', 'loading');
	
	},
	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;
}