$(document).ready(function() {
	// Global variables
	var anchor = location.toString().substring(location.toString().indexOf("#") + 1);
	var lang = $('body').attr('rel');

	// Hide navigation entries when not logged in.
	$('.notLoggedIn #navigation ul li ul a[href^="/' + lang + '/pricelist-login/"]').each(function () {
		$(this).parent().hide();
	});

	// print
	$('#print').click(function() {
		window.print();
	});
	
	// language-switcher
	/*$('#language-current').click(function() {
		$('#language-chooser').slideToggle();
	});
	*/

	$('#language-chooser').css('left', $('#language-left').width() + 'px');

	// search
	$('#search-input').focus(function() {
		$(this).addClass('search-input-active');
		if ($(this).val() == 'Search' || $(this).val() == 'Suche') {
			$(this).val('');
		}
		$('#search-dialog').slideDown(200);
	});

	// this yields inevitably an error in iE
	$('#search-input').blur(function() {
		$(this).removeClass('search-input-active');
	});

	$('#search-closer').click(function(){
		$('#search-dialog').slideToggle(200, function(){
			$('#search-result-list').html('').hide();
		});
	});

	$('input[name=search-context]').change(function(){
		$('#search-input').keyup();
	});

	$('#search-input').keyup(function() {
		var q = $(this).val();
		var searchContext = $('input[name=search-context]:checked').val(); 
		if (q.length < 3) {
			return false;
		}
		$('#search-ajax').show();
		$.post('/' + lang + '/search.html', {'q':q, 'searchContext':searchContext}, function(res) {
			$('#search-result-list').html(res);
			$('#search-result-list').slideDown();
			$('#search-ajax').fadeOut();
		}, 'text');
	});

	// i18n breadcrumb
	$('#breadcrumb a').each(function() {
		var location = '/' + lang + $(this).attr('href');
		$(this).attr('href', location);
	});

	// mini-gallery
	var relCount = 0;
	$('.gallery').each(function() {
		var rel = 'gallery' + relCount;
		$(this).find('.gallery-item').each(function() {
			var thumbImage = $(this).find('img.thumb');
			var bigImage = $(this).find('img.big');
			var pre = $(this).attr('rel');
			var src = bigImage.attr('src');
			var tmp = src.split('.');
			var ext = (tmp[(tmp.length-1)]).toLowerCase();
			var txt = $(this).attr('title');
			$(this).attr('rel', rel);
			$(this).attr('href', src);
			
			if (ext == 'jpg') {
				// Check if there's a preview available, else fallback to thumb of image itself.
				if (pre) {
					thumbImage.attr('src', pre);
				}
			}
			else if (ext == 'flv') {
				// TODO: code missing here
			}
			$(this).colorbox({
				transition:'elastic',
				preloading: true
			});
		});
		$(this).click(function(){return false});
		relCount++;
	});
	
	// product-overview
	$('#product-overview .sliderbox').each(function() {
		sliderBox.init(this);
	});

	// Show distributor when page is loaded.
	if (anchor.indexOf('distributor') == 0) {
		showDistributor(anchor);
	}

	// Validate contact form
	$('#contactform').submit(function() {
		return validateForm('contactform');
	});

	// Validate registration form
	$('#registrationform').submit(function() {
		$('#registerFullName').val($('#registerFirstName').val() + ' ' + $('#registerLastName').val());
		$('#registerUsername').val($('#registerEmail').val());
		return validateForm('registrationform');
	});

	// Validate login form
	$('#loginform').submit(function() {
		return validateForm('loginform');
	});

	// Show/hide registration form
	$('#show-registration').click(function() {
		$('#loginform').toggle();
		$('#registrationform').toggle();
	});

	// Show/hide forgotpassword form
	$('#show-forgotpassword').click(function() {
		$('#registration-loginform-part').toggle();
		$('#forgotpasswordform').toggle();
	});

	// Validate forgot password form
	$('#forgotpasswordform').submit(function() {
		return validateForm('forgotpasswordform');
	});

	// Preselect select value
	$('select.preselect').each(function() {
		var value = $(this).attr('rel');
		if (value && value != '') {
			$(this).find('option[value=\'' + value  + '\']').attr('selected', 'selected');
		}
	});

	// Validate change profile form
	$('#changeprofileform').submit(function() {
		$('#changeprofileFullName').val($('#changeprofileFirstName').val() + ' ' + $('#changeprofileLastName').val());
		// Currently change email (=username) isn't supported.
		//$('#changeprofileUsername').val($('#changeprofileEmail').val());
		return validateForm('#changeprofileform');
	});

	// Validate calculator form
	$('#calculationform').submit(function() {
		$('#emailOffer').val($('#offer').html());
		return validateForm('calculationform');
	});

	// Gallery
	$('.gallery-left .help a').click(function() {
		$('#help-text').slideToggle();
	});

	$('#galleryform select').change(function() {
		if ($(this).attr('name') == 'photographer') {
			$('#galleryform #camera').val('');
			$('#galleryform #lens').val('');
			$('#galleryform #solution').val('');
		}
		$('#galleryform #num').val('');
		$('#galleryform #image').val('');
		$('#galleryform').submit();
	});

	$('.gallery-left .batchingbar a').click(function() {
		$('#galleryform #num').val($(this).attr('rel'));
		$('#galleryform').submit();
	});

	$('#gallery-thumbnails a').click(function() {
		$('#galleryform #image').val($(this).attr('rel'));
		$('#galleryform').submit();
	});

	$('.small-batchingbar a').click(function() {
		$('#galleryform #image').val($(this).attr('rel'));
		$('#galleryform').submit();
	});

	/**
	 * Glossary
	 */

	$('.glossary-item').each(function() {
		$(this).find('a.title').click(function() {
			$(this).next().slideToggle();
			return false;
		});
	});

	// Intro
	if ($('#intro').length == 1) {
		// Vertically center images
		var bannerHeight = $('#intro .intro-banner').height();
		$('#intro .title-image').each(function () {
			$(this).css('top', ((bannerHeight - $(this).height()) / 2) + 'px');
		});
		$('#intro .content-image').each(function () {
			$(this).css('top', ((bannerHeight - $(this).height()) / 2) + 'px');
		});

		// Remove unused buttons
		$('#intro .paragraph-intro:first .intro-next').remove();
		$('#intro .paragraph-intro:last .intro-previous').remove();

		// Fade-in buttons
		$('#intro .intro-banner').mouseenter(function() {
			$('#intro .intro-navigation').fadeIn("fast");
		});
		$('#intro .intro-banner').mouseleave(function() {
			$('#intro .intro-navigation').fadeOut("fast");
		});

		// Move intro strip to the left
		var count = $('#intro .paragraph-intro').size();
		var width = $('#intro .intro-banner:first').width();
		if (count > 0) {
			$('#intro').css('left', -((count * width) - width) + 'px');
		}

		// Button actions
		$('#intro .intro-navigation').click(function() {
			var width = $('#intro .intro-banner:first').width();
			var curLeftPos = parseInt($('#intro').css('left'));
			$('#intro .intro-navigation').hide();

			// Previous
			if ($(this).hasClass('intro-previous')) {
				$('#intro').animate({
					left: curLeftPos - width + 'px'
				}, 600, "swing" );
			}

			// Next
			else {
				$('#intro').animate({
					left: curLeftPos + width + 'px'
				}, 600, "swing" );
			}
			return false;
		});

	}

	// Calculator
	if ($('#calculator').length == 1) {
		// Recalculate total
		$('#calculator input.amount').change(function() {
			updateCalculation();
		});
		$('#calculator textarea.additional-info').change(function() {
			updateCalculation();
		});
	}

	// Calculator form: deactivate unused input fields
	$('#calculationform input[type=radio]').change(function() {
		if ($(this).val() == 'order') {
			$('#calculationform input.dependent').attr('disabled', false).css('border-color', '#000000').css('background-color', '#ffffff').css('color', '#000000');
			$('#calculationform label.dependent').css('color', '#000000');
		}
		else {
			$('#calculationform input.dependent').attr('disabled', true).css('border-color', '#dfdfdf').css('background-color', '#f2f2f2').css('color', '#dfdfdf');
			$('#calculationform label.dependent').css('color', '#dfdfdf');
		}

	});

	// Write Sound on/off cookie
	$('.sound-toggle').click(function() {
		if ($.cookie("sound") == 'off') {
			$.cookie("sound", "on", { path: '/', expires: 365 });
		}
		else {
			$.cookie("sound", "off", { path: '/', expires: 365 });
		}
	});

	// Write language cookie
	$('#language-chooser a').each(function() {
		$(this).click(function() {
			var language = $(this).text();
			$.cookie("language", language, { path: '/', expires: 365 });
		});
	});
});

/**
 * Update calculation form
 */

function updateCalculation() {
	var offerHtml = $('#calculationTitle').html();
	offerHtml += '<table class="calculator" cellspacing="0" border="0">';
	offerHtml += '<tr>' + $('#calculator .header').html() + '</tr>';
	var totalAmount = 0;
	var totalPriceProfessional = 0;
	var totalPriceDealer = 0;
	var totalPriceDistributor = 0;
	var alt = 0;
	$('#calculator input.amount').each(function() {
		if ($(this).val() != ''&& isNumber($(this).val()) && $(this).val() != '0') {
			var amount = parseInt($(this).val());
			totalAmount += amount;
			var columnId = '#' + $(this).attr('rel');
			var column = $(columnId);
			var priceProfessional = $(column).find('.priceProfessional').text();
			if (priceProfessional != '' && isFloat(priceProfessional)) {
				priceProfessional = priceProfessional.replace(/,/g, '.');
				totalPriceProfessional += amount * priceProfessional; 
			}
			var priceDealer = $(column).find('.priceDealer').text();
			priceDealer = priceDealer.replace(/,/g, '.');
			if (priceDealer != '' && isFloat(priceDealer)) {
				totalPriceDealer += amount * priceDealer; 
			}
			var priceDistributor = $(column).find('.priceDistributor').text();
			priceDistributor = priceDistributor.replace(/,/g, '.');
			if (priceDistributor != '' && isFloat(priceDistributor)) {
				totalPriceDistributor += amount * priceDistributor; 
			}
			var rowClass = alt == 0 ? 'even' : 'odd';
			offerHtml += '<tr class="row-' + rowClass + '"><td>' + amount  + '</td>';
			offerHtml += column.html();
			offerHtml += '<td>' + $(column).find('.additional-info').val().replace(/\n/g, '<br />') + '</td></tr>';
			alt = ((alt + 1) %2);
		}
		else {
			$(this).val('');
		}
	});
	offerHtml += '</table>';

	var eurRate = $('#eurRate').val();
	var usdRate = $('#usdRate').val();

	var totalPriceProfessionalString = 'CHF ' + totalPriceProfessional.toFixed(2) + '<br/>';
	totalPriceProfessionalString += 'EUR ' + (totalPriceProfessional * eurRate).toFixed(2) + '<br/>';
	totalPriceProfessionalString += 'USD ' + (totalPriceProfessional * usdRate).toFixed(2) + '<br/>';

	var totalPriceDealerString = 'CHF ' + totalPriceDealer.toFixed(2) + '<br/>';
	totalPriceDealerString += 'EUR ' + (totalPriceDealer * eurRate).toFixed(2) + '<br/>';
	totalPriceDealerString += 'USD ' + (totalPriceDealer * usdRate).toFixed(2) + '<br/>';

	var totalPriceDistributorString = 'CHF ' + totalPriceDistributor.toFixed(2) + '<br/>';
	totalPriceDistributorString += 'EUR ' + (totalPriceDistributor * eurRate).toFixed(2) + '<br/>';
	totalPriceDistributorString += 'USD ' + (totalPriceDistributor * usdRate).toFixed(2) + '<br/>';

	$('#calculatorTotalAmount').text(totalAmount);
	$('#calculatorTotalPriceProfessional').html(totalPriceProfessionalString);
	$('#calculatorTotalPriceDealer').html(totalPriceDealerString);
	$('#calculatorTotalPriceDistributor').html(totalPriceDistributorString);
	offerHtml += $('#calculationTotalTitle').html();
	offerHtml += '<br/><table class="calculator" cellspacing="0" border="0">';
	offerHtml += $('#calculatorTotal').html();
	offerHtml += '</table>';
	$('#offer').html(offerHtml);
	$('#offer .offerRequest-remove').each(function() {
		$(this).remove();
	});
	var baseUrl = $('#baseUrl').val();
	$('#offer img').each(function() {
		// in IE8 the src starts with http://
		if ($(this).attr('src').indexOf('http://') == 0) {
			$(this).attr('src', $(this).attr('src'));
		}
		else {
			$(this).attr('src', baseUrl + $(this).attr('src'));
		}
	});
	$('#offer a').each(function() {
		// in IE8 the src starts with http://
		if ($(this).attr('href').indexOf('http://') == 0) {
			$(this).attr('href', $(this).attr('href'));
		}
		else {
			$(this).attr('href', baseUrl + $(this).attr('href'));
		}
	});
}

/**
 * A simple sliderBox emulating the default OS behaviour with a little more spice in a crossbrowser-fun fashion
 * @author Benny Zaminga <benny.zaminga@openinteractive.ch>
 */
window.sliderBox = {
	init: function(box) {
		var slider = $('.slider',box);
		slider.css('overflow-x','hidden');
		$('.product',slider).mouseover(function(){$(this).addClass('active')});
		$('.product',slider).mouseout(function(){$(this).removeClass('active')});
		// show and apply slider-functionality only if there is really something to slide
		var swidth = sliderBox.sliderWidth(slider);
		slider.width(swidth);	// fixed: seems that margin between products is not correctly calculated
		if (swidth > 780) {
			$('.trigger-left',box).click(function() {
				var slider = $(this).parent();
				if (sliderBox.checkPositionLeft(slider)) {
					slider.animate(
						{marginLeft: '+=100px'}, 
						750, 
						'easeOutQuint',
						function(){
							sliderBox.repositionScroller(box);
						}
					);
				}
			});
			$('.trigger-right',box).click(function() {
				var slider = $(this).parent();
				if (sliderBox.checkPositionRight(slider)) {
					slider.animate(
						{marginLeft: "-=100px"}, 
						750, 
						'easeOutQuint',
						function(){
							sliderBox.repositionScroller(box);
						}
					);
				}
			});
			// init scroller (only if necessary)
			$('.scroller-inner',box).draggable({
				axis: 'x',
				containment: 'parent',
				cursor: 'move',
				//grid: [Math.round(700/($('.product',$('.slider',box)).length)),0],
				drag: function(event,ui){					
					var slider = $('.slider',box);
					var scrollpos = ui.position.left;
					var scrollper = scrollpos / (700-40);
					var newpos = Math.round((swidth-780) * scrollper);
					slider.stop();
					slider.animate(
						{marginLeft: newpos*-1+"px"},
						{
							delay: 250,
							duration: 750, 
							easing: 'easeOutQuint'
						}
					);
					// show/hide arrow-buttons
					sliderBox.checkPositionLeft(slider);
					sliderBox.checkPositionRight(slider);
				}
			});
			// init hovers (left and right)
			$('.hover-left',box).hover(
				function(){
					var slider = $('.slider',box);
					this.scrolly = setInterval(function(){
						var offset = slider.css('margin-left').replace('px','');
						var swidth = sliderBox.sliderWidth(slider);
						if (offset>0) return true;
						sliderBox.moveSlider(slider,6);
						return true;
					},25);
				},
				function(){
					clearInterval(this.scrolly);
				}
			);
			$('.hover-right',box).hover(
				function(){
					var slider = $('.slider',box);
					this.scrolly = setInterval(function(){
						var offset = Math.abs(slider.css('margin-left').replace('px',''));
						var swidth = sliderBox.sliderWidth(slider);
						if ((offset+780)>swidth) return true;
						sliderBox.moveSlider(slider,-6);
						return true;
					},25);
				},
				function(){
					clearInterval(this.scrolly);
				}
			);
			// hide left trigger and hover on init, since we're all left
			$('.trigger-left',box).hide();
			$('.hover-left',box).hide();
		} else {
			// remove triggers and scroller (nothing to scroll)
			$('.trigger-left',box).remove();
			$('.trigger-right',box).remove();
			$('.scroller',box).remove();
			$('.hover-left',box).hide();
			$('.hover-right',box).hide();
		}
	},
	
	moveSlider: function(slider,offset){
		var currentPos = $(slider).css('margin-left').replace('px','');
		$(slider).stop(); // must stay here to prevent filling the stack with events (preserve snappiness)
		$(slider).animate(
			{marginLeft: '+='+offset+'px'},
			0,
			function(){
				sliderBox.repositionScroller($(slider).parent());
			}
		);
		return true;
	},
	
	checkPositionLeft: function(slider) {
		var pos = $(slider).css('margin-left').replace('px','');
		var triggers = sliderBox.getTriggers(slider);
		var hovers = sliderBox.getHovers(slider);
		if (Math.abs(pos) < 25) {	// add some tolerance
			triggers.ltrigger.hide();
			hovers.lhover.hide();
			return false;
		} else {
			triggers.ltrigger.show();
			hovers.lhover.show();
			return true;
		}
	},
	
	checkPositionRight: function(slider) {
		var pos = $(slider).css('margin-left').replace('px','');
		var triggers = sliderBox.getTriggers(slider);
		var hovers = sliderBox.getHovers(slider);
		var swidth = sliderBox.sliderWidth(slider);
		if ((swidth - Math.abs(pos)) < (780+25)) {	// add some tolerance
			triggers.rtrigger.hide();
			hovers.rhover.hide();
			return false;
		} else {
			triggers.rtrigger.show();
			hovers.rhover.show();
			return true;
		}
	},
	
	repositionScroller: function(box){
		var scroller = $('.scroller-inner',box);
		var slider = $('.slider',box);
		var swidth = sliderBox.sliderWidth(slider);
				
		var numProducts = $('.product',box).length;
		var sliderOffset = slider.css('margin-left').replace('px','');
		var scrollerOffset = (660*sliderOffset) / (780-swidth); 
		
		var currentPos = scroller.css('left').replace('px','');
		if (scrollerOffset <   0) scrollerOffset = 0;
		if (scrollerOffset > 660) scrollerOffset = 660;
		
		scroller.stop();
		scroller.animate({left: scrollerOffset+"px"},{
			//duration: 500, 
			//easing: 'easeOutElastic',
			complete: function(){
				sliderBox.checkPositionLeft(slider);
				sliderBox.checkPositionRight(slider);
			}
		});
	},
	
	sliderWidth: function(slider) {
		var prods  = $('.product',slider);
		var swidth = (prods.length) * ($(prods[0]).width()+15);
		return swidth;
	},
	
	getTriggers: function(slider) {
		var ltrigger = $('.trigger-left',$(slider).parent());
		var rtrigger = $('.trigger-right',$(slider).parent());
		var triggers = {'ltrigger':ltrigger,'rtrigger':rtrigger};
		return triggers;
	},
	
	getHovers: function(slider){
		var lhover = $('.hover-left',$(slider).parent());
		var rhover = $('.hover-right',$(slider).parent());
		var hovers = {'lhover':lhover,'rhover':rhover};
		return hovers;
	}
}

/**
 * Show distributors for current country.
 */

function showDistributor(distributorId) {
	var distributorContent = $('#' + distributorId);
	var distributorCountry = $('#' + distributorId + '_country');
	// First hide all but the already open distributors to avoid flickering.
	$('.distributor-content').each(function (hideDistributor) {
		if (this.id != distributorId) {
			$(this).slideUp('slow');
		}
	});
	// Remove the red class from all countries.
	$('.distributor-container .title').each(function (resetCountry) {
		$(this).find('h2').removeClass('red');
	});

	// Add the red class if the country is open.
	if (distributorContent.css('display') == 'none') {
		distributorCountry.find('h2').addClass('red');
	}

	// Toggle the selected distributor.
	distributorContent.slideToggle('slow');

	return false;
}

/**
 * Form validation
 */

function validateForm(formName) {
	var proceed = true;

	// input, textarea
	$('#' + formName + ' :input.mandatory').each(function() {
		if ($(this).val() == '') {
			$(this).addClass('error');
			proceed = false;
		}
		else {
			$(this).removeClass('error');
		}
	});

	// select
	$('#' + formName + ' :select.mandatory').each(function() {
		if ($(this).val() == '') {
			$(this).addClass('error');
			proceed = false;
		}
		else {
			$(this).removeClass('error');
		}
	});

	// radio, checkbox
	$('#' + formName + ' label.rel-mandatory').each(function() {
		var name = $(this).attr('rel');
		if (! $('input[name='+ name  +']:checked').val()) {
			$(this).addClass('error');
			proceed = false;
		}
		else {
			$(this).removeClass('error');
		}
	});

	// email
	var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	$('#' + formName + ' :text.validate-email').each(function() {
		if (! reg.test($(this).val())) {
			$(this).addClass('error');
			proceed = false;
		}
		else {
			$(this).removeClass('error');
		}
	});

	// password confirmation
	$('#' + formName + ' :input[type=password]').each(function() {
		var name = $(this).attr('rel');
		if (name && $(this).val() != '' && $(this).val() != $('#' + name).val()) {
			$('#' + name).addClass('error');
			proceed = false;
		}
		else {
			$('#' + name).removeClass('error');
		}
	});

	return proceed;
}

/**
 * Check for a numeric value
 */

function isNumber(value) {
	if (! value.toString().match(/^\d*$/)) {
		return false;
	}
	else {
		return true;
	}
}

function isFloat(value) {
	if (! value.toString().match(/^[-]?\d*\.?,?\d*$/)) {
		return false;
	}
	else {
		return true;
	}
}
