var THUMB_WIDTH = 104;
var THUMB_MARGIN = 5;

var CAPTION_OFFSET = 20;
var CAPTION_CHAIN = null;
var CAPTION_CHAIN_FX = null;

var HORIZONTAL_SCROLL_SPEED_THUMBS = 2.5;
var HORIZONTAL_SCROLL_SPEED_CAPTIONS = 23;
var VERTICAL_SCROLL_SPEED = 4.5;

function initGallery(id) {

	// get gallery navigation list
	var gallery_nav = $("gallery_nav" + id);
	
	// get gallery navigation container
	var gallery_nav_container = $("gallery_nav_container" + id);
	
	// init
	gallery_nav.removeClass("noscript");
	
	// get total number of thumbnails
	var thumbnails = $$("ul#gallery_nav" + id + " li").length;
	
	// set gallery navigation width
	gallery_nav.setStyle("width", ((thumbnails * THUMB_WIDTH) + ((thumbnails - 1) * THUMB_MARGIN)) + "px");
	
	// get gallery navigation scrollers
	var scrollers = $$("div#gallery_nav_container" + id + " a.scroll");
	
	// show gallery navigation scrollers
	for (var i = 0; i < scrollers.length; i++)
		scrollers[i].removeClass("hidden");
	
	// show and add click event to gallery navigation scrollers
	for (var i = 0; i < scrollers.length; i++) {
	
		// show
		scrollers[i].removeClass("hidden");
		
		// add events
		scrollers[i].addEvents({
		
			"click": function(ev) {
			
				// handle event
				var event = new Event(ev).stop();
			
			}
			
		});
		
	}
	
	// check width of thumbnail list
	if (gallery_nav.getStyle("width").toInt() > gallery_nav_container.getStyle("width").toInt()) {
	
		// define scrolling effects
		var fxThumbnails = new Fx.Tween(gallery_nav, {
												unit: "px",
												duration: 5000,
												transition: Fx.Transitions.Linear
											});
		
		// add events to gallery navigation scrollers
		for (var i = 0; i < scrollers.length; i++) {
			
			// add events
			scrollers[i].addEvents({
				
				"mouseover": function(ev) {
						
					var gN = gallery_nav;
					var gNC = gallery_nav_container;
					
					// start
					if (this.hasClass("scroll-left")) {
					
						fxThumbnails.setOptions({
							duration: ( ( gN.getStyle("width").toInt() - ( gN.getStyle("left").toInt() + ( gN.getStyle("width").toInt() - gNC.getStyle("width").toInt() ) ) ) * HORIZONTAL_SCROLL_SPEED_THUMBS )
						});
					
						fxThumbnails.start(
							"left",
							gN.getStyle("left"),
							0
						);
						
					} else if (this.hasClass("scroll-right")) {
					
						fxThumbnails.setOptions({
							duration: ( ( gN.getStyle("width").toInt() - ( gN.getStyle("left").toInt() * -1 ) ) * HORIZONTAL_SCROLL_SPEED_THUMBS )
						});
					
						fxThumbnails.start(
							"left",
							gN.getStyle("left"),
							( gN.getStyle("width").toInt() - gNC.getStyle("width").toInt() ) * -1
						);
					
					}
					
				},
				
				"mouseout": function(ev) {
					
					// stop
					fxThumbnails.cancel();
					
				}
			
			});
		
		}
		
	}

}

function galLoadImage(response, ev, id, pic_id) {
	
	if (response != null) {

		if (response.pic_path != null) {
		
			var id = response.page_id;
		
			// get main image container
			var image = $$("div#gallery" + id + " div.inner")[0];
			
			// get caption container
			var caption = $$("div#gallery" + id + " div.caption span")[0];
			
			// define fx objects
			var imageFx = new Fx.Tween(image);
			
			// load large image
			var img = new Asset.image(response.pic_path, {
			
				onload: function() {
				
					// set background-image
					image.setStyle("background-image", "url('" + response.pic_path + "')");
					
					// set caption
					caption.set("text", response.label);
					
					// show
					imageFx.start("opacity", 0, 1);
					
					// scroll caption
					(function() { galInitScrollCaption(id); }).delay(1000);
					
				},
				
				onerror: function() {
					
					// show
					imageFx.start("opacity", 0, 1);
					
				}
				
			});
			
		}
		
	} else {
	
		// handle event
		var event = new Event(ev).stop();
		
		// stop caption scrolling and reset caption position
		if (CAPTION_CHAIN != null) {
			
			// stop scrolling
			CAPTION_CHAIN_FX.cancel();
			
			// clear chain
			CAPTION_CHAIN.clearChain();
			
			// reset caption position
			var caption = $$("div#gallery" + id + " div.caption span")[0];
			caption.setStyle("left", CAPTION_OFFSET + "px");
		
		}
		
		// get main image container
		var image = $$("div#gallery" + id + " div.inner")[0];
		
		// define fx objects
		var imageFx = new Fx.Tween(image);
		
		imageFx.start("opacity", 1, 0).chain(function() {
		
			// json request
			new Request.JSON({
					url: "/modules/h_galleries/actions.php",
					onSuccess: galLoadImage
				}).post({
					"a": "get_pic_path",
					"page_id": id,
					"pic_id": pic_id
				});
				
		});
		
	}

}

function galInitScrollCaption(id) {
	
	// get caption container
	var caption = $$("div#gallery" + id + " div.caption span");
	
	if (caption.length > 0) {
	
		// store caption
		caption = caption[0];
		
		// get caption parent
		var caption_parent = $$("div#gallery" + id + " div.caption")[0];
		
		// calculate if caption needs to be scrolled
		if (caption.getStyle("width").toInt() > (caption_parent.getStyle("width").toInt() - CAPTION_OFFSET)) {
		
			// get params
			var caption_width = caption.getStyle("width").toInt();
			var caption_left = caption.getStyle("left").toInt();
			
			var caption_parent_width = caption_parent.getStyle("width").toInt();
									
			// build params array
			var params = new Object();
			params.caption = caption;
			params.caption_width = caption_width;
			params.caption_left = caption_left;
			params.caption_parent_width = caption_parent_width;
			
			// scroll
			galScrollCaption(params);
		
		}
	
	}

}

function galScrollCaption(params) {

	// define additional params
	var caption_left = params.caption.getStyle("left").toInt();
	
	// create chain object
	CAPTION_CHAIN = new Chain();
	
	// define effects
	var duration = 0;
	if ((caption_left - CAPTION_OFFSET) > 0)
		duration = (params.caption_parent_width + params.caption_width + CAPTION_OFFSET) * HORIZONTAL_SCROLL_SPEED_CAPTIONS;
	else
		duration = (params.caption_width + CAPTION_OFFSET) * HORIZONTAL_SCROLL_SPEED_CAPTIONS;
	
	if (duration < 0)
		duration = duration * -1;
	
	CAPTION_CHAIN_FX = new Fx.Tween(params.caption, {
								unit: "px",
								transition: Fx.Transitions.linear,
								duration: duration,
								onComplete: function() { CAPTION_CHAIN.callChain(); }
							});

	CAPTION_CHAIN.chain(
		function() {
			var destination = 0;
			if ((caption_left - CAPTION_OFFSET) > 0)
				destination = caption_left - (params.caption_parent_width + params.caption_width);
			else
				destination = caption_left - (params.caption_width + CAPTION_OFFSET);
			
			CAPTION_CHAIN_FX.start(
				"left",
				caption_left,
				destination
			);
		},
		function() {
			CAPTION_CHAIN_FX.set(
				"left",
				params.caption.getStyle("left").toInt() + params.caption_width + params.caption_parent_width
			);
			this.callChain();
		},
		function() {
			galScrollCaption(params);
			this.callChain();
		}
	);
	
	CAPTION_CHAIN.callChain();

}

function initMHGalleryList() {

	// get gallery list
	var gallery_list = $$("div.mh-galleries ul");
	
	if (gallery_list != null)
		gallery_list = gallery_list[0];
		
	// get gallery list container
	var gallery_list_container = $$("div.mh-galleries div.inner");
	
	if (gallery_list_container != null)
		gallery_list_container = gallery_list_container[0];
		
	// init
	gallery_list_container.addClass("inner-height");
	
	// get gallery list navigation scrollers
	var scrollers = $$("div.mh-galleries div.scroller a");
	
	// add click event to gallery list navigation scrollers
	for (var i = 0; i < scrollers.length; i++) {
	
		// add events
		scrollers[i].addEvents({
		
			"click": function(ev) {
			
				// handle event
				var event = new Event(ev).stop();
			
			}
			
		});
	
	}
	
	// get gallery list height
	var gallery_list_height = gallery_list.getStyle("height").toInt();
	
	// get gallery list container height
	var gallery_list_container_height = gallery_list_container.getStyle("height").toInt();
	
	// check height of gallery list
	if (gallery_list_height > gallery_list_container_height) {
		
		// define scrolling effects
		var fxGalleries = new Fx.Tween(gallery_list, {
												unit: "px",
												duration: 5000
											});
		
		// add events to gallery navigation scrollers
		for (var i = 0; i < scrollers.length; i++) {
			
			// add events
			scrollers[i].addEvents({
				
				"mouseover": function(ev) {
						
					var gL = gallery_list;
					var gLC = gallery_list_container;
					
					// start
					if (this.hasClass("scroll-up")) {
					
						fxGalleries.setOptions({
							duration: ( ( gL.getStyle("height").toInt() - ( gL.getStyle("top").toInt() + ( gL.getStyle("height").toInt() - gLC.getStyle("height").toInt() ) ) ) * VERTICAL_SCROLL_SPEED )
						});
					
						fxGalleries.start(
							"top",
							gL.getStyle("top"),
							0
						);
						
					} else if (this.hasClass("scroll-down")) {
					
						fxGalleries.setOptions({
							duration: ( ( gL.getStyle("height").toInt() - ( gL.getStyle("top").toInt() * -1 ) ) * VERTICAL_SCROLL_SPEED )
						});
					
						fxGalleries.start(
							"top",
							gL.getStyle("top"),
							( gL.getStyle("height").toInt() - gLC.getStyle("height").toInt() ) * -1
						);
					
					}
					
				},
				
				"mouseout": function(ev) {
					
					// stop
					fxGalleries.cancel();
					
				}
			
			});
		
		}
	
	}

}

windowDomReady[windowDomReady.length] = function() {

	// calendar
	if ($$("div.mh-galleries ul").length > 0)
		initMHGalleryList();
	
};