(function ($) {
/**
 * Interhome jQuery plugins
 * @depends jQuery
 */
	$.fn.extend({
		/**
		 * jQuery clickout Plugin (strict HTML)
		 * @acess public
		 * @author skrings
		 */
		clickout: function(opts) {
			if(!this.length) {
				return this;
			}
			// Default Optionen
			var defaults = {linkClass: null, beforeOpen: null},
				options = $.extend({}, defaults, opts);
			
			if (!!options.linkClass) {
				this.addClass(options.linkClass);
			}
			// Event an anker binden
			this.filter('a').bind('click', function() {
				var sHref = $(this).attr('href');
		
				if ($.isFunction(options.beforeOpen)) {
					options.beforeOpen.apply(this);
				}
				if (!!sHref && sHref.charAt(0) !== '#') {
					window.setTimeout(function(){
						window.open(sHref).focus();
					}, 100);
					return false;
				}
				return true;
			});
			return this;
		},
		/**
		 * jQuery ItemCarousel Plugin
		 * @access public
		 * @author skrings
		 */
		itemCarousel: function(opts) {
			if (!this.length) {
				return this;
			}
			// Default Optionen
			var defaults = {'hoverClass': 'ih-active', 'useKeypress': true, 'autoScroll': false, 'disabledClass': 'ih-disabled', 'viewCount': null, 'scrollInterval': 3500, 'duration': 'normal', 'init': null, 'change': null, 'parentSelector': null},
				options = $.extend({}, defaults, opts);
			
			if (!options.duration || typeof options.duration !== 'number') {
				options.duration = $.fx.speeds[options.duration] || $.fx.speeds._default;
			}
			if (options.autoScroll && (!options.scrollInterval || typeof options.scrollInterval !== 'number')) {
				options.scrollInterval = options.duration*10;
			}
				
			// Über alle Elemente iterieren
			return this.each(function() {
				var element = $(this),
					carouselList = element.find('.ih-carousel-content > ul'),
					carouselItems = carouselList.find('li'), 
					iItemWidth = carouselList.find('li:first').outerWidth(true),
					bMouseOver = false,
					xHoldInterval = null,
					xAutoInterval = null,
					clearHoldInterval = function () {
						if(!!xHoldInterval) {
							window.clearInterval(xHoldInterval);
							xHoldInterval = null;
						}
					},
					clearAutoInterval = function () {
						if(!!xAutoInterval) {
							window.clearInterval(xAutoInterval);
							xAutoInterval = null;
						}
					},
					slideItems = function(slideTo) {
						if(!carouselList.is(':animated')) {
							
							var self 			= this,
								iCarouselLeft 	= parseInt(carouselList.css('left'), 10),
								iLeftOffset 	= (slideTo === 'left' ? iCarouselLeft + iItemWidth : iCarouselLeft - iItemWidth),
								currentElement;
						 
							carouselList.animate({'left' : iLeftOffset}, 
									{queue: false, easing: 'swing', duration: options.duration, complete: function() {
						  
									if(slideTo === 'left'){
										currentElement = carouselList.find('li:first').before(carouselList.find('li:last'));
									} 
									else {
										carouselList.find('li:last').after(carouselList.find('li:first'));
										currentElement = carouselList.find('li:eq(1)');
									}
						     
									carouselList.css({'left' : '-'+iItemWidth+'px'});
								
									if($.isFunction(options.change)) {
										options.change.apply(this, [currentElement]);	
									}
									currentElement = null;
								}
							});	
						}
					},
					setAutoScroll = function() {
						if (!xAutoInterval) {
							xAutoInterval = window.setInterval(function() {
								if (!!bMouseOver) {
									clearAutoInterval();
								}
								else {
									slideItems('right');
								}
							}, options.scrollInterval);	
						}
					};
				
				// Liste initzialisieren
				carouselList
					.width(parseInt(iItemWidth * carouselItems.length, 10));
				
				if (carouselList.css('position') !== 'absolute') {
					carouselList.css('position', 'absolute');
				}
				
				if (!!options.viewCount && !carouselList.parent().css('width')) {
					carouselList.parent().width(parseInt(options.viewCount * iItemWidth, 10));					
				}
				if (!!options.viewCount && options.viewCount >= carouselItems.length) {
					// Callback aufrufen
					if($.isFunction(options.init)) {
						options.init.apply(this, [carouselItems]);	
					}
					
					return element.addClass(options.disabledClass);
				}

				// Ggf. Elemente clonen
				if(!!options.viewCount && carouselItems.length === (options.viewCount+1)) {
					carouselItems.each(function(i, element) {
						var cloneElement 	= $(element).clone(),
							sElementID 		= cloneElement.attr('id');
						
						if (!!sElementID) {
							cloneElement.attr('id', 'clone_'+sElementID);	
						}
						cloneElement.insertAfter(carouselList.find('li:last'));
					});
					
					carouselItems = carouselList.find('li');
					carouselList.width(parseInt(iItemWidth * carouselItems.length, 10));
				}
				
				// Elemente vertauschen
				if( carouselItems.length>1 ) {
					carouselList
						.css({'left' : '-'+iItemWidth+'px'})
						.find('li:first').before(carouselList.find('li:last'));
				}
				
								
				if (!!options.hoverClass) {
					
					// Hover Effekt
					carouselItems.hover(
							function() {
								$(this).addClass(options.hoverClass);
							},
							function() {
								$(this).removeClass(options.hoverClass);
							}
					); 
					element.find('.ih-carousel-left').hover(
							function() {
								$(this).addClass(options.hoverClass);	
							},
							function() {
								$(this).removeClass(options.hoverClass);	
							}
					);
					element.find('.ih-carousel-right').hover(
							function() {
								$(this).addClass(options.hoverClass);	
							},
							function() {
								$(this).removeClass(options.hoverClass);	
							}
					);
				}
				
				// Navigation linker Button
				element.find('.ih-carousel-left').mousedown(function() {
					if(!!options.autoScroll){
						clearAutoInterval();
					}
					slideItems('left');
					
					xHoldInterval = window.setInterval(function() {
						slideItems('left');
					}, options.duration*1,5);
					
					return false;  
				}).mouseup(function() {
					clearHoldInterval();
				}).mouseleave(function() {
					clearHoldInterval();
				});
				// Navigation rechter Button
				element.find('.ih-carousel-right').mousedown(function() {
					if(!!options.autoScroll){
						clearAutoInterval();
					}
					slideItems('right');
					
					xHoldInterval = window.setInterval(function() {
						slideItems('right');
					}, options.duration*1,5);
					
					return false;  
				}).mouseup(function() {
					clearHoldInterval();
				}).mouseleave(function() {
					clearHoldInterval();
				});
					
				// Mouse im carousel
				element.parent().mouseenter(function() {
					bMouseOver = true;
					// Automatisches scrollen deaktivieren
					if (!!options.autoScroll && !!options.scrollInterval) {
						clearAutoInterval();
					}
				}).mouseleave(function() {
					bMouseOver = false;
					// Automatisches scrollen aktivieren
					if (!!options.autoScroll && !!options.scrollInterval) {
						setAutoScroll();
					}
				});
				
				// Navigation über Tasten
				if (!!options.useKeypress) {
					
					(typeof options.parentSelector === 'string' ? $(options.parentSelector) : $(document))
					.keydown(function(event) {
						if (!bMouseOver) {
							return true;
						}
						if (!!carouselList.is(':animated')) {
							event.stopPropagation();
							return true;
						}
						var keyCode = (!!event.keyCode ? event.keyCode : event.which);
						
						if (keyCode === 37) {
							if(!!options.autoScroll){
								clearAutoInterval();
							}
							slideItems('left');
							event.stopPropagation();
						}
						else if (keyCode === 39) {
							if(!!options.autoScroll){
								clearAutoInterval();
							}
							slideItems('right');
							event.stopPropagation();
						}
					});
				}
				
				// Automatisches scrollen aktivieren
				if(!!options.autoScroll && !!options.scrollInterval) {
					setAutoScroll();
				}
				
				// Elemente einblenden
				if($.support.opacity && !carouselItems.is(':visible')) {
					carouselItems.fadeIn('fast', function() {
						carouselItems.removeAttr('style');
					});					
				}
				if (carouselItems.hasClass('ih-hide')) {
					carouselItems.removeClass('ih-hide');
				}
				
				// Callback aufrufen
				if($.isFunction(options.init)) {
					options.init.apply(this, [element]);	
				}
			});
		}
	});
})(jQuery);
