/*
Script: gmaps.js
		
License:
        MIT-style license.

About:
		gmaps.js for mootools framework <http://www.mootools.net/> (c) 2007 Valerio Proietti, MIT-style license.
		Class created by Sylvain Barraud, Yvan Cottet and Gregory Paccaud, Luca Pillonel <http://www.esl.ch/>.
		Last modification, 4 may 2010.

Version: 1.0

Note:
		XHTML doctype is required.
		
*/

/*
Class: SchoolGoogleMap EXTEND GoogleMap
		
Arguments:

		map_container		A dom element ID
		street_container	A dom element ID
		data				Data origin (DB or XML)
		auto_center			true / false (calculate where to center on)
		streetview			true / false
		cache				false or new Cache()
		customized_icon		true / false (use a customized icon)
		icon_image			path (customized icon)
		icon_shadow			path (customized icon)
		
		image_adult			path (icone image for adult)
		xml_adult           path (xml file for adult)
		image_junior		path (icone image for junior)
		xml_junior 			path (xml file for junior)
		image_50 			path (icone image for 50+)
		xml_50 				path (xml file for 50+)
		schoolmap			map for school pages
		zoom_level			default level zoom
		

Example:

		(start code)
		new SchoolGoogleMap({
			'map_container' : 'gmap',
			'auto_center' : true,
			'streetview' : false,
			'customized_icon' : true,
			'icon_image' : '/img/googlemap/adult_map.png',
			'icon_shadow' : '/img/googlemap/shadow_map.png'
		});
		(end)
		
Note:
		Don't forget to insert "<script language="Javascript" type="text/javascript" src="js/mootools.js"></script>" 
		and "<script language="Javascript" type="text/javascript" src="http://www.google.com/jsapi?key=ABCDE"></script>" into the head page before this js file.
*/

var LocationsGoogleMap = new Class({
	Extends: GoogleMap,
	Implements : Options,
	
	options: {
		'image_agencies': '/img/googlemap/agencies_map.png',
		'xml_agencies': '/data/xml/towns.xml',
		'image_schools': '/img/googlemap/schools_map.png',
		'xml_schools': '/data/xml/schools.xml',
		'image_camps': '/img/googlemap/camps_map.png',
		'xml_camps': '/data/xml/schools.xml',
		'schoolmap': false,
		'zoom_level': 15,
		'countryMenu' : new Array()
	},
	
	sites: {
		'en' : 'esl-languages.com',
		'ch' : 'esl.ch',
		'fr' : 'esl.fr',
		'de' : 'esl.de',
		'it' : 'esl.it',
		'es' : 'esl-idiomas.com',
		'se' : 'esl.se',
		'cz' : 'esl-jazykovky.cz'
	},
	
	servers: {
		'en' : 'eslagencyen',
		'fr' : 'eslagencyfr',
		'ch' : 'eslagency',
		'de' : 'eslagencyde',
		'it' : 'eslagencyit',
		'es' : 'eslagencyes',
		'se' : 'eslagencyse',
		'cz' : 'eslagencycz'
	},
	
	/**
	 * initialize : Init
	 * 
	 * @param options : list of options
	 * @return void
	 */
	initialize: function(options){
		
		this.setOptions(options);
		
		/* if not a map in school pages (schools localization) */
		if (!this.options.schoolmap) {
			
			$('btn_agencies').image = this.options.image_agencies;
			$('btn_agencies').xml = this.options.xml_agencies;
			$('btn_agencies').type = "agency";
			$('btn_schools').image = this.options.image_schools;
			$('btn_schools').xml = this.options.xml_schools;
			$('btn_schools').type = "school";
			$('btn_camps').image = this.options.image_camps;
			$('btn_camps').xml = this.options.xml_camps;
			$('btn_camps').type = "camp";
			
			// the initial data
			this.current = $('btn_agencies');
			this.options.data = this.current.xml;
			this.options.icon_image = this.current.image;
			
		}
		
		//call the parent constructor
		this.parent(this.options);
    },
	
    /**
     * _createIcon : Create the overlay icon marker
     * 
     * @retrun void
     */
	_createIcon : function() {
		//call the parent createIcon function
		this.parent();
		this.icon.iconSize = new GSize(75, 36);
		this.icon.shadowSize = new GSize(100, 36);
		this.icon.iconAnchor = new GPoint(29, 40);
		this.icon.infoWindowAnchor = new GPoint(50, 10);
	},
		
	/**
	 * _getData : Retrieve data from XML
	 * 
	 * @param urlXML : the URL path to xml file
	 * @param country : the country filter
	 */
	_getData: function(xmlURL, country) {
		this.map.clearOverlays();
		this.bound = new GLatLngBounds();
		GDownloadUrl(xmlURL, function(data) {
			
			var xml = GXml.parse(data);
			
			var lang = typeof(window['defaultLanguage']) != "undefined" ? defaultLanguage : 'en';
			var isTown = xml.documentElement.getElementsByTagName('town').length > 0;
			var isSchool = xml.documentElement.getElementsByTagName('school').length > 0;
			var elList;
			
			// Get Elements list from XML file
			if (isSchool) {
				var elList = xml.documentElement.getElementsByTagName('school');
			} else if (isTown) {
				var elList = xml.documentElement.getElementsByTagName('town');
			}
			
			// Init country menu list
			if ($('countryList').innerHTML == '' && isTown) {
				this._createCountryMenu(elList);
			}
			
			for (var i = 0; i < elList.length; i++) {
				var map = elList[i].getElementsByTagName('map');
				var lat = map[0].getElementsByTagName('lat');
				var long = map[0].getElementsByTagName('long');
								
				// Marker
				var point = null;
				
				// For a school
				if (isSchool) {
					point = new GLatLng(parseFloat(GXml.value(lat[0])), parseFloat(GXml.value(long[0])), false);
					var isAdultOrSenior = eval(elList[i].getAttribute('isadult')) || eval(elList[i].getAttribute('issenior'));
					var isJunior = eval(elList[i].getAttribute('isjunior'));
					if (isAdultOrSenior && this.current.type == 'school') {
						this.map.addOverlay(this._createSchoolMarker(point, elList[i], lang));
					} else if (isJunior && this.current.type == 'camp') {
						this.map.addOverlay(this._createCampMarker(point, elList[i], lang));
					}
					this.bound.extend(point);
					
				// For an office
				} else if (isTown) {
					
					// Display by country
					if (typeof country != "undefined") {
						if (country == elList[i].getAttribute('lang').split('_')[1]) {
							point = new GLatLng(parseFloat(GXml.value(lat[0])), parseFloat(GXml.value(long[0])), false);
							this.map.addOverlay(this._createTownMarker(point, elList[i], lang));
							this.bound.extend(point);
						}
						
					// Display all
					} else {
						point = new GLatLng(parseFloat(GXml.value(lat[0])), parseFloat(GXml.value(long[0])), false);
						this.map.addOverlay(this._createTownMarker(point, elList[i], lang));
						this.bound.extend(point);
					}		
				}
			}
						
			//auto-centered or not
			if (this.options.auto_center) {
				if (isSchool) {
					this.map.setCenter(this.bound.getCenter(), this.map.getBoundsZoomLevel(this.bound));
				} else if (isTown) {
					this.map.setCenter(this.bound.getCenter(), this.map.getBoundsZoomLevel(this.bound) - 1);
				}
			} else {
				this.map.setCenter(this.bound.getCenter(), this.options.zoom_level);
			}			
        }.bind(this));
	},
	
	/**
	 * createCountryMenu : Create the country list menu and sort it
	 * 
	 * @param gCountryList : unsort country hash
	 * @return : void
	 */
	_createCountryMenu : function(elList) {
		var countryHash = {};
		var sortCountryList = new Array();
		
		for (var i = 0; i < elList.length; i++) {
			var country = elList[i].getAttribute('lang').split('_')[1].toUpperCase();
			if (countryHash[country] == undefined) {
				countryHash[country] = country;
				sortCountryList.push(countriesLanguages[country] + "_" + country);
			}
		}
		
		// Sort list by country name
		sortCountryList.sort();
		
		// Populate innerHTML menu
		var html = '';
		for (var i = 0; i < sortCountryList.length; i++) {
			//this.options.countryMenu.push(sortCountryList[i].split('_')[1]);
			var style = i == 0 ? 'first' : (sortCountryList.length - i < 3 ? 'last' : '');
			var isStartCol = i % 3 == 0;
			var isEndCol = (i + 1) % 3 == 0;
			var countryAndId = sortCountryList[i].split('_');
			html += isStartCol ? "<ul class=" + style + ">" : '';
			html += '<li id="' + countryAndId[1] + '">';
			html += '<a href="javascript:void(0);">';
			html += countriesLanguages[countryAndId[1]];
			html += '</a>';
			html += "</li>";
			html += isEndCol ? "</ul>" : '';
		}
		$('countryList').set('html', html);
		
		// Navigation menu
		this.manageNavigation();
		
	},
	
	/**
	 * manageNavigation : Manage all the navigation menu
	 * 
	 * @return void
	 */
	manageNavigation : function() {
		var isOut = false;
		var slideListFX = new Fx.Slide('navioffice');

		// Events on main button
		[$('btn_agencies'),$('btn_schools'),$('btn_camps')].each(function(btn) {
			btn.addEvent('click', function() {
				if (this.current != btn) {
					this.icon.image = btn.image;
					this.current = btn;
					if ((this.current.type == 'school' || this.current.type == 'camp') && !isOut) {
						isOut = !isOut;
						slideListFX.slideOut();
					} else if (this.current.type == 'agency') {
						slideListFX.slideIn();
						isOut = !isOut;
					}
					this._getData(this.current.xml);
				}
			}.bind(this))
		},this);
		
		// Events on country list
		var country = $('countryList').getElements('li');
		country.each(function(el) {
			if (el.innerHTML != '') {
				el.addEvent('click', function() {
					this.current = null;
					this._getData($('btn_agencies').xml, el.getAttribute("id"));
				}.bind(this))
			}
		},this);
	},
	
	/**
	 * _createCampMarker : Create the marker for camp
	 * 
	 * Create a marker for Camp and add a event on it
	 * @param point : a GLatLng object
	 * @param camp : a XML town oblect
	 * @param lang : language
	 * @see googlemap._createMarker
	 * @return marker : the marker to display
	 */
	_createCampMarker : function(point, camp, lang) {
		var marker = new GMarker(point, this.icon);
		
		// Data
		var country = camp.getAttribute('country');
		var data = camp.getElementsByTagName('langs')[0].getElementsByTagName(lang)[0];
		var name = data.getElementsByTagName('name');
		var address = data.getElementsByTagName('address')[0];
		var addressName = address.getElementsByTagName('name');
		var streets = address.getElementsByTagName('street');
		var city = address.getElementsByTagName('city');
		var link = data.getElementsByTagName('links')[0].getElementsByTagName('junior');
		var img = camp.getElementsByTagName('imgs')[0].getElementsByTagName('junior');
		
		var text = '<table id="gContent">';
			text += '<tbody>';
		
			// Title
			text += '<tr>';
			text += '<td id="gTitle" colspan="2">' + GXml.value(name[0]) + '</td>';
			text += '</tr>';
			
			// Address
			text += '<tr>';
			text += '<td id="gDescription">';
			text += GXml.value(addressName[0]) + '<br />';
			for (var i = 0; i < streets.length; i++) {
				text += GXml.value(streets[i]) != '<br />' ? GXml.value(streets[i]) + '<br />' : '';
			}
			text += GXml.value(city[0]) + '<br />';
			text += countriesLanguages[country.toUpperCase()] + '<br />';
			
			// Link
			if (GXml.value(link[0]) != '') {
				text += '<a href="http://' + GXml.value(link[0]) + '" target="_blank">' + link[0].getAttribute('label').charAt(0).toUpperCase() + link[0].getAttribute('label').slice(1) + '</a>';
			}
			
			text += '</td>';
			
			// Image
			if (GXml.value(img[0]) != '') {
				text += '<td id="gImage"><img src="/data/gmap/img/' + GXml.value(img[0]) + '" /></td>';
			}
			
			text += '</tr>';
			text += '</tbody>';
			text += '</table>';
					
		GEvent.addListener(marker, "click", function() {
        	marker.openInfoWindowHtml(text);
		});
		return marker;
	},
	
	/**
	 * _createSchoolMarker : Create a marker for School and add a event on it
	 * 
	 * @param point : a GLatLng object
	 * @param school : a XML town oblect
	 * @param lang : language
	 * @see googlemap._createMarker
	 * @return marker : the marker to display
	 */
	_createSchoolMarker : function(point, school, lang) {
		var marker = new GMarker(point, this.icon);
		
		// Data
		var country = school.getAttribute('country');
		var data = school.getElementsByTagName('langs')[0].getElementsByTagName(lang)[0];
		var name = data.getElementsByTagName('name');
		var address = data.getElementsByTagName('address')[0];
		var addressName = address.getElementsByTagName('name');
		var streets = address.getElementsByTagName('street');
		var city = address.getElementsByTagName('city');
		var link = data.getElementsByTagName('links')[0].getElementsByTagName('adult');
		var img = school.getElementsByTagName('imgs')[0].getElementsByTagName('adult');
		
		var text = '<table id="gContent">';
			text += '<tbody>';
			
			// Title
			text += '<tr>';
			text += '<td id="gTitle" colspan="2">' + GXml.value(name[0]) + '</td>';
			text += '</tr>';
			
			// Address
			text += '<tr>';
			text += '<td id="gDescription">';
			text += GXml.value(addressName[0]) + '<br />';
			for (var i = 0; i < streets.length; i++) {
				text += GXml.value(streets[i]) != '<br />' ? GXml.value(streets[i]) + '<br />' : '';
			}
			text += GXml.value(city[0]) + '<br />';
			text += countriesLanguages[country.toUpperCase()] + '<br />';
			
			// Link
			if (GXml.value(link[0]) != '') {
				text += '<a href="http://' + GXml.value(link[0]) + '" target="_blank">' + link[0].getAttribute('label').charAt(0).toUpperCase() + link[0].getAttribute('label').slice(1) + '</a>';
			}
			
			text += '</td>';
			
			// Image
			if (GXml.value(img[0]) != '') {
				text += '<td id="gImage"><img src="/data/gmap/img/' + GXml.value(img[0]) + '" /></td>';
			}
			
			text += '</tr>';
			text += '</tbody>';
			text += '</table>';
			
		GEvent.addListener(marker, "click", function() {
        	marker.openInfoWindowHtml(text);
		});
		return marker;
	},
	
	/**
	 * _createTownMarker : Create a marker for Town and add a event on it
	 * 
	 * @param point : a GLatLng object
	 * @param town : a XML town oblect
	 * @param lang : language
	 * @see googlemap._createMarker
	 * @return marker : the marker to display
	 */
	_createTownMarker : function(point, town, lang) {
		var marker = new GMarker(point, this.icon);
		
		// Data
		var city = town.getAttribute('name');
		var langAndCountry = town.getAttribute('lang').split('_');
		var townLang = langAndCountry[0].toLowerCase();
		var townCountry = langAndCountry[1].toLowerCase();
		var address = town.getElementsByTagName('address')[0];
		var head = address.getElementsByTagName('head');
		var lines = address.getElementsByTagName('line');
		var moreLink = town.getElementsByTagName('links')[0].getElementsByTagName('eslagency');
		
		var text = '<table id="gContent">';
			text += '<tbody>';
			
			// Title
			text += '<tr>';
			text += '<td id="gTitle" colspan="2">' + officesLanguages["ouroffice"] + ' ' + officesLanguages[city] + '</td>';
			text += '</tr>';
			
			// Address
			text += '<tr>';
			text += '<td id="gDescription">';
			text += head.length > 0 ? GXml.value(head[0].getElementsByTagName((lang == 'en' || lang == 'fr') ? lang : 'en')[0]) + '<br />' : '';
			for (var i = 0; i < lines.length; i++) {
				text += GXml.value(lines[i]) != '<br />' ? GXml.value(lines[i]) + '<br />' : '';
			}
			text += countriesLanguages[langAndCountry[1].toUpperCase()] + '<br />';
			
			// Link
			var isSwiss = (lang == 'de' || lang == 'fr' || lang == 'it');
			var isInCountry = lang == townCountry;
			var linkSite = !isInCountry ? 'ch' : lang;
			var lingServer = isSwiss && !isInCountry ? 'ch' : lang;
			var linkLang = isSwiss && !isInCountry ? 'ch' + lang : lang;
			text += '<a href="http://www.' + this.sites[linkSite] + '/floor/cs?server=' + this.servers[lingServer] + '&lang=' + linkLang + '&item_categoryID=' + GXml.value(moreLink[0]) + '" target="_blank">' + gMapLanguages["more"] + '...';
	
			text += '</td>';
			text += '</tr>';
			text += '</tbody>';
			text += '</table>';
			
		GEvent.addListener(marker, "click", function() {
        	marker.openInfoWindowHtml(text);
		});
		return marker;
	}
});
