
function init()
{
	if(GBrowserIsCompatible())
	{
		
		////////////////////////////////////////////////////////////////////////////////////
		// CONFIG
		////////////////////////////////////////////////////////////////////////////////////
		
		var ZOOM_MIN = 16;
		var ZOOM_MAX = 18;
		var ZOOM_START = 16;
		var HOTSPOT_MIN_SIZE = 40;
		var HOTSPOT_MAX_SIZE = 160;
		var TIMER_INTERVAL = 1000;
		var TOP_LIMIT = 50.86837814203458;
		var BOTTOM_LIMIT = 50.85105467671643;
		var LEFT_LIMIT = 4.3265533447265625;
		var RIGHT_LIMIT = 4.347195625305176;
		var START_POINT = new GLatLng((TOP_LIMIT+BOTTOM_LIMIT)/2, (LEFT_LIMIT+RIGHT_LIMIT)/2);
		var MAP_IMG_BASE_URL = "http://bureau347.s3.amazonaws.com/wonderbra/7/";
		var LANG = "fr";
		
		
		
		
		////////////////////////////////////////////////////////////////////////////////////
		// APPLICATION
		////////////////////////////////////////////////////////////////////////////////////
		
		var application = {};
		
		// // Constants
		var MAPTYPE_NORMAL = "original";
		var MAPTYPE_MODIFIED = "altered";
		var STATE_LOADING = 0;
		var STATE_LOADED = 1;
		var STATE_READY = 2;
		var STATE_COMPLETE = 3;
		var STATE_SUBMITTED = 4;
		
		
		
		
		////////////////////////////////////////////////////////////////////////////////////
		// CUSTOM MAPS & HOTSPOTS
		////////////////////////////////////////////////////////////////////////////////////
		
		var maps = [
		
			{
				id: 1,
				timer: 0,
				hotSpots: [
							{found:false, position:new GLatLng(50.858105385865, 4.34355854988098), width:20, height:20},
							{found:false, position:new GLatLng(50.854170395291, 4.33429956436157), width:30, height:290},
							{found:false, position:new GLatLng(50.857042090685, 4.33603763580322), width:56, height:50},
							{found:false, position:new GLatLng(50.854305856595, 4.33998584747314), width:30, height:34},
							{found:false, position:new GLatLng(50.858870672487, 4.34271097183227), width:30, height:50},
							{found:false, position:new GLatLng(50.865094085773, 4.34145569801330), width:20, height:20},
							{found:false, position:new GLatLng(50.862409902322, 4.34022917022705), width:156, height:42}
							]
			},
			{
				id: 2,
				timer: 0,
				hotSpots: [
							{found:false, position:new GLatLng(50.865398801761, 4.32867765426635), width:190, height:150},
							{found:false, position:new GLatLng(50.864288271675, 4.33610200881958), width:74, height:94},
							{found:false, position:new GLatLng(50.862405727322, 4.33590888977050), width:74, height:120},
							{found:false, position:new GLatLng(50.861200317280, 4.33745384216308), width:76, height:80},
							{found:false, position:new GLatLng(50.855010249031, 4.33665990829467), width:70, height:86},
							{found:false, position:new GLatLng(50.854658054143, 4.33129549026489), width:156, height:100},
							{found:false, position:new GLatLng(50.866089483960, 4.33906316757202), width:40, height:40}
							]
			},
			{
				id: 3,
				timer: 0,
				hotSpots: [
							{found:false, position:new GLatLng(50.864586221368, 4.34537172317504), width:120, height:140},
							{found:false, position:new GLatLng(50.859480183820, 4.33013677597045), width:64, height:192},
							{found:false, position:new GLatLng(50.859886520283, 4.33764696121215), width:82, height:82},
							{found:false, position:new GLatLng(50.855687539419, 4.33492183685302), width:332, height:92},
							{found:false, position:new GLatLng(50.851840399286, 4.32917118072509), width:150, height:114},
							{found:false, position:new GLatLng(50.853073144231, 4.34386968612670), width:92, height:36},
							{found:false, position:new GLatLng(50.851935226977, 4.34296846389770), width:30, height:30}
							]
			}
		
		];
		
		var mapID = 4;
		var currentMap = maps[mapID-1];
		
		function getCustomTileURL(mapID, mapType, point, zoom)
		{
			var url = MAP_IMG_BASE_URL + "img/maps/"+mapID+"/"+mapType+"/"+zoom+"_"+point.x+"_"+point.y+".jpg";
			return url;
		}
		
		var allowedBounds = new GLatLngBounds(new GLatLng(BOTTOM_LIMIT, LEFT_LIMIT), new GLatLng(TOP_LIMIT, RIGHT_LIMIT));
		var copyright = new GCopyright(1, allowedBounds, ZOOM_START, "Wonderbra");
		var copyrightCollection = new GCopyrightCollection("©");
		copyrightCollection.addCopyright(copyright);
		
		
		
		
		////////////////////////////////////////////////////////////////////////////////////
		// MASTER MAP
		////////////////////////////////////////////////////////////////////////////////////
		
		var master = {};
		master.loaded = false;
		master.getCustomTileURL = function(point, zoom)
		{
			return getCustomTileURL(currentMap.id, MAPTYPE_NORMAL, point, zoom);
		}
		master.setup = function()
		{
			master.tileLayers = [new GTileLayer(copyrightCollection,ZOOM_MIN,ZOOM_MAX)];
			master.tileLayers[0].getTileUrl = master.getCustomTileURL;
			master.customMap = new GMapType(master.tileLayers, new GMercatorProjection(ZOOM_MAX+1), "Original Map "+currentMap.id);
			master.customMap.getMinimumResolution = function(){return ZOOM_MIN;};
			master.customMap.getMaximumResolution = function(){return ZOOM_MAX;};
			master.map = new GMap2(document.getElementById("mastermap"), {backgroundColor:"#000000"});
			master.map.removeMapType(G_NORMAL_MAP);
			master.map.removeMapType(G_SATELLITE_MAP);
			master.map.removeMapType(G_HYBRID_MAP);
			master.map.addMapType(master.customMap);
			master.map.setCenter(START_POINT, ZOOM_START, master.customMap);
			master.map.addControl(new GLargeMapControl());
			master.map.enableScrollWheelZoom();
			master.map.enableContinuousZoom();
			
			GEvent.addListener(master.map, "tilesloaded", master.tilesloadedHandler);
			GEvent.addListener(master.map, "move", master.moveHandler);
			GEvent.addListener(master.map, "moveend", master.moveHandler);
			GEvent.addListener(master.map, "dragstart", master.dragstartHandler);
			GEvent.addListener(master.map, "dragend", master.dragendHandler);
			GEvent.addListener(master.map.getDragObject(), "mousedown", master.mousedownHandler);
			GEvent.addListener(master.map, "zoomend", master.zoomendHandler);
			GEvent.addListener(master.map, "mouseover", master.mouseoverHandler);
			GEvent.addListener(master.map, "mouseout", master.mouseoutHandler);
			GEvent.addListener(master.map, "mousemove", master.mousemoveHandler);
			GEvent.addListener(master.map, "click", master.clickHandler);
		}
		
		
		
		
		////////////////////////////////////////////////////////////////////////////////////
		// SLAVE MAP
		////////////////////////////////////////////////////////////////////////////////////
		
		var slave = {};
		slave.loaded = false;
		slave.getCustomTileURL = function(point, zoom)
		{
			return getCustomTileURL(currentMap.id, MAPTYPE_MODIFIED, point, zoom);
		}
		slave.setup = function()
		{
			slave.tileLayers = [new GTileLayer(copyrightCollection,ZOOM_MIN,ZOOM_MAX)];
			slave.tileLayers[0].getTileUrl = slave.getCustomTileURL;
			slave.customMap = new GMapType(slave.tileLayers, new GMercatorProjection(ZOOM_MAX+1), "Altered Map "+currentMap.id);
			slave.customMap.getMinimumResolution = function(){return ZOOM_MIN;};
			slave.customMap.getMaximumResolution = function(){return ZOOM_MAX;};
			slave.map = new GMap2(document.getElementById("slavemap"), {backgroundColor:"#000000"});
			slave.map.removeMapType(G_NORMAL_MAP);
			slave.map.removeMapType(G_SATELLITE_MAP);
			slave.map.removeMapType(G_HYBRID_MAP);
			slave.map.addMapType(slave.customMap);
			slave.map.setCenter(START_POINT, ZOOM_START, slave.customMap);
			slave.map.enableContinuousZoom();
			slave.map.disableDragging();
			slave.map.disableDoubleClickZoom();
			slave.map.disableScrollWheelZoom();
			slave.map.disablePinchToZoom();
			// Crosshair icon to indicate where we are on the slave map
			var icon = new GIcon();
			icon.image = "img/crosshair.png";
			icon.iconSize = new GSize(55, 55);
			icon.iconAnchor = new GPoint(26, 26);
			icon.infoWindowAnchor = new GPoint(26, 26);
			icon.shadow = '';
			// Add icon as new pointer for slave map
			slave.pointer = new GMarker(slave.map.getCenter(), icon);
			slave.pointer.disableDragging();
			slave.overlays = [];
			
			GEvent.addListener(slave.map, "tilesloaded", slave.tilesloadedHandler);
		}
		
		
		
		
		////////////////////////////////////////////////////////////////////////////////////
		// EVENT HANDLERS
		////////////////////////////////////////////////////////////////////////////////////
		
		master.tilesloadedHandler = function()
		{
			updateHotSpots(master.map.getZoom()); // Fix to make sure all hotspots are visible
			updateOverlays();
			if(master.loaded) return;
			master.loaded = true;
			checkLoadStatus();
		}
		
		slave.tilesloadedHandler = function()
		{
			if(slave.loaded) return;
			slave.loaded = true;
			checkLoadStatus();
		}
		
		// Mirror the master map moves onto the slave map
		master.moveHandler = function()
		{
			restrainToZone();
			slave.map.setCenter(master.map.getCenter());
			savePosition();
		}
		
		// 
		master.moveendHandler = function()
		{
			updateOverlays();
		}
		
		// 
		master.dragstartHandler = function()
		{
			log("dragstart");
		}
		
		// 
		master.dragendHandler = function()
		{
			log("dragend");
		}
		
		// 
		master.mousedownHandler = function()
		{
			log("mousedown");
		}
		
		// Mirror the master map zoom onto the slave map
		master.zoomendHandler = function(oldLevel, newLevel)
		{
			/*
			if(newLevel - oldLevel == 1)
			{
				log("zoomIn");
				slave.map.zoomIn(slave.map.getCenter(), false, true);
			}
			else if(newLevel - oldLevel == -1)
			{
				log("zoomOut");
				slave.map.zoomOut(slave.map.getCenter(), true);
			}
			else
			{
			*/
				slave.map.setZoom(newLevel);//slave.map.ak(newLevel-oldLevel, true, slave.map.getCenter(), false);//
			//}
			//log(slave.map.zoomIn.toSource());
			updateHotSpots(newLevel);
			updateOverlays();
		}
		
		// Show the slave pointer when the mouse is over the map
		master.mouseoverHandler = function(latlng)
		{
			slave.pointer.show();
		}
		
		// Hide the slave pointer when the mouse is out the map
		master.mouseoutHandler = function(latlng)
		{
			slave.pointer.hide();
		}
		
		// Mirror the master map mouse position to the slave pointer
		master.mousemoveHandler = function(latlng)
		{
			slave.pointer.setLatLng(latlng);
		}
		
		// Handle clicks on the master map. If a marker is clicked, we found a difference!
		master.clickHandler = function(marker, latlng)
		{
			log("click");
			
			if(latlng)
				log(latlng.lat()+",", latlng.lng());
			
			if(marker)
			{
				var id = marker.getId();
				selectHotSpot(id);
			}
		}
		
		// Recenter the maps when the window is resized
		function windowResizeHandler()
		{
			var w = $(window).width();
			var h = $(window).height();
			$("#main").width( w < 960 ? 960 : w);
			$("#main").height( h < 600 ? 600 : h);
			returnToSavedPosition();
		}
		$(window).resize(windowResizeHandler);
		
		// Timer
		var startTime;
		function timerHandler($timer)
		{
			currentMap.timer = ((new Date()).getTime() - startTime) / 1000;
			$("#panels #timer p.numbers").html(secondsToTime(currentMap.timer));
			Cufon.refresh("#panels #timer p.numbers");
		}
		var timer = $.timer(TIMER_INTERVAL, timerHandler);
		timer.stop();
		
		// Cleanup before leaving the page
		$(window).unload(GUnload);
		
		
		
		
		////////////////////////////////////////////////////////////////////////////////////
		// COMMON
		////////////////////////////////////////////////////////////////////////////////////
		
		function log()
		{
			var output = "";
			for(var i = 0; i < arguments.length; i++) {
				output += arguments[i] + " ";
			}
			//console.log(output);
		}
		
		/*
		slave.map.smoothZoomTo = function(targetCenter,targetZoom,callBack) {
			var currentZoom = this.getZoom();
			var zoomAmount = targetZoom-currentZoom;
	
			if (!this.Ef) {
				this.setZoom(targetZoom);
				this.setCenter(targetCenter);
				if (callBack) {
					callBack.apply(this);
				}
				return;
			}
	
			if (zoomAmount===0) {
				if (callBack) {
					callBack.apply(this);
				}
			} else {
				this.ak(zoomAmount,true,targetCenter,true);
				if (callBack) {
					var zoomEnd = GEvent.addListener(this,'zoomend',function() {
						callBack.apply(this);
						GEvent.removeListener(zoomEnd);
					});
				}
			}
		}
		*/
		
		function restrainToZone()
		{
			var mapCenter = master.map.getCenter();
			var mapBounds = master.map.getBounds();
			var top = mapBounds.getNorthEast().lat();
			var right = mapBounds.getNorthEast().lng();
			var bottom = mapBounds.getSouthWest().lat();
			var left = mapBounds.getSouthWest().lng();
			
			if(top - bottom < TOP_LIMIT - BOTTOM_LIMIT)
			{
				if(top > TOP_LIMIT)
				{
					var topDiff = top - TOP_LIMIT;
					var newCenterLat = mapCenter.lat() - topDiff - 0.00001;
					master.map.setCenter(new GLatLng(newCenterLat, mapCenter.lng()));
				}
				if(bottom < BOTTOM_LIMIT)
				{
					var bottomDiff = bottom - BOTTOM_LIMIT;
					var newCenterLat = mapCenter.lat() - bottomDiff + 0.00001;
					master.map.setCenter(new GLatLng(newCenterLat, mapCenter.lng()));
				}
			}
			else if(mapCenter.lat() > TOP_LIMIT)
			{
				master.map.setCenter(new GLatLng(TOP_LIMIT, mapCenter.lng()));
			}
			else if(mapCenter.lat() < BOTTOM_LIMIT)
			{
				master.map.setCenter(new GLatLng(BOTTOM_LIMIT, mapCenter.lng()));
			}
			
			if(right - left < RIGHT_LIMIT - LEFT_LIMIT)
			{
				if(left < LEFT_LIMIT)
				{
					var leftDiff = left - LEFT_LIMIT;
					var newCenterLng = mapCenter.lng() - leftDiff + 0.00001;
					master.map.setCenter(new GLatLng(mapCenter.lat(), newCenterLng));
				}
				if(right > RIGHT_LIMIT)
				{
					var rightDiff = right - RIGHT_LIMIT;
					var newCenterLng = mapCenter.lng() - rightDiff - 0.00001;
					master.map.setCenter(new GLatLng(mapCenter.lat(), newCenterLng));
				}
			}
			else if(mapCenter.lng() > RIGHT_LIMIT)
			{
				master.map.setCenter(new GLatLng(mapCenter.lat(), RIGHT_LIMIT));
			}
			else if(mapCenter.lng() < LEFT_LIMIT)
			{
				master.map.setCenter(new GLatLng(mapCenter.lat(), LEFT_LIMIT));
			}
		}
		
		function checkLoadStatus()
		{
			log("checkLoadStatus", master.loaded, slave.loaded);
			if(application.state < STATE_LOADED && master.loaded && slave.loaded)
			{
				log("loaded");
				setState(STATE_LOADED);
			}
		}
		
		function savePosition()
		{
			master.savedPosition = master.map.getCenter();
		}
		
		function returnToSavedPosition()
		{
			master.map.setCenter(master.savedPosition);
		}
		
		function updateHotSpots(zoomLevel)
		{
			log("updateHotSpots", zoomLevel);
			master.map.clearOverlays();
			for(var i=0; i < currentMap.hotSpots.length; i++)
			{
				var invisibleIcon = new GIcon(G_DEFAULT_ICON, "img/transparent.png");
				var zoomPercent = 1 - ((ZOOM_MAX - zoomLevel) / (ZOOM_MAX - ZOOM_MIN));
				var zoomCoeff = Math.pow(2, zoomPercent * 2); // 1, 2, 4
				var w = zoomCoeff * currentMap.hotSpots[i].width;
				var h = zoomCoeff * currentMap.hotSpots[i].height;
				invisibleIcon.iconSize = new GSize(w, h);
				invisibleIcon.imageMap = [0,0, w,0, w,h, 0,h];
				invisibleIcon.iconAnchor = new GPoint(w/2,h/2);
				
				invisibleIcon.shadow = '';
				var marker = new PdMarker(currentMap.hotSpots[i].position, invisibleIcon);// GMarker
				marker.setId(i);
				marker.disableDragging();
				master.map.addOverlay(marker);
			}
			
			if(!$.browser.msie)
			{
				var cursorStyle = "move";
				if($.browser.mozilla)
				{
					cursorStyle = "-moz-grab";
				}
				else
				{
					$("#mastermap > div > div > div").css("cursor",cursorStyle);
					$("#mastermap > div.gmnoprint > div > div").css("cursor","pointer");
				}
				$("#mastermap > div > div > div > img.gmnoprint").css("cursor",cursorStyle);
				$("#mastermap > div > div > div > map area").css("cursor",cursorStyle);
			}
			else
			{
				$("#mastermap > div > div > div > img.gmnoprint").css("cursor", "url('http://maps.gstatic.com/intl/fr_ALL/mapfiles/openhand_8_8.cur')");
			}
		}
		
		function selectHotSpot(id, ignoreGameState)
		{
			if(!currentMap.hotSpots[id].found)
			{
				currentMap.hotSpots[id].found = true;
				
				var hotSpotsFound = 0;
				for(var i=0; i < currentMap.hotSpots.length; i++)
					if(currentMap.hotSpots[i].found)
						hotSpotsFound++;
				
				updateCounter(hotSpotsFound);
				
				var hotspotIcon = new GIcon(G_DEFAULT_ICON, "img/hotspots/"+hotSpotsFound+".png");
				hotspotIcon.iconSize = new GSize(55, 71);
				hotspotIcon.iconAnchor = new GPoint(27, 60);
				hotspotIcon.shadow = '';
				var marker = new GMarker(currentMap.hotSpots[id].position, hotspotIcon);
				slave.overlays.push(marker);
				updateOverlays();
				
				if(!ignoreGameState)
					sendGameState({hotSpotsFound: hotSpotsFound});
			}
		}
		
		function updateOverlays()
		{
			slave.map.clearOverlays();
			for(var i=0; i < slave.overlays.length; i++)
			{
				slave.map.addOverlay(slave.overlays[i]);
			}
		}
		
		function sendGameState(data)
		{
			if(!data) data = {};
			data.state = application.state;
			$.post("checkstate/",
				data,
				function(response){
					log("state:", response.state);
					log("prevTime:", response.prevTime);
					log("totalTime:", response.totalTime);
					log("hotSpotsFound:", response.hotSpotsFound);
					log("status:", response.status);
					log("complete:", response.complete);
					
					if(response.status > 0) // error or cheating detected
					{
						alert(response.statusmessage);
					}
					if(response.complete)
					{
						application.totalTime = response.totalTime;
						setState(STATE_COMPLETE);
					}
				},
				"json");
		}
		
		function updateCounter(hotSpotsFound)
		{
			$("#panels #counter p.numbers").html(hotSpotsFound+"<span>/"+currentMap.hotSpots.length+"</span>");
			Cufon.refresh("#panels #counter p.numbers");
		}
		
		function secondsToTime(seconds)
		{
			var time = "";
			var h = (seconds / 3600) >> 0;
			var m = ((seconds % 3600) / 60) >> 0;
			var s = (seconds % 60) >> 0;
			//var ds = ((seconds - (seconds>>0)) * 10) >> 0;
			time += formatNumber(h) + ":";
			time += formatNumber(m) + ":";
			time += formatNumber(s)
			return time;
		}
		
		function formatNumber(n)
		{
			return (n<10 ? "0" : "" ) + n;
		}
		
		function startTimer()
		{
			startTime = (new Date()).getTime();
			timer.reset();
			sendGameState({hotSpotsFound:0});
		}
		
		function stopTimer()
		{
			timer.stop();
			var totalTime = ((new Date()).getTime() - startTime) / 1000;
			return totalTime;
		}
		
		function animateFade(selector, opacity)
		{
			$(selector).fadeTo(250, opacity, function(){animateFade(selector, (opacity==1?0.5:1));});
		}
		
		function startGame()
		{
			$("#clickblocker").hide();
			$("#panels .d1").fadeOut(250, function(){
				$("#panels").animate({height: 198}, 250);
				$("#panels .d2").fadeIn(250, startTimer);
				slave.overlays = [slave.pointer];
				updateOverlays();
				slave.pointer.hide();
				$("#slavemask").fadeTo(500, 0);
			});
		}
		
		function giveUp()
		{
			application.givingUp = true;
			master.map.setZoom(ZOOM_MIN);
			for(var i=0; i < currentMap.hotSpots.length; i++)
				selectHotSpot(i, true);
			setTimeout(function(){
				sendGameState({giveup:true})
			}, 1000);
		}
		
		function setState(state)
		{
			log("setState:", state);
			application.state = state;
			switch(state)
			{
				case STATE_LOADING:
					log("loading map #", mapID);
					$("#loading").css({display: "block", opacity:0});
					$("#loading").fadeTo(500, 0.9, function(){
						$("#middleBar").css({display: "block", opacity:0});
						$("#middleBar").fadeTo(500, 1);
						master.setup();
						slave.setup();
						$("#main").css("background", "transparent");
					});
					Cufon.refresh("#loadingcontent a#go span");
					$("#loadingcontent a#go").click(function(){
						return false;
					});
					
					break;
					
				case STATE_LOADED:
					//Cufon.refresh("#loadingcontent a#go span");
					$("#loadingcontent a#go").fadeOut(250, function(){
						$("#loadingcontent a#go span").text("Jouer")
						Cufon.refresh("#loadingcontent a#go span");
						$("#loadingcontent a#go").fadeIn(250);
					});
					$("#loadingcontent a#go").click(function(){
						setState(STATE_READY);
						return false;
					});
					break;
					
				case STATE_READY:
					savePosition();
					updateHotSpots(ZOOM_START);
					updateCounter(0);
					Cufon.refresh("#panels #description a");
					$("#panels .d1 a").click(function(){
						$("#panels .d1 a").stop(true);
						$("#panels .d1 a").click(function(){return false;});
						startGame();
						return false;
					});
					$("#loadingcontent").fadeOut(300, function(){
						$("#loading").fadeOut(400, function(){
							$("#loading").css("visibility", "hidden");
							$("#panels").css({height: (LANG=="fr"?242:260)});
							$("#panels .d2").hide();
							if(!$.browser.msie) animateFade("#panels .d1 a", 1);
							$("#panels").fadeIn(300);
							$("h1").fadeIn(300);
						});
					});
					application.givingUp = false;
					$("#panels a#giveup").click(function(){
						giveUp();
						return false;
					});
					$("#slavemask").fadeTo(700, 0.8);
					break;
					
				case STATE_COMPLETE:
						var totalTime = stopTimer();
						slave.pointer.hide();
						$("#complete").css({display: "block", opacity:0});
						$("form#completeform").jqTransform();
						setTimeout(function(){
							$("#panels").fadeOut(300);
							$("#complete").fadeTo(500, 0.9);
						}, 500);
						$("#panels #timer p.numbers").html(secondsToTime(application.totalTime));
						Cufon.refresh("#panels #timer p.numbers");
						$("#completecontent #report_time").text(secondsToTime(application.totalTime));
						Cufon.refresh("#completecontent p");
					break;
					
				case STATE_SUBMITTED:
						setTimeout(function(){
							$("#formcontainer").fadeOut(250, function(){
								$("#thankscontainer").fadeIn(250);
								//setTimeout(function(){$(location).attr('href',"change/");}, 3000);
							});
						}, 250);
					break;
					
				default:
					
					break;
			}
		}
		
		
		
		
		////////////////////////////////////////////////////////////////////////////////////
		// FORM
		////////////////////////////////////////////////////////////////////////////////////
		
		function validateForm(formData, jqForm, options)
		{ 
			for(var i=0; i < formData.length; i++)
			{ 
				if(formData[i].name.indexOf("birthdate") < 0 && !formData[i].value)
				{ 
					alert("Veuillez remplir tous les champs obligatoires.");//+formData[i].name); 
					return false;
				}
				if(formData[i].name == "email" && !isEmail(formData[i].value))
				{
					alert("Veuillez remplir une adresse e-mail valide.");
					return false;
				}
			}
			if($("form#completeform input[@id=rules]:checked").length == 0)
			{
				// accept rules not checked
				alert("Veuillez accepter le règlement.");
				return false;
			}
				
		}
		
		function isEmail(value)
		{
			return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/.test(value);
		}
		
		function formResponseHandler(response, status)
		{ 
			log("success:", response.success);
			log("error:", response.error);
			if(response.success)
			{
				setState(STATE_SUBMITTED);
			}
			else  // error
			{
				alert(response.error);
			}
		}
		
		var options = { 
			beforeSubmit:	validateForm,
			success:		formResponseHandler,
			dataType:		"json"
		}; 
		
		function fixMask(input, power, mask)
		{
			var replace = "";
			var parts = input.val().split(" ");
			var h = parseInt(parts[0]);
			if(isNaN(h)) h = 0;
			if(h<Math.pow(10, power-1))
				for(var i=0; i < power-1; i++)
					replace += "0";
			replace += h;
			if(mask) replace += " " + mask;
			input.val(replace);
		}
		
		$("form#completeform").ajaxForm(options);
		$("form#completeform a.submit").click(function(){$('form#completeform').submit();return false;});
		$("form#completeform input.hours").css("background-image", "url('img/form/hours_"+LANG+".png')");
		$("form#completeform input.minutes").css("background-image", "url('img/form/minutes_"+LANG+".png')");
		$("form#completeform input.seconds").css("background-image", "url('img/form/seconds_"+LANG+".png')");
		$("form#completeform input.small").keyup(function() { 
			this.value = this.value.replace(/[^0-9\.]/g, "");
		});
		
		
		////////////////////////////////////////////////////////////////////////////////////
		// CSS ADJUSTMENTS
		////////////////////////////////////////////////////////////////////////////////////
		
		if($.browser.msie)
		{
			$("#mastermap > div > div > div > img.gmnoprint").css("cursor", "url('http://maps.gstatic.com/intl/fr_ALL/mapfiles/openhand_8_8.cur')");
			if(parseInt($.browser.version)==6)
				DD_belatedPNG.fix("#loadingcontent, #loadingcontent h2, #loadingcontent #game, #loadingcontent .fr #game, #loadingcontent #splashRight img, #clickblocker, #panels a.button, #panels a.button span, #completecontent a.button, #completecontent a.button span");
		}
		
		$("div").disableSelection();
		$("#slavemap > div").css("visibility", "hidden");
		$("#slavemap > div:first-child").css("visibility", "visible");
		$("#panels .bg").fadeTo(0, 0.6);
		$("#slavemask").fadeTo(0, 0.0);
		$("#slavemask").mouseover(function(){
			$("#slavemask").fadeTo(250, 0.8);
		});
		$("#slavemask").mouseout(function(){
			$("#slavemask").fadeTo(250, 0.0);
		});
		$("h1").css("cursor", "pointer");
		$("h1").click(function(){window.open("http://www.wonderbra.be", "_blank");});
		$("a[rel*=external]").click( function() {
			window.open(this.href);
			return false;
		});
		
		Cufon.replace("#panels #timer p.numbers", {fontFamily: "DIN Engschrift"});
		Cufon.replace("#panels #counter p.numbers", {fontFamily: "DIN Engschrift"});
		Cufon.replace("#panels h2", {fontFamily: "Adobe Caslon Pro"});
		Cufon.replace("#panels p.text", {fontFamily: "Adobe Caslon Pro"});
		Cufon.replace("#panels #description span", {fontFamily: "Adobe Caslon Pro"});
		Cufon.replace("#completecontent h2", {fontFamily: "DIN Engschrift"});
		Cufon.replace("#completecontent h3", {fontFamily: "DIN Engschrift"});
		Cufon.replace("#completecontent p", {fontFamily: "Adobe Caslon Pro"});
		Cufon.replace("#completecontent label", {fontFamily: "Adobe Caslon Pro"});
		Cufon.replace("#completecontent .text", {fontFamily: "Adobe Caslon Pro"});
		Cufon.replace("#loadingcontent a#go span", {fontFamily: "Adobe Caslon Pro"});
		Cufon.replace("#completecontent a.button span", {fontFamily: "Adobe Caslon Pro"});
		Cufon.replace("#completecontent h3", {fontFamily: "DIN Engschrift"});
		
		// start the mofo
		setState(STATE_LOADING);
		
		
		
		
	}
	else
	{
		// Display a warning if the browser is not compatible with Google Maps
		alert("This website is not compatible with your browser. Please update it to the latest version.");
	}
	
}


// Initialize when document is loaded and ready
$(document).ready(init);
