/* Script client commun à toutes les pages du site */

/* Déclaration */

/* Gallery V13 */
/* TODO Recode to handle variable image width with SLIDE effect */
var SLIDE = 0, FADE = 1;
var Gallery = new Class({
	Implements : Options,
	options : {
		container : 'div',
		list : 'ul',
		items : 'li',
		prev : '.button.prev',
		next : '.button.next',
		auto : true,
		step : 1,
		delay : 3000,
		loop : true,
		links : 'ul.nav li a',
		linksEvent : 'click',
		linksRel : false,
		play : '.button.play',
		autoHide : true,
		tween : {'link':'cancel'},
		effect : SLIDE, // SLIDE | FADE
		pause : true
	},
	initialize : function(element,options){
		this.element = document.id(element);
		this.setOptions(options);
		this.prev = this.element.getElement(this.options.prev);
		this.next = this.element.getElement(this.options.next);
		this.play = this.element.getElement(this.options.play);
		this.links = this.element.getElements(this.options.links);
		this.container = this.element.getElement(this.options.container);
		this.list = this.container.getElement(this.options.list);
		this.items = this.list.getElements(this.options.items);
		this.itemWidth = this.items[0].getStyle('width').toInt()+this.items[0].getStyle('padding-right').toInt()+this.items[0].getStyle('padding-left').toInt();
		this.i = 0;
		this.maxStep = Math.ceil(this.items.length/this.options.step);
		if (this.maxStep>0){
			if (this.options.auto){
				this.start();
				if (this.options.pause) this.element.addEvents({'mouseenter':this.stop.bind(this),'mouseleave':this.start.bind(this)});
			}
			if (this.prev) this.prev.addEvent('click',this.scrollBy.bind(this,0));
			if (this.next) this.next.addEvent('click',this.scrollBy.bind(this,1));
			if (this.play) this.play.addEvent('click',function(){if (this.timer) this.stop(); else	this.start();}.bind(this));
			if (this.options.autoHide){
				this.element.getElements('.button').setStyle('opacity',0);
				this.element.addEvents({
					'mouseenter' : function(){
						$$(this.prev,this.next,this.play).fade('in');
					}.bind(this),
					'mouseleave' : function(){
						$$(this.prev,this.next,this.play).fade('out');
					}.bind(this)
				});
			}
		};
		if (this.options.effect==SLIDE){
			if (this.options.loop){
				this.items.clone().inject(this.list);
				this.items.clone().inject(this.list);
				this.list.setStyle('margin-left',-this.items.length * this.itemWidth * this.options.step);
			}
			this.list.tween = new Fx.Tween(this.list, this.options.tween);
			this.list.setStyle('width',this.itemWidth*3*this.items.length);
		}else{
			this.zIndex = this.items.length+1;
			for(var i=0;i<this.items.length;i++){
				this.items[i].set('tween',this.options.tween);
				this.items[i].setStyles({'position':'absolute','z-index':this.items.length-i});
			}
		}
		if (typeof(Slimbox)!='undefined') Slimbox.scanPage();
		if (this.links.length>0){
			this.links.each(function(link,j){
				link.addEvent(this.options.linksEvent,function(event){
					event.stop();
					this.stop();
					if (this.options.linksRel) j = this.getIndexByLink(link);
					this.scrollTo(j);
				}.bind(this));
			}.bind(this));
			this.link = this.links[0];
			this.link.addClass('selected');
		}
	},
	getIndexByLink : function(link){
		for(var i=0;i<this.items.length;i++){
			if (this.items[i].id==link.rel) return i;
		}
		return 0;
	},
	getLinkByIndex : function(j){
		for (var i=0;i<this.links.length;i++){
			if (this.links[i].rel==this.items[j].id) return this.links[i];
		}
		return this.link;
	},
	scrollBy : function (direction){
		this.scrollTo(this.i+direction*2-1);
		return false;
	},
	scrollTo : function (index,callback){
		if (this.link) this.link.removeClass('selected');
		this.i = index;
		if (this.options.effect==SLIDE){
			this.list.tween.start('margin-left',-this.itemWidth * (this.i+this.items.length) * this.options.step).chain(function(){
				if (this.options.loop && Math.abs(this.i)>=this.maxStep){
					this.list.setStyle('margin-left',-this.items.length * this.itemWidth * this.options.step);
					this.i = (this.i+this.maxStep) % this.maxStep;
					if (callback) callback();
				}
			}.bind(this));
		}else if (this.options.effect==FADE){
			this.i = (this.i+this.maxStep) % this.maxStep;
			this.items[this.i].setStyles({'z-index':this.zIndex,'opacity':0});
			this.items[this.i].tween('opacity',1);
			this.zIndex++;
		}
		this.link = this.getLinkByIndex((this.i+this.maxStep) % this.maxStep);
		if (this.link) this.link.addClass('selected');
	},
	start : function(){
		if (this.play) this.play.addClass('stop');
		if (this.next) this.next.fireEvent('mouseenter');
		this.timer = this.scrollBy.bind(this,1).periodical(this.options.delay);
	},
	stop : function(){
		if (this.play) this.play.removeClass('stop');
		if (this.next) this.next.fireEvent('mouseleave');
		this.timer = $clear(this.timer);
	}
});

/* Menu V6.0 */
var Menu = new Class({
	Implements : Options,
	options : {
		showMinLevel : 0,
		hideDelay : 300,
		morph : {
			showStyles : {opacity:1},
			hideStyles : {opacity:0},
			options : {link:'cancel',duration:200}
		}
	},
	initialize: function(menu,options){
		this.setOptions(options);
		this.items = document.id(menu).getChildren('li');
		this.items.each(function(item,i){
			item.i = i;
			item.link = item.getElement('a');
			item.link.addEvent('focus',this.showItem.bind(this,item));
			item.submenu = item.getElement('ul');
			if (this.options.showMinLevel>0){
				if (item.submenu) item.submenu.setStyle('display','block');
			}else{
				item.addEvents({mouseenter:this.showItem.bind(this,item),mouseleave:this.hideItem.bind(this,item)});
			}
			if (item.submenu){
				item.submenu.morph = new Fx.Morph(item.submenu,this.options.morph.options);
				var options = $merge(this.options);
				options.showMinLevel = options.showMinLevel-1;
				new Menu(item.submenu,options);
			}
		}.bind(this));
	},
	showItem : function(item){
		this.timer = $clear(this.timer);
		item.link.addClass('hover');
		if (item.submenu){
			item.submenu.morph.start(this.options.morph.showStyles).chain(function(){item.submenu.setStyle('display','block');}.bind(this));
		}
		this.items.each(function(otherItem,j){
			if (item.i!=j) this.hideItemNow(otherItem);
		}.bind(this));
	},
	hideItem : function(item){
		this.timer = $clear(this.timer);
		this.timer = this.hideItemNow.bind(this,item).delay(this.options.hideDelay);
	},
	hideItemNow : function(item){
		if (item.link){
			item.link.removeClass('hover');
			if (item.submenu){
				item.submenu.morph.start(this.options.morph.hideStyles).chain(function(){item.submenu.setStyle('display','none');}.bind(this));
			}
		}
	}
});

/* Pulse V2.0 */
var Pulse = new Class({
	Implements : Options,
	options : {
		from : '.pulsed-off',
		to : '.pulsed-on',
		duration : 500,
		morph : false
	},
	initialize : function (element,options){
		this.element = $(element);
		this.setOptions(options);
		if (this.options.morph){
			this.element.morph(this.options.to);
		}else{
			if (typeof this.options.to == 'string'){
				this.element.removeClass(this.options.from.replace('.',''));
				this.element.addClass(this.options.to.replace('.',''));
			}else{
				this.element.setStyles(this.options.to);
			}
		}
		setTimeout(function(){
			var tmp = this.options.from;
			this.options.from = this.options.to;
			this.options.to = tmp;
			this.initialize(this.element, this.options);
		}.bind(this),this.options.duration);
	}
});

/* GoogleMaps V4 */
var GoogleMaps = new Class({
	Implements : [Options],
	element : null,
	options : {
		markers : null,
		url : null,
		controls :{
			smallMap : true,
			type : true
		},
		icon : {
			image : "/wp-content/themes/jbconstructions/images/markerA.png",
			shadow : "/wp-content/themes/jbconstructions/images/shadow50.png",
			iconSize : new GSize(20, 34),
			shadowSize : new GSize(37, 34),
			iconAnchor : new GPoint(9, 34),
			infoWindowAnchor : new GPoint(9, 2),
			infoShadowAnchor : new GPoint(18, 25)
		},
		center : null,
		zoom : 7,
		markerDefaultEvents : {
			click : function(){
				this.openInfoWindowHtml(this.marker.text);
			}
		}
	},
	map : null,
	geocoder : null,
	icon : null,
	markers : [],
	initialize : function(element,options){
		this.element = document.id(element);
		this.setOptions(options);
		this.geocoder = new GClientGeocoder();
		this.map = new GMap2(this.element);
		if (this.options.controls.smallMap) this.map.addControl(new GSmallMapControl());
		if (this.options.controls.type)  this.map.addControl(new GMapTypeControl());
		if (this.options.icon){
			this.icon = new GIcon();
			$extend(this.icon,this.options.icon);
		}
		if (this.options.markers) this.addMarkers(this.options.markers);
		if (this.options.url) this.loadMarkers(this.options.url);
		if (this.options.center) this.setCenter(this.options.center);
		document.onunload = GUnload;
	},
	addMarkers : function(markers){
		markers.each(function (marker){
			if (!marker.lat || !marker.lng){
				this.geoencode(marker);
			}else{
				this.addMarker(marker);
			}
		}.bind(this));
	},
	addMarker : function(marker){
		var gPoint = new GLatLng(marker.lat,marker.lng);
		if (!marker.options) marker.options = {};
		if (!marker.options.icon) marker.options.icon = new GIcon(this.icon);
		var gMarker = new GMarker(gPoint, marker.options);
		gMarker.marker = marker;
		if (!marker.events) marker.events = this.options.markerDefaultEvents;
		if (marker.events){
			var eventsHash = new Hash(marker.events);
			eventsHash.each(function(eventFunction,eventName){
				GEvent.addListener(gMarker,eventName,eventFunction);
			});
		}
		this.markers.push(gMarker);
		this.map.addOverlay(gMarker);
		if (!this.options.center) this.setCenter(gPoint);
	},
	geoencode : function(marker){
		this.geocoder.getLatLng(
			marker.address,
			function(point) {
				if (!point) {
					//GLog.write("Adresse \"" + marker.address + "\" non trouvée");
				} else {
					marker.lat=point.y;
					marker.lng=point.x;
				}
				this.addMarker(marker);
			}.bind(this)
		);
	},
	loadMarkers : function(url){
		var result = [];
		GDownloadUrl(url, function(data) {
	        var xml = GXml.parse(data);
			var markers = xml.documentElement.getElementsByTagName("marker");
			for (var i = 0; i < markers.length; i++) {
				result.push({
					lat : markers[i].getAttribute("latitude"),
					lng : markers[i].getAttribute("longitude"),
					address : markers[i].getAttribute("address"),
					text : this.innerXML(markers[i]),
					events: markers[i].getAttribute("events")
				});
			}
			this.addMarkers(result);
		}.bind(this));
	},
	setCenter : function(center){
		this.options.center = center;
		this.map.setCenter(center, this.options.zoom);
	},
	innerXML : function(node){
		return (node.xml || (new XMLSerializer()).serializeToString(node) || "").replace(
		new RegExp("(^<\\w*" + node.tagName + "[^>]*>)|(<\\w*\\/\\w*" + node.tagName + "[^>]*>$)", "gi"), "");
	}
});

/* Webcallback */
var Webcallback = new Class({
	initialize : function(form,div){
		this.form = document.id(form);
		this.div = document.id(div);
		if (this.form){
			this.form.addEvent('submit', function(e) {
				e.stop();
				new Request({
					method: this.form.method,
					url: this.form.action,
					onSuccess: function(responseText, responseXML) {
						this.div.set('html',responseText);
						new Webcallback(form,div);
					}.bind(this)
				}).send(this.form.toQueryString());
			}.bind(this));
		}
	}
});

/* Initialisation */
window.addEvent('domready',function(){		
	/* Initialise la galerie des réalisations */	
	$$('.gallery.large.slide').each(function(h){
		new Gallery(h,{delay:4000,tween:{duration:400},effect:FADE,pause:false,autoHide:false,auto:false});
	});	
	/* Initialise la galerie */	
	$$('.gallery.medium.slide').each(function(g){
		new Gallery(g,{delay:1600,tween:{duration:400},effect:FADE,pause:false,autoHide:false});
	});
	/* Initialise le menu */
	new Menu('menu');
	/* Initialisation éléments pulsés */
	$$('.pulse').each(function(e){
		new Pulse(e,{morph:true,duration:900});
	});
	/* Carte des agences */
	var points = $$('#content #mapAgences area');
	var agences = $$('#content ul.agences li');
	if (points && agences){
		points.each(function(point,i){
			point.addEvent('mouseover',function(){
				agences.each(function(agence,j){
					agence.removeClass('selected');
					points[j].removeClass('selected');
				});
				point.addClass('selected');
				agences[i].addClass('selected');
			});
		});
	}
	/* Login box */
	var loginbox = document.id('loginbox');
	if (loginbox){
		loginbox.button = loginbox.getElement('a.loginbox');
		loginbox.content = loginbox.getElement('div.content');
		loginbox.content.set('slide',{wrapper:loginbox.getElement('div.wrapper'),fixedHeight:175});
		loginbox.content.slide('hide');
		loginbox.addEvents({
			'mouseenter' : function(){loginbox.content.slide('in');loginbox.button.addClass('hover');},
			'mouseleave' : function(){loginbox.content.slide('out');loginbox.button.removeClass('hover');}
		});
	}
	/* Carte des terrains 
	var terrains = document.id(document.body).getElement('ul.terrains');
	if (terrains){
		terrains.setStyle('display','none');
		terrains.items = terrains.getElements('li');
		var div = new Element('div',{id:'googlemap'});
		div.inject(terrains,'before');
		var googlemap = new GoogleMaps(div);
		googlemap.current = null;
		googlemap.showCurrent = function(current){
			this.current = current;
			this.markers.each(function(marker){marker.setImage('/wp-content/themes/jbconstructions/images/markerA.png');});
			this.markers[this.current].setImage('/wp-content/themes/jbconstructions/images/markerB.png');
			this.markers[this.current].openInfoWindowHtml(terrains.items[this.current].info);
		}
		terrains.items.each(function(terrain,i){
			terrain.i = i;
			terrain.geo = terrain.getElement('.geo');
			terrain.info = '<div style="width:300px;height:200px;" class="info"><h3>'+terrain.getElement('h3').get('html')+'</h3>'+'<div class="image">'+terrain.getElement('.image').get('html')+'</div>'+'<div class="description">'+terrain.getElement('.description').get('html')+'</div></div>';
			googlemap.addMarker({
				lat:terrain.geo.getElement('.latitude').get('text'),
				lng:terrain.geo.getElement('.longitude').get('text'),
				address:terrain.getElement('.adr').get('text'),
				events:{
					click:function(){
						googlemap.showCurrent(terrain.i);
					}
				},
				options : {
					zIndexProcess : function(){
						return googlemap.current==terrain.i?9999:terrain.i;
					}
				}
			});
		});
		$$('a.prev').addEvent('click',function(){
			googlemap.showCurrent(googlemap.current==null?0:(googlemap.current+googlemap.markers.length-1)%googlemap.markers.length);
		});
		$$('a.next').addEvent('click',function(){
			googlemap.showCurrent(googlemap.current==null?0:(googlemap.current+1)%googlemap.markers.length);
		});
	}*/
	
	// Soumet le formulaire webcallback dans le div au lieu de la page complète
	new Webcallback('webcallback-form','webcallback-div');
	
	// Navigation dans les modèles de gammes
	var gamme = document.id('gamme');
	if (gamme){
		//gamme.liens = gamme.getElements('ul.navigation>li>a[href^=#]');
		gamme.modeles = gamme.getElements('ul.modele>li');
		gamme.select = function(index){
			this.selected = index;
			//this.liens.each(function(l){l.removeClass('selected');});
			//this.liens[this.selected].addClass('selected');
			this.modeles.each(function(m){m.removeClass('selected');});
			this.modeles[this.selected].addClass('selected');
		}
		gamme.selectBy = function(step){
			this.select((this.selected+this.modeles.length+step)%this.modeles.length);
			return false;
		}
		gamme.select(0);
		gamme.getElement('.gamme a.prev').addEvent('click',gamme.selectBy.bind(gamme,-1));
		gamme.getElement('.gamme a.next').addEvent('click',gamme.selectBy.bind(gamme,+1));
		/*gamme.liens.each(function(lien,i){
			lien.i = i;
			lien.addEvent('click',function(event){
				event.stop();
				gamme.select(lien.i);
			});
		});*/
		/*gamme.modeles.each(function(modele){
			modele.getElements('.gallery a').each(function(a,i){
				a.addEvent('mouseover',function(){
					modele.getElement('.image img').src = a.href;
				});
				a.addEvent('click',function(event){event.stop();});
			});
		});*/
	}
	
	
	/* Gallery Spread */
	$$('.gallery.spread').each(function(gallery){
		new Swiff('/wp-content/themes/jbconstructions/spread-gallery.swf', {
			container : gallery,
			width: '100%',
		  height: '100%',
		  params: {
		  	wMode: 'transparent',
		  	menu: 'false',
				allowfullscreen: true
		  },
			vars :{
				xml_file : '/wp-content/themes/jbconstructions/spread-gallery.php?id='+gallery.id.replace('gallery-','')
			}
		});
	});
});

