/*
    This file is part of JonDesign's SmoothGallery v1.0.1.

    JonDesign's SmoothGallery is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    JonDesign's SmoothGallery is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with JonDesign's SmoothGallery; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

    Main Developer: Jonathan Schemoul (JonDesign: http://www.jondesign.net/)
    Contributed code by:
    - Christian Ehret (bugfix)
	- Nitrix (bugfix)
	- Valerio from Mad4Milk for his great help with the carousel scrolling and many other things.
	- Archie Cowan for helping me find a bugfix on carousel inner width problem.
	Many thanks to:
	- The mootools team for the great mootools lib, and it's help and support throughout the project.
*/


var $removeEvents = function (object, type)
{
	if (!object.events) return object;
	if (type){
		if (!object.events[type]) return object;
		for (var fn in object.events[type]) object.removeEvent(type, fn);
		object.events[type] = null;
	} else {
		for (var evType in object.events) object.removeEvents(evType);
		object.events = null;
	}
	return object;
};
		
		
// declaring the class
var gallery = new Class({
	initialize: function(element, options) {
		this.setOptions({
			showArrows: false,
			showCarousel: true,
			showInfopane: true,
			thumbHeight: 275,
			thumbWidth: 227,
			thumbSpacing: 0,
			embedLinks: true,
			fadeDuration: 500,
			timed: true,
			delay: 100,
                        borderWidth: 1,
			nummer:0,
			preloader: true,
			onOver:false,
			manualData: [],
			populateData: true,
			galleryElementOffsetLeft: 340,
			galleryElementOffsetTop: 240,
			elementSelector: "div.imageElement",
			titleSelector: "h3",
			subtitleSelector: "p",
			linkSelector: "a.open",
			linkageSelector: "a.slideshow",
			imageSelector: "img.full",
			thumbnailSelector: "img.thumbnail",
			imageWidthSelector: "span.imageWidth",
			toolTipWidth: 200,
			slideInfoZoneOpacity: 1.0,
			carouselMinimizedOpacity: 1.0,
			carouselMinimizedHeight: 20,
			carouselMaximizedOpacity: 1.0, 
			destroyAfterPopulate: true,
			baseClass: 'jdGallery',
			withArrowsClass: 'withArrows',
			textShowCarousel: 'Pictures',
			useThumbGenerator: false,
			thumbGenerator: 'resizer.php'
		}, options);
		this.fireEvent('onInit');
		this.currentIter = 0;
		this.lastIter = 0;
		this.maxIter = 0;
		this.galleryElement = element;
		this.galleryData = this.options.manualData;
		this.galleryInit = 1;
		this.galleryElements = Array();
		this.thumbnailElements = Array();
		this.galleryElement.addClass(this.options.baseClass);
		if (this.options.populateData)
			this.populateData();
		element.style.display="block";
		
		if (this.options.embedLinks)
		{
			this.currentLink = new Element('a').addClass('open').setProperties({
				href: '#',
				title: ''
			}).injectInside(element);
			if ((!this.options.showArrows) && (!this.options.showCarousel))
				this.galleryElement = element = this.currentLink;
			else
				this.currentLink.setStyle('display', 'none');
		}
		
		this.constructElements();
		if ((data.length>1)&&(this.options.showArrows))
		{
			var leftArrow = new Element('a').addClass('left').addEvent(
				'click',
				this.prevItem.bind(this)
			).injectInside(element);
			var rightArrow = new Element('a').addClass('right').addEvent(
				'click',
				this.nextItem.bind(this)
			).injectInside(element);
			this.galleryElement.addClass(this.options.withArrowsClass);
		}
		this.loadingElement = new Element('div').addClass('loadingElement').injectInside(element);
		if (this.options.showInfopane) this.initInfoSlideshow();
		if (this.options.showCarousel) this.initCarousel();
		//this.doSlideShow(1);
	},
	populateData: function() {
		currentArrayPlace = this.galleryData.length;
		options = this.options;
		data = this.galleryData;
		this.galleryElement.getElements(options.elementSelector).each(function(el) {
			elementDict = {
				image: el.getElement(options.imageSelector).getProperty('src'),
				number: currentArrayPlace
			};
			if ((options.showInfopane) | (options.showCarousel))
				Object.extend(elementDict, {
					title: el.getElement(options.titleSelector).innerHTML,
					description: el.getElement(options.subtitleSelector).innerHTML,
					imageWidth: el.getElement(options.imageWidthSelector).innerHTML
				});
			if (options.embedLinks)
				Object.extend(elementDict, {
					link: el.getElement(options.linkSelector).href||false,
					linkage: el.getElement(options.linkageSelector).href,
					linkTitle: el.getElement(options.linkSelector).title||false
				});
			if ((!options.useThumbGenerator) && (options.showCarousel))
				Object.extend(elementDict, {
					thumbnail: el.getElement(options.thumbnailSelector).src
				});
			else if (options.useThumbGenerator)
				Object.extend(elementDict, {
					thumbnail: 'resizer.php?imgfile=' + elementDict.image + '&max_width=' + options.thumbWidth + '&max_height=' + options.thumbHeight
				});
			
			data[currentArrayPlace] = elementDict;
			currentArrayPlace++;
			if (this.options.destroyAfterPopulate)
				el.remove();
		});
		this.galleryData = data;
		this.fireEvent('onPopulated');
	},
	constructElements: function() {
		el = this.galleryElement;
    this.maxWidth = 0;		
		this.maxIter = this.galleryData.length;				
		var currentImg;
                for(i=0;i<this.galleryData.length;i++)
		{
		 this.maxWidth += 1 * (this.galleryData[i].imageWidth);
                 this.maxWidth += 1 * (this.options.borderWidth);
		}
		var currentImg;
		for(i=0;i<this.galleryData.length;i++)
		{
			var currentImg = new Fx.Style(
				new Element('div').addClass('slideElement').setStyles({
					'position':'absolute',
					'left':'0px',
					'right':'0px',
					'margin':'0px',
					'padding':'0px',
					'backgroundImage':"url('" + this.galleryData[i].image + "')",
					'backgroundPosition':"center center",
					'opacity':'0'
				}).injectInside(el),
				'opacity',
				{duration: this.options.fadeDuration}
			);
			this.galleryElements[parseInt(i)] = currentImg;
		}
	},
	destroySlideShow: function(element) {
		var myClassName = element.className;
		var newElement = new Element('div').addClass('myClassName');
		element.parentNode.replaceChild(newElement, element);
	},
	startSlideShow: function() {
		this.fireEvent('onStart');
		this.loadingElement.style.display = "none";
		this.lastIter = this.maxIter - 1;
		this.currentIter = 0;
		this.galleryInit = 0;
		this.galleryElements[parseInt(this.currentIter)].set(1);
		if (this.options.showInfopane)
		this.showInfoSlideShow.delay(1000, this);
				
		if (this.options.embedLinks)
			this.makeLink(this.currentIter);
	},
	
		//die aktuelle Mausposition abfragen
  mouseNow: function() {  
  var lefter = this.galleryElement.offsetLeft;
  var topper = this.galleryElement.offsetTop;                       
  var theHalfX = screen.width/2;
 // var theHalfY = screen.height/2;
  var theHalfY = 260;
  this.carouselWrapper.onmousemove = function(event) {    
  event = new Event(event);    
  if (event.page.x < theHalfX) {
  mousex = event.page.x - lefter;    
    } else if (event.page.x > theHalfX) {
  mousex = event.page.x - (lefter+200);    
    }         
  if (event.page.y < theHalfY) {
  mousey = event.page.y - topper;  
  } else if(event.page.y > theHalfY) {
  mousey = event.page.y - (topper+150);  
    }      
   }    
  },  
    
  getActProp: function() {
  if (document.getElementById("mainContentWrapper")) {
  var lefter = document.getElementById("mainContentWrapper").style.offsetLeft;  
  }
  
  var topper = this.galleryElement.offsetTop-60;
  
  },  
    
	goToLink: function(theLink) {	
	window.location.href=theLink;
  },
  
	goTo: function(num) {								
			this.goSlideShowOn.delay(1, this, this.currentIter);				
	},
	
	clearTimer: function() {		
			$clear(this.timer);
	},
	prepareTimer: function() {	   
		if (this.options.timed)		
			this.timer = this.goTo.periodical(this.options.delay, this);
	},
	
	initCarousel: function () {	  
		var carouselContainerElement = new Element('div').addClass('carouselContainer').injectInside(this.galleryElement);
		this.carouselContainer = new Fx.Styles(carouselContainerElement, {transition: Fx.Transitions.expoOut});
		this.carouselContainer.normalHeight = carouselContainerElement.offsetHeight;
	
		
    //initialisierung der scrollable Area
		this.carouselContainer.clearTimer();
	  this.toggleCarousel();
		this.carouselActive = true;

		var carouselElement = new Element('div').addClass('carousel').injectInside(carouselContainerElement);
		this.carousel = new Fx.Styles(carouselElement);
		
		this.carouselLabel = new Element('p').addClass('label').injectInside(this.carousel.element);
		this.carouselWrapper = new Element('div').addClass('carouselWrapper').injectInside(this.carousel.element);
		this.carouselInner = new Element('div').addClass('carouselInner').injectInside(this.carouselWrapper);

		this.carouselWrapper.scroller = new Scroller(this.carouselWrapper, {
			area: 200,
			velocity: 0.2
		})
		
		this.carouselWrapper.elementScroller = new Fx.Scroll(this.carouselWrapper, {
			duration: 400,
			onStart: this.carouselWrapper.scroller.stop.bind(this.carouselWrapper.scroller),
			onComplete: this.carouselWrapper.scroller.start.bind(this.carouselWrapper.scroller)
		});

		this.constructThumbnails();

		this.carouselInner.style.width = this.maxWidth+ "px";
    this.mouseNow();
    this.prepareTimer();
		//alert (this.maxIter);
	},
	toggleCarousel: function() {
		if (this.carouselActive)
			this.hideCarousel();
		else
			this.showCarousel();
	},
	showCarousel: function () {
		this.fireEvent('onShowCarousel');
		this.carouselContainer.custom({
			'opacity': this.options.carouselMaximizedOpacity,
			'top': 0
		}).addEvent('onComplete', function() { this.carouselActive = true; this.carouselWrapper.scroller.start(); }.bind(this));
	},
	hideCarousel: function () {
		this.fireEvent('onHideCarousel');
		this.carouselContainer.custom({
			'opacity': this.options.carouselMinimizedOpacity,
			'top': (this.options.carouselMinimizedHeight - this.carouselContainer.normalHeight)
		}).addEvent('onComplete', function() { this.carouselActive = false; this.carouselWrapper.scroller.stop(); }.bind(this));
	},
	constructThumbnails: function () {
		element = this.carouselInner;
		for(i=0;i<this.galleryData.length;i++)
		{
			var currentImg = new Fx.Style(new Element ('div').addClass("thumbnail").setStyles({
					backgroundImage: "url('" + this.galleryData[i].thumbnail + "')",
					backgroundPosition: "center center",
					backgroundRepeat: 'no-repeat',
					marginLeft: this.options.thumbSpacing + "px",
					width: this.galleryData[i].imageWidth + "px",
					height: this.options.thumbHeight + "px"
				}).injectInside(element), "opacity", {duration: 200}).set(1.0);
			currentImg.linkTemp = this.galleryData[i].linkage;
      currentImg.number = i;	
			currentImg.element.addEvents({
				'mouseover': function (myself) {				  
					//myself.clearTimer();
					$clear(this.timer);
					myself.custom(1.0);
					this.getActProp();
          this.currentIter = myself.number;
          this.options.onOver = false;					
					this.showInfoSlideShow.delay(10, this);
				}.pass(currentImg, this),
				'mouseout': function (myself) {
					myself.clearTimer();
					myself.custom(1.0);
					this.hideInfoSlideShow.delay(10, this);
				}.pass(currentImg, this),
				'click': function (myself) {
					this.goToLink(myself.linkTemp);
				}.pass(currentImg, this)
			});
			
			currentImg.relatedImage = this.galleryData[i];
			this.thumbnailElements[parseInt(i)] = currentImg;
		}
	},
	clearThumbnailsHighlights: function()
	{
		for(i=0;i<this.galleryData.length;i++)
		{
			this.thumbnailElements[i].clearTimer();
			this.thumbnailElements[i].custom(0.2);
		}
	},
	centerCarouselOn: function(num) {
		//position bleibt die aktuelle des Sliders				
		//var scrollPos = this.carouselWrapper.elementScroller.element.offsetLeft;		
		//this.carouselWrapper.elementScroller.scrollTo(scrollPos,0);
	},
	
	goSlideShowOn: function(num) {		
	this.options.nummer = this.options.nummer+1;
  this.carouselWrapper.elementScroller.scrollTo(this.options.nummer ,0);
  //theTimer = this.prepareTimer.periodical(100);   
  },
  
  initInfoSlideshow: function() {	  		
		this.slideInfoZone = new Fx.Styles(new Element('div').addClass('slideInfoZone').injectInside($(this.galleryElement))).set({'opacity':0});
		var slideInfoZoneTitle = new Element('h2').injectInside(this.slideInfoZone.element);		
		this.slideInfoZone.normalHeight = this.slideInfoZone.element.offsetHeight;
		this.slideInfoZone.element.setStyle('opacity',0);
	},	
	
	showInfoSlideShow: function() { 	
		this.fireEvent('onShowInfopane');    		
		this.slideInfoZone.clearTimer();		
		element = this.slideInfoZone.element;		
		//leftPosOfSlider = this.carouselWrapper.scroller.element.offsetLeft;
		element.getElement('h2').setHTML(this.galleryData[this.currentIter].title);
    leftPosTitle = mousex;
    
    element.getElement('h2').setHTML(this.galleryData[this.currentIter].title);      		
		this.slideInfoZone.custom({'opacity': [0, this.options.slideInfoZoneOpacity], 'width': [0, this.options.toolTipWidth],'top': [mousey, mousey], 'left': [mousex, mousex]});		
		//this.slideInfoZone.custom({'opacity': [0, this.options.slideInfoZoneOpacity], 'width': [0, this.options.toolTipWidth], 'top': 70});
		if (this.options.showCarousel)
			this.slideInfoZone.chain(this.centerCarouselOn.pass(this));
		return this.slideInfoZone;
	},
	
	hideInfoSlideShow: function() {
		this.fireEvent('onHideInfopane');
		this.slideInfoZone.clearTimer();
		this.slideInfoZone.custom({'opacity': 0, 'width': 0, 'top':mousey, 'left':mousex});
		return this.slideInfoZone;
	},
	
	makeLink: function(num) {
		this.currentLink.setProperties({
			href: this.galleryData[num].link,
			title: this.galleryData[num].linkTitle
		})
		if (!((this.options.embedLinks) && (!this.options.showArrows) && (!this.options.showCarousel)))
			this.currentLink.setStyle('display', 'block');
	},
	clearLink: function() {
		this.currentLink.setProperties({href: '', title: ''});
		if (!((this.options.embedLinks) && (!this.options.showArrows) && (!this.options.showCarousel)))
			this.currentLink.setStyle('display', 'none');
	}
});
gallery.implement(new Events);
gallery.implement(new Options);

/* All code copyright 2006 Jonathan Schemoul */

