// JavaScript Document
/*
 * init
 */
$(function() {
	
	// Initialize history plugin.
	// The callback is called at once by present location.hash. 
	jQuery.historyInit(axm.navigate, "jquery_history.html");
	axm.initiateHistoryLinks();
	
	/*
	 * Scrollbar
	 */
	axm.initScrollbar();
	
	/*
	 * Plugins
	 */
	axm.initPlugins();

	/*
	 * Windows Fonts anpassen
	 */
	if (navigator.appVersion.indexOf("Win")!=-1) {
		$('#caseStudy').css({
			'font-size': '10px'
		});
		$('#projects li.box span.title span.text').css({
			'font-size': '10px'
		});
	}
	
});


/*
 * (a)cc(x)(m)edia Functions
 */
var axm = {
	
	caseStudiesOnly: false,
	
	initPlugins:	function() {
						/*
						 * LacyLoad
						 */
						if ($('#noLazyLoad').css('display') == 'none') {
							$("#content img:not(.noLazyLoad)").lazyload({
								placeholder: "img/0.png",
								effect: "fadeIn",
								event: "lazyLoad"
							});
						}
						
						/*
						 * FancyBox
						 */
						$('.fancyBox').fancybox({
							'titlePosition' : 'inside'
						});
						
						/*
						 * Project Hover Effekte
						 */
						axm.projectHover();
						
					},
	
	fieldWidth:	188,
	fieldSpaceH: 3,
	
	initiateHistoryLinks:	function() {
								// set onlick event for buttons
								$("a[rel*=history]").click(function(){
									var hash = this.href;
									hash = hash.replace(/^.*#/, '');
									// moves to a new page. 
									// pageload is called at once. 
									// hash don't contain "#", "?"
									$.historyLoad(hash);
									return false;
								});
							},
	
	lastHashs:		[],
	
	navigate:		function(hash) {
						//webkit bug
						if(hash == axm.lastHashs[(axm.lastHashs.length - 1)] && hash != '') {
							return;
						}
						
						$(window).scrollTop(0);
						
						if (hash == 'heaven') {
							// Seitentitel und Text neutralisieren:
							//Page-Title
							$(document).attr('title', 'acc cross media GmbH Innsbruck, Tirol');
							//Text
							$('#text').removeClass('home').html('');
							axm.goTo('heaven');
						} else if (hash == 'hell') {
							// Seitentitel und Text neutralisieren:
							//Page-Title
							$(document).attr('title', 'acc cross media GmbH Innsbruck, Tirol');
							//Text
							$('#text').removeClass('home').html('');
							axm.goTo('hell');
						} else if (hash.indexOf("-caseStudy:") != -1) {
							if (typeof axm.scrollbar.slider == "function") {
								axm.projectScroll = axm.scrollbar.slider("value");
								axm.projectScrollPX = axm.scrollContent.css('margin-left');
							}
							axm.closeMenu();
							axm.exit('anywhere');
							
							// Seitentitel und Text neutralisieren:
							//Page-Title
							$(document).attr('title', 'acc cross media GmbH Innsbruck, Tirol');
							//Text
							$('#text').removeClass('home').html('');
							
							setTimeout(function() {
								//Load CaseStudy
								axm.loadCaseStudy(hash.replace(/^(.*)-caseStudy:/, ""));
								//Menü markieren
								axm.activateNav(hash.replace(/-caseStudy:(.*)$/, ""));
							}, 300);
						} else if (hash.indexOf("caseStudy:") != -1) {
							if (typeof axm.scrollbar.slider == "function") {
								axm.projectScroll = axm.scrollbar.slider("value");
								axm.projectScrollPX = axm.scrollContent.css('margin-left');
							}
							//Load CaseStudy
							axm.loadCaseStudy(hash.replace("caseStudy:", ""));
						} else {
							var lastHash = (axm.lastHashs.length > 0 ? axm.lastHashs[axm.lastHashs.length - 1] : '');
							if (lastHash.indexOf('caseStudy') != -1) {
								if(hash == '') {
									hash = axm.defaultCleanString;
								}
								setTimeout(function() {
									axm.scrollbar.slider("value", axm.projectScroll);
									axm.scrollContent.animate({
										'margin-left': axm.projectScrollPX
									}, function(){
										axm.lazyLoad();
									});
								}, 300);
							}
							axm.exit('nav');
							axm.loadProjects(hash);
							axm.activateNav(hash);
						} 
						
						axm.lastHashs.push(hash);
					},
					
	activateNav: 	function(cleanString) {
						$('#mainNav li.active').removeClass('active');
						$('#mainNav a[href*=\\#' + cleanString + ']').parents('li').addClass('active');
					},
	
	loadCaseStudy:	function(id) {
						axm.showLoading();
						$('#caseStudy')
							.css('display', 'block')
							.load("ajax.php", {"lang": lang, "nodeID": nodeID, "action": "loadCaseStudy", "caseStudy": id}, function() {
								$('#projects,#projectsList').animate({
									'margin-top': '-570px'
								}, "slow", function() {
									$('#projects').css('display', 'none');
									axm.refreshScrollbar('loadCaseStudy');
								});
								axm.initPlugins();
								axm.hideLoading();
								/*
								 * IE 6 PNG Fix
								 */
								if($.browser.msie && $.browser.version == '6.0') {
									$("#closeBtn a img[src$=png]").ifixpng();
								} 
							});

					},
					
	closeCaseStudy:	function(dontChangeHash) {
						if (!dontChangeHash) {
							//Sucht den letzten Hash der keine CaseStudy ist um auf die Projektliste zurück zu gelangen
							for (var i = this.lastHashs.length - 1; i >= 0; i--) {
								if (this.lastHashs[i].indexOf("caseStudy:") == -1 && this.lastHashs[i] != '') {
									document.location.href = document.location.href.replace(/#(.*)$/i, "#" + this.lastHashs[i]);
									break;
								} else if (i == 0) {
									document.location.href = document.location.href.replace(/#(.*)$/i, "#" + this.defaultCleanString);
								}
							}
						}

						axm.exit('anywhere');
						setTimeout(function() {
							axm.scrollbar.slider("value", axm.projectScroll);
							if (!dontChangeHash) {
								axm.scrollContent.animate({
									'margin-left': axm.projectScrollPX
								}, function(){
									axm.lazyLoad();
								});
							}
						}, 300);
					},
	
	lastPlace: '',
	
	goTo:			function(place) {
						if(place == '') {
							return false;
						}
						if(place == 'hell') {
							if(document.location.href.indexOf('#') != -1) {
								document.location.href = document.location.href.replace(/#.*$/, '#hell');
							} else {
								document.location.href += '#hell';
							}
						}
						
						this.lastPlace = place;
						this.closeMenu();
						this.showLoading();
						axm.activateNav(place);
						axm.exit('anywhere');
						setTimeout(function() {
							//Ort laden
							$('#' + place)
								.load("ajax.php", {"lang": lang, "nodeID": nodeID, "action": place}, function() {
									switch(place) {
										case 'heaven':
											$('#heaven').fadeIn().animate({'margin-top': 0}, {duration:3000, queue: false});
											$('#projects,#projectsList').animate({
												'margin-top': '1300px'
											}, 3000, function() {
												$('#projects').css('display', 'none');
												axm.refreshScrollbar();
											});
											break;
										case 'hell':
											$('#hell').fadeIn().animate({'margin-top': '-730px'}, {duration:3000, queue: false});
											$('#projects,#projectsList').animate({
												'margin-top': '-1300px'
											}, 3000, function() {
												$('#projects').css('display', 'none');
												axm.refreshScrollbar();
											});
											break;
									}
									axm.initPlugins();
									axm.hideLoading();
								});
						}, 200);

					},

	
	exit:			function(place) {
						if(place == '') {
							return false;
						}
						if(place == 'nav') {
							$('#projects').css('display', 'block');
						}
						var duration = ((place == 'anywhere' || place == 'nav') ? 200 : 3000);
						
						// Ausgangssituation herstellen
						$('#heaven').stop().animate({'margin-top': '-1300px'}, {
							"duration": duration,
							"queue": false,
							"complete": function() {
								$('#heaven').css('display', 'none');
							}
						});
						$('#hell').stop().animate({'margin-top': 0}, {
							"duration": duration,
							"queue": false,
							"complete": function() {
								$('#hell').css('display', 'none');
								axm.refreshScrollbar();
							}
						});
						if (place == "anywhere") {
							$('#projects').css('display', 'block');
						}
						$('#projects').stop().animate({'margin-top': 0}, {
							"duration": duration,
							"queue": false,
							"complete": function() {
							} 
						});
						if (place == "anywhere") {
							$('#projectsList').css('display', 'block');
						}
						$('#projectsList').stop().animate({'margin-top': 0, 'left': '-1400px'}, {
							"duration": duration,
							"queue": false,
							"complete": function() {

							}
						});
						if (place == "anywhere") {
							$('#caseStudy').css('display', 'none');
						}
						$('#caseStudy').stop().animate({'margin-top': 0}, {
							"duration": duration,
							"queue": false,
							"complete": function() {

							} 
						});
					},
	
	loadProjects:	function(cleanString) {
						this.showLoading();
						this.closeMenu();
						// timeout damit zuerst menü hoch fährt und erst dann die boxen animiert werden
						setTimeout(function() {
							$.get(approot + "ajax.php", {"lang": lang, "nodeID": nodeID, "action": "loadProjects", "cleanString": cleanString, "caseStudiesOnly": axm.caseStudiesOnly}, function(res) {
								
								$('.scroll-content').queue("fx", function() {
									//verstecke nicht mehr gebrauchte							
									$.each(res.hidden, function(i, value) {
										$('#prjt' + value + ',#list' + value)
											.fadeOut(
												function() {
													$(this).css({
														'left': '-396px',
														'top': '-396px'
													});
												}
											);
									});
									$(this).dequeue();
									
									// Spaltenanzahl für Projektmenüdefinieren
									var displayedProjectsCount = 0;
									$.each(res.positions,function(){displayedProjectsCount++;});
									$('#projectsList ul').attr("style", 
										'width:' + (Math.ceil(displayedProjectsCount/20) * 250 - 50) + 'px; '+ 
										'column-count:' + Math.ceil(displayedProjectsCount/20) + '; '+ 
										'-moz-column-count:' + Math.ceil(displayedProjectsCount/20) + '; '+ 
										'-webkit-column-count:' + Math.ceil(displayedProjectsCount/20) + ';'
									);
									
									//gebrauchte anzeigen und neu sortieren
									$.each(res.positions, function(id, value) {
										if(parseInt($('.scroll-content').find('#prjt' + id).css('left')) < 0) {
											$('.scroll-content')
												.find('#prjt' + id)
												.fadeIn()
												.css({
													'left': value.left + 'px'
												});
										}
										$('#prjt' + id + ',#list' + id).fadeIn()
											.animate({
													'top': value.top + 'px',
													'left': value.left + 'px'
												},
												800,
												'easeInExpo',
												function() {
													//Wenn letztes Element positioniert, Scrollbar anpassen
													if (value.last) {
														axm.refreshScrollbar();
													}
												}
											)
											.attr('class', 'box ' + value.type + ' col' + value.col)
											.find('.grid')
											.attr('class', 'grid row' + value.row);
									});
									$(this).dequeue();
								});
								
								//Page-Title
								$(document).attr('title', res.title);
								
								//Text
								$('#text').removeClass('home').html(res.text);
								if(cleanString == 'home' || cleanString == '') {
									$('#text').addClass('home');
								}
								
								axm.hideLoading();
							});
						}, 300);
					},
	
	getMaxRight:	function() {
						// Liefert das äußerst plazierte Element
						axm.maxRight = 0;
						axm.maxrightObj = {};
						$('.scroll-content ul:visible li').each(function(i, el) {
							if($(el).width() + parseInt($(el).css('left')) > axm.maxRight && $(el).css('display') != 'none') {
								axm.maxRight = $(el).width() + parseInt($(el).css('left'));
								axm.maxrightObj = el;
							}
						});
						return axm.maxrightObj;
					},
	
	maxRight 		: 0,
	maxrightObj 	: '',
	resizeContentArea:	function() {
							// Passt denn Scrollbaren Inhalt anhand des äußersten Element oder min. der Fensterbreite an
							axm.getMaxRight();
							$('.scroll-content').css({
								"width": Math.max(axm.maxRight, $(window).width() - 1) + "px"
							});
						},
	
	lazyLoad:		function() {
						var leftShownCol = Math.floor(parseInt(axm.scrollContent.css('margin-left'))*-1 / (axm.fieldWidth + axm.fieldSpaceH));
						var countColsShown = Math.floor($(window).width() / (axm.fieldWidth + axm.fieldSpaceH));
						for (var i = leftShownCol; i <= (leftShownCol + countColsShown); i++) {
							$('.col' + i + ' img').trigger('lazyLoad');
							/*
							 * IE 6 PNG Fix
							 */
							if($.browser.msie && $.browser.version == '6.0') {
								$('.col' + i + ' img[src$=png]').ifixpng();
							} 
						}
					},
	
	/*
	 * Scrollbar
	 */
	scrollPane: 	{},
	scrollContent: 	{},
	scrollbar: 		{},	
	handleHelper : 	{},
	touchValues : {},
	initScrollbar: 	function() {
		
						axm.resizeContentArea();
		
						//scrollpane parts
						axm.scrollPane = $('.scroll-pane');
						axm.scrollContent = $('.scroll-content');
						
						//build slider
						axm.scrollbar = $(".scroll-bar").slider({
							animate:true,
							slide: axm.slideContent,
							min: 0,
							max: 100
						});
						
						/*
						 * Mousewheel abgreifen
						 */
						axm.scrollContent.bind("mousewheel", function(event, delta) {
							var speed = 1;
							var sliderVal = axm.scrollbar.slider("option", "value");
							sliderVal += ((delta*-1)*speed);
							if (sliderVal > axm.scrollbar.slider("option", "max")) {
								sliderVal = axm.scrollbar.slider("option", "max");
							} else if (sliderVal < axm.scrollbar.slider("option", "min")) {
								sliderVal = axm.scrollbar.slider("option", "min");
							}
							axm.scrollbar.slider("value", sliderVal);
							axm.slideContent();
							event.preventDefault();
						});
						
						/*
						 * Swipe abgreifen
						 */
						axm.scrollContent.bind('touchstart', function(e){
							axm.touchValues.down = e.originalEvent.touches[0].pageX;
							
						});
						axm.scrollContent.bind('touchmove', function(e){
							var delta = axm.touchValues.down - e.originalEvent.touches[0].pageX;

							var speed = 0.01;
							var sliderVal = axm.scrollbar.slider("option", "value");
							sliderVal += delta*speed;
							if (sliderVal > axm.scrollbar.slider("option", "max")) {
								sliderVal = axm.scrollbar.slider("option", "max");
							} else if (sliderVal < axm.scrollbar.slider("option", "min")) {
								sliderVal = axm.scrollbar.slider("option", "min");
							}
							axm.scrollbar.slider("value", sliderVal);
							axm.slideContent();
						});

						
						/*
						 * Scroll-Buttons
						 */
						$('#btnScrollLeft,#btnScrollRight').mousedown(axm.scrollByButton);
						$('#btnScrollLeft,#btnScrollRight').mouseup(axm.stopScrollByButton);
						
						//append icon to handle
						axm.handleHelper = axm.scrollbar.find('.ui-slider-handle')
						.mousedown(function(){
							axm.scrollbar.width( axm.handleHelper.width() );
						})
						.mouseup(function(){
							axm.scrollbar.width( '100%' );
						})
						//.append('<span class="icoArrowRight"></span>')
						//.append('<span class="icoArrowLeft"></span>')
						.append('<span class="ui-icon ui-icon-grip-dotted-vertical"></span>')
						.wrap('<div class="ui-handle-helper-parent"></div>').parent();
						
						//change overflow to hidden now that slider handles the scrolling
						axm.scrollPane.css('overflow','hidden');
					
						//change handle position on window resize
						$(window).resize(function(){
							axm.refreshScrollbar();
						});
						//init scrollbar size
						setTimeout(function(){
							axm.sizeScrollbar();
							//LazyLoad Images
							axm.lazyLoad();
						},10);//safari wants a timeout

					},
					
	slideContent:	function(e, ui){
						if( axm.scrollContent.width() > axm.scrollPane.width() ) {
							var value = (typeof(ui) != 'undefined' ? ui.value : axm.scrollbar.slider("option", "value"));
							if (e == 'animated') {
								axm.scrollContent.animate({'margin-left': Math.round(value / 100 * (axm.scrollPane.width() - axm.scrollContent.width())) + 'px'});
							} else {
								axm.scrollContent.css('margin-left', Math.round( value / 100 * ( axm.scrollPane.width() - axm.scrollContent.width() )) + 'px');
							}
						} else {
							axm.scrollContent.css('margin-left', 0);
							$('.ui-slider-handle').css('left', '0 !important');
						}
						//LazyLoad Images
						axm.lazyLoad();
					},
	
	scrollInterval:	'',	
	scrollByButton:	function(interval, id) {
						if(!id) {
							var id = $(this).attr('id');
						}
						var sliderVal = axm.scrollbar.slider("option", "value");
						if (id == 'btnScrollLeft') {
							sliderVal -= 1;
						}
						else {
							sliderVal += 1;
						}
						if (sliderVal > axm.scrollbar.slider("option", "max")) {
							sliderVal = axm.scrollbar.slider("option", "max");
						} else if (sliderVal < axm.scrollbar.slider("option", "min")) {
							sliderVal = axm.scrollbar.slider("option", "min");
						}
						axm.scrollbar.slider("value", sliderVal);
						axm.slideContent();
						if (typeof(interval) == 'object') {
							axm.scrollInterval = setInterval(function(){
								axm.scrollByButton(true, id);
							}, 50);
						}
					},
					
	stopScrollByButton:	function() {
							clearInterval(axm.scrollInterval);
						},
	
	projectScroll: 		0,
	projectScrollPX: 	0,
	
	refreshScrollbar: function(calledFrom, dontChangeMargin) {
						axm.resizeContentArea();
						axm.sizeScrollbar();
						switch(calledFrom) {
							case 'loadCaseStudy':
								axm.scrollbar.slider("value", 0);
								axm.scrollContent.animate({
									'margin-left': 0
								}, function() {
									axm.lazyLoad();
								});
								break;
								
							case 'closeCaseStudy':
								axm.scrollbar.slider("value", axm.projectScroll);
								if (!dontChangeMargin) {
									axm.scrollContent.animate({
										'margin-left': axm.projectScrollPX
									}, function(){
										axm.lazyLoad();
									});
								}
								break;
							
							default:
								setTimeout(function() {axm.resetValue();}, 10);
								break;
						}
						axm.reflowContent();
						//LazyLoad Images
						axm.lazyLoad();
					},
	
	//size scrollbar and handle proportionally to scroll distance
	sizeScrollbar: 	function(){
						var remainder = axm.scrollContent.width() - axm.scrollPane.width();
						var proportion = remainder / axm.scrollContent.width();

						var handleSize = axm.scrollPane.width() - (proportion * axm.scrollPane.width());
						if(handleSize >= $(window).width() - 63) {
							handleSize = $(window).width() - 63;
							axm.scrollbar.find('.ui-slider-handle').addClass('deactivated');
							$('#btnScrollLeft,#btnScrollRight').addClass('deactivated');
						} else {
							axm.scrollbar.find('.ui-slider-handle').removeClass('deactivated');
							$('#btnScrollLeft,#btnScrollRight').removeClass('deactivated');
						}
						axm.scrollbar.find('.ui-slider-handle').css({
							width: handleSize,
							'margin-left': -handleSize/2
						});
						axm.handleHelper.width($(window).width() - 63 - handleSize);
						$('.ui-slider-horizontal').width($(window).width() - 63 - handleSize);
					},
					
	//reset slider value based on scroll content position
	resetValue: 	function(){
						var remainder = axm.scrollPane.width() - axm.scrollContent.width();
						var leftVal = axm.scrollContent.css('margin-left') == 'auto' ? 0 : parseInt(axm.scrollContent.css('margin-left'));
						var percentage = Math.round(leftVal / remainder * 100);
						axm.scrollbar.slider("value", percentage);
					},
	
	//if the slider is 100% and window gets larger, reveal content
	reflowContent: 	function(){
						var showing = axm.scrollContent.width() + parseInt( axm.scrollContent.css('margin-left') );
						var gap = axm.scrollPane.width() - showing;
						if(gap > 0){
							axm.scrollContent.css('margin-left', Math.min(0, parseInt( axm.scrollContent.css('margin-left') ) + gap) );
						}
					},
					
	projectHover:	function() {
						/*
						 * BOX Hover Animation
						 */
						$('.box').hover(function(e) {
							var pos = (e.pageX - (this.offsetLeft + parseInt(axm.scrollContent.css('margin-left'))));
							if(pos < Math.ceil($(this).width()/2)) {
								//fadein von links
								$(this).find('.title').stop().css({'left': '-' + $(this).find('.title').width() + 'px'}).animate({'left': '0'});
							} else {
								//fadein von rechts
								$(this).find('.title').stop().css({'left': $(this).find('.title').width() + 'px'}).animate({'left': '0'});
							}
							$(this).find('.grid,.monochrome').stop().animate({
								'opacity': 0
							}, 400);
						}, function(e) {
							var pos = (e.pageX - (this.offsetLeft + parseInt(axm.scrollContent.css('margin-left'))));
							if(pos > Math.ceil($(this).width()/2)) {
								//fadeout nach rechts
								$(this).find('.title').stop().animate({'left': $(this).width() + 'px'}, 400);
							} else {
								//fadeout nach links
								$(this).find('.title').stop().animate({'left': '-' + $(this).width() + 'px'}, 400);
							}
							
							$(this).find('.grid,.monochrome').stop().animate({
								'opacity': 1
							}, 400);
						});
					},
					
	openMenu:		function() {
						$('#header').stop().animate({'height':'170px'}, "fast");
					},
					
	closeMenu:		function() {
						$('#header').stop().css({'overflow': 'hidden'}).animate({'height':'60px'}, "fast");
					},
	
	toggleOverlay: function(selector) {
						// Overlay-Position korrigieren (wenn Casestudy & Overlay aktiv und Overlay nach oben geschoben wurde)
						if(parseInt($(selector).css('left')) == 0 && parseInt($(selector).css('margin-top')) < 0) {
							$(selector)
								.css({
									'left': '-1400px'
								})
						}
						
						// Overlay anzeigen
						if(parseInt($(selector).css('left')) < 0) {
							$(selector)
								.css({
									'margin-top': 0
								})
								.animate({
									'left': 0
								});
						// Overlay ausblenden
						} else {
							$(selector).animate({
								'left': '-1400px'
							});
						}
					},
	
	toggleProjectList:	function() {
						this.toggleOverlay('#projectsList');
					},
					
	toggleImprint:	function() {
						$(document).scrollTop(0);
						this.toggleOverlay('#imprint');
					},
					
	scrollNews:		function(page, obj) {
						$('ul.newsList').animate({
							"margin-left": ((page-1) * -390) + "px"
						});
						$('ul.pages li img[src$=_active.png]').attr('src', 'img/page.png');
						$(obj).children('img').attr('src', 'img/page_active.png');
					},
					
	showLoading:	function() {
						$('#loading').stop().animate({
							'left': 0
						});
					},
					
	hideLoading:	function() {
						$('#loading').stop().animate({
							'left': '-200px'
						});
					}
	
};
