/**
 * jgallery.js v2
 *
 * Photo gallery based on Prototype and Scriptaculous
 * By David Esteves October 26, 2008 <david@esteves.eu> for Neken, Montreal,CA
 * use or copy in any project under request
 *
 */
var Bbox_width=800;
var Bbox_height=500;
Bthumb_width = 62 

var jgalleries
document.observe('dom:loaded',function(){jgalleries = new jgallery()})
document.observe('dom:unload', Event.unloadCache, false)
var Bthumb_width;
var thumbs_width;
var jgallery = Class.create({
	projector_selector:new String(),
	activity:new Array(),
	galleries: new Object(),
	original_class:new String(),
	slideshow_time: 5,
	slideshow_status: new String(), 
	gallery_length:0,
	initialize: function(){ // Search for jgallery nodes      
		$$('.jgallery').each(this.prepare_gallery,this)
	},
	prepare_gallery:function(el){                                                                
			if(this.activity.indexOf(el.id)==0){ 
				this.activity = this.activity.without(el.id)
				// alert("prepare"+this.activity.indexOf(el.id))
			}
			this.gallery_length = $$('.jg_thumbs a').length 
		var button_playPause = new Element("a", {href:"#",className:'jg_play'})  
			.observe('click',this.slideshow.bindAsEventListener(this))
		button_playPause.onclick = function(){return false}
		var button_stop = new Element("a", {href:"#",className:'jg_stop'}) 
			.observe('click',this.slideshow.bindAsEventListener(this))       
		button_stop.onclick = function(){return false}
		var button_time_increase = new Element("a", {href:"#",className:'jg_time_increase'})  
			.observe('click',this.slideshow_time_increase.bindAsEventListener(this))
		button_time_increase.onclick = function(){return false}
		var button_time_decrease = new Element("a", {href:"#",className:'jg_time_decrease'})  
			.observe('click',this.slideshow_time_decrease.bindAsEventListener(this))
		button_time_decrease.onclick = function(){return false}
		var button_zoom = new Element("a", {href:"#",className:'jg_zoom'}) 
			.observe('click',this.slideshow_time_increase.bindAsEventListener(this))       
		button_zoom.onclick = function(){return false}
		var first_image = new Image()
		first_image.src = $$$('.jg_thumbs a').href
		el.insert(
			new Element("div", {className:"jg_projector"})
			   .insert(
			   	new Element("div",{className:"jg_slide jg_loading"})
			   		.insert(
			   			new Element("div")
			   				.insert(
			   					new Element("img",{className:"reflected first",src:"jgallery_img/blank.gif"})
			 				)
			   		)
				)
			).insert( 
				new Element("div", {className:"jg_control"})
					.insert(new Element("ul", {className:"jg_buttons"})  
								.insert(new Element("li").insert(button_playPause))
								.insert(new Element("li").insert(button_stop))      
							)
					.observe('mousemove',this.cursor_observer)
					.observe('mouseout',function(event){ 
						$(Event.element(event))
							.removeClassName('jg_next')
							.removeClassName('jg_prev')                                
					})
					.observe('click',this.load_image.bindAsEventListener(this,el))
					
			).insert(
				new Element("div", {className:"jg_legend"})
			).insert(
				new Element("div", {className:"jg_prev_th hide"})
			).insert(
				new Element("div", {className:"jg_next_th"})
			)
		
		el.select('.jg_thumbs a')
			.invoke('observe','click',this.load_image.bindAsEventListener(this,el))
		  	.each(function(el){
				el.href = el.href
				el.onclick = function(){return false}
				el.update(new Element('span').update(el.innerHTML))
				.insert(new Element("img",{src:el.href.gsub('/nr_','/tp_'),alt:el.innerHTML.stripTags(),width:"60",height:"60"}))    
			}.bind(this))
	   	new PeriodicalExecuter(function(pe) {         
		  if (first_image.complete === true && el.select(".first").length > 0){
			Event.observe(document,'keyup',this.analize_keypress.bindAsEventListener(this,el))
			var text = ($('content').className == "en") ? 
			"Use Arrow keys or 0 to 9 keys to navigate."
			:
			"Utilisez les fl&egrave;ches du clavier ou les touches de 0 à 9 pour naviguer."
			$("gallery_info").update(text)        
			$$$('.jgallery').show()
			thumbs_width =  this.gallery_length*Bthumb_width
			$$$('.jg_thumbs').style.width = thumbs_width+"px"     
			$$$('.jg_prev_th').observe('click',this.move_thumbs.bindAsEventListener(this,-(Bbox_width - 118)))          
			$$$('.jg_next_th').observe('click',this.move_thumbs.bindAsEventListener(this,(Bbox_width - 118)))          
			this.load_image('start',el)
			// setTimeout("new Effect.Fade($$$('#wrap_in .intro_img'),{duration:2})",2000);
			pe.stop()
		  }
		}.bind(this),0.1)
	},
	analize_keypress:function(ev,el){
		var element = Event.element(ev);
        if((ev.keyCode > 36 && ev.keyCode < 41) || (ev.keyCode > 47 && ev.keyCode < 59)){
			this.activity.without(el.id);
				// alert("keypress"+this.activity.indexOf(el.id))                                           
		switch (ev.keyCode) {
		    case 39:
				this.load_image('next',el) 
		    break;
    	    case 37:
				this.load_image('prev',el) 
		    break;  
		   	case 38:
				this.load_image('start',el) 
		    break;
			case 40:
				this.load_image('end',el) 
			break;
			default:
				if(ev.keyCode >47){       
					var imgN = ev.keyCode-48
					if($('key_display').innerHTML){
						$('key_display').update($('key_display').innerHTML+""+imgN)
					}else{
						$('key_display').update(imgN)							
					}    
					new PeriodicalExecuter(function(pe) {
						imgN = $('key_display').innerHTML
						if(imgN < this.gallery_length){
							pe.stop()
							this.load_image(imgN,$$$('.jgallery'))							
						}else{
							$('key_display').update("")   
						}
					}.bind(this),1)      
					
				}else{
					this.activity.push(el.id);
					// alert("keypressout"+this.activity.indexOf(el.id))					
				}
  			break;
		   }
		}
	},
	create_controls:function(gallery){
	},
	load_image:function(event,el){   
		if(event.type){
			this.original_class = $(Event.element(event)).className
			
		}
		if(event.type && (!$(Event.element(event)).ancestors()[0].hasClassName('jg_control'))){          
			if ($(Event.element(event)).hasClassName('jg_next')){ 
				$('key_display').update("next")
				if(el.select('.jg_selected')[0].ancestors()[0].next()) {          
					var new_image_src = el.select('.jg_selected')[0].ancestors()[0].next().select('a')[0].href
					var legend =  el.select('.jg_selected')[0].ancestors()[0].next().select('a span')[0].innerHTML
				}else {
					var new_image_src = el.select('.jg_thumbs a').first().href
					var legend =  el.select('.jg_thumbs a span').first().innerHTML
				}	  
			}else if ($(Event.element(event)).hasClassName('jg_prev')){
				$('key_display').update("previous")
				if(el.select('.jg_selected')[0].ancestors()[0].previous()){ 
					var new_image_src = el.select('.jg_selected')[0].ancestors()[0].previous().select('a')[0].href
					var legend =  el.select('.jg_selected')[0].ancestors()[0].previous().select('a span')[0].innerHTML
			   }else{
				 	var new_image_src = el.select('.jg_thumbs a').last().href
					var legend =  el.select('.jg_thumbs a span').last().innerHTML
			   } 	
			}else if($(Event.element(event)).parentNode.tagName == 'A'){    
				var new_image_src = $(Event.element(event)).parentNode.href;  
				var legend =   $(Event.element(event)).ancestors().first().select('span').first().innerHTML
				$('key_display').update(legend)
			}else{                 
				return false
			}
		}else{        
			if (event == 'next'){                   
				$('key_display').update("next")
				if(el.select('.jg_selected')[0].ancestors()[0].next()){           
					var new_image_src = el.select('.jg_selected')[0].ancestors()[0].next().select('a')[0].href
					var legend =  el.select('.jg_selected')[0].ancestors()[0].next().select('a span')[0].innerHTML
				}else{
					var new_image_src = el.select('.jg_thumbs a').first().href 
					var legend =  el.select('.jg_thumbs a span').first().innerHTML
				}	 
			}else if (event == 'prev'){
				$('key_display').update("previous")
				if(el.select('.jg_selected')[0].up('li').previous()){ 
					var new_image_src = el.select('.jg_selected')[0].ancestors()[0].previous().select('a')[0].href;
					var legend =  el.select('.jg_selected')[0].ancestors()[0].previous().select('a span')[0].innerHTML
				}else{                                         
				 	var new_image_src = el.select('.jg_thumbs a').last().href
					var legend =  el.select('.jg_thumbs a span').last().innerHTML
				} 
			}else if(event == "start"){
				$('key_display').update("start")
			    var new_image_src = $$$('.jg_thumbs a').href                            
			// alert('.jg_thumbs a[href="'+$$$('.jg_thumbs a').href+'"]')
				var legend =  $$$('.jg_thumbs a').down('span').innerHTML
			}else if(event == "end"){
				$('key_display').update("end")
			    var new_image_src = $$('.jg_thumbs a').last().href      
				var legend =  el.select('.jg_thumbs a[href="'+$$('.jg_thumbs a').last().href+'"]').last().down('span').innerHTML
			}else if(event && event <= this.gallery_length){
				var new_image_src = $$('.jg_thumbs a')[event-1].href      
				var legend =  el.select('.jg_thumbs a[href="'+$$('.jg_thumbs a')[event-1].href+'"]').last().down('span').innerHTML
				$('key_display').update(legend)
			}else{                 
				return false
			}
		}
		window.setTimeout(function() { $('key_display').update("")}, 800);    
		// alert(this.activity.indexOf(el.id)+" < 0 && "+new_image_src+" != "+el.select(".jg_slide img").first().src)                                            
		if(this.activity.indexOf('gallery') < 0 && new_image_src != el.select(".jg_slide img").first().src){     
					// alert(legend)
					this.activity.push(el.id);
					// alert("push"+this.activity.indexOf(el.id))                                           
				var new_image = new Image()
				new_image.src = new_image_src   
				if(new_image.complete === false){
					if(this.original_class.match('jg_next')){
						$$$(".jg_control").addClassName("jg_next");
					}else if(this.original_class.match('jg_prev')){
						$$$(".jg_control").addClassName("jg_prev");						
					}
					var loading_class = " jg_loading";
				}else{
					var loading_class = ""
				}
				el.select(".jg_projector").first().insert(
					new Element("div", {className:"jg_slide"+loading_class})
						.insert(
							new Element("img",{className:"jg_hide no_reflection rheight40 ropacity100",src:new_image.src})
						)
					) 
					
				new PeriodicalExecuter(function(pe) {
				  if (new_image.complete === true && el.select(".jg_hide").length > 0){               
					this.change_image(el,event,legend)
					// if(!el.className.match("no_reflection"))
				   		// Reflection.add(el.select(".reflect").first(), { height: 0.3, opacity : 1}); 
					pe.stop()  
				  }
				}.bind(this),0.1)                   
			}else{
				$('key_display').update()
			} 
	},
	slideshow:function(event,item){
		var gallery = $(Event.element(event)).ancestors()[3]   ;   
		switch (this.slideshow_status = $(Event.element(event)).className.gsub('jg_','')){
			case 'play':  
				$(Event.element(event)).removeClassName('jg_play').addClassName('jg_pause')
				new PeriodicalExecuter(function(pe) {      
					if (this.slideshow_status != 'play')
						pe.stop()
					else
						this.load_image('next', gallery) 
				}.bind(this), this.slideshow_time)
			break;
			case 'pause':
				$(Event.element(event)).removeClassName('jg_pause').addClassName('jg_play')
			break;                       
			case 'stop':                                                                
				$(Event.element(event)).up(0).previous("li").down("a").removeClassName('jg_pause').addClassName('jg_play')
			    gallery.select('.jg_selected').invoke('removeClassName','jg_selected')
				gallery.select('.jg_thumbs a')[0].addClassName('jg_selected')
			break; 
		}                                                     
	},
	slideshow_time_increase: function(event){                                     
		if($(Event.element(event)).ancestors()[2].select('.jg_pause').length > 0){
			this.slideshow("pause")
			this.slideshow_time ++                                                                                               
			$(Event.element(event)).ancestors()[2].select('.jg_play').first().removeClassName('jg_play').addClassName('jg_pause')
		}else{
		   this.slideshow_time ++  
		}     
	},
	slideshow_time_decrease: function(event){                                                                                      
		if($(Event.element(event)).ancestors()[2].select('.jg_pause').length > 0){
			$(Event.element(event)).ancestors()[2].select('.jg_pause').first().removeClassName('jg_pause').addClassName('jg_play')    
			this.slideshow_time --                                                                                               
			$(Event.element(event)).ancestors()[2].select('.jg_play').first().removeClassName('jg_play').addClassName('jg_pause')
		}else{
		   this.slideshow_time --  
		}    
	},
	change_image:function(gallery,original_element,legend){
		new PeriodicalExecuter(function(pe) {
		var old_image = gallery.select('.jg_projector div').first()
		var new_image = gallery.select('.jg_hide').first()           
		var gallery_selected = gallery.select('.jg_selected')[0]
		var gallery_thumbs = gallery.select('.jg_thumbs a') 
		if (gallery.select(".jg_hide").length > 0){          
	    	pe.stop()      
		    if (original_element <= this.gallery_length){       
			    $('key_display').update("")
				if(gallery_selected){gallery_selected.removeClassName('jg_selected')}  
				$$$('.jg_thumbs a[href="'+$$('.jg_thumbs a')[original_element-1].href+'"]').addClassName('jg_selected') 
				this.move_thumbs();
			}else if(Object.isString(original_element)){     
			           
				 if (original_element == 'next'){   
					if(gallery_selected.ancestors()[0].next()){  
						gallery_selected.removeClassName('jg_selected')
							.ancestors()[0].next().select('a')[0].addClassName('jg_selected');
					}else{                          
						gallery_selected.removeClassName('jg_selected')
						gallery_thumbs.first().addClassName('jg_selected')
					} 
					this.move_thumbs();
					 
				}else if (original_element == 'prev'){ 
					 if(gallery_selected.up("li").previous()){  
						gallery_selected.removeClassName('jg_selected')
							.up("li").previous().down('a').addClassName('jg_selected');
					 }else{
						gallery_selected.removeClassName('jg_selected')
						gallery.select('.jg_thumbs a').last().addClassName('jg_selected')
					}
					this.move_thumbs();
					 
				}else if (original_element == 'start'){ 
					if(gallery_selected){gallery_selected.removeClassName('jg_selected')}  
					$$$('.jg_thumbs a').addClassName('jg_selected') 
					this.move_thumbs();
					   
				}else if (original_element == 'end'){ 
					if(gallery_selected){gallery_selected.removeClassName('jg_selected')}  
					$$$('.jg_thumbs a[href="'+$$('.jg_thumbs a').last().href+'"]').addClassName('jg_selected') 
					this.move_thumbs();
				}
			}else{
				original_element = $(Event.element(original_element))
				if (this.original_class.match('jg_next')){
					if(gallery_selected.ancestors()[0].next()){ 
						gallery_selected.removeClassName('jg_selected')
							.ancestors()[0].next().select('a')[0].addClassName('jg_selected');  
					}else{                                     
						gallery_selected.removeClassName('jg_selected')
						gallery_thumbs.first().addClassName('jg_selected')         
					}
					this.move_thumbs();
					  
				}else if (this.original_class.match('jg_prev')){
					if(gallery_selected.ancestors()[0].previous()){   
						gallery_selected.removeClassName('jg_selected')
							.ancestors()[0].previous().select('a')[0].addClassName('jg_selected');
					}else{
						gallery_selected.removeClassName('jg_selected')
						gallery_thumbs.last().addClassName('jg_selected')
					}
					this.move_thumbs();
					 
				}else{
					gallery_selected.removeClassName('jg_selected')           
					original_element.parentNode.addClassName("jg_selected")
				}
			}
			var page_number = legend.split('/')[0]

			gallery.select(".jg_loading").invoke("removeClassName","jg_loading")
			new_image.hide()
			new_image.removeClassName("jg_hide")
			Effect.Fade(old_image, { duration: 1.2})                            
			Effect.Appear(new_image, { duration: 1,afterFinish:function(){
				old_image.remove()
				$$$('.jg_legend').update(legend).removeClassName("sIFR-replaced")
				this.activity = this.activity.without(gallery.id)
				// alert("without"+this.activity.indexOf(gallery.id))                                                     
			}.bind(this)})                 
		  }  
		}.bind(this),0.1)                                
	},
	move_thumbs:function(length){
		var left;
		if(this.gallery_length < 12){
			left = (Bbox_width-thumbs_width)/2
			$$$('.jg_next_th').addClassName('hide')
		}else{
			if(length){
				var data = $A(arguments);
				data.shift();
				length = data[0]
				left = $$$('.jg_thumbs').positionedOffset().left - length
			}else{	
				var left = -($$$('.jg_selected').positionedOffset().left-59)
			}
			if(left > 0){
				left = 59
				$$$('.jg_prev_th').addClassName('hide')
			}else{                                        
				$$$('.jg_prev_th').removeClassName('hide')
			}                                         
			var th_length =(thumbs_width)-(Bbox_width-59)
			if(left < -th_length){
				left = -th_length
				$$$('.jg_next_th').addClassName('hide')
			}else{                                        
				$$$('.jg_next_th').removeClassName('hide')
			}
	    }
		
		new Effect.Move($$$('.jg_thumbs'), {y:(Bbox_height-62),x: left, mode: 'absolute'})
	},
	cursor_observer:function(event){
		var control_node = Event.element(event)
		this.cursor_x = parseInt(((Event.pointerX(event)-control_node.cumulativeOffset().left)*100)/control_node.getDimensions().width)
		this.cursor_y = parseInt(((Event.pointerY(event)-control_node.cumulativeOffset().top)*100)/control_node.getDimensions().height)
		if(control_node.hasClassName("jg_control")){	
			if(this.cursor_x < 45){                
				control_node.removeClassName('jg_next')
				control_node.addClassName('jg_prev')
			}else if(this.cursor_x >55){                                                          
				control_node.removeClassName('jg_prev')                                             
				control_node.addClassName('jg_next')
			}
			else{                                                                          
				try{
					control_node.removeClassName('jg_next').removeClassName('jg_prev')
							    }
				finally{return false}   
			}
		}                         
	}
});
