/**
 * WORK SLIDER AND LIST
 */

jQuery(function () {

	if (!jQuery('.workSlider[id]').length) return;

	var config = {
		shownItemNum: 2, // number of items in the visible area
		preloaderSize: 4, // number of hidden items at left AND right of the visible area - should be at least as big as shownItemNum
		movetime: 500, // time in milliseconds to move the items when a scroll button is clicked
		buttonUnlockWhenImagesLoaded: false, // [true] to wait unlocking the scroll buttons until all images are loaded (including hidden preloader area) ;; [false] to unlock the scroll buttons immediately after the movement has ended
		slideEndless: true // [true] to have the works slider sliding endless ;; [false] to stop sliding at the last work
	};

	// initialization
		var contentDiv = jQuery('div.content').css({
			position: 'relative',
			overflow: 'hidden'
		});
		// resets overflow to hidden after other js has overwritten it (happens sometimes, depending on computer speed)
			var setAgain = false;
			var setAgainTimeout = window.setTimeout(function () {
				if (contentDiv.css('overflow') == 'hidden') return;
				clearTimeout(setAgainTimeout);
				contentDiv.css('overflow', 'hidden');
			}, 100);

	// customer info
		var customerInfo = jQuery('#customerInfo');
		var customerInfoShowLink = jQuery('.showCustomerInfoLink');
		var customerInfoHideLink = jQuery('.hideCustomerInfoLink');
		var customerInfoPresent = false;
		var customerInfoNotClose = false;
		if (customerInfo.length) {
			customerInfoPresent = true;
			var showCustomerInfo = function () {
				customerInfo.slideDown(config.movetime);
				customerInfoHideLink.show();
				customerInfoShowLink.hide();
			};
			var hideCustomerInfo = function () {
				if (customerInfoNotClose) {
					customerInfoNotClose = false;
					return;
				}
				if (!customerInfo.is(':visible')) return;
				customerInfo.slideUp(config.movetime, function () {
					// ie7 browser bug fix
						if (jQuery.browser.msie && jQuery.browser.version < 8) customerInfo.parent().children('.workSlider').css('padding-top', '33px');
				});
				customerInfoShowLink.show();
				customerInfoHideLink.hide();
			};
			customerInfoShowLink.bind('click', function () {
				showCustomerInfo();
				return false;
			});
			// close info on click anywhere inside the content div (accordeon)
				jQuery('div.content').bind('click', hideCustomerInfo);
			// prevent from closing info when clicked inside the info itself
				customerInfo.bind('click', function (e) {
					if(jQuery(e.target).is("a")) customerInfoNotClose = true;
					else return false;
				});
			// safari browser bug fix
				if (jQuery.browser.safari) customerInfo.hide().slideDown(1);
		}

	// slider view
		jQuery('.workSlider').each(function () {
			// jquery objects
				var left = jQuery('.workSliderLeftArrow', this);
				var right = jQuery('.workSliderRightArrow', this);
				var cropper = jQuery('.workSliderCropper', this);
				var mover = jQuery('.workSliderItemList', this);
				var images; // is set during initialization
			// values
				var startItemNum = jQuery('.workSliderItem', this).length;
				var itemTemplate = jQuery('.workSliderItem:first', this);
				var itemWidth = 372;
				var moverZeroPosition = -config.preloaderSize * itemWidth;
				var items = new Array();
				var preloaderItemIndex = config.preloaderSize + config.shownItemNum;
				var data = workSliderItems[jQuery(this).attr('id')];
				var activeIndex = 0;
				var buttonsLocked = false;
				var lastDir = 0;
				var imageLinkPresent = itemTemplate.find('.image_link').length ? true : false;
				var clientLinkPresent = itemTemplate.find('.client_link').length ? true : false;
			// description
				jQuery('.workSliderItem img', this).bind('mouseover', function () {
					hideLeftVisibleDescs();
					if (hideCustomerInfo) hideCustomerInfo();
					if (buttonsLocked) return;
					jQuery(this).parents('.workSliderItem:first').find('.work_desc').show();
				});
				jQuery('.workSliderItem .work_desc', this).bind('mouseout', function () {
					jQuery(this).hide();
				});
				// mouseout on .work_desc does not always work properly, that's why additional functions are necessary
					var hideLeftVisibleDescs = function () {
						jQuery('.workSliderItem .work_desc').hide();
					};
					jQuery('.workSliderLeftArrow, .workSliderRightArrow', this).bind('mouseover', hideLeftVisibleDescs);
				if (imageLinkPresent) {
					jQuery('.workSliderItem .work_desc', this).bind('click', function () {
						window.location.href = jQuery(this).parents('.workSliderItem:first').find('.image_link').attr('href');
					}).addClass('work_desc_linked');
				}
			// functions
				var checkButtons = function () { // checks if scroll buttons should be visible and enables/disables them
					if (config.slideEndless) return;
					left.css('visibility', 'visible');
					right.css('visibility', 'visible');
					if (activeIndex + config.shownItemNum > data.length - 1) right.css('visibility', 'hidden');
					if (activeIndex - config.shownItemNum < 0) left.css('visibility', 'hidden');
				};
				var moveItems = function (dir) { // moves all items left or right
					if (buttonsLocked) return;
					buttonsLocked = true;
					lastDir = dir;
					activeIndex += config.shownItemNum * dir;
					if (config.slideEndless) {
						if (activeIndex >= data.length) while (activeIndex >= data.length) activeIndex -= data.length;
						else if (activeIndex < 0) while (activeIndex < 0) activeIndex += data.length;
					}
					checkButtons();
					mover.animate({'margin-left': (moverZeroPosition - (dir * config.shownItemNum * itemWidth)) + "px"}, config.movetime, preloadItems);
				};
				var preloadItems = function () { // gives all items their specific content and resets movement position
					for (var i=-config.preloaderSize; i<config.preloaderSize+config.shownItemNum; i++) {
						var myItem = items[config.preloaderSize + i];
						var myData = data[activeIndex + i];
						if (!myData && config.slideEndless && data.length > config.shownItemNum) {
							var j = activeIndex + i;
							if (j >= data.length) while (j >= data.length) j -= data.length;
							else while (j < 0) j += data.length;
							myData = data[j];
						}
						if (!myData) myItem.css('visibility', 'hidden');
						else {
							myItem.css('visibility', 'visible');
							if (imageLinkPresent) myItem.find('.image_link').attr('href', myData.imageLink);
							myItem.find('img').attr('src', myData.image);
							if (clientLinkPresent) myItem.find('.client_link').attr('href', myData.clientLink).html(myData.client);
							myItem.find('.work_link').attr('href', myData.titleLink).html(myData.title);
							myItem.find('.work_desc').html(myData.description);
						}
					}
					mover.css('margin-left', moverZeroPosition);
					if (!config.buttonUnlockWhenImagesLoaded) buttonsLocked = false;
				};
				var imagePreloaded = function () { // is called every time an image is loaded - is needed only to unlock scroll buttons, if config.buttonUnlockWhenImagesLoaded is set
					if (!buttonsLocked) return;
					var allLoaded = true;
					images.each(function () {
						if (!this.complete) allLoaded = false;
					});
					buttonsLocked = !allLoaded;
				};
			// initialization
				checkButtons();
				// create cache and preloader areas
					// create cache area
						for (var i=0; i<config.preloaderSize; i++) mover.prepend(itemTemplate.clone());
					// check and if necessary create preloader area
						if (startItemNum < config.shownItemNum + config.preloaderSize)
							for (var i=startItemNum-config.shownItemNum-1; i<config.preloaderSize; i++)
								mover.append(itemTemplate.clone());
				// get items
					jQuery('.workSliderItem', this).each(function () {
						var myItem = jQuery(this);
						items.push(myItem);
					});
				mover.css('width', (items.length * itemWidth) + "px");
				images = jQuery('.workSliderItem img', this);
				preloadItems();
			// break if no scrolling is needed because of too few items
				if (data.length <= config.shownItemNum) {
					left.css('visibility', 'hidden');
					right.css('visibility', 'hidden');
					return;
				}
			// events
				left.bind('click', function () {
					moveItems(-1);
				});
				right.bind('click', function () {
					moveItems(1);
				});
				// image preloading
					if (config.buttonUnlockWhenImagesLoaded) {
						items[config.preloaderSize].prevAll('.workSliderItem').find('img').bind('load', imagePreloaded);
						items[config.preloaderSize+1].nextAll('.workSliderItem').find('img').bind('load', imagePreloaded);
					}
			if (config.slideEndless) {
				left.css('visibility', 'visible');
				right.css('visibility', 'visible');
			}
		});

	// list view
		if (jQuery('.workListViewLink').length) {
			var listViewDrawn = false;
			var listViewActive = false;
			var slideView = jQuery('.workSlider');
			var slideViewLink = jQuery('.workSlideViewLink');
			var listView;
			var listViewLink = jQuery('.workListViewLink');
			jQuery('.workListViewLink, .workSlideViewLink').bind('click', function () {
				if (listViewActive) {
					// alter url for slide view
						var hashPos = window.location.href.indexOf('#');
						if (hashPos > 0) window.location.href = window.location.href.substring(0, hashPos) + "#slideView";
						else window.location.href += "#slideView";
					slideView.css('display', 'block');
					listView.css('display', 'none');
					listViewLink.removeClass('active');
					slideViewLink.addClass('active');
					contentDiv.css('overflow', 'hidden');
				} else {
					// alter url for slide view
						var hashPos = window.location.href.indexOf('#');
						if (hashPos > 0) window.location.href = window.location.href.substring(0, hashPos) + "#listView";
						else window.location.href += "#listView";
					if (!listViewDrawn) {
						// draw list view
						slideView.each(function () {
							// values
								var data = workSliderItems[jQuery(this).attr('id')];
								var itemTemplate = jQuery('.workListItemTemplate:first', this).find('.workListItem:first');
								var clientLinkPresent = itemTemplate.find('.client_link').length ? true : false;
							// initialization
								listView = jQuery('<div class="workList" />').insertAfter(jQuery(this));
								jQuery(data).each(function () {
									var item = itemTemplate.clone();
									// fill item with content
										item.find('.image_link').attr('href', this.imageLink);
										item.find('img').attr('src', this.image);
										if (clientLinkPresent) item.find('.client_link').attr('href', this.clientLink).html(this.client);
										item.find('.work_link').attr('href', this.titleLink).html(this.title);
										item.find('.work_desc').html(this.description);
									listView.append(item);
								});
						});
						listViewDrawn = true;
					}
					slideView.css('display', 'none');
					listView.css('display', 'block');
					listViewLink.addClass('active');
					slideViewLink.removeClass('active');
					contentDiv.css('overflow', 'auto');
					// ie browser bug fix
						if (jQuery.browser.msie) {
							slideViewLink.parent().animate({ opacity: 0.99 }, 10).animate({ opacity: 1 }, 10);
							listView.animate({ opacity: 0.99 }, 10).animate({ opacity: 1 }, 10);
						}
				}
				listViewActive = !listViewActive;
			});
			// activate list view first if is set in url
				if (window.location.href.indexOf('#listView') > 0) {
					customerInfoNotClose = true;
					window.clearTimeout(setAgainTimeout);
					jQuery('.workListViewLink').trigger('click');
				}
		}

});




/**
 *	CHANNEL OVERVIEW (PAGING)
 */

jQuery(function () {

	var config = {
		fadeDelay: 80, // time in milliseconds to wait between the items are faded
		fadeDuration: 300, // time in milliseconds to fade
		autoFlipWaitTime: 5000 // time in milliseconds to wait until the next autoflip occurs
	};

	if (!jQuery('.showcaseItem[id]').length) return;
	jQuery('.accordion_tab > .content').css('position', 'relative'); // makes paging buttons positionable absolute
	var locked = false;
	var firstFlipDone = false;
	var flipPage = function (dir) {
		if (locked) return;
		locked = true;
		jQuery('.showcaseItem[id]').data('flipped', firstFlipDone).each(function (i) {
			var me = jQuery(this);
			var data = showcaseItems[me.attr('id')];
			// get next index
				var index = me.data('pageIndex');
				if (index + dir >= data.length) index = 0;
				else if (index + dir < 0) index = data.length - 1;
				else index += dir;
				me.data('pageIndex', index);
			data = data[index];
			var delay = !me.data('flipped') ? 1 : i * config.fadeDelay;
			me.delay(delay).animate({'opacity': 0}, !me.data('flipped') ? 1 : config.fadeDuration, function () {
				// fill item with content
					me.find('.image_link').attr('href', data.imageLink).find('img').attr('src', data.image);
					me.find('h1 a').attr('href', data.categoryLink).html(data.category);
					me.find('.work_link').attr('href', data.workLink).html(data.title);
					me.find('.client_link').attr('href', data.clientLink).html(data.client);
					me.find('.client_link').next('p').html(data.description);
					me.animate({'opacity': 1}, !me.data('flipped') ? 1 : config.fadeDuration, function () { if (i == 0) locked = false; });
			});
		});
		firstFlipDone = true;
	};
	jQuery('.showcaseItem[id]').data('pageIndex', -1);
	flipPage(1);
	var autoFlipInterval = window.setInterval(function () { flipPage(1); }, config.autoFlipWaitTime);
	jQuery('#prevShowcasePage').bind('click', function () {
		window.clearInterval(autoFlipInterval);
		flipPage(-1);
	});
	jQuery('#nextShowcasePage').bind('click', function () {
		window.clearInterval(autoFlipInterval);
		flipPage(1);
	});
});

/**
 *	WORK DETAIL
 */

jQuery(function () {
	if (!jQuery('.workDetailRightCol').length) return;
	var config = {
		fadetime: 500, // time in milliseconds to fade the buttons
		movetime: 500, // time in milliseconds to move the images when a scroll button is clicked
		autoMoveTime: 3500, // time to wait between automatic movement
		slideEndless: true // [true] to have the works slider sliding endless ;; [false] to stop sliding at the last work
	};

	// feature navigation
		jQuery('.workDetailRightCol #featureNavigation a').bind('click', function () {
			var me = jQuery(this);
			// set active menu item
				me.siblings().removeClass('active');
				me.addClass('active');
			// show / hide overlayers
				jQuery('#featureDescription, #featureOtherProjects').hide();
				var container, aligner;
				if (me.attr('id') == "featureNavigationDescription") {
					container = jQuery('#featureDescription').show();
					container = container.find('.featureTextScroller');
					aligner = container.find('.featureTextAligner');
				} else if (me.attr('id') == "featureNavigationOtherWorks") {
					container = jQuery('#featureOtherProjects').show();
					container = container.find('.featureTextScroller');
					aligner = container.find('.featureTextAligner');
				}
			// vertically align text if no scrolling is needed
				if (aligner && aligner.length && aligner.innerHeight() < container.innerHeight())
					aligner.css('position', 'absolute')
		});

	// image slider
		jQuery('.workDetailRightCol .imgSlider').each(function () {
			// jquery objects
				var me = jQuery(this);
				var mover = me.find('.imgSliderImageList');
				var left = me.find('.imgSlideLeft');
				var right = me.find('.imgSlideRight');
				var overLeft = me.find('.imgOverLeft');
				var overRight = me.find('.imgOverRight');
				var autoMoveStopper = jQuery('#featureDescription, #featureOtherProjects');
			// values
				var imageCounter = mover.children('img').length;
				var imageIndex = 1;
				var buttonsLocked = false;
				var imageSize;
				var autoMoveInterval;
			// break if no scrolling is needed because of too few items
				if (imageCounter <= 1) return;
			// functions
				var hideMe = function () {
					jQuery(this).hide();
				};
				var fadeLeft = function (force) {
					if (overLeft.data('over') && (imageIndex > 1 || config.slideEndless) && (!left.is(':visible') || force)) left.stop().fadeTo(config.fadetime, 0.75);
					else if (imageIndex <= 1 && !config.slideEndless && left.is(':visible')) left.stop().fadeTo(config.fadetime, 0, hideMe);
				};
				var fadeRight = function (force) {
					if (overRight.data('over') && (imageIndex < imageCounter || config.slideEndless) && (!right.is(':visible') || force)) right.stop().fadeTo(config.fadetime, 0.75);
					else if (imageIndex >= imageCounter && !config.slideEndless && right.is(':visible')) right.stop().fadeTo(config.fadetime, 0, hideMe);
				};
				var slideImages = function (dir) {
					buttonsLocked = true;
					if (!imageSize) {
						imageSize = mover.find('img:first').outerWidth();
						mover.css('width', (imageCounter * (imageSize + 10)) + "px");
					}
					// prepare image movement
						if (config.slideEndless)
							if (dir > 0) imageIndex = 2;
							else {
								imageIndex = 1;
								mover.find('img:first').before(mover.find('img:last'));
								mover.css('left', '-' + imageSize + 'px');
							}
						else imageIndex += dir;
					mover.animate({'left': (0 - ((imageIndex - 1) * imageSize)) + "px"}, config.movetime, function () {
						// postprocessing of image movement
							if (config.slideEndless && dir > 0) {
								mover.find('img:last').after(mover.find('img:first'));
								mover.css('left', '0');
				 			}
						buttonsLocked = false;
					});
					fadeLeft();
					fadeRight();
				};
				var doAutoMove = function () {
					if (autoMoveStopper.is(':visible')) return;
					if (!config.slideEndless && imageIndex + 1 > imageCounter) imageIndex = 0;
					slideImages(1);
				};
			// events
				jQuery(window).bind('load', function () {
					clearInterval(autoMoveInterval);
					autoMoveInterval = window.setInterval(doAutoMove, config.autoMoveTime);
				});
				me.bind('mouseenter', function () {
					clearInterval(autoMoveInterval);
					autoMoveInterval = false;
				}).bind('mouseleave', function () {
					autoMoveInterval = window.setInterval(doAutoMove, config.autoMoveTime);
				});
				overLeft.bind('mouseenter', function () {
					jQuery(this).data('over', true);
					fadeLeft(true);
				}).bind('mouseleave', function () {
					jQuery(this).data('over', false);
					left.stop().fadeTo(config.fadetime, 0, hideMe);
				});
				overRight.bind('mouseenter', function () {
					jQuery(this).data('over', true);
					fadeRight(true);
				}).bind('mouseleave', function () {
					jQuery(this).data('over', false);
					right.stop().fadeTo(config.fadetime, 0, hideMe);
				});
				left.bind('click', function () {
					if (buttonsLocked) return;
					slideImages(-1);
				});
				right.bind('click', function () {
					if (buttonsLocked) return;
					slideImages(1);
				});
		});

});
