// Lightbox für rel-Tag vorbereiten
$(function() {$('a[rel*=lightbox]').lightBox();});

(function($) {
    // Lightbox aufruf für ein jQuery-Element
	$.fn.lightBox = function(settings) {
		// Einstellungen festlegen
		settings = jQuery.extend({
			loading: {				image:			          '../layout/gallery/loading.gif'},
	        blank: {	        	image:				      '../layout/gallery/blank.gif'},
			btnPrev: {				image:                    '../layout/gallery/prev.gif',
				hover:                    '../layout/gallery/prev_1.gif',
				width:                    '49%',
				height:                   '100%',
				position:                 'left 40%'},
			btnNext: {				image:                    '../layout/gallery/next.gif',
				hover:                    '../layout/gallery/next_1.gif',
				width:                    '49%',
				height:                   '100%',
				position:                 'right 40%'},
			btnClose: {			    image:                    '../layout/gallery/close.gif',
			    hover:                    '../layout/gallery/close_1.gif',
			    width:                    69,
			    height:                   13,
			    position:                 ''},
			btnSlideshow: {			    image:                    '../layout/gallery/slide_off.gif',
			    hover:                    '../layout/gallery/slide_off_1.gif',
			    activeImage:              '../layout/gallery/slide_on.gif',
			    activeHover:              '../layout/gallery/slide_on_1.gif',
			    width:                    80,
			    height:                   13,
			    position:                 ''},
			overlayColor: 	              '#000',
			overlayOpacity:			      0.8,
			overlayFadeInSpeed:	          400,
			lightboxFadeInSpeed:	      300,
			lightboxResizeSpeed:	      400,
			lightboxRepositionSpeed:      800,
			slideShowSpeed:               6000,
			dataSlideSpeed:               200,
			currentNumberCaption:	      'Bild %1$s von %2$s',
			keyToClose:				      'c',
			keyToPrev:				      'p',
			keyToNext:				      'n',
			keyToToggleSlideshow:	      's',
			ignoreMultipleImages:         false,
			showInfo:                     true,
			loopThroughImages:            true,
			disableSlideshow:             false,
			alwaysShowFooter:		      false,
			slideshowOnStartActive:       false,
			slideshowActive:              false,
			onResizePosition:             false,
			onScrollPosition:             false,
			ignoreGalleryName:            false,
			galleryName:                  '',
			imageArray:				      [],
			uniqueArray:                  [],
			activeImage:			      0
		},settings);

        // Funktionsübergreifen Variablen
		var jQueryMatchedObj = this;
		var objImagePreloader;
		var slideshowTimeout;

		// Laden der Lightbox
		function _start(objClicked) {
			$('embed, object, select').css({ 'visibility' : 'hidden' });

			_start_gallery(objClicked);

			if (settings.imageArray.length == 0) {
			    _finish();
			} else {
                _set_interface();
			    _set_image_to_view();
	        }
		}

		function _start_gallery(objClicked) {		    settings.imageArray = [];
		    settings.uniqueArray = [];
		    settings.activeImage = 0;

		    settings.galleryName = objClicked.getAttribute('rel');

            $.each(jQueryMatchedObj, function() {
				if (settings.ignoreMultipleImages) {
				    if ($.inArray(this.getAttribute('href'), settings.uniqueArray) == -1) {
				        settings.uniqueArray.push(this.getAttribute('href'));
		            }
				}

				if (settings.ignoreGalleryName || (!settings.ignoreGalleryName && this.getAttribute('rel') == settings.galleryName)) {
				    settings.imageArray.push(new Array(this.getAttribute('href'),this.getAttribute('title')));
	            }
			});

			while ( settings.imageArray[settings.activeImage][0] != objClicked.getAttribute('href') ) {
				settings.activeImage++;
			}
		}

		function _set_interface() {
			var arrPageSizes = ___getPageSize();
			var arrPageScroll = ___getPageScroll();

			$('body').append('<div id="jquery-overlay"></div><div id="jquery-lightbox"><div id="jquery-lightbox-image-container"><div id="jquery-lightbox-image-container-inner"><img id="jquery-lightbox-image"><div id="jquery-lightbox-nav"><a href="#" id="jquery-lightbox-nav-btnPrev"></a><a href="#" id="jquery-lightbox-nav-btnNext"></a></div><div id="jquery-lightbox-loading"><a href="#" id="jquery-lightbox-loading-link"><img src="' + settings.loading.image + '"></a></div></div></div><div id="jquery-lightbox-data-container"><div id="jquery-lightbox-data-details"><span id="jquery-lightbox-data-details-caption"></span><span id="jquery-lightbox-data-details-currentNumber"></span></div><div id="jquery-lightbox-secNav"><a href="#" id="jquery-lightbox-secNav-btnSlideshow"></a><a href="#" id="jquery-lightbox-secNav-btnClose"></a><div id="jquery-lightbox-secNav-clear"></div></div></div></div>');
			$('#jquery-overlay, #jquery-lightbox').hide();

			$('#jquery-overlay').css({
				backgroundColor:	settings.overlayColor,
				opacity:			settings.overlayOpacity,
				width:              '100%',
				height:				arrPageSizes[1]
			}).fadeIn(settings.overlayFadeInSpeed, function() {
    			$('#jquery-lightbox').css({
    				top:	arrPageScroll[1] + (arrPageSizes[3] / 10),
    				left:	arrPageScroll[0]
    			}).fadeIn(settings.lightboxFadeInSpeed);
            })

            // Buttons
            $('#jquery-lightbox-secNav-btnClose').css({
                'background': 'transparent url(' + settings.btnClose.image + ') no-repeat ' + settings.btnClose.position,
                'width':      settings.btnClose.width,
                'height':     settings.btnClose.height
            }).hover(function() {
				$(this).css({ 'background' : 'transparent url(' + settings.btnClose.hover + ') no-repeat ' + settings.btnClose.position });
			},function() {
				$(this).css({ 'background' : 'transparent url(' + settings.btnClose.image + ') no-repeat ' + settings.btnClose.position });
			}).show();

			$('#jquery-lightbox-nav-btnPrev').css({
                'background' : 'transparent url(' + settings.btnPrev.image + ') no-repeat ' + settings.btnPrev.position,
                'width':      settings.btnPrev.width,
                'height':     settings.btnPrev.height
            }).hover(function() {
				$(this).css({ 'background' : 'transparent url(' + settings.btnPrev.hover + ') no-repeat ' + settings.btnPrev.position });
			},function() {
				$(this).css({ 'background' : 'transparent url(' + settings.btnPrev.image + ') no-repeat ' + settings.btnPrev.position });
			}).show().click(function() {
                return _show_image_prev();
            });

			$('#jquery-lightbox-nav-btnNext').css({
                'background' : 'transparent url(' + settings.btnNext.image + ') no-repeat ' + settings.btnNext.position,
                'width':      settings.btnNext.width,
                'height':     settings.btnNext.height
            }).hover(function() {
				$(this).css({ 'background' : 'transparent url(' + settings.btnNext.hover + ') no-repeat ' + settings.btnNext.position });
			},function() {
				$(this).css({ 'background' : 'transparent url(' + settings.btnNext.image + ') no-repeat ' + settings.btnNext.position });
			}).show().click(function() {
                return _show_image_next();
            });

			if (settings.disableSlideshow) {
			    $('#jquery-lightbox-secNav-btnSlideshow').hide();
	        } else {
			    _toggle_slideshowBtn();
			}

			// Klickfunktionen
			$('#jquery-overlay,#jquery-lightbox').click(function() {
				_finish();
			});

			$('#jquery-lightbox-secNav-btnSlide').click(function() {
			    _toggle_slideshow();
			    return false;
			});

			$('#jquery-lightbox-loading-link,#jquery-lightbox-secNav-btnClose').click(function() {
				_finish();
				return false;
			});

			$(window).resize(function() {
				var arrPageSizes = ___getPageSize();

				$('#jquery-overlay').css({
    				backgroundColor:	settings.overlayBgColor,
    				opacity:			settings.overlayOpacity,
    				width:				'100%',
    				height:				arrPageSizes[1]
    			}).show();

                if (settings.onResizePosition) {
				    //$('#jquery-lightbox').stop();
				    _resize(objImagePreloader.width,objImagePreloader.height);
    		    }
    		});
            /*
            if (settings.onScrollPosition) {
    			$(window).scroll(function() {
    				//$('#jquery-lightbox').stop();
    				_resize(objImagePreloader.width,objImagePreloader.height);
    			});
            }*/
		}

		function _set_image_to_view() {
			$('#jquery-lightbox-loading').show();

			if ( !settings.alwaysShowFooter ) {
				$('#jquery-lightbox-data-container').hide();
			}

			$('#jquery-lightbox-image,#jquery-lightbox-nav-btnPrev,#jquery-lightbox-nav-btnNext').hide();

			objImagePreloader = new Image();
			objImagePreloader.onload = function() {
				$('#jquery-lightbox-image').attr('src',settings.imageArray[settings.activeImage][0]);
				_resize(objImagePreloader.width,objImagePreloader.height);
				objImagePreloader.onload=function(){};
			};
			objImagePreloader.src = settings.imageArray[settings.activeImage][0];
		};

		function _resize(intImageWidth,intImageHeight) {
			var intCurrentWidth = $('#jquery-lightbox-image-container').width();
			var intCurrentHeight = $('#jquery-lightbox-image-container').height();

			var intWidth = intImageWidth;
			var intHeight = intImageHeight;

			var intDiffW = intCurrentWidth - intWidth;
			var intDiffH = intCurrentHeight - intHeight;

			$('#jquery-lightbox-image-container').animate({ width: intWidth, height: intHeight }, settings.lightboxResizeSpeed, function() { _reposition(); });

			if ( !settings.alwaysShowFooter ) {
			    $('#jquery-lightbox-data-container').css({ width: intWidth });
			} else {				$('#jquery-lightbox-data-container').animate({ width: intWidth }, settings.lightboxResizeSpeed);
			}

			$('#jquery-lightbox-nav-btnPrev,#jquery-lightbox-nav-btnNext').css({ height: intHeight });


			if ( ( intDiffW == 0 ) && ( intDiffH == 0 ) ) {
				if ( $.browser.msie ) {
					___pause(250);
				} else {
					___pause(100);
				}
			}
		};

		function _reposition() {
			var arrPageScroll = ___getPageScroll();

			var nHeight = parseInt($('#jquery-lightbox').height(),10);

			var nTop = arrPageScroll[1] + ($(window).height() - nHeight) / 2.5;
			var nLeft = arrPageScroll[0];

			if (nTop < 0) {nTop = 0;}

			$('#jquery-lightbox').animate({
				left: nLeft,
				top: nTop
			}, settings.lightboxRepositionSpeed, function() { _show_image(); });
		}

		function _show_image() {
			$('#jquery-lightbox-loading').hide();
			$('#jquery-lightbox-image').fadeIn(function() {
				_set_navigation();
				_show_data();
			});
			_preload();

			if (settings.slideshowActive) { _slideshow_start(); }
		};

		function _show_image_prev() {
			_slideshow_stop();

			if ( settings.activeImage != 0 ) {
				settings.activeImage = --settings.activeImage;
				_set_image_to_view();
				_disable_keyboard_navigation();
			} else if ( settings.loopThroughImages ) {			    settings.activeImage = settings.imageArray.length - 1;
				_set_image_to_view();
				_disable_keyboard_navigation();
			}

			return false;
		};

		function _show_image_next() {
			_slideshow_stop();

			if ( settings.activeImage != ( settings.imageArray.length - 1 ) ) {
				settings.activeImage = ++settings.activeImage;
				_set_image_to_view();
				_disable_keyboard_navigation();
			} else if ( settings.loopThroughImages ) {				settings.activeImage = 0;
				_set_image_to_view();
				_disable_keyboard_navigation();
			}

			return false;
		};

		function _show_data() {
			$('#jquery-lightbox-data-container').slideDown(settings.dataSlideSpeed);
			if ( settings.showInfo ) {
    			//$('#jquery-lightbox-data-details-caption').hide();

    			if ( settings.imageArray[settings.activeImage][1] ) {
    				$('#jquery-lightbox-data-details-caption').html(settings.imageArray[settings.activeImage][1]).show();
    			}

    			if ( settings.imageArray.length > 1 ) {
    				$('#jquery-lightbox-data-details-currentNumber').html($.sprintf(settings.currentNumberCaption, settings.activeImage + 1 , settings.imageArray.length)).show();
    			}
            }
		}


		function _set_navigation() {
			$('#jquery-lightbox-nav').show();

			if ( ( settings.loopThroughImages && settings.imageArray.length > 1 ) || settings.activeImage != 0 ) {
				$('#jquery-lightbox-nav-btnPrev').show();
			}

			if ( ( settings.loopThroughImages && settings.imageArray.length > 1 ) || settings.activeImage != ( settings.imageArray.length -1 ) ) {
				$('#jquery-lightbox-nav-btnNext').show();
			}

			_enable_keyboard_navigation();
		}

		// Keyboardfunktionen
		function _keyboard_action(objEvent) {

			if ( objEvent == null ) {
				keycode = event.keyCode;
				escapeKey = 27;
			} else {
				keycode = objEvent.keyCode;
				escapeKey = objEvent.DOM_VK_ESCAPE;
			}

			key = String.fromCharCode(keycode).toLowerCase();

			if ( ( key == settings.keyToClose ) || ( keycode == escapeKey ) ) {
				_finish();
			}

			if ( key == settings.keyToPrev ) {
				_show_image_prev();
			}

			if ( key == settings.keyToNext ) {
				_show_image_next();
			}

			if ( key == settings.keyToToggleSlideshow ) {
				_toggle_slideshow();
			}
		}

		// Keyboardfunktionen aktivieren
		function _enable_keyboard_navigation() {
			$(document).keydown(function(objEvent) {
				_keyboard_action(objEvent);
			});
		}

		// Keyboardfunktionen deaktivieren
		function _disable_keyboard_navigation() {
			$(document).unbind();
		}

		// Benachbarte Bilder laden
		function _preload() {
			if ( (settings.imageArray.length -1) > settings.activeImage ) {
				objNext = new Image();
				objNext.src = settings.imageArray[settings.activeImage + 1][0];
			} else if (settings.lightboxImageLoop && (settings.imageArray.length -1) == settings.activeImage) {
				objNext = new Image();
				objNext.src = settings.imageArray[0][0];
			}

			if ( settings.activeImage > 0 ) {
				objPrev = new Image();
				objPrev.src = settings.imageArray[settings.activeImage -1][0];
			} else if (settings.lightboxImageLoop && settings.activeImage == 0) {
				objNext = new Image();
				objNext.src = settings.imageArray[(settings.imageArray.length -1)][0];
			}
		}

		// Slideshow Button ändern
		function _toggle_slideshowBtn() {
			if (!settings.slideshowActive) {
        		$('#jquery-lightbox-secNav-btnSlideshow').css({
    			    'background' : 'transparent url(' + settings.btnSlideshow.image + ') no-repeat ' + settings.btnSlideshow.position,
    			    'width':      settings.btnSlideshow.width,
                    'height':     settings.btnSlideshow.height
    			}).unbind().hover(function() {
    				$(this).css({ 'background' : 'transparent url(' + settings.btnSlideshow.hover + ') no-repeat ' + settings.btnSlideshow.position });
    			},function() {
    				$(this).css({ 'background' : 'transparent url(' + settings.btnSlideshow.image + ') no-repeat ' + settings.btnSlideshow.position });
    			}).show().click(function() {
                    return _toggle_slideshow();
                });
			} else {
				$('#jquery-lightbox-secNav-btnSlideshow').css({
    			    'background' : 'transparent url(' + settings.btnSlideshow.activeImage + ') no-repeat ' + settings.btnSlideshow.position,
    			    'width':      settings.btnSlideshow.width,
                    'height':     settings.btnSlideshow.height
    			}).unbind().hover(function() {
    				$(this).css({ 'background' : 'transparent url(' + settings.btnSlideshow.activeHover + ') no-repeat ' + settings.btnSlideshow.position });
    			},function() {
    				$(this).css({ 'background' : 'transparent url(' + settings.btnSlideshow.activeImage + ') no-repeat ' + settings.btnSlideshow.position });
    			}).show().click(function() {
                    return _toggle_slideshow();
                });
			}
		}

		// Slideshow toggln
		function _toggle_slideshow() {
			if (!settings.slideshowActive) {
				settings.slideshowActive = true;
			   	_slideshow_start();
                _toggle_slideshowBtn();
			} else {
				settings.slideshowActive = false;
				_slideshow_stop();
                _toggle_slideshowBtn();
			}
			return false;
		}

				// Slodeshow starten
		function _slideshow_start() {
            _slideshow_stop();

			if (settings.imageArray.length > 1) {
                slideshowTimeout = setTimeout(function(){_show_image_next();}, settings.slideShowSpeed);
			}
		}

		// Slideshow anhalten
		function _slideshow_stop( clear ) {
            clearTimeout(slideshowTimeout);
		}

		// Lightbox entfernen
		function _finish() {			_slideshow_stop()
			$('#jquery-lightbox').remove();
			$('#jquery-overlay').fadeOut(function() { $('#jquery-overlay').remove(); });
			$('embed, object, select').css({ 'visibility' : 'visible' });
		}

		// Seitengröße
		function ___getPageSize() {
			var xScroll, yScroll;

        	if (window.innerHeight && window.scrollMaxY) {
        		xScroll = document.body.scrollWidth;
        		yScroll = window.innerHeight + window.scrollMaxY;
        	} else if (document.body.scrollHeight > document.body.offsetHeight){
        		xScroll = document.body.scrollWidth;
        		yScroll = document.body.scrollHeight;
        	} else {
        		xScroll = document.body.offsetWidth;
        		yScroll = document.body.offsetHeight;
        	}

        	var windowWidth, windowHeight;
        	if (self.innerHeight) {
        		windowWidth = self.innerWidth;
        		windowHeight = self.innerHeight;
        	} else if (document.documentElement && document.documentElement.clientHeight) {
        		windowWidth = document.documentElement.clientWidth;
        		windowHeight = document.documentElement.clientHeight;
        	} else if (document.body) {
        		windowWidth = document.body.clientWidth;
        		windowHeight = document.body.clientHeight;
        	}

        	if(yScroll < windowHeight){
        		pageHeight = windowHeight;
        	} else {
        		pageHeight = yScroll;
        	}

        	if(xScroll < windowWidth){
        		pageWidth = windowWidth;
        	} else {
        		pageWidth = xScroll;
        	}

        	arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight)
        	return arrayPageSize;
		};

        // Scrollposition der Seite
		function ___getPageScroll() {
			var xScroll, yScroll;
			if (self.pageYOffset) {
				yScroll = self.pageYOffset;
				xScroll = self.pageXOffset;
			} else if (document.documentElement && document.documentElement.scrollTop) {
				yScroll = document.documentElement.scrollTop;
				xScroll = document.documentElement.scrollLeft;
			} else if (document.body) {
				yScroll = document.body.scrollTop;
				xScroll = document.body.scrollLeft;
			}
			arrayPageScroll = new Array(xScroll,yScroll);
			return arrayPageScroll;
		};

        // Anzeigepause
		function ___pause(ms) {
			var date = new Date();
			curDate = null;
			do { var curDate = new Date(); }
		    while ( curDate - date < ms);
		};

		return this.unbind().click(function() {		    _start(this);
		    return false;
		});
	};
})(jQuery);
