var map;var slider;var gData = {};var gLoadedFiles = 0;var gInitCircleTimer;var gInitCircleIdx;var gInitComplete = false;var gMarkerIcons = {};var gUserDict = {};var gFsaDict = {};var kMarkers = {	yellow:'yellow-dot.gif', green:'green-dot.gif', red:'red-dot.gif'	};var kDataSchemas = {	votes: ['id','time','vote'],	fsa: ['fsa', 'lng', 'lat'],	utilisateurs: ['id', 'fsa']	};//	politiciens: ['start', 'end', 'name'],var gNmbLoadedFiles = 3;var kSliderWidth = 360;var kSliderTickSize = 5;var kStartTime;var kEndTime;var kTickSpan;function load(){	if(!GBrowserIsCompatible())		return;	window.onresize = onResizeHandler;	onResizeHandler();	loadData();	initSlider();	map = new GMap2(document.getElementById("map"));	map.setCenter(new GLatLng(47.2419, -72.1419), 7);	map.addControl(new GLargeMapControl());		var checkOnDataLoad = setInterval(function()	{		if(gLoadedFiles == gNmbLoadedFiles)		{			onDataLoad();			clearInterval(checkOnDataLoad);		}	}, 200);		var checkOnInitEnd = setInterval(function()	{		if(gInitComplete)		{			clearInterval(checkOnInitEnd);			$('#initStatusDiv').css({display: 'none'});						onSliderMove();			onSliderEnd();		}	}, 200);}function onResizeHandler(){	var mapCenter = $('#map').offset().left + parseInt($('#map').css('width')) / 2;	var movePanelTo = mapCenter - parseInt($('#sliderPanelDiv').css('width')) / 2;	$('#sliderPanelDiv').css({left: movePanelTo + "px"});		var moveInitPanelTo = mapCenter - parseInt($('#initStatusDiv').css('width')) / 2;	$('#initStatusDiv').css({left: moveInitPanelTo + "px"});}function onSliderMove(){	if(!gInitComplete)		return;		var sliderValue = 0 | slider.getValue();		var sliderHintLeft = $('#slider-bg').offset().left;	$('#sliderHint').css({left: sliderValue + sliderHintLeft + 'px', display: 'block'});	var thumbDate;	if(sliderValue != 0)	{		var sliderFraction = sliderValue / kSliderWidth;		thumbDate = new Date(kStartTime + (kEndTime - kStartTime) * sliderFraction);	}	else		thumbDate = new Date(kStartTime);	$('#sliderHint').html(strPadL(thumbDate.getHours(), '0', 2) + ":" + strPadL(thumbDate.getMinutes(), '0', 2));			var dataStartTime = thumbDate.getTime() - kTickSpan;	if(dataStartTime < kStartTime)		dataStartTime = kStartTime;		var dataEndTime = thumbDate.getTime() + kTickSpan;	if(dataEndTime > kEndTime)		dataEndTime = kEndTime;				var fsaVotes = {};	for(var voteIdx = 0; voteIdx < gData.votes.length; voteIdx++)	{		// exclude other votes in time (this helps to make the map faster)		if(gData.votes[voteIdx].time < dataStartTime || gData.votes[voteIdx].time > dataEndTime)			continue;			var voteObj = gData.votes[voteIdx];		var userObj = gUserDict[voteObj.id];		// some fsa haven't been geocoded		if(!gFsaDict[userObj.fsa])			continue;		var fsaObj = gFsaDict[userObj.fsa];		var fsaObjKey = fsaObj.fsa;				if(!fsaVotes[fsaObjKey])			fsaVotes[fsaObjKey] = {score: 0, high: 0, total: 0};				switch(gData.votes[voteIdx].vote)		{			case '1':		fsaVotes[fsaObjKey].score++;	break;			case '2':	fsaVotes[fsaObjKey].score--;	break;			case '3':	fsaVotes[fsaObjKey].high++;		break;		}				fsaVotes[fsaObjKey].total++;	}		// hide fsas with no votes		for(var fsaIdx = 0; fsaIdx < gData.fsa.length; fsaIdx++)	{		if(!fsaVotes[gData.fsa[fsaIdx].fsa])		{			gData.fsa[fsaIdx].gmarker.hide();		}	}		for(var currVoteFsa in fsaVotes)	{		// **********************		// do something better with color gradients and use fsaVotes[idx].total and the score		// **********************				// more than 25% exclamations		if(fsaVotes[currVoteFsa].high != 0 && fsaVotes[currVoteFsa].high > fsaVotes[currVoteFsa].total / 4)		{			gFsaDict[currVoteFsa].gmarker.setImage('img/' + kMarkers.yellow);		}		else if(fsaVotes[currVoteFsa].score > 0)		{			gFsaDict[currVoteFsa].gmarker.setImage('img/' + kMarkers.green);		}		else		{			gFsaDict[currVoteFsa].gmarker.setImage('img/' + kMarkers.red);		}		gFsaDict[currVoteFsa].gmarker.show();	}}function onSliderStart(){	$('#sliderHint').css({display: 'block'});}function onSliderEnd(){	$('#sliderHint').css({display: 'none'});}function initSlider(){    var Event = YAHOO.util.Event,        Dom   = YAHOO.util.Dom,        lang  = YAHOO.lang,        bg="slider-bg", thumb="slider-thumb",         valuearea="slider-value", textfield="slider-converted-value";    var topConstraint = 0;    Event.onDOMReady(function()    {        slider = YAHOO.widget.Slider.getHorizSlider(bg,                          thumb, topConstraint, kSliderWidth, kSliderTickSize);        slider.subscribe("slideStart", onSliderStart);        slider.subscribe("slideEnd", onSliderEnd);        slider.subscribe("change", onSliderMove);	});}function initSliderCaptions(){	var startDateObj = new Date(kStartTime);	$('#startTimeDiv').html(startDateObj.getHours() +":"+ strPadL(startDateObj.getMinutes(), '0', 2));	var endDateObj = new Date(kEndTime);	$('#endTimeDiv').html(endDateObj.getHours() +":"+ strPadL(endDateObj.getMinutes(), '0', 2));}function initVoteTimestamps(){	for(var i = 0; i < gData.votes.length; i++)	{		var timeObjMatches = /^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$/.exec(gData.votes[i].time);				if(!timeObjMatches)			continue;				var timeObjDate = new Date(timeObjMatches[1], timeObjMatches[2], timeObjMatches[3], timeObjMatches[4], timeObjMatches[5], timeObjMatches[6]);				gData.votes[i].time = timeObjDate.getTime();	}}function initTimeConstants(){		kStartTime = gData.votes[0].time;	kEndTime = gData.votes[gData.votes.length - 1].time;		kTickSpan = (kEndTime - kStartTime) * (kSliderTickSize / kSliderWidth);}function initDicts(){	for(var i = 0; i < gData.fsa.length; i++)		gFsaDict[gData.fsa[i].fsa] = gData.fsa[i];	for(var i = 0; i < gData.utilisateurs.length; i++)		gUserDict[gData.utilisateurs[i].id] = gData.utilisateurs[i];}function initUserFsaAllCaps(){	for(var i = 0; i < gData.utilisateurs.length; i++)	{		if(!gData.utilisateurs[i].fsa)			continue;				gData.utilisateurs[i].fsa = gData.utilisateurs[i].fsa.toUpperCase();	}}function onDataLoad(){	initUserFsaAllCaps();	initDicts();	initFsaLatLng();	initVoteTimestamps();	initTimeConstants();	initSliderCaptions();	initMarkerIcons();		// last - sets ginitcomplete	initCircles();}function initMarkerIcons(){	var baseIcon = new GIcon();	baseIcon.shadow = "";	baseIcon.iconSize = new GSize(16, 16);	baseIcon.shadowSize = new GSize(1, 1);	baseIcon.iconAnchor = new GPoint(8, 8);	baseIcon.infoWindowAnchor = new GPoint(1, 1);	for(var currMarker in kMarkers)	{		var currIcon = new GIcon(baseIcon);		currIcon.image = "img/" + kMarkers[currMarker];			gMarkerIcons[currMarker] = currIcon;	}}function initCircles(){	gInitCircleIdx =  0;		gInitCircleTimer = setInterval(initCircleOnInterval, 70);}function initCircleOnInterval(){	gData.fsa[gInitCircleIdx].gmarker = new GMarker(gData.fsa[gInitCircleIdx].gpoint, {clickable: false, icon: gMarkerIcons.red});	map.addOverlay(gData.fsa[gInitCircleIdx].gmarker);	gData.fsa[gInitCircleIdx].gmarker.hide();	if(++gInitCircleIdx == gData.fsa.length)	{		gInitComplete = true;		clearInterval(gInitCircleTimer);	}}function initFsaLatLng(){	for(var i = 0; i < gData.fsa.length; i++)		gData.fsa[i].gpoint = new GLatLng(gData.fsa[i].lat, gData.fsa[i].lng);}function loadData(){//	ajaxReqCsvToObj('politiciens');	ajaxReqCsvToObj('utilisateurs');	ajaxReqCsvToObj('votes');	ajaxReqCsvToObj('fsa', true);}function ajaxReqCsvToObj(file, dontSkipHeaders){	$.ajax({		type:'GET',		url:'data/' + file + '.csv',		success: function(data)		{			if(data)			{				data = data.split("\n");				if(data.length < 3)					return;								gData[file] = [];								for(var lineIdx = 0; lineIdx < data.length; lineIdx++)				{					if(!dontSkipHeaders && lineIdx == 0)						continue;									var lineData = data[lineIdx].split(';');					var lineDataObj = {};										for(var lineDataIdx = 0; lineDataIdx < lineData.length; lineDataIdx++)						lineDataObj[kDataSchemas[file][lineDataIdx]] = lineData[lineDataIdx];										gData[file].push(lineDataObj);				}								gLoadedFiles++;			}		}	});}function strPadL(str, padStr, length){	str = "" + str;	padStr = "" + padStr;	for(var i = length - str.length; i > 0; i--)		str = padStr + str;	return str;}