/* +----------------------------------------------------------------------------------------------
   | CanoeMeteo
   |
   | Gérer les blocs de météo d'accueil de Canoë
   |
   | auteur : jean-baptiste landry [jean-baptiste.landry@canoe.ca]
   | date	: décembre 2009
   | projet : portail
   |
   |----------------------------------------------------------------------------------------------
   | copyright (c) 2009 sun media, tous droits réservés 
   +---------------------------------------------------------------------------------------------- */

var CanoeMeteo = {
	
	// json service
	jsonurl: 'http://fr.canoe.ca/meteo2009/json.pl?callback=?',
	
	// TMPL
	TMPL: {
		selection: '<span class="greyfonceb">Météo</span><span class="greypale">&nbsp;-&nbsp;</span><a href="/meteo2009/" class="autresVilles" onclick="return CanoeMeteo.linkMeteo(this);">Choisir une ville</a>',
		ville:     '<a href="http://fr.canoe.ca/infos/meteo/villes/{PAGE}.html">{VILLE}</a><img src="http://fr.canoe.ca/meteo2009/images/icones/{ICON_COURANT}.gif" width="34" height="20" alt="" /><span class="greyfonceb">{TEMP_COURANT}&deg;C</span>&nbsp;&nbsp;<span class="greypale">Demain&nbsp;&raquo;</span><img src="http://fr.canoe.ca/meteo2009/images/icones/{ICON_DEMAIN}.gif" width="34" height="20" alt="" /><span class="greyfonceb">{TEMP_DEMAIN_BAS}&deg;C/{TEMP_DEMAIN_HAUT}&deg;C</span> &nbsp;&nbsp;<a href="/meteo2009/" class="autresVilles" onclick="return CanoeMeteo.linkMeteo(this);">Changer la ville</a>'
	},
	
	// var
	_linkmeteo: false,


	/* +----------------------------------
	   | update villes dropdown
	   +---------------------------------- */
	updatevilles: function(){

		var selectVille      = document.getElementById('ville');
		selectVille.length              = 1;
		selectVille.options[0].selected = true;
		selectVille.disabled            = true;

		// pour quelle province
		var province = arguments[0].options[arguments[0].selectedIndex].value.toString();

		// si une province sélectionné
		if (province != 0) {

			// get liste
			jQuery.getJSON(CanoeMeteo.jsonurl, {act:'getvilles',province:province}, function(data) {

				// update dropdown
				var villes = data.villes.sites.site;
				var selectVille = document.getElementById('ville');
				
				selectVille.length              = villes.length+1;
				selectVille.disabled            = false;
				selectVille.options[0].selected = true;
				
				for (var i=0; i<villes.length; ++i) {
                    // Fix to replace '&amp;' wrongly encoded in the DB
                    villes[i].site_name.fr = villes[i].site_name.fr.replace('&amp;','&').replace('&amp;','&').replace('&amp;','&');
					selectVille.options[i+1].text  = CanoeMeteo.html_entity_decode(villes[i].site_name.fr);
					selectVille.options[i+1].value = villes[i]['@attributes'].id;
				}
			});
		}
	},


	/* +----------------------------------
	   | update cookie
	   +---------------------------------- */
	updatecookie: function (form) {
		
		// si ville sélectionnée
		if(form.province.value != 0 && form.ville.value != 0) {
			new CanoeMeteo.Obj.cookie('canoe_meteo2009').setCookie({
				value:      form.province.value+':'+form.ville.value,
				expires:    new Date(2100,1,1),
				rootdomain: 1
			});

			CanoeMeteo.loadMeteo();
		
		// sinon
		} else {
			alert("Veuillez faire un choix avant de soumettre");	
		}

		return false;
	},

	
	/* +----------------------------------
	   | load meteo block
	   +---------------------------------- */
	 loadMeteo: function(onpage) {
		var meteocookie = new CanoeMeteo.Obj.cookie('canoe_meteo2009').getCookie();

		// si un cookie
		if (meteocookie) {
			
			var elements  = (meteocookie) ? meteocookie.split(':') : [];
			var province = elements[0];
			var ville    = elements[1];

			if (onpage) {
				jQuery.getJSON(CanoeMeteo.jsonurl, {act:'getmeteo',province:province,ville:ville}, function(data) {
					document.getElementById('meteo_container').innerHTML = CanoeMeteo.loadMeteo_html(data);
				});
			} else {
				jQuery.getJSON(CanoeMeteo.jsonurl, {act:'getmeteo',province:province,ville:ville}, function(data) {
					window.opener.document.getElementById('meteo_container').innerHTML = CanoeMeteo.loadMeteo_html(data);
					window.close();			
				});
			}

		// sinon
		} else {
			document.getElementById('meteo_container').innerHTML = CanoeMeteo.TMPL.selection;
		}
	},

	/* +----------------------------------
	   | html
	   +---------------------------------- */
	loadMeteo_html: function(json) {
		var html = CanoeMeteo.TMPL.ville;
		
		var data = {
			VILLE:            CanoeMeteo.html_entity_decode(json.current.type.weather.site_name.fr),
			VILLE_CODE:       json.current.type.destination.site.a,
			PAGE:             json.current.type.destination.site.a.replace(/[^a-z]/gi,'')+json.current.type.destination.region.a,
			ICON_COURANT:     json.current.type.weather.icon['@attributes'].id,
			TEMP_COURANT:     json.current.type.weather.temperature.cel,
			ICON_DEMAIN:      json.longterm.type.weather.period[0].icon['@attributes'].id,
			TEMP_DEMAIN_BAS:  json.longterm.type.weather.period[0].temperature.low.cel,
			TEMP_DEMAIN_HAUT: json.longterm.type.weather.period[0].temperature.high.cel
		};	
		
		for (var i in data) {
			html = html.replace(new RegExp('\{'+i+'\}','g'),data[i]);
		}

		return html;
	},


	/* +----------------------------------
	   | linkMeteo
	   +---------------------------------- */
	linkMeteo: function (anchor) { 
		CanoeMeteo._linkmeteo = window.open(anchor.href,null,'height=260,width=420,status=no,toolbar=no,menubar=no,location=no');
		setTimeout('CanoeMeteo._linkmeteo.focus();',250);
		return false;
	},

	
	/* +----------------------------------
	   | html_entity_decode
	   +---------------------------------- */
	html_entity_decode: function(str) {
		var obj=document.createElement('textarea');
		obj.innerHTML=str.replace(/</g,'&lt;').replace(/>/g,'&gt;');
		return obj.value;
	},



	/* +----------------------------------
	   | Objects
	   +---------------------------------- */
	Obj: {
		cookie: function (id) {

			/* +--------------------------------------------
				| _fixDate  //fixes a stupid bug in MsIE Mac 
				+-------------------------------------------- */
			this._fixDate = function(date) {
				var base = new Date(0);
				var skew = base.getTime();
				if (skew > 0) date.setTime(date.getTime() - skew);
				return date;
			};
			
			
			/* +--------------------------------------------
				| setCookie 
				+-------------------------------------------- */
			this.setCookie = function(params) {
				var value   = params['value'];
				var expires = (params['expires']) ? this._fixDate(params['expires']).toGMTString() : '';
				var path    = (params['path'])    ? params['path']                                 : '/';
				var domain  = (params['domain'])  ? params['domain']                               : document.domain;
				var secure  = (params['secure'])  ? 1                                              : 0;
				
				
				// domain
				var splitDomain = domain.split('.');
				if (params['rootdomain']) {
					domain = '.'+splitDomain[splitDomain.length-2]+'.'+splitDomain[splitDomain.length-1];
				} else if (splitDomain.length == 2) {
					domain = '.'+domain;
				}
				
				
				document.cookie = '' +
					this.id + '=' + escape(value) +			
					((expires) ? '; expires=' + expires : '') +
					((path)    ? '; path='    + path    : '') +
					((domain)  ? '; domain='  + domain  : '') +
					((secure)  ? '; secure'             : '') +
				'';
			};


			/* +--------------------------------------------
				| getCookie 
				+-------------------------------------------- */
			this.getCookie = function() {
				var cookie = document.cookie;
				var prefix = this.id + '=';
				var begin = cookie.indexOf('; ' + prefix);
				
				if (begin == -1) {
					begin = cookie.indexOf(prefix);
					if (begin != 0) { return null; }
				} else {
					begin += 2;
				}

				var end = cookie.indexOf(';', begin);
				if (end == -1) { end = cookie.length; }

				return unescape(cookie.substring(begin + prefix.length, end));
			};


			/* +--------------------------------------------
				| deleteCookie 
				+-------------------------------------------- */
			this.deleteCookie = function(params) {
				if (this.getCookie()) {
					var path       = (typeof(params) != 'undefined' && params['path'])       ? params['path']       : '';
					var domain     = (typeof(params) != 'undefined' && params['domain'])     ? params['domain']     : '';
					var rootdomain = (typeof(params) != 'undefined' && params['rootdomain']) ? params['rootdomain'] : '';
				
					this.setCookie({
						value:      '',				
						path:       path,				
						domain:     domain,				
						rootdomain: rootdomain,				
						expires:    new Date(1999, 7, 1)
					});
				}
			};


			
			/* +--------------------------------------------
				| MAIN 
				+-------------------------------------------- */

			this.id = id;
		}
	}
};

