/**
 * Image Gallery module
 * @constructor
 * @author   Sperg Ádám
 * @version  2.05
 */
function ImageGallery() {

	/**
	 * Pointer to this
	 * @type  ImageGallery
	 */
	var self = this;
	
	/**
	 * Is Internet Fucking Explorer
	 * @type  Boolean
	 */
	var ie = (navigator.userAgent.indexOf('MSIE') != -1 && navigator.userAgent.indexOf('Windows') != -1) ? true : false;
	
	/**
	 * Image gallery base setting
	 * @type  Object
	 */
	var setting = {need: true, relname: 'imagegallery', basename: 'base', pagepadding: 10, imagedir: '/Portals/_default/Skins/Agrarkamara/images/imagegallery/'};
	
	/**
	 * Image gallery objects
	 * @type  Object
	 */
	var object = {background: null, frame: null, table: null, content: null, image: null, title: null, previousin: null, nextin: null, navigate: null, previous: null, info: null, next: null, exit: null};
	
	/**
	 * Image informations
	 * @type  Object
	 */
	var image = {current: 0, fade: false, opacity: 0, opacitymax: 10};
	
	/**
	 * Gallery informations
	 * @type  Object
	 */
	var gallery = {array: new Array(), current: '', running: false};
	
	/**
	 * Background informations
	 * @type  Object
	 */
	var background = {fade: false, opacity: 0, opacitymax: 8};
	
	/**
	 * Frame informations
	 * @type  Object
	 */
	var frame = {basewh: 300, position: false, inposition: false, dealermin: 10, dealermax: 20, dealerpx: 20, dealer: 15, counter: 0, fade: false, opacity: 0, opacitymax: 10, width: 0, height: 0, left: 0, top: 0, targetwidth: 0, targetheight: 0, targetleft: 0, targettop: 0, distancewidth: 0, distanceheight: 0, distanceleft: 0, distancetop: 0};
	
	/**
	 * Table informations
	 * @type  Object
	 */
	var table = {bordersize: 10};
	
	/**
	 * Title informations
	 * @type  Object
	 */
	var title = {height: 25, padding: 5, fade: false, opacity: 0, opacitymax: 10, have: false};
	
	/**
	 * Navigate informations
	 * @type  Object
	 */
	var navigate = {height: 26, fade: false, opacity: 0, opacitymax: 10};
		
	/**
	 * Page and window size
	 * @type  Object
	 */
	var pageSize = {pageWidth: 0, pageHeight: 0, windowWidth: 0, windowHeight: 0};
	
	/*** REL ***/
	
	/**
	 * Call when have ajax loaded images
	 */
	this.relGet = function() {
		relGet();
	}
	
	/**
	 * Get all "a" with specified "rel"
	 * Set onclick events
	 */
	function relGet() {
		var aElements = document.getElementsByTagName('a');
		var to = 0;
		for(i = 0, to = aElements.length; i < to; i++) {
			if(aElements[i].rel && aElements[i].rel.substring(0, setting.relname.length) == setting.relname && aElements[i].href) {
				addEvent(aElements[i], 'click', imageClick, true);
			}
		}
	}
	
	/*** IMAGE ***/
	
	/**
	 * Manage image galley on click event
	 */
	function imageClick() {
		var caller = this;
		if(!caller) {
			return true;
		}
		if(!object.frame) {
			backgroundCreate();
			imageCreate();
			navigateCreate();
			titleCreate();
			frameCreate();
		}
		if(!object.background || !object.frame ||!object.title || !object.navigate) {
			return true;
		} else {
			getPageSize();
			backgroundShow();
			frameShow();
		}
		window.onresize = function() {
			getPageSize();
			object.background.style.width = pageSize.pageWidth + 'px';
			object.background.style.height = pageSize.pageHeight + 'px';
		}
		var imageRel = caller.rel.split('|');
		gallery.current = imageRel.length > 1 ? imageRel[1] : setting.basename;
		if(!gallery.array[gallery.current]) {
			galleryGet(caller.href);
		} else {
			var to = 0;
			for(var i = 1, to = gallery.array[gallery.current].length; i <= to; i++) {
				if(gallery.array[gallery.current][i].src == caller.href) {
					image.current = i;
					break;
				}
			}
		}
		if(!gallery.array[gallery.current] || !image.current || image.current == 0) {
			return true;
		}
		if(gallery.array[gallery.current][image.current].image == null) {
			imageGet();
		}
		gallery.running = true;
		self.show();
		return false;
	}
	
	/**
	 * Create image object
	 */
	function imageCreate() {
		object.image = document.createElement('IMG');
		setClassName(object.image, 'imageGalleryImage');
		object.image.setAttribute('border', '0');
	}
	
	/**
	 * Show image gallery
	 */
	this.show = function() {
		if(!gallery.running) {
			return;
		}
		if(frame.fade || image.fade || title.fade || navigate.fade) {
			var repeat = setTimeout('imagegallery.show()', 300);
			return;
		}
		var currentImg = gallery.array[gallery.current][image.current];
		if(!currentImg.image.complete) {
			var repeat = setTimeout('imagegallery.show()', 1000);
			return;
		}
		var imageSize = imageSetSize();
		if(!frame.inposition) {
			if(!frame.position) {
				frame.position = true;
				frame.targetwidth = Math.max(frame.basewh, Math.round(imageSize.width + (2 * table.bordersize)));
				frame.targetheight = Math.max(frame.basewh, Math.round(imageSize.height + (currentImg.title != '' ? title.height : 0) + navigate.height + (2 * table.bordersize)));
				frame.targetleft = Math.round((pageSize.windowWidth / 2) - (frame.targetwidth / 2) + getScrollXY().scrollX);
				frame.targettop = Math.round((pageSize.windowHeight / 2) - (frame.targetheight / 2) + getScrollXY().scrollY);
				var difference = Math.round(Math.max(Math.round(Math.abs(frame.width - frame.targetwidth)), Math.round(Math.abs(frame.height - frame.targetheight))) / frame.dealerpx);
				frame.dealer = difference < frame.dealermin ? frame.dealermin : difference > frame.dealermax ? frame.dealermax : difference;
				var posVar = ['width', 'height', 'left', 'top'];
				var to = 0;
				for(var i = 0, to = posVar.length; i < to; i++) {
					frame['distance' + posVar[i]] = Math.round((Math.abs(frame[posVar[i]] - frame['target' + posVar[i]]) / frame.dealer));
				}
				self.frameMoveToPosition();
			}
			var repeat = setTimeout('imagegallery.show()', 300);
			return;			
		}
		titleShow();
		imageShow(imageSize.width, imageSize.height);
		navigateShow();
	}
	
	/**
	 * Show previous image
	 */
	this.showPrevious = function() {
		if(!gallery.running) {
			return;
		}
		if(frame.fade || frame.position || image.fade) {
			return;
		}
		titleHide();
		navigateHide();
		imageHide();
		frame.inposition = false;
		frame.position = false;
		var imgInGallery = gallery.array[gallery.current].length - 1;
		image.current = image.current != 1 ? image.current - 1 : imgInGallery;
		if(gallery.array[gallery.current][image.current].image == null) {
			imageGet();
		}
		self.show();
	}
	
	/**
	 * Show next image
	 */
	this.showNext = function() {
		if(!gallery.running) {
			return;
		}
		if(frame.fade || frame.position || image.fade) {
			return;
		}
		titleHide();
		navigateHide();
		imageHide();
		frame.inposition = false;
		frame.position = false;
		var imgInGallery = gallery.array[gallery.current].length - 1;
		image.current = imgInGallery > image.current ? image.current + 1 : 1;
		if(gallery.array[gallery.current][image.current].image == null) {
			imageGet();
		}
		self.show();
	}
	
	/**
	 * Show image
	 * @param  Integer  pWidth   Image width
	 * @param  Integer  pHeight  Image height
	 */
	function imageShow(pWidth, pHeight) {
		object.image.setAttribute('src', gallery.array[gallery.current][image.current].image.src);
		object.image.style.width = pWidth + 'px';
		object.image.style.height = pHeight + 'px';
		object.image.style.display = 'block';
		image.fade = true;
		self.imageFadeIn();
	}
	
	/**
	 * Create current image
	 * Set gallery current image
	 */
	function imageGet() {
		var newImage = new Image();
		newImage.src = gallery.array[gallery.current][image.current].src;
		gallery.array[gallery.current][image.current].image = newImage;
	}
	
	/**
	 * Set image size 
	 * @return  Array  images width and height
	 */
	function imageSetSize() {
		var currentImg = gallery.array[gallery.current][image.current];
		var imageWidth = currentImg.image.width;
		var imageHeight = currentImg.image.height;
		var maxWidth = pageSize.windowWidth - (2 * table.bordersize) - (2 * setting.pagepadding);
		var maxHeight = pageSize.windowHeight - (currentImg.title != '' ? title.height : 0) - navigate.height - (2 * table.bordersize) - (2 * setting.pagepadding);
		if(imageWidth > maxWidth) {
			var aspectRatio = maxWidth / imageWidth;
			imageWidth = maxWidth;
			imageHeight = imageHeight * aspectRatio;
		}
		if(imageHeight > maxHeight) {
			var aspectRatio = maxHeight / imageHeight;
			imageHeight = maxHeight;
			imageWidth = imageWidth * aspectRatio;
		}
		return {width: Math.round(imageWidth), height: Math.round(imageHeight)};
	}
	
	/**
	 * Hide image
	 */
	function imageHide() {
		image.fade = true;
		self.imageFadeOut();
	}
	
	/**
	 * Fade in image
	 * Repeat as needed
	 */
	this.imageFadeIn = function() {
		if(image.opacity == image.opacitymax) {
			image.fade = false;
			imagePreload();
			return;
		}
		image.opacity = image.opacity + 2;
		setObjectOpacity(object.image, image.opacity);
		var repeat = setTimeout('imagegallery.imageFadeIn()', 25);
		return;
	}
	
	/**
	 * Preload next and previous images
	 */
	function imagePreload() {
		var imgInGallery = gallery.array[gallery.current].length - 1;
		var nextImage = gallery.array[gallery.current][image.current + 1];
		if(imgInGallery > image.current && nextImage.image == null) {
			var nextImagePreload = new Image();
			nextImagePreload.src = nextImage.src;
			gallery.array[gallery.current][image.current + 1].image = nextImagePreload;
		}
		var previousImage = gallery.array[gallery.current][image.current - 1];
		if(image.current != 1 && previousImage.image == null) {
			var previousImagePreload = new Image();
			previousImagePreload.src = previousImage.src;
			gallery.array[gallery.current][image.current - 1].image = previousImagePreload;
		}
	}
	
	/**
	 * Fade out image
	 * Repeat as needed
	 */
	this.imageFadeOut = function() {
		if(image.opacity == 0) {
			object.image.style.display = 'none';
			image.fade = false;
			return;
		}
		image.opacity = image.opacity - 2;
		setObjectOpacity(object.image, image.opacity);
		var repeat = setTimeout('imagegallery.imageFadeOut()', 25);
		return;
	}
	
	/*** GALLERY ***/
	
	/**
	 * Get gallery
	 * Set current image
	 */
	function galleryGet(pCurrentHref) {
		gallery.array[gallery.current] = new Array();
		var aElements = document.getElementsByTagName('a');
		var counter = 0;
		var to = 0;
		for(i = 0, to = aElements.length; i < to; i++) {
			if(aElements[i].rel && aElements[i].rel.substring(0, setting.relname.length) == setting.relname && aElements[i].rel.substring(setting.relname.length + 1, aElements[i].rel.length) == gallery.current && aElements[i].href) {
				counter++;
				gallery.array[gallery.current][counter] = {src: aElements[i].href, title: aElements[i].title, image: null};
				if(aElements[i].href == pCurrentHref) {
					image.current = counter;
				}
			}
		}
	}
	
	/**
	 * Hide image gallery
	 */
	function hide() {
		titleHide();
		navigateHide();
		imageHide();
		frameHide();
		backgroundHide();
		frame.inposition = false;
		gallery.running = false;
	}
	
	/*** BACKGROUND ***/
	
	/**
	 * Create gallery background div
	 */
	function backgroundCreate() {
		object.background = document.createElement('DIV');
		setClassName(object.background, 'imageGalleryBackground');
		document.body.appendChild(object.background);
	}
	
	/**
	 * Show background div
	 */
	function backgroundShow() {
		object.background.style.display = 'none';
		object.background.style.width = pageSize.pageWidth + 'px';
		object.background.style.height = pageSize.pageHeight + 'px';
		object.background.style.display = 'block';
		if(background.opacity != background.opacitymax) {
			background.fade = true;
			self.backgroundFadeIn();
		}
	}
	
	/**
	 * Hide background div
	 */
	function backgroundHide() {
		background.fade = true;
		self.backgroundFadeOut();
	}
	
	/**
	 * Fade in background div
	 * Repeat as needed
	 */
	this.backgroundFadeIn = function() {
		if(background.opacity == background.opacitymax) {
			addEvent(object.background, 'click', hide);
			background.fade = false;
			return;
		}
		background.opacity = background.opacity + 2;
		setObjectOpacity(object.background, background.opacity);
		var repeat = setTimeout('imagegallery.backgroundFadeIn()', 25);
		return;
	}
	
	/**
	 * Fade out background div
	 * Repeat as needed
	 */
	this.backgroundFadeOut = function() {
		if(background.opacity == 0) {
			removeEvent(object.background, 'click', hide);
			object.background.style.display = 'none';
			background.fade = false;
			return;
		}
		background.opacity = background.opacity - 2;
		setObjectOpacity(object.background, background.opacity);
		var repeat = setTimeout('imagegallery.backgroundFadeOut()', 25);
		return;
	}
	
	/*** FRAME / TALBE ***/
	
	/**
	 * Create gallery frame div
	 */
	function frameCreate() {
		object.frame = document.createElement('DIV');
		setClassName(object.frame, 'imageGalleryFrame');
		var classId = [
					   ['TopLeft', 'TopCenter', 'TopRight'], 
					   ['MiddleLeft', '', 'MiddleRight'], 
					   ['NavigateLeft', '', 'NavigateRight'], 
					   ['BottomLeft', 'BottomCenter', 'BottomRight']
					   ];
		object.table = document.createElement('TABLE');
		setClassName(object.table, 'imageGalleryTable');
		object.table.setAttribute('border', '0');
		object.table.setAttribute('cellpadding', '0');
		object.table.setAttribute('cellspacing', '0');
		var tbody = document.createElement('TBODY');
		var nbsp = '&nbsp;';
		for(var i = 0; i < 4; i++) {
			var row = document.createElement('TR');
			for(var j = 0; j < 3; j++) {
				var cell = document.createElement('TD');
				if(classId[i][j] != '') {
					setClassName(cell, 'imageGalleryTable' + classId[i][j]);
					cell.innerHTML = nbsp;
				} else {
					if(i == 1) {
						setClassName(cell, 'imageGalleryIn');
						cell.appendChild(object.image);
						cell.appendChild(object.previousin);
						cell.appendChild(object.nextin);
						object.content = cell;
					} else if(i == 2){
						setClassName(cell, 'imageGalleryNavigationCenter');
						cell.appendChild(object.title);
						cell.appendChild(object.navigate);
					}
				}
				row.appendChild(cell);
			}
			tbody.appendChild(row);
		}
		object.table.appendChild(tbody);
		object.frame.appendChild(object.table);
		document.body.appendChild(object.frame);
	}
	
	/**
	 * Show frame div
	 */
	function frameShow() {
		object.frame.style.display = 'none';
		if(frame.width == 0 || frame.height == 0) {
			frame.width = frame.basewh;
			object.frame.style.width = frame.width + 'px';
			frame.height = frame.basewh + navigate.height;
			object.frame.style.height = frame.height + 'px';
			object.table.style.width = frame.width + 'px';
			object.table.style.height = frame.height + 'px';
			object.content.style.width = frame.width - (2 * table.bordersize) + 'px';
			object.content.style.height = frame.height - (2 * table.bordersize) + 'px';
			var posLeft = Math.round((pageSize.windowWidth / 2) - (frame.width / 2) + getScrollXY().scrollX);
			posLeft = posLeft < 0 ? 0 : posLeft;
			var posTop = Math.round((pageSize.windowHeight / 2) - (frame.height / 2) + getScrollXY().scrollY);
			posTop = posTop < 0 ? 0 : posTop;
			object.frame.style.left = posLeft + 'px';
			frame.left = posLeft;
			object.frame.style.top = posTop + 'px';
			frame.top = posTop;
		}
		object.frame.style.display = 'block';
		if(frame.opacity != frame.opacitymax) {
			frame.fade = true;
			self.frameFadeIn();
		}
	}
	
	/**
	 * Hide frame div
	 */
	function frameHide() {
		frame.fade = true;
		self.frameFadeOut();
	}
	
	/**
	 * Fade in frame div
	 * Repeat as needed
	 */
	this.frameFadeIn = function() {
		if(frame.opacity == frame.opacitymax) {
			frame.fade = false;
			return;
		}
		frame.opacity = frame.opacity + 2;
		setObjectOpacity(object.frame, frame.opacity);
		var repeat = setTimeout('imagegallery.frameFadeIn()', 25);
		return;
	}
	
	/**
	 * Fade out frame div
	 * Repeat as needed
	 */
	this.frameFadeOut = function() {
		if(frame.opacity == 0) {
			object.frame.style.display = 'none';
			frame.fade = false;
			return;
		}
		frame.opacity = frame.opacity - 2;
		setObjectOpacity(object.frame, frame.opacity);
		var repeat = setTimeout('imagegallery.frameFadeOut()', 25);
		return;
	}
	
	/**
	 * Move frame to target position
	 */
	this.frameMoveToPosition = function() {
		if(!frame.position) {
			return;
		}
		frame.counter++;
		var posVar = ['width', 'height', 'left', 'top'];
		var to = 0;
		for(var i = 0, to = posVar.length; i < to; i++) {
			if(frame.counter == frame.dealer) {
				frame[posVar[i]] = frame['target' + posVar[i]];
			} else {
				frame[posVar[i]] = frame[posVar[i]] < frame['target' + posVar[i]] ? (frame[posVar[i]] + frame['distance' + posVar[i]]) : (frame[posVar[i]] - frame['distance' + posVar[i]]);
			}
			object.frame.style[posVar[i]] = frame[posVar[i]] + 'px';
			if(i < 2) {
				object.table.style[posVar[i]] = frame[posVar[i]] + 'px';
			}
		}
		var currentImg = gallery.array[gallery.current][image.current];
		object.content.style.width = frame.width - (2 * table.bordersize) + 'px';
		object.content.style.height = frame.height - (currentImg.title != '' ? title.height : 0) - navigate.height  - (2 * table.bordersize) + 'px';
		object.previousin.style.width = ((frame.width - (2 * table.bordersize)) / 2) - 10 + 'px';
		object.nextin.style.width = ((frame.width - (2 * table.bordersize)) / 2) - 10 + 'px';
		object.previousin.style.height = object.content.style.height;
		object.nextin.style.height = object.content.style.height;
		object.title.style.width = frame.width - (2 * table.bordersize) - (2 * title.padding) + 'px';
		object.navigate.style.width = frame.width - (2 * table.bordersize) + 'px';
		if(frame.counter == frame.dealer) {
			frame.position = false;
			frame.inposition = true;
			frame.counter = 0;
			return;
		} else {
			var repeat = setTimeout('imagegallery.frameMoveToPosition()', 25);
			return;
		}
	}
	
	/*** TITLE ***/
	
	/**
	 * Create title objects
	 */
	function titleCreate() {
		object.title = document.createElement('DIV');
		setClassName(object.title, 'imageGalleryNavigateTitle');
	}
	
	/**
	 * Show title div
	 */
	function titleShow() {
		object.title.style.display = 'none';
		var currentImg = gallery.array[gallery.current][image.current];
		if(currentImg.title != '') {
			object.title.innerHTML = currentImg.title;
			object.title.style.display = 'block';
			title.fade = true;
			self.titleFadeIn();
		} else {
			object.title.innerHTML = '';
			title.opacity = 0;
			setObjectOpacity(object.title, title.opacity);
			title.fade = false;
		}
	}
	
	/**
	 * Hide title div
	 */
	function titleHide() {
		title.fade = true;
		self.titleFadeOut();
	}
	
	/**
	 * Fade in title div
	 * Repeat as needed
	 */
	this.titleFadeIn = function() {
		if(title.opacity == title.opacitymax) {
			title.fade = false;
			return;
		}
		title.opacity = title.opacity + 2;
		setObjectOpacity(object.title, title.opacity);
		var repeat = setTimeout('imagegallery.titleFadeIn()', 25);
		return;
	}
	
	/**
	 * Fade out title div
	 * Repeat as needed
	 */
	this.titleFadeOut = function() {
		if(title.opacity == 0) {
			object.title.style.display = 'none';
			title.fade = false;
			return;
		}
		title.opacity = title.opacity - 2;
		setObjectOpacity(object.title, title.opacity);
		var repeat = setTimeout('imagegallery.titleFadeOut()', 25);
		return;
	}
	
	/*** NAVIGATE ***/
	
	/**
	 * Create navigate objects
	 */
	function navigateCreate() {
		var objectName = ['previousin', 'nextin', 'navigate', 'previous', 'info', 'next', 'exit'];
		var objectTag = ['DIV', 'DIV', 'DIV', 'A', 'SPAN', 'A', 'A'];
		var objectId = ['PreviousIn', 'NextIn', '', 'Previous', 'Info', 'Next', 'Exit'];
		var nbsp = '&nbsp;';
		var to = 0;
		for(var i = 0, to = objectName.length; i < to; i++) {
			object[objectName[i]] = document.createElement(objectTag[i]);
			setClassName(object[objectName[i]], 'imageGalleryNavigate' + objectId[i]);
			if(i < 2) {
				object[objectName[i]].innerHTML = nbsp;
			}
		}
		object.navigate.appendChild(object.previous);
		object.navigate.appendChild(object.info);
		object.navigate.appendChild(object.next);
		object.navigate.appendChild(object.exit);
	}
	
	
	/**
	 * Show navigate div
	 */
	function navigateShow() {
		object.navigate.style.display = 'none';
		if(image.current > 1) {
			addEvent(object.previousin, 'mouseover', navigateShowPreviousIn);
			addEvent(object.previousin, 'mouseout', navigateHidePreviousIn);
			addEvent(object.previousin, 'click', self.showPrevious);
			object.previousin.style.display = 'block';
			object.previous.style.display = 'inline-block';
			addEvent(object.previous, 'click', self.showPrevious);
		} else {
			removeEvent(object.previousin, 'mouseover', navigateShowPreviousIn);
			removeEvent(object.previousin, 'mouseout', navigateHidePreviousIn);
			removeEvent(object.previousin, 'click', self.showPrevious);
			object.previousin.style.display = 'none';
			object.previous.style.display = 'none';
			removeEvent(object.previous, 'click', self.showPrevious);
		}
		var imgInGallery = gallery.array[gallery.current].length - 1;
		object.info.style.display = 'none';
		object.info.innerHTML = ' ( ' + image.current + ' / ' + imgInGallery + ' ) ';
		object.info.style.display = 'inline-block';
		if(image.current < imgInGallery) {
			addEvent(object.nextin, 'mouseover', navigateShowNextIn);
			addEvent(object.nextin, 'mouseout', navigateHideNextIn);
			addEvent(object.nextin, 'click', self.showNext);
			object.nextin.style.display = 'block';
			object.next.style.display = 'inline-block';
			addEvent(object.next, 'click', self.showNext);
		} else {
			removeEvent(object.nextin, 'mouseover', navigateShowNextIn);
			removeEvent(object.nextin, 'mouseout', navigateHideNextIn);
			removeEvent(object.nextin, 'click', self.showNext);
			object.nextin.style.display = 'none';
			object.next.style.display = 'none';
			removeEvent(object.next, 'click', self.showNext);
		}
		addEvent(object.exit, 'click', hide);
		object.navigate.style.display = 'block';
		navigate.fade = true;
		self.navigateFadeIn();
	}
	
	/**
	 * Show navigete previous in background image
	 */
	function navigateShowPreviousIn() {
		object.previousin.style.backgroundImage = 'url("' + setting.imagedir + 'imagePreviousIn.png")';
	}
	
	/**
	 * Show navigete next in background image
	 */
	function navigateShowNextIn() {
		object.nextin.style.backgroundImage = 'url("' + setting.imagedir + 'imageNextIn.png")';
	}
	
	/**
	 * Hide navigate div
	 */
	function navigateHide() {
		navigate.fade = true;
		object.previousin.style.display = 'none';
		object.nextin.style.display = 'none';
		self.navigateFadeOut();
	}
	
	/**
	 * Hide navigete previous in background image
	 */
	function navigateHidePreviousIn() {
		object.previousin.style.backgroundImage = 'none';
	}
	
	/**
	 * Hide navigete next in background image
	 */
	function navigateHideNextIn() {
		object.nextin.style.backgroundImage = 'none';
	}
	
	/**
	 * Fade in navigate div
	 * Repeat as needed
	 */
	this.navigateFadeIn = function() {
		if(navigate.opacity == navigate.opacitymax) {
			navigate.fade = false;
			return;
		}
		navigate.opacity = navigate.opacity + 2;
		setObjectOpacity(object.navigate, navigate.opacity);
		var repeat = setTimeout('imagegallery.navigateFadeIn()', 25);
		return;
	}
	
	/**
	 * Fade out navigate div
	 * Repeat as needed
	 */
	this.navigateFadeOut = function() {
		if(navigate.opacity == 0) {
			object.navigate.style.display = 'none';
			navigate.fade = false;
			return;
		}
		navigate.opacity = navigate.opacity - 2;
		setObjectOpacity(object.navigate, navigate.opacity);
		var repeat = setTimeout('imagegallery.navigateFadeOut()', 25);
		return;
	}
	
	/*** FUNC ***/
	
	/**
	 * Get page, widow height and width size 
	 * @return  Array  Size data
	 */
	function getPageSize() {
		var db = document.body;
		var dde = document.documentElement;
		pageSize.pageWidth = Math.max(db.scrollWidth, dde.scrollWidth, db.offsetWidth, dde.offsetWidth, db.clientWidth, dde.clientWidth);
		pageSize.pageHeight = Math.max(db.scrollHeight, dde.scrollHeight, db.offsetHeight, dde.offsetHeight, db.clientHeight, dde.clientHeight);
		// IE7 dde.scrollWidth, dde.scrollHeight nem frissül átméretezéskor ^
		if(dde && dde.clientHeight) {
			pageSize.windowWidth = dde.clientWidth;
			pageSize.windowHeight = dde.clientHeight;
		} else if(db) {
			pageSize.windowWidth = db.clientWidth;
			pageSize.windowHeight = db.clientHeight;
	    }
	}
	
	/**
	 * Get scroll x and y position
	 * @return  Array  size data
	 */
	function getScrollXY() {
		var scrollX = 0;
		var scrollY = 0;
		if(typeof(window.pageYOffset ) == 'number') {
			scrollY = window.pageYOffset;
			scrollX = window.pageXOffset;
		} else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {
			scrollY = document.body.scrollTop;
			scrollX = document.body.scrollLeft;
		} else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
			scrollY = document.documentElement.scrollTop;
			scrollX = document.documentElement.scrollLeft;
		}
		return {
			'scrollX': scrollX, 
			'scrollY': scrollY
		};
	}
	
	/**
	 * Set object opacity
	 * @param  Object   pObj    Object to set opacity
	 * @param  Integer  pSetTo  Set opacity to
	 */
	function setObjectOpacity(pObj, pSetTo) {
		if(!pObj || typeof pObj != 'object' || !pSetTo) {
			return false;
		}
		if(ie) {
			pObj.style.filter = 'alpha(opacity=' + pSetTo * 10 + ')';
		} else {
			pObj.style.opacity = pSetTo / 10;
		}
		return;
	}
	
	/**
	 * Set object class name in IE and other browsers
	 * @param  Object  pObj    Object to set class name
	 * @param  String  pSetTo  Set class name to
	 */
	function setClassName(pObj, pSetTo) {
		if(typeof pObj != 'object') {
			return false;
		}
		if(ie) {
			pObj.className = pSetTo;
		} else {
			pObj.setAttribute('class', pSetTo);
		}
	}
	
	/**
	 * Initialize
	 */
	if(setting.need) {
		relGet();
	}
}

/**
 * Event Manager
 */
if(typeof addEvent != 'function') {
	
	/**
	 * addEvent
	 * @param  Object   o  Object to which we're attached
	 * @param  String   t  The event name without the 'on' prefix
	 * @param  String   f  A function reference that is called when the event fires
	 * @param  Boolean  l  If true, disables usage of addEventListener()
	 */
	var addEvent = function(o, t, f, l) {
		var d = 'addEventListener';
		var n = 'on' + t;
		var rO = o;
		var rT = t;
		var rF = f;
		var rL = l;
		if(o[d] && !l) {
			return o[d](t, f, false);
		}
		if(!o._evts) {
			o._evts = {};
		}
		if(!o._evts[t]) {
			o._evts[t] = o[n] ? {b: o[n]} : {};
			o[n] = new Function('e', 
								'var r = true, o = this, a = o._evts["' + t + '"], i; for (i in a) {' + 
								'o._f = a[i]; r = o._f(e||window.event) != false && r; o._f = null;' + 
								'} return r');
			if(t != 'unload') {
				addEvent(window, 'unload', function() {removeEvent(rO, rT, rF, rL);});
			}
		}
		if(!f._i) {
			f._i = addEvent._i++;
		}
		o._evts[t][f._i] = f;
	};
	
	/**
	 * removeEvent
	 * @param  Object   o  Object to which we're attached
	 * @param  String   t  The event name without the 'on' prefix
	 * @param  String   f  A function reference that is called when the event fires
	 * @param  Boolean  l  If true, disables usage of removeEventListener()
	 */
	addEvent._i = 1;
	var removeEvent = function(o, t, f, l) {
		var d = 'removeEventListener';
		if(o[d] && !l) {
			return o[d](t, f, false);
		}
		if(o._evts && o._evts[t] && f._i) {
			delete o._evts[t][f._i];
		}
	};
}

/**
 * Create imagegallery object
 * @type  ImageGallery
 */
var imagegallery = null;

/**
 * Initializes ImageGallery module
 * @type ImageGallery
 */ 
imagegallery = new ImageGallery();
