var Util = {
	dictionary:{
		Hotels:'Hôtels',
		Parking:'Stationnements',
		'Cafes / Bars':'Cafés, bars',
		Bars:'Bars',
		'Get directions':'Directions'
	},
	language: /fr|montreal|french/i.test( /^http:..(.+?)\//i.exec(document.location)[1] ) ? 'french' : 'english',
	translation:function(english){
		return this.language=='french' && this.dictionary[english] || english;
	}
};

var MapPage = {
	active_link:null,
	locations:{
		'Cundari Toronto - Bloor':{
			city:'Toronto',
			province:'Ontario',
			markers:{
				Restaurants:[
					['Ichi Riki Restaurant',['120 Bloor Street East','Toronto, ON M4W 1B7'].join('<br>'),[43.6710529,-79.3831995 ]],
					['Spring-Rolls Restaurant',['691 Yonge Street','Toronto, ON M4Y 2B2'].join('<br>'),[43.6690412,-79.3862522 ]],
					['Focaccia Restaurant',['17 Hayden Street','Toronto, ON M4Y 2P2'].join('<br>'),[43.6695368,-79.3856963 ]],
					['Matisse Restaurant and Bar',['90 Bloor Street East','Toronto, ON'].join('<br>'),[43.6708683,-79.3839871 ]],
					['Empire Restaurant and Lounge',['50 Cumberland Street','Toronto, ON M4W 1J5'].join('<br>'),[43.6707208,-79.3888679 ]],
					['Pangaea Restaurant',['1221 Bay Street','Toronto, ON M5R 3P5'].join('<br>'),[43.6700161,-79.389525 ]],
					['Hemingway\'s Restaurant',['142 Cumberland Street','Toronto, ON M5R 1A8'].join('<br>'),[43.6700016,-79.3927035 ]],
					['Sassafraz Restaurant',['100 Cumberland Street','Toronto, ON M5R 1A6'].join('<br>'),[43.6703417,-79.3910418 ]]
				],
				'Cafes / Bars':[
					['Pilot Tavern',['22 Cumberland Street','Toronto, ON M4W 1J5'].join('<br>'),[43.6709313,-79.3878693 ]],
					['Bishop & The Belcher ',['175 Bloor E','Toronto, ON M4W 3R8'].join('<br>'),[43.6711505,-79.3826203 ]],
					['Hemingway\'s Restaurant',['142 Cumberland Street','Toronto, ON M5R 1A8'].join('<br>'),[43.6700016,-79.3927035 ]],
					['Duke Of Gloucester',['649 Yonge Street','Toronto, ON M4Y 1Z9'].join('<br>'),[43.6679683,-79.3858049 ]]
				],
				Parking:[
					['Green P Parking Carpark ',['74 Yorkville Ave','Toronto, ON'].join('<br>'),[43.6712332,-79.3908004 ]],
					['Green P Parking',['2-62 Yorkville Ave','Toronto, ON'].join('<br>'),[43.6714348,-79.3898457 ]],
					['Apcoa Parking Development & Management Ltd',['345 Bloor Street East','Toronto, ON M4W 3J6'].join('<br>'),[43.6718741,-79.3791766 ]],
					['Car Park Management Services Ltd',['730 Yonge Street','Toronto, ON M4Y 2B7'].join('<br>'),[43.6686726,-79.3861489 ]],
					['Car Park Management',['40 Isabella Street','Toronto, ON M4Y 1N1'].join('<br>'),[43.6680113,-79.3836741 ]],
					['160 Bloor St E.',['160 Bloor St E.','Toronto, ON'].join('<br>'),[43.6711514,-79.3827768 ]]						
				],
				Hotels:[
					['Toronto Marriott Bloor Yorkville ',['90 Bloor Street East','Toronto, ON M4W 1A7'].join('<br>'),[43.6708683,-79.3839871 ]],
					['Canada Suites',['Yorkville - Bloor & Yonge','Toronto, ON M4W3W6'].join('<br>'),[43.670233,-79.386755 ]],
					['Occidental Hotels',['2 Bloor Street West','Toronto, ON M4W 3E2'].join('<br>'),[43.6701945,-79.3870662 ]],
					['Comfort Hotel Downtown',['15 Charles St. E.','Toronto, ON M4Y 1S1'].join('<br>'),[43.6688079,-79.3853087 ]],
					['The Hazelton Hotel Toronto',['118 Yorkville Avenue','Toronto, ON M5R 1C2'].join('<br>'),[43.6707601,-79.393114 ]],
					['Intercontinental Toronto ',['220 Bloor Street West','Toronto, ON M5S 1T8'].join('<br>'),[43.6682308,-79.3963875 ]]
				]
			}
		},
		'Cundari Toronto':{
			city:'Toronto',
			province:'Ontario',
			markers:{
				Restaurants:[
					['The Queen Mother','206 Queen Street W',[43.6503181,-79.3889593]],
					['Alice Fazoolis Italian Restaurant','294 Adelaide Street W.',[43.6477215,-79.3908876]],
					['Little India','255 Queen Street W.',[43.6502768,-79.388988]],
					['Ho Su Japanese Bistro','254 Queen St. W',[43.6498629,-79.3911271]],
					['Tutti Matti','364 Adelaide Street W.',[43.6470659,-79.3940817]]
				],

				'Cafes / Bars':[
					['Jack Astors','133 John Street',[43.7048277,-79.5126287]],
					['Smokeless Joe','125 John St. ',[43.704741,-79.512982 ]],
					['The London Tap House','250 Adelaide Street W.',[43.6481364,-79.3889843 ]],
					['Grace O\'Malley\'s','14 Duncan Street',[43.6477193,-79.3884675 ]],
					['Bar 244','244 Adelaide Street W.',[43.6481964,-79.3887141 ]]
				],

				Parking:[
					['Nelson / Duncan','John St & Nelson St',[43.648466,-79.390529 ]],
					['Richmond / John','Richmond S W & John St',[43.649109,-79.390767 ]],
					['Adelaide / Simcoe','Adelaide St & Simcoe St',[43.648631,-79.386605 ]],
					['Scotia Bank Cinema Underground','259 Richmond St. W',[43.648975,-79.3913185 ]],
					['Adelaide / John','Adelaide St W & John St',[43.647836,-79.39028 ]]
				],

				Hotels:[
					['Hilton','145 Richmond Street West',[43.6502589,-79.385394 ]],
					['Sheraton','123 Queen Street West',[43.651273,-79.38434 ]],
					['Hyatt','370 King Street West',[43.6462153,-79.3914886 ]],
					['Residence Inn','350 Wellington Street West',[43.644585,-79.392915 ]],
					['Soho Met','350 Wellington Street West',[43.644585,-79.392915 ]]
				]
			}
		},

		'Cundari Montréal':{
			city:'Montréal',
			province:'QC',
			markers:{
				Restaurants:[
					['Anton & James',[
						'1414, rue Stanley ',
						'Montréal (Québec) H3A 1P7',
						'Réservations',
						'(514) 843-0555',
					].join("<br>"),[45.4996708,-73.5743122 ]],

					['Bistro L\'Aromate',[
						'1410, rue Peel',
						'Montréal (Québec) H3A 1S8',
						'Réservations',
						'(514) 847-9005',
						'Renseignements',
						'info@laromate.com',
						'Site Web',
						'http://www.laromate.com'
					].join("<br>"),[45.5001819,-73.5731313]],

					['Ferreira',[
						'1446, rue Peel',
						'Montréal (Québec) H3A 1S8',
						'Réservations',
						'(514) 848-0988',
						'Renseignements',
						'info@ferreiracafe.com',
						'Site Web',
						'http://www.ferreiracafe.com'
					].join("<br>"),[45.5006032,-73.5739776 ]],

					['Rosalie',[
						'1232, rue de la Montagne',
						'Montréal (Québec) H3G 1Z1',
						'Réservations',
						'(514) 392-1970',
						'Renseignements',
						'reservations@rosalierestaurant.com',
						'Site Web',
						'http://www.rosalierestaurant.com'
					].join("<br>"),[45.4971534,-73.5735782 ]],

					['Koko',[
						'8, rue Sherbrooke Ouest',
						'Montréal (Québec) H2X 4C9 ',
						'Réservations',
						'(514) 657-5656',
						'Renseignements',
						'info@ kokomontreal.com',
						'Site Web',
						'http://www.kokomontreal.com'
					].join("<br>"),[45.5123704,-73.5694775 ]]
				],

				Parking:[
					['Stationnement Safeway Canada Ltd',[
						'1140 boulevard de Maisonneuve Ouest',
						'Montréal, QC H3A 1M8',
						'(514) 842-2222',
					].join("<br>"),[45.5006635,-73.5749865 ]],

					['Unipark Stationnement Inc ',[
						'2055 rue Peel',
						'Montréal, QC H3A 1V4',
						'(514) 849-8267',
					].join("<br>"),[45.5014952,-73.5756969 ]],

					['Stationnement Métropolitain Inc',[
						'1801 avenue McGill Collège',
						'Montréal, QC H3A 2N4',
						'(514) 843-3868',
					].join("<br>"),[45.5023903,-73.5721378 ]],

					['Stationnement Métropolitain Inc',[
						'1453 rue Metcalfe',
						'Montréal, QC H3A 1X5',
						'(514) 842-7412',
					].join("<br>"),[45.5009772,-73.5728571 ]],

					['Rivest AG',[
						'2040 McGill Collège',
						'Montréal, QC H3A 1Z7',
						'(514) 844-3191',
					].join("<br>"),[45.502964,-73.5736299 ]]
				],
						
				Hotels:[
					['Opus ',[
						'10, rue Sherbrooke Ouest',
						'Montréal (Québec) H2X 4C9',
						'Réservations',
						'Téléphone : (514) 843-6000 ',
						'Sans frais : 1 866 744 6346 ',
						'Télécopieur : 514 843-6810',
						'Courriel : info@opusmontreal.com',
						'Site Web',
						'http://www.opushotel.com/montreal/french/index.html',
					].join("<br>"),[45.512349,-73.5694864 ]],
					
					['Hôtel de la Montagne',[
						'1430, rue de la Montagne    ',
						'Montréal (Québec) H3G 1Z5',
						'Réservations',
						'Téléphone : 514 288-5656',
						'Sans frais : 1 800 361-6262',
						'Télécopieur : 514 288-9658',
						'Courriel : reservations@hoteldelamontagne.com',
						'Site Web',
						'http://www.hoteldelamontagne.com',
					].join("<br>"),[45.4981607,-73.5755768 ]],

					['W Montréal',[
						'901, rue Square-Victoria    ',
						'Montréal (Québec) H2Z 1R1',
						'Réservations',
						'Téléphone : 514 395-3100',
						'Sans frais : 1 888 627-7081',
						'Télécopieur : 514 395-3150',
						'Courriel : wmontreal@whotels.com',
						'Site Web',
						'http://www.whotels.com/montreal',
					].join("<br>"),[45.5018873,-73.5621809 ]],

					['Hôtel Le Crystal',[
						'1100, rue de la Montagne ',
						'Montréal (Québec) H3G 0A1',
						'Réservations',
						'Téléphone : 514 861-5550',
						'Sans frais : 1 877 861-5550',
						'Télécopieur : 514 380-3454',
						'Courriel : info@hotellecrystal.com',
						'Site Web',
						'http://www.hotellecrystal.com',
					].join("<br>"),[45.4965944,-73.5724346 ]],

					['Hôtel Le St-James',[
						'355, rue Saint-Jacques    ',
						'Montréal (Québec) H2Y 1N9',
						'Réservations',
						'Téléphone : 514 841-3111',
						'Sans frais : 1 866 841-3111',
						'Télécopieur : 514 841-1232',
						'Courriel : info@hotellestjames.com',
						'Site Web',
						'http://www.hotellestjames.com     ',
					].join("<br>"),[45.502587,-73.559604 ]],

					['Le Centre Sheraton Montréal Hotel',[
						'1201, Boulevard René-Lévesque Ouest',
						'Réservations',
						'Montréal (Québec)  H3B 2L7',
						'(514) 878-2000',
						'Site Web',
						'http://www.sheratoncentremontreal.com',
					].join("<br>"),[45.4980365,-73.5711507 ]]
				]
			}
		}
	},

	initialize:function(language){
		Util.language = language;
		if(GBrowserIsCompatible()) {
			// Observe the onClick events for the Anchors
			this.map = new GMap2($('map'));
			this.anchors = $$('.content_left a');
			this.anchors.each(function(a){
				Event.observe(a,'click',this.displayMap.bindAsEventListener(this,a));
			},this);

			this.map.setUIToDefault();

			// display first map
			this.displayMap(null,this.anchors[ language=="french" ? 1 : 0 ]);
		} else {
			$('map').update('Your browser is not compatible with google maps.');
		}

		return this;
	},

	addMarker:function(marker,html,open){
		this.map.addOverlay(marker);
		GEvent.addListener(marker, "click", this.onMarkerClicked.bind(this,marker,html));
		if(open) this.onMarkerClicked(marker,html);
		return marker;
	},

	onMarkerClicked:function(marker,html){
		marker.openInfoWindowHtml(html);
	},

	// Display a map
	displayMap:function(ev,anchor){
		if(ev) Event.stop(ev);
		
		// Activate the anchor ( for css )
		if(this.active_link) this.active_link.up().removeClassName('active');
		this.active_link=anchor;
		this.active_link.up().addClassName('active');

		// Set the map to the coordinates with info box
		var coords = anchor.readAttribute('rel').split(',');
		var name = coords.length==3 && coords.pop() || anchor.up().select('b').shift().innerHTML;
		var point = new GLatLng(coords[0],coords[1]);
		this.map.setCenter(point, 15);
		this.map.setUIToDefault();
		this.addMarker(new GMarker(point),'<img src="/images/logo.gif"> <br> ' + anchor.innerHTML + this.getDirectionsAnchor(coords.reverse()),true);

		// Place links on 
		var asset = this.locations[name];
		var markers = asset && this.locations[name].markers;
		$('location_types').update(
			$H(markers).keys().map(function(type){
				return '<a href="javascript:void(1)" onclick="MapPage.displayMarkers(this,\'#{0}\')">#{1}</a>'.interpolate([type,Util.translation(type)])
			}).join('')
		);
	},

	getDirectionsAnchor:function(coordinates){
		return '<br><a href="javascript:void(MapPage.getDirections(#{0},#{1}))">#{2}</a>'.interpolate([coordinates[0],coordinates[1],Util.translation('Get directions')]);
	},

	displayMarkers:function(a,type){
		// remove all markers
		this.markers.each(function(m){
			m.remove();
			this.map.removeOverlay(m);
		},this);
		this.markers = [];

		// Mark A as active
		$(a).up().select('a').invoke('removeClassName','active');
		$(a).addClassName('active');

		var anchor = this.active_link;

		// Place the markers onto the map - http://code.google.com/apis/maps/documentation/overlays.html
		var coords = anchor.readAttribute('rel').split(',');
		var geocoder = new GClientGeocoder();
		var name = coords.length==3 && coords.pop() || anchor.up().select('b').shift().innerHTML;
		var asset = this.locations[name];
		var city = asset && asset.city;
		var province = asset && asset.province;
		var markers = asset && this.locations[name].markers;
		var icons = 'red blue green black white'.split(' ').map(function(colour){
			var tinyIcon = new GIcon();
			tinyIcon.image = "http://labs.google.com/ridefinder/images/mm_20_#{0}.png".interpolate([colour]);
			tinyIcon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
			tinyIcon.iconSize = new GSize(12, 20);
			tinyIcon.shadowSize = new GSize(22, 20);
			tinyIcon.iconAnchor = new GPoint(6, 20);
			tinyIcon.infoWindowAnchor = new GPoint(5, 1);
			return tinyIcon;
		},this);
		var locations = markers[type];
		if(!locations) return;

		var icon = icons[0];
		
		locations.each(function(marker){
			var name = marker[0];
			var address = (marker[1] && Object.isString(marker[1]) && marker[1] || name);//.split("<br>").shift();
			var coords = Object.isArray(marker[marker.length-1]) && marker[marker.length-1];
			var title = [ name,address ].join(" <br> ");
			var markerOptions = { icon:icon };
			if(coords){
				this.onLocationReceived(
					{Placemark:[{Point:{coordinates:coords.reverse()}}]},
					title,
					markerOptions
				);
			} else {
				geocoder.getLocations(
					[address,city,province].join(','),
					this.onLocationReceived.bindAsEventListener(
						this,
						title,
						markerOptions
					)
				);
			}
		},this);

	},

	markers:[],
	onLocationReceived:function(response,title,markerOptions) {
		if(response && response.Placemark && response.Placemark.length){
			var place = response.Placemark[0];
			var point = new GLatLng(place.Point.coordinates[1],place.Point.coordinates[0]);
			this.markers.push(this.addMarker(
				new GMarker(point,markerOptions),
				title + this.getDirectionsAnchor(place.Point.coordinates)
			));
			//$('test').innerHTML+="GOOD: " + title + "COORDS: " + [place.Point.coordinates[1],place.Point.coordinates[0]] + " <hr>";
		} else {
			//$('test').innerHTML+="BAD: " + title + "<BR>";
		}
	},

	getDirections:function(longitude,latitude){
		var postal = prompt('Please enter your postal code or address');
		if(postal) window.open('http://maps.google.ca/maps?saddr=#{0},#{1}&daddr=#{2}'.interpolate([latitude,longitude,postal]),'directions');
	}
};
