/**
 * @fileoverview File with all the function used on the page
 *
 * @version 1.0
 * @author DHIMAHI
*/

/**
 * Handle seatmap previews
 *
 * @param /
 *
 * @return /
 *
 * @require getSeatmapResults(objHtmlHolder, ajaxUrl)
 *
 * @requireIn document.ready
 *
 * @onPage shopping process (performance.tpl)
 */
function handleSeatmapPreviews(){
	var ajaxRequestHolder	= $("#seatmap-selection");
	var previewHolder		= $("#best-seat-selection");
	var previewHolderH1		= $("#seatmap-selection h1");

	// greab urls for seatmaps
	var seatmap_interactive_path = $("#btn_seatmap_interactive").attr("rel");

	// hide seatmap application layer
	ajaxRequestHolder.hide();

	$("#btn_seatmap_interactive").click(function(event){
		 $("#btn_seatmap_interactive").parent('li').addClass('active');
		 $("#btn_preview").parent('li').removeClass('active');
		 getSeatmapResults(ajaxRequestHolder, seatmap_interactive_path);
		 ajaxRequestHolder.show();
		 previewHolder.hide();
		 $("#performance_heading").html(previewHolderH1.html());
	});

	$("#btn_preview").click(function(event){ event.preventDefault();
		$("#btn_preview").parent('li').addClass('active');
		$("#btn_seatmap_interactive").parent('li').removeClass('active');
		$("#btn_seatmap_preview").parent('li').removeClass('active');
		ajaxRequestHolder.hide();
		previewHolder.show();
		$("#performance_heading").html($("h1").data('originalTitle'));
	}
	);

	$("#btn_seatmap_preview").click(function(event){ event.preventDefault();
		$("#btn_preview").parent('li').removeClass('active');
		$("#btn_seatmap_preview").parent('li').addClass('active');
		ajaxRequestHolder.show();
		previewHolder.hide();
		previewHolderH1.remove();
		$("#performance_heading").html(previewHolderH1.html());
	}
	);
}

/**
 * Get seatmap results
 *
 * @param string objHtmlHolder Object Html holder identification
 * @param string ajaxUrl Path to data
 *
 * @return string recivedData Data obtained from ajax request
 *
 * @requireIn handleSeatmapPreviews()
 *
 * @onPage shopping process (performance.tpl)
*/
function getSeatmapResults(objHtmlHolder, ajaxUrl) {
	var recivedData = null;
	recivedData =  $.get(ajaxUrl,
		function(data){
			objHtmlHolder.html(data);
			// fetch if price has been updated and redirect back to same script
			if ($(data).is('#reload')) {
					getSeatmapResults(objHtmlHolder,ajaxUrl);
			}
		});

	return  recivedData;
}

/**
 * Close / open help section handling
 *
 * @param /
 *
 * @return /
 *
 * @requireIn document.ready
 *
 * @onPage shopping process
*/
function handleHelpSection(){
	var btnElement			= $('#helpSectionToggler');
	var toggleElement		= $('#info');
	var speed				= 'slow';
	var classNameVisible	= 'visible';
	var classNameHidden		= 'hidden';

	btnElement.click(function(){
		if (toggleElement.hasClass(classNameVisible)){
			toggleElement.fadeOut(speed);
			toggleElement.removeClass(classNameVisible);
			toggleElement.addClass(classNameHidden);

			btnElement.removeClass(classNameVisible)
		   //  btnElement.addClass(classNameHidden)
		} else {
			toggleElement.fadeIn(speed);
			toggleElement.removeClass(classNameHidden);
			toggleElement.addClass(classNameVisible);

			btnElement.removeClass(classNameHidden)
		   //  btnElement.addClass(classNameVisible)
		}
	});
}

/**
 * Auto fill address for delivery
 *
 * @longdesc
 * Using: name, surname, address, postal_code, city, company, country
 * NOT using: alias, middlename, address_comment, countries_metros_id, country
 *
 * @param /
 *
 * @return /
 *
 * @requireIn document.ready
 *
 * @onPage mod page
*/
function fillAddress() {
	var tmp_class;

	// Hide buttons on the top
	$("#existing-addresses form button").hide();

	$("#existing-addresses form address")
	.css('cursor', 'pointer')
	.click(function() {

		// Clear form
		clearForm('.edit-address');

		$(this).find('span').each(function() {

			tmp_class = $(this).attr('class');
			if ($('.edit-address .'+tmp_class).is("input")) {
				// Input
				$('.edit-address .'+tmp_class).val($(this).text());
			} else {
				// Dropdown
				$('.edit-address .'+tmp_class+' option:contains("'+$(this).text()+'")').attr('selected', 'selected');
			}

		});

		// Fill address id
		$("form .edit-address-id").val($(this).parent().find(".address-id").attr('value'));
		//$("form .edit-address-id").attr('name',($(this).parent().find(".address-id").attr('name')));

		// Scroll on click
		scrollTo(".edit-address");
	});

	$("form.edit-address button[type=button]").click(function() {
		// Manualy clear address id
		$('.edit-address .edit-address-id').attr('value', '');
		//$('.edit-address .edit-address-id').attr('name', '');

	});
}

/**
 * Get creditcard type by number
 *
 * @param int number Number inputed
 *
 * @return array card cc_key(s) of card
 *
 * @requireIn document.ready
 *
 * @onPage order overview
*/
function creditCardTypeFromNumber(number) {
	var card = new Array();
	// first, sanitize the number by removing all non-digit characters.
	num = number.replace(/[^\d]/g, '');
	// now test the number against some regexes to figure out the card type.

	/* Mastercard - 1 */
	if (number.match(/^5[1-5]/)) { card.push('1'); }

    /* Visa Paylife black card - 10 */
	else if (number.match(/^400012/)) { card.push('10'); }
	/* Visa - 2 */
	else if (number.match(/^4/)) { card.push('2'); }

	/* American Express - 3 */
	else if (number.match(/^3[47]/)) { card.push('3'); }

	/* Discover - ?
	else if (num.match(/^6011/)) { card.push('4'); }
	*/

	/* Diners Club - 4 */
	else if (number.match(/^3[06]/)) { card.push('4'); }

	/* OET Card - 9 */
	else if (number.match(/^60[0-9]/)) { card.push('9'); }

    return card;
}

/**
 * Prevent deletion of prefilled number  on a cc_number field
 * And checks if preffiled numbers matches with first numebrs of entered cc
 * and corrects input field value if
 */
function preventCreditCardPrefillClearing(prefillNumber) {
    if (prefillNumber.length > 0 ) {
       currVal = $('#fpayment-cc_number').val();
       prefillNumLength = prefillNumber.length;
       if (currVal.length < prefillNumLength){
            $('#fpayment-cc_number').val(prefillNumber);
       }

       // check if the fist numbers are the same as prefilled numbers
       var i = 0
       var notMatching = false;
       for(i=0; i != prefillNumLength; i++) {
          if (prefillNumber[i] != currVal[i]) {
              notMatching = true;
          }
       }

       // If we detect that current value first (n) of numbners do not match we
       // fill cc numbr field with prefiled numbers
       if (notMatching) {
            $('#fpayment-cc_number').val(prefillNumber);
       }
    }
}

/**
 * Registration / Login form methods
 *
 * @param /
 *
 * @return /
 *
 * @onPage ?
*/
function modalSigninClass() {
	// initialization comes here
	$('#registerLoginForm').delegate('input[value="login"]',	'click', selectLogin);
	$('#registerLoginForm').delegate('input[value="register"]', 'click', selectRegister);
    $('#registerLoginForm').delegate('#loginButton',            'click', submitSignin)

	$checkedValue = jQuery('#registerLoginForm input[checked="checked"]');

	// public methods
    /**
     * Shows sign-in form
     */
	this.showModal = function(event) {
		event.preventDefault();
		checkUserOldNew();
		$('#cartModal').reveal({
			 animation: 'fade',
			 animationspeed: 300,
			 closeonbackgroundclick: true
		});

	}

	// private methods
	function selectRegister() {
		$('#registerLoginForm #login').hide();
	}

	function selectLogin() {
		$('#registerLoginForm #login').show();
		if ($('#email').val()) { inputFocus("password");}
	}

    /**
     * Submits signin with the proper form
     */
    function submitSignin(event) {
        // we are on cart, we need to submit using service form
        if ($('#serviceGroup').length) {
            event.preventDefault();
            $('#registerLoginForm input').each(function(index, element){
                $(element).clone().hide().appendTo('#checkout-form');
            });
            $('#checkout-form').parent('form').submit();
        }
    }

	// check for selected sign in mode
	if ( $checkedValue.val() == 'login' ) {
		selectLogin();
	} else {
		selectRegister();
	}

}

/**
 * Check if user is new/old
 *
 * @param /
 *
 * @return /
 *
 * @requireIn document.ready
 *
 * @onPage all
*/
function checkUserOldNew() {
	// If user has email and password inputed - select register user
	setTimeout(function(){
		if ($('#email').val() == "" && $('#password').val() == "") {
			inputFocus("email");

		} else if ($('#email').val() && $('#password').val() == "") {
			$('#signin-switch input[value="login"]').attr("checked","checked");
			$('#registerLoginForm #login').show();
			inputFocus("password");

		} else if ($('#email').val() && $('#password').val()) {
			$('#signin-switch input[value="login"]').attr("checked","checked");
			$('#registerLoginForm #login').show();
		}

	},500);

}


/**
 * Toggle full address - if address has .collapse class next to .edit-address it will show only mandatory fields
 *
 * @param string option Option show/hide/toggle
 *
 * @return /
 *
 * @requireIn document.ready
 *
 * @onPage add/edit address
*/
function toggleFullAddress(option) {
	if (option == "hide") { $('.edit-address .form-row:not(:has(span.mandatory))').not('.form-row:last').hide(); }
	else if (option == "show") { $('.edit-address .form-row:not(:has(span.mandatory))').not('.form-row:last').show(); }
	else if (option == "toggle") { $('.edit-address .form-row:not(:has(span.mandatory))').not('.form-row:last').slideToggle(); }

}

/**
 * Handles global Quicksearch JS bindings
 *
 * @return bool true
 *
 * @todo onPage?
 * @todo function is running on all pages !!
 *
 * @requireIn document.ready
*/
function globalQuickSearchBind() {

	if (Modernizr.input.placeholder) {
		return true;
	}

	/* default text */
	$('input#quicksearch')

	.focusin(function(event) {
		if ($(this).val() == $(this).attr('placeholder')) {
			$(this).val('');
		}
	})

	.focusout(function(event) {
		if ($('input#quicksearch').val() == '') {
			$('input#quicksearch').val($('input#quicksearch').attr('placeholder'));
		}

	});

	if ((!Modernizr.input.autofocus) && (location.hash == '')) {

		if ($('input#quicksearch').attr('autofocus') != undefined) {
			$('input#quicksearch').focus();

		} else {
			$('input#quicksearch').focusout();

		}

	}

	$('#search').submit(function(event) {

		// chrome workaround
		if ($('input#quicksearch') == null) {
			var input = document.getElementById('quicksearch');

			if (input != null) {
				if (input.value == input.getAttribute('placeholder')) {
					input.value = '';
				}

			}

		} else {

			if ($('input#quicksearch').val() == $('input#quicksearch').attr('placeholder')) {
				$('input#quicksearch').val('');

			}

		}

	});

	return true;

}

/**
 * Handle order summary, here are ajax post request generated for fee/mode calculation used during SP.
 *
 * @param /
 *
 * @return
 *
 * @todo function is running on all pages !!
 *
 * @requireIn document.ready
*/

function handleOrderSummary() {

	// Cart order summary Ticket insurance Service ajax
	// => Check if we are on cart page...
	var postForm = null;
	var testFormExist = $('form#checkout-form');

	if (testFormExist.length > 0) {
		postForm = testFormExist;
		ajaxElements = $('input[name = "service"]');
		ajaxFillelement = $('#order-summary tbody');
	}

	// Method of delivery  order summary ajax
	// => Check if we are on mod page
	testFormExist = $('#shopping_process_form');

	if (testFormExist.length > 0 ) {
		postForm = testFormExist;
		ajaxElements = $('input[name = "ra_mod"]');
		ajaxFillelement = $('#order-summary tbody');
	}

	if (postForm && (postForm.length != 0)) {
		originalAction = postForm.attr('action');
		ajaxPath = postForm.attr('rel');

		ajaxElements.each(function(index) {
			$(this).click(function() {

				// Serialize all form data for use in post request
				var formData = postForm.serialize();

				// Make a post request on cart page with additnial GET parameter ajax
				// Script will calculate all fees and display them in template in inside ajaxFillelement
				currHeight = ajaxFillelement.css("height");
				// ajaxFillelement.addClass('loading');

				if (currHeight == "auto") {
					currHeight = "60px";
				}
				//ajaxFillelement.html('<tr style="height:'+ currHeight +'" ><td></td></tr>');
				//ajaxFillelement.css('height', currHeight);
				postdone = 0;
				clickElement = $(this);

				// For now we do not wana use ajax requests for making
				// calculations
				// $.post(ajaxPath, formData, function(data) {
				//  ajaxFillelement.html(data);
				//  $('#quick_total').html($('#order_total').html())
				//  ajaxFillelement.removeClass('loading');
				//
				// });


				// This mens we need to call ajax for this mod to get special / additinal fields for this type of mod
				// For now only kontramarka is using this type of mod (RU)
				if (clickElement.hasClass('ajaxMod')) {
					ajaxPathModFields		 = clickElement.attr('rel');
					ajaxFillelementModFields  = $('#mod_description_' + clickElement.val());

					ajaxFillelementModFields.addClass('loading');

					ajaxFillelementModFields.html('<div style="height:'+ currHeight +'" ></div>');

					$.get(ajaxPathModFields,function(modData) {
						ajaxFillelementModFields.html(modData);
						ajaxFillelementModFields.removeClass('loading');
						ajaxFillelementModFields.css("text-indent", "0");
					});
				}
			});
		});

	}

}

/**
 * Show/hide main dropdown menu on top
 *
 * @onPage all pages
*/
var mainmenu = {

	/**
	 * Hover over main menu
	 *
	 * @member mainmenu
	*/
	over: function() {
		$(this).find(".dropdown").show();
		$(this).find("a.dropdownlink").addClass("hovered");
	},

	/**
	 * Hover out main menu
	 *
	 * @member mainmenu
	*/
	out: function() {
		$(this).find(".dropdown").hide();
		$(this).find("a.dropdownlink.hovered").removeClass("hovered");
	}
}

/**
 * Main slideshow
 *
 * @use first page
*/

var slideshow = {

	/**
	 * Start slideshow (first time and everytime we make mouse leave)
	 *
	 * @member slideshow
	*/
	start: function () {
		var refreshIntervalId = setInterval(function() {
		var trasSpeed = 300;

		// Check if we are on the last image
		if ($("ul.overlay_picker li.selected").index() == $("ul.overlay_picker li").size()-1) {

			// Manage picker
			$("ul.overlay_picker li.last").removeClass("selected");
			$("ul.overlay_picker li.first").addClass("selected");

			// Manage big picture
			$("ul.overlay_main li.last").fadeOut(trasSpeed).removeClass("selected")
			$("ul.overlay_main li.first").addClass("selected").fadeIn(trasSpeed);

			} else {

				// Manage picker
				$("ul.overlay_picker li.selected").removeClass("selected").next().addClass("selected");

				// Manage big picture
				$("ul.overlay_main li.selected").fadeOut(trasSpeed).removeClass("selected").next().addClass("selected").fadeIn(trasSpeed);

			}

		}, 5000);	// Set time interval here

		return refreshIntervalId;
	},

	/**
	 * Stop slideshow (on mouse over)
	 *
	 * @member slideshow
	*/
	stop: function (stopId) { clearInterval(stopId); },

	/**
	 * Manage slideshow (starting and stoping)
	 *
	 * @member slideshow
	*/
	init: function () {
		var refreshIntervalId = 0;
		var trasSpeed = 300;

		$("ul.overlay_main li").not('.first').hide();

		// check if no slide is selected as first
		if ($("ul.overlay_main li.first").length == 0) {
			$("ul.overlay_main li:first").addClass('first selected').show();
			$("ul.overlay_picker li").removeClass('selected');
			$("ul.overlay_picker li:first").addClass('first selected');
		}

		refreshIntervalId = slideshow.start();

		$("#overlay_slideshow")
		.mouseenter(function() {
			slideshow.stop(refreshIntervalId);
		})
		.mouseleave(function() {
			refreshIntervalId = slideshow.start();
		});

		$("#overlay_slideshow ul.overlay_picker li").click(function() {

			// Which button was clicked
			var tabNumber = $(this).index();
			tabNumber = tabNumber + 1;
			var showPicture = "ul.overlay_main li:nth-child(" + tabNumber + ")";

			// Manage picker
			$("ul.overlay_picker li.selected").removeClass('selected');
			$(this).addClass('selected');

			// Manage big picture
			$("ul.overlay_main li.selected").fadeOut(trasSpeed).removeClass('selected');
			$(showPicture).fadeIn(trasSpeed).addClass('selected');

		});
	}
}

/**
 * Carousel bind for event gallery.
 *
 * @param /
 *
 * @return /
 *
 * @require bindCarousel
 *
 * @requireIn document.ready
*/

function bindEventGalleryCarousel() {

	// Remove arrows if there is less then 11 picture in gallery
	var noPictures = $(".event_gallery_carousel .carousel_main ul li").size();

	if (noPictures < 12) {
		$('.event_gallery_nextbutton').removeClass("event_gallery_nextbutton");
		$('.event_gallery_prevbutton').removeClass("event_gallery_prevbutton");
	}

	// Main carousel functions
	if ($('.event_gallery_carousel').length > 0) {
		bindCarousel('.event_gallery_carousel .carousel_main ul', '.event_gallery_carousel .carousel_prev','.event_gallery_carousel .carousel_next', 11, 'last');

	}

}

/**
 * Carousel bind for venue.
 *
 * @param /
 *
 * @return /
 *
 * @require bindCarousel
 *
 * @requireIn document.ready
*/

function bindVenueCarousel() {

	$(".venue_picture ul ul.venue_picture_carousel li").click(function() {

		// Which button was clicked
		var tabNumber = $(this).index();
		tabNumber = tabNumber + 1;
		var showPicture = ".venue_picture .main_pictures img:nth-child(" + tabNumber + ")";
		$(".venue_picture div.main_pictures img.show").removeClass("show");
		$(showPicture).addClass("show");


	});

	// Remove arrows if there is less then 4 picture in gallery
	var noPictures = $("ul.venue_picture_carousel li").size();

	if (noPictures < 5) {
		$('.venue_picture_next').removeClass("venue_picture_nextbutton");
		$('.venue_picture_prev').removeClass("venue_picture_prevbutton");
	}

	// Main carousel functions
	bindCarousel('.venue_picture ul ul.venue_picture_carousel', '.venue_picture ul li.venue_picture_prev', '.venue_picture ul li.venue_picture_next', 4, null);

}

/**
 * Carousel bind for category.
 *
 * @param /
 *
 * @return /
 *
 * @require bindCarousel
 * @require category_carousel_initCallback
 *
 * @requireIn document.ready
*/

function bindCategoryCarousel() {

	// Calculate number of slides
	var numberOfSlides = $("#category_carousel ul.category_carousel li").size();
	var numberOfSites = Math.ceil(numberOfSlides/4);

	$("#category_carousel div.page_count span.all_page").text(numberOfSites);

	bindCarousel('#category_carousel ul.category_carousel', null, null, 4, 'last',
		function(carousel) {
			category_carousel_initCallback(carousel, numberOfSites);

		}
	);

}

/**
 * Carousel callback for category gallery.
 *
 * @param string carousel Selector of carousel
 * @param int numberOfSites Noumber of sites
 *
 * @requireIn bindCategoryCarousel
*/

function category_carousel_initCallback(carousel, numberOfSites) {

	$('#carousel_next').bind('click', function() {

		var currentPage = parseInt($("#category_carousel div.page_count span.current_page").text());
		var nextPage = currentPage + 1;

		if (nextPage > numberOfSites) {
			nextPage = 1;
		}

		$("#category_carousel div.page_count span.current_page").text(nextPage);

		// Push carousel
		carousel.next();

		return false;

	});

	$('#carousel_prev').bind('click', function() {

		var currentPage = parseInt($("#category_carousel div.page_count span.current_page").text());
		var nextPage = currentPage - 1;

		if (nextPage == 0) {
			nextPage = numberOfSites;
		}

		$("#category_carousel div.page_count span.current_page").text(nextPage);

		// Push carousel
		carousel.prev();

		return false;

	});

}

/**
 * Binds jcarousel to selector with some settings not common to all elements.
 *
 * @param {selector*?*} selector jQuery selector for main carousel
 * @param {selector*?*} selectorPrev jQuery selector for previus button
 * @param {selector*?*} selectorNext jQuery selector for next button
 * @param {int} scrollCount Number of slides to scroll when next/prev button is clicked
 * @param {int} wrapType jcarousel "wrap" option
 * @param {object*?*} callback Custom callback to be called
 *
 * @requireIn document.ready
 * @requireIn bindVenueCarousel
 * @requireIn bindCategoryCarousel
 * @requireIn bindEventGalleryCarousel
*/
function bindCarousel(selector, selectorPrev, selectorNext, scrollCount, wrapType, callback) {

	if (typeof callback == 'undefined') {
		callback = function(carousel) {
			$(selectorNext).bind('click', function() {
				carousel.next();
				return false;

			});

			$(selectorPrev).bind('click', function() {
				carousel.prev();
				return false;

			});

		};

	}

	// Remove arrows if there is less then 11 picture in gallery
	var noPictures = $(selector+" li" ).size();

	if (noPictures < 5) {
		$(selectorPrev).hide();
		$(selectorNext).hide();
	}

	$(selector).jcarousel({
		// Function for custom buttons
		initCallback: callback,

		// Number of slides to scroll when next/prev button is clicked
		scroll: scrollCount,

		// Set wrap type
		wrap: wrapType,

		// This tells jCarousel NOT to autobuild prev/next buttons
		buttonNextHTML: null,
		buttonPrevHTML: null

	});

}

/**
 * Generate event subnavigation.
 *
 * @longdesc
 * 1. Add class "subnavigation-item" to section tag
 * 2. Add title (title="") to section (title will be displayed as a link in subnavigation)
 *
*/
function generateSubnavigation() {

	// Count how many subnavigation item are there
	var numberOfItems = $(".subnavigation-item").size();

	$(".subnavigation").append('<ul class="subnavigation_list"></ul>');

	var i = 0;
	for (i = 0; i < numberOfItems; i++) {

		title = $("section.subnavigation-item").eq(i).attr("title");

		// Convert link to lowercase and remove spaces
		linkTitle = title.replace(" ", "-");
		linkTitle = linkTitle.toLowerCase();

		// Add #name tag to sections
		$("section.subnavigation-item").eq(i).attr('id','anchor-' + linkTitle)

		// Append pipe (|) on the end of every link except last one
		if (i != numberOfItems-1) {
			$(".subnavigation ul.subnavigation_list").append('<li><a class="text-link" href="#anchor-' + linkTitle + '">' + title + '</a> |</li>');

		} else {
			$(".subnavigation ul.subnavigation_list").append('<li><a class="text-link" href="#anchor-' + linkTitle + '">' + title + '</a></li>');

		}

	}

}

/**
 * Generate event detail section.
 *
 * @longdesc
 * 1. Structure of "content div"
 * <h4 class="module-title">Tilte</h4>
 * <div class="module-content">Content</div>
 *
 * 2. Structure of "menu div"
 * Must be empty
 *
 * 4. Set DScontent (class of content div)
 * 5. Set DSmenu (class of menu div)
 *
 * @param {selector} DScontent Class of content div (ex.: .detail_sections)
 * @param {selecotr} DSmenu Class of menu div (ex.: .detail_menu)
 *
 * @requireIn document.ready
 *
 * @onPage event
*/

function detailSection(DScontent, DSmenu) {

	// First changes
	$(DSmenu).append('<ul class="detail_menu_list"></ul>'); // Add list for menu
	$(DScontent).find('div.module-content').hide(); // Hide all content divs

	// Count number of sections
	var numberOfSections = $(DScontent + " h4.module-title").size();
	numberOfSections = numberOfSections*2;

	// Construct detail_menu_list

	$(DScontent + " h4.module-title").each(function(index, element) {
		var $tmph4 = $(DScontent + ' h4.module-title').eq(index);
		var $tmpdiv = $(DScontent + ' div.module-content').eq(index);

		// Get heading and put it in detail_menu_list
		var tempHeading = $tmph4.text();
		$(DSmenu + " ul.detail_menu_list").append('<li id="'+$tmpdiv.attr('id')+'_menu"><span class="arrow"></span>' + tempHeading + '</li>');
	});

	// Now we can remove headings
	$(DScontent).find('h4.module-title').remove();

	// Make first tab in menu list and first div selected
	$(DSmenu +  " ul.detail_menu_list li:nth-child(1)").addClass('selected');
	$(DScontent +  " div.module-content:nth-child(1)").addClass('selected').show();

	// If first content is map => load map
	if ($(DScontent +  " div.module-content:nth-child(1)").attr('id') == 'venue_location') {
		var iframeAttribute = $(DScontent + " div.selected iframe").attr('src');
		var url = $(DScontent + " div.selected iframe").attr('longdesc');
		$(DScontent + " div.selected iframe").attr('src', url);

	}

	// Detail sections
	$(DSmenu + " ul.detail_menu_list li").click(function () {
		$(DSmenu + " ul.detail_menu_list li.selected").removeClass("selected");
		$(this).addClass("selected");

		// Which button was clicked
		var tabNumber = $(this).index();
		tabNumber = tabNumber + 1;
		var showDetail = DScontent + " div.module-content:nth-child(" + tabNumber + ")";

		$(DScontent + " div.selected").removeClass("selected").hide();
		$(showDetail).addClass("selected").show();

		if ($(showDetail).attr('id') == 'venue_location') {
			var iframeAttribute = $(DScontent + " div.selected iframe").attr('src');
			var url = $(DScontent + " div.selected iframe").attr('longdesc');

			if (!iframeAttribute) {
				$(DScontent + " div.selected iframe").attr('src', url);
			}

		}

	});

}

/**
 * @todo add description
 *
 * @param /
 *
 * @return /
 *
 * @requireIn document.ready
 *
 * @onPage shoping process
*/

function showhideVoucher() {

	// Hide fieldset
	$("form#voucher-form fieldset").hide();

	$("form#voucher-form h3")
	.click( function() {
		$("form#voucher-form fieldset").toggle("slow");
	});

}

/**
 * @todo add description
 *
 * @param /
 *
 * @return /
 *
 * @requireIn document.ready
 *
 * @onPage all
*/

function loadFacebookJS() {

	// FB dependancy protector
	var locale = $('body').data('locale');

	if (locale == '') {
		locale = 'en_US';
	}

	var fileref=document.createElement('script');
	fileref.setAttribute("type","text/javascript");
	fileref.setAttribute("src", window.location.protocol+'//connect.facebook.net/'+locale+'/all.js#xfbml=1');
	document.getElementsByTagName("head")[0].appendChild(fileref);

}

/**
 * Display terms of use on order overview page
 *
 * @param /
 *
 * @return /
 *
 * @require termsOfUseWindow(action)
 *
 * @requireIn document.ready
 *
 * @onPage order overview
*/

/*
function handleTermsOfUse() {

	$('#standard_terms_content').show();
	$('#special_terms_content').show();

	// Initializing events
	$("#tou_agree").click(function() {
		termsOfUseWindow('hide');
		$("#additions_to_terms_of_use_checkbox").attr({
			checked: "checked"
		});

		return false;

	});

	$("#tou_reject").click(function() {
		termsOfUseWindow('hide');
		$("#additions_to_terms_of_use_checkbox").attr({
			checked: ""
		});

		return false;

	});

	$("p.agree_box a").click(function() {
		termsOfUseWindow('show');

		return false;

	});

	//Set window class that assignes proper CSS styling
	$("#terms_of_use_window").addClass("window");

	//Get the screen height and width
	var maskHeight = $(window).height();
	var maskWidth = $(window).width();

	//Set height and width to mask to fill up the whole screen
	$('#mask').css({
		'width':maskWidth,
		'height':maskHeight
	});

	//Calculate modal window position
	var windowTop = maskHeight / 2 - 200;
	var windowLeft = maskWidth / 2 - 300;

	$(".window").css({
		'top':windowTop,
		'left':windowLeft
	});

	//Show modal window on load if not agreed
	var alreadyAgreed = $("#additions_to_terms_of_use_checkbox").attr("checked");

	if (!alreadyAgreed) {
		termsOfUseWindow('show');

	} else {
		termsOfUseWindow('hide');

	}

	return;
}

/**
 * Display terms of use on order overview page
 *
 * @param /
 *
 * @return /
 *
 * @require termsOfUseWindow(action)
 *
 * @requireIn document.ready
 *
 * @onPage order overview ()
*/
/*
function handleTermsOfUse() {

	$('#standard_terms_content').show();
	$('#special_terms_content').show();

	// Initializing events
	$("#tou_agree").click(function() {
		termsOfUseWindow('hide');
		$("#fpayment-terms_of_use").attr({
			checked: "checked"
		});

		return false;

	});

	$("#tou_reject").click(function() {
		termsOfUseWindow('hide');
		$("#fpayment-terms_of_use").attr({
			checked: ""
		});

		return false;

	});

	$("p.agree_box a").click(function() {
		termsOfUseWindow('show');

		return false;

	});

	//Set window class that assignes proper CSS styling
	$("#terms_of_use_window").addClass("window");

	//Get the screen height and width
	var maskHeight = $(window).height();
	var maskWidth = $(window).width();

	//Set height and width to mask to fill up the whole screen
	$('#mask').css({
		'width':maskWidth,
		'height':maskHeight
	});

	//Calculate modal window position
	var windowTop = maskHeight / 2 - 200;
	var windowLeft = maskWidth / 2 - 300;

	$(".window").css({
		'top':windowTop,
		'left':windowLeft
	});

	//Show modal window on load if not agreed
	var alreadyAgreed = $("#additions_to_terms_of_use_checkbox").attr("checked");

	if (!alreadyAgreed) {
		termsOfUseWindow('show');

	} else {
		termsOfUseWindow('hide');

	}

	return;
}
*/
/**
 * Show Terms of use window
 *
 * @param string action Could be 'show' or 'hide'
 *
 * @return /
 *
 * @requireIn handleTermsOfUse()
 * @requireIn document.ready
 *
 * @onPage order overview
*/
/*
function termsOfUseWindow(action) {
	if (action == 'show') {
		//show background mask with transition effect
		$('#mask').fadeIn(500);
		$('#mask').fadeTo("slow",0.2);

		//show window
		$(".window").show();
	} else {
		$("#mask").hide();
		$(".window").hide();
	}

	return;
}
*/
/**
 * Simple AJAX implementation of search
 *
 * @param event JQuery event object
 *
 * @return bool true
 *
 * @requireIn document.ready
 *
 * @todo onPage
 */
function simpleAjaxLoadContent(event) {
	if (event.data.type != 'link') {
		return false;
	}

	event.preventDefault();
	if ($(this).attr('rel') != '') {
		var params = $(this).attr('rel');
	} else {
		var params = $(this).attr('href');
	}

	$("#loadingclass").css('display','block');
	//alert(params);
	$.ajax({
		type	: 'GET',
		dataType: 'text',
		url	 : params,
		data: 'ajax=1',
		success : function(data) {
			$('.ajaxSimpleReplace:first').parent().html(innerShiv(data)); //.replaceWith(data);
			$('a.simpleAjax').bind('click', {
				type: 'link'
			}, simpleAjaxLoadContent);
		},
		complete: function() {
			$("#loadingclass").css('display','none');
		}
	});
	return true;

}

/**
 * Check if banner exists
 *
 * @longdesc
 * If banner in empty (height is 0) check every 2 second for first 30 secound for change and if something changes display banner
 * If banner contains "empty.gif" automatically hide him
 *
 * @param char banner_div_id Id of the banner we want to check
 *
 * @return /
 *
 * @requireIn document.ready
 *
 * @onPage all
 */
function checkBanners (banner_div_id) {
	var times_checked = 0;

	// Check if "empty.gif" exists
	var empty_gif = false;
	$(banner_div_id +' .banner_content a[href*="empty.gif"]').each(function() {
		empty_gif = true;
	});

	// If banner has 0 height hide it
	if ($(banner_div_id +" .banner_content").height() == 0) {
		$(banner_div_id).hide();

		var html = $(banner_div_id).html();
		var check_banner = setInterval(function(){
			if($(banner_div_id).html() != html){
				$(banner_div_id).show();
				$(banner_div_id).resize();
			}
			times_checked++;
			if (times_checked > 15){
				clearTimeout(check_banner);
			}
		}, 2000);

	} else if (empty_gif) {
		$(banner_div_id).hide();
	}

}

/**
 * Binds quicksearch autocomplete preview
 *
 * @param /
 *
 * @return /
 *
 * @requreIn document.ready
 *
 * @onPage all
 */
function bindQuickSearch() {
	disableQuickSearch = $('#quicksearch').data('disablehints');
	// Test if quick search is not disabled
	if (disableQuickSearch != true) {
		searchPath = $('#quicksearch').attr('rel');
		// add autocomplete to quicksearch *//* add autocomplete to quicksearch
		$("#quicksearch").autocomplete(searchPath, {
			minChars:2,
			maxItemsToShow:7
		});
	}
}

/**
 * Toggle additional information for personalized tickets fields
 *
 * @param /
 *
 * @return /
 *
 * @requreIn document.ready
 *
 * @onPage personalized tickets (in shoping process)
 */
function personalizedAdditionalInfo() {
	$('.ticket-fields .additional_info').hide();

	$('.ticket-fields .more').click(function() {
		$(this).parent().find('.additional_info').slideToggle();
	});
}

/**
 * Toggle personalized data on order overview
 * @param /
 *
 * @return /
 *
 * @requreIn document.ready
 *
 * @onPage personalized tickets (in shoping process)
 */
function showHidePersonalizedData () {
	$('.personification-data dd').hide();
	$('.personification-data dt').removeClass('collapse').addClass('expand');

	$('.personification-data dt').click(function() {
		$(this).toggleClass('expand').toggleClass('collapse');
		$(this).parent().find('dd').slideToggle();
	});

}

/**
 * Manage Terms of use pop up
 *
 * @param /
 *
 * @return /
 *
 * requireIn document.ready
 *
 * @onPage order overview
*/
function manageTOU() {
	// If TOU window is to big we change position from fixed to absolute
	if (($('#termsOfUse').height()+100) > $(window).height()) { $('#termsOfUse').css('position', 'absolute'); }

	$('#tou_agree').click(function(event) {
		event.preventDefault();
		$('#fpayment-terms_of_use').attr('checked', true);
	});

	$('#tou_reject').click(function(event) {
		event.preventDefault();
		$('#fpayment-terms_of_use').attr('checked', false);
	});

}


/**
 * Show or hide drawers on MOP,MOD,...
 *
 * @param /
 *
 * @return /
 *
 * @requireIn document.ready
 *
 * @onPage mod/mop page
*/

var manageDrawers = {
	/**
	 * Initialization of process
	 *
	 * @member manageDrawers
	*/
	init: function() {

		var section, trigger;
		if ($(".drawer").length != 1) {
			// Show radion buttons for JS users
			$(".drawer .drawer-trigger input").removeClass('hide-me');
			// Hide all drawers
			manageDrawers.hide();
		}



		// Show hand on header
		$(".drawer-trigger").css('cursor','pointer');
		$(".drawer-trigger label").css('cursor','pointer');

		// Check if any radio button are checked
		manageDrawers.check();

		// Click on trigger
		$(".drawer .drawer-trigger").click(function() {
			$(this).find('input').attr('checked', true);
			if ($(".drawer").length != 1) { manageDrawers.toggle($(this)); }
		});

	},

	/**
	 * Hide drawers
	 *
	 * @member manageDrawers
	*/
	hide: function() {$(".drawer-content").hide();},

	/**
	 * Get section
	 *
	 * @member manageDrawers
	*/
	getSection: function(trigger) {
		section = $(trigger).parent();

		return section;
	},

	check: function() {
		$(".drawer .drawer-trigger").each(function() {

			if ($(this).find('input').attr('checked')) {
				section = manageDrawers.getSection($(this));
				// Show corect drawer content
				$(section).children('.drawer-content').show().addClass('selected');
			}

		});
	},

	/**
	 * Toggle drawers
	 *
	 * @member manageDrawers
	*/
	toggle: function(trigger) {
		section = manageDrawers.getSection(trigger);

		if (!$(section).find('.drawer-content').hasClass('selected')) {
			// Hide open drawer content
			$(".drawer-content.selected").slideUp('slow').removeClass('selected');

			// Show corect drawer content
			$(section).children('.drawer-content').slideToggle('slow').addClass('selected');

			// Scroll to just clicked drawer top
			var index = $(trigger).parent().index();
			if (index > 4) {
				scrollTo($('.drawer').eq(index-3));
			} else {
				scrollTo(".page-heading");
			}

		}

	}
};

/**
 * Shopping process; on click we disable all set of buttons.
 *
 * @onPage shopping process
*/

function btnNav() {

	var buttons = Array('prev', 'clear', 'next')
	for(var i=0; i<buttons.length; i++) {
		document.getElementById(buttons[i]).disabled = true;

	}

}

/**
 * = = = = = = = = = = = = = = = = = = = =
 * Helpers
 * = = = = = = = = = = = = = = = = = = = =
 *
 *
 *
*/

/**
 * Used on orderoverview FOR EPS
 */
function parseEpsBank(val) {
    tmp = val.split('#');

    return tmp[0];
}

/**
 * @todo Add description
 *
 * @param string cat Category name
 *
 * @return /
*/

function checkPriceCat( cat ) {
	var frm = document.getElementById('frm_choose');
	for (i = 0; i < frm.length; i++) {
		if (frm[i].type == 'select-one') {
			// cat[123_456] => 123_456
			var str_pk = cat.name.slice(4,-1);
			var arr_pk = str_pk.split('_');

			// cat[123_456] => 123_456
			var str_elm = frm[i].name.slice(4,-1);
			var arr_elm = str_elm.split('_');

			if (arr_pk[0] != arr_elm[0]) {
				frm[i].value = 0;
			}
		}
	}

}

/**
 * @todo Add description
 *
 * @param string obj_id
 * @param int mode Object mode
*/

function show(obj_id, mode) {

	var status = (mode ? 'block' : 'none');
	document.getElementById('a_perf_' + obj_id).style.display = status;

}

/**
 * @todo add description and parameter descriptions
 *
 * @param int cId [Missing description*?*]
 * @param int cValue [Missing description*?*]
 *
*/
function addValue(cId,cValue) {

	document.getElementById(cId).value = cValue;

}

/**
 * Check is value is a number
 *
 * @param ? val Value to check
 *
 * @return bool true/false
*/

function is_numeric(val) {

 	if (isNaN(parseFloat(val))) {
  		return false;
 	}

 	return true
}

/**
 * Redirect user (if he clicks OK) to an url
 *
 * @param string string Text to be displayed in popup window
 * @param string url Destination address to be redirected
 *
 * @return bool true/false
*/
function confirmLocation(string, url) {
	if (confirm(string)) {
			window.location.href = url;
			return true;

	} else {
		return false;
	}

}

/**
 * Display banner
 *
 * @param string cSRC Path to the image
 * @param string cURL Click through address
 * @param int nType Type of the banner
 * @param strinng cTarget Open in new/the same window
 * @param int width Banner width
 * @param int height Banner height
 *
 * @return /
*/
function banner(cSRC, cURL, nType, cTarget, width, height) {

	if (cTarget != '') {
		urlTarget = cTarget;
	}

	if (nType == 2) {
		document.getElementById('flash_banner').innerHTML = '<a href="'+ cURL +'" onclick="this.target=\'' + urlTarget + '\'"><img src="'+ cSRC +'" alt="" style="border:none;" /></a>';
	} else {
		var fo = new FlashObject(cSRC + '?clickthru=' + cURL, "banner", width, height, "6", "#ffffff");
		fo.write("flash_banner");
	}

}

/**
 * @todo add description
*/

function submitForm(f) {

	if (!document.getElementById) {
		return;
	}

	var fo = document.getElementById(f);
	fo.submit();

}

/**
 * Get focus to a specific field/span/div/...
 *
 * @param string id Id of the field/span/div... you want to get focus to
 *
 * @return /
*/

function inputFocus(id) { $('#'+id).focus(); }

/**
 * @todo Add description
 *
 * @param string url address for popup
 * @param int popup width
 * @param int popup height
 *
*/

function popUp(URL, width, height) {

	day = new Date();
	id = day.getTime();
	leftVal = (screen.width - width)/2;
	topVal = (screen.height - height)/2;
	eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1,width="+ width +",height="+ height +", left="+ leftVal +", top="+ topVal +"');");

}

/**
 * New version of open link in new window
 *
 * @param /
 *
 * @return /
*/
function external_links() {
  //$("a[rel*='external']").attr('target','_blank');  not xhtml valid
  $('a[rel*="external"]').click(function(){
	window.open(this.href);
	return false;
  });
}

/**
 * Scroll to a specific location on the page
 *
 * @param string indicator Indicator of an element you want to scroll to
 *
 * @return /
*/
function scrollTo(indicator) { $('html, body').delay(100).animate({scrollTop: $(indicator).offset().top+"px"}, 300); }

/**
 * @todo add description
 *
 * @param selector from_list Selector of the list you want to copy from
 * @param selector to_list Selector of the list you want to copy to
*/

function copy(from_list, to_list){

	var to = $('#' + to_list);

	// Remove instructions
	$('#' + to_list + ' > option[value="temp"]').each(function(){
		$(this).remove();
	});

	// Move from one list to the other
	$('#' + from_list + ' > option:selected').each(function () {
		$(this).appendTo(to);
	});

	// Sort the to list
	to.sortOptions();

}

/**
 * Clear form
*/
function clearForm(form_selector) {

	// Clear form
	$(':input',form_selector)
	 .not(':button, :submit, :reset, :hidden')
	 .val('')
	 .removeAttr('checked')
	 .removeAttr('selected');

	// Clear errors
	$(form_selector+' .error-desc').remove();
	$(form_selector+' .form-row-error').removeClass('form-row-error');

}

/**
 * = = = = = = = = = = = = = = = = = = = =
 * "Check them" functions
 * = = = = = = = = = = = = = = = = = = = =
 *
 *
 *
*/

/**
 * [Missing description*?*]
 *
 * @todo Add description
 * @todo Where is this function in use ?
*/

jQuery.fn.loading = function () {

	var div = jQuery(this);
	div.attr({ innerHTML: '<div class="loading"></div>' });
	return(this);

}

/**
 * [Missing description*?*]
 *
 * @todo Add description
 * @todo Where is this function in use ?
*/

jQuery.fn.sortOptions = function(ascending) {

	var a = typeof(ascending) == "undefined" ? true : !!ascending;
	this.each(
		function() {

			if(this.nodeName.toLowerCase() != "select") return;

			// get options
			var o = this.options;
			// get number of options
			var oL = o.length;
			// create an array for sorting
			var sA = [];
			// loop through options, adding to sort array
			for(var i = 0; i<oL; i++) {
				sA[i] = {
					v: o[i].value,
					t: o[i].text
				}
			}

			// sort items in array
			sA.sort(
				function(o1, o2) {
					// option text is made lowercase for case insensitive sorting
					o1t = o1.t.toLowerCase(), o2t = o2.t.toLowerCase();
					// if options are the same, no sorting is needed
					if(o1t == o2t) return 0;
					if(a)
					{
						return o1t < o2t ? -1 : 1;
					}
					else
					{
						return o1t > o2t ? -1 : 1;
					}
				}
			);
			// change the options to match the sort array
			for(var i = 0; i<oL; i++) {
				o[i].text = sA[i].t;
				o[i].value = sA[i].v;
			}
		}
	);

	return this;
};

/**
 * @todo add description
 *
 * @use faq.js
*/
$(function(){
	/* hide all answers and set link icons closed */
	if ($("#faqs h3 q").length == 0){
		$("#faqs dl dd").css({'display' : 'none'});
		$("#faqs dl dt a").toggleClass("plus");
	} else {
		$("#faqs a.toggle_section").toggleClass("open");
	}

	/* toggle question */
	$("#faqs dl dt a").click(function () {
		$(this).toggleClass("plus").parent().next().slideToggle("normal");
		/* check for section toggle */
		openeditems = $(this).parents("div.dl_container").children("dl").children("dt").children("a").not("a.plus").length;
		closeditems = $(this).parents("div.dl_container").children("dl").children("dt").children("a.plus").length;
		if(openeditems == 0 || closeditems == 0){
			$(this).parents("div.dl_container").children("a.toggle_section").toggleClass("open");
		}
		return false;
	});

});

/**
 *
 */
$(function() {
	if (jQuery('article .sign-in-form').length > 0) {
		jQuery('nav #cartModal').remove();
	}

	var loginForm = new modalSigninClass();

	if ($('#cartModal').length != 0) {
		$('#account').delegate('#accountLink', 'click', loginForm.showModal);
	}

    // proceed handler
	$('#checkout-form').delegate('button[type="submit"]', 'click', processCheckoutForm);
    // hide error when service is clicked
	$('#serviceGroup').delegate('label', 'click', function() {$('#serviceError').slideUp()});

	// continue with checkout
	function processCheckoutForm(event) {

		if ($('#serviceGroup').length  && !($('#serviceGroup input[type="radio"]:checked').length)) {
			event.preventDefault();
			// Check if error msg is allready displayed
			if ($('#serviceError').hasClass('hide-me')) {$('#serviceError').hide().removeClass('hide-me').slideDown();}
		} else {
			// Check if we are signin
			if ($('#cartModal').length){loginForm.showModal(event);}
		}

	}
})

/**
 * @todo add description
 *
 * @onPage MOD/MOP
 *
 * requireIn document.ready
*/
function buyAddressFlowDeliveryTypeRefresh() {

	if ($(this).val() == '0') { // Yes

		$("#checkout-progress .address_no").hide();
		$("#checkout-progress .address_yes").show();

	} else if ($(this).val() == '1') { // No

		$("#checkout-progress .address_yes").hide();
		$("#checkout-progress .address_no").show();

	}

}

/**
 * @todo add description
 *
 * @onPage MOD/MOP
*/
function buyAddressFlowDeliveryNewRefresh() {

	var str = '';
	var name = [$('#a_name').val().trim(), $('#a_surname').val().trim()];
	var nameStr = name.join(', ');
	var post = [];

	if (nameStr) {
		str += nameStr+'<br />';
	}

	if($('#a_address').val()) {
		str += $('#a_address').val().trim()+'<br />';
	}

	if ($('#a_postal_code').val().trim()) {
		post.push($('#a_postal_code').val().trim());
	}

	if ($('#a_city').val().trim()) {
		post.push($('#a_city').val().trim());
	}

	var postStr = post.join(', ');

	if (postStr) {
		str += postStr+'<br />';
	}

	if($('#a_country').val()) {
		str += $('#a_country option:selected').text().trim()+'<br />';
	}

	$('#checkout-progress address').html(str);

}

/**
 * Handles shopping process right side existing address refresh
*/

function buyAddressFlowDeliveryExistingRefresh() {

	var str = $(this).parent().find('address label').html();
	$('#checkout-progress address').html(str);

}

/**
 * Handles change of text in MOP.
*/

function buyAddressMOPSelector() {

	$("#checkout-progress li .payment_method").text($(this).parent().text());

}

/**
 * Slides up/down content in MOP page
*/

function MOPSlidingRadios() {

	$("ul#choose input:radio").not('.subradio').change(function(){

		$("ul#choose li p.showed").removeClass('showed').slideUp(350);
		$(this).parents('li').find('p').addClass('showed').slideDown(350);

	});

	$("ul#choose li p").hide();

	if ($("ul#choose input:radio").not('.subradio').length > 1) {

		$("ul#choose input:radio:checked").not('.subradio').change();

	} else {

		$("ul#choose input:radio:first").not('.subradio').click().change();

	}

}

/**
 * Slides up/down content in MOD page
*/

function MODSlidingRadios() {

	$("ul#choose li p").hide();
	$("ul#choose li div").hide();

	$("ul#choose input:radio").not('.subradio').change(function(){

		$("ul#choose li.show p").slideUp(350).hide();
		$("ul#choose li.show div").slideUp(350).hide();
		$("ul#choose li.show").removeClass('show');
		$(this).parent().parent().parent().addClass('show');
		$("ul#choose li.show p").slideDown(350);
		$("ul#choose li.show div").slideDown(350);

	});

	if ($("ul#choose input:radio").not('.subradio').length > 1) {

		$("ul#choose input:radio:checked").not('.subradio').change();

	} else {

		$("ul#choose input:radio:first").not('.subradio').click().change();

	}

}

/**
 * Handles change of text in MOD
*/

function buyAddressMODSelector() {

	$("#checkout-progress li .delivery_method").text($(this).parent().text());

}

/**
 * Handles all sliding radio boxes, hiding all except chosen one
*/

function buyAddressHandleSlidingRadios() {

	$("ul#choose input:radio").not('.subradio').change(function(){

		$("ul#choose li p.showed").removeClass('showed').slideUp(350);
		$(this).parents('li').find('p').addClass('showed').slideDown(350);

	});

	$("ul#choose li p").hide();

	if ($("ul#choose input:radio").not('.subradio').length > 1) {

		$("ul#choose input:radio:checked").not('.subradio').change();

	} else {

		$("ul#choose input:radio:first").not('.subradio').click().change();

	}

}

/**
 * ???
*/

window.innerShiv=(function(){
	var d,r;
	return function(h,u){
		if(!d){
			d=document.createElement('div');
			r=document.createDocumentFragment();/*@cc_on d.style.display = 'none'@*/
		}
		var e=d.cloneNode(true);/*@cc_on document.body.appendChild(e);@*/
		e.innerHTML=h.replace(/^\s\s*/, '').replace(/\s\s*$/, '');/*@cc_on document.body.removeChild(e);@*/
		if(u===false)return e.childNodes;
		var f=r.cloneNode(true),i=e.childNodes.length;
		while(i--)f.appendChild(e.firstChild);
		return f
	}
}());

/**
 * Add / remove class 'hover' to main_nav.
*/

function nav() {

	$('#main_nav li').hover(function(){
		// over
		$(this).addClass('hover');
	}, function(){
		// out
		$(this).removeClass('hover');
	});

}

/**
 * From outlets file
*/
function outletsNav(id)
{
	$("#nav_results_ul > li").each(function () {
		if ($(this).attr("id") == "outletnav"+id) {
			$(this).addClass("lisel");
		}
		else {
			$(this).removeClass("lisel");
		}
	});
}

function selectNav()
{
	var c = document.getElementById("c").value;
	$("#nav_ul > li").each(function () {
		if ($(this).attr("id") == "nav_"+c) {
			$(this).addClass("selected");
		}
		else {
			$(this).removeClass("selected");
		}
	});
}

var outletsNavCache = new Array();

function outlets_ajax(path, cache_id) {
	if (outletsNavCache[cache_id] == null) {
		$("#nav_results").loading().load(path, function () {
			outletsNavCache[cache_id] = $("#nav_results").attr("innerHTML");
		});
	}
	else {
		$("#nav_results").attr({ innerHTML: outletsNavCache[cache_id] });
	}
}

var outletsResultCache = new Array();

function outlets_results(path, id) {
	outletsNav(id);
	if (outletsResultCache[id] == null) {
		$("#outlets_results").loading().load(path, function () {
			outletsResultCache[id] = $(this).attr("innerHTML");
		});
	}
	else {
		$("#outlets_results").attr({ innerHTML: outletsResultCache[id] });
	}
}

/**
 * From search js
*/

/* never remove this */
var isRunningIE6OorBelow = false;

function handler(newHash, initial) {
	searchAjaxPerformCall(newHash);
}


function log(msg) {
	$('#masthead').append('<p>'+msg+'</p>');
}

function http_build_query(arr) {
	var str = '';
	for (key in arr) {
		if (key) {
			if (str.length) {
				str += "&";
			}
//			str += key+'='+arr[key];
			str += key+'='+encodeURI(arr[key]);
		}
	}
	return str;
}

/*** =list_states
----------------------------------------------------------------------------------------------------
 *
 * Description:
 *
 * => country
 * => state
 *
 * <= (null)
 *
*/
function list_states(country, state) {

	$("#search_state").load('?liststates&liststates_country=' + country + '&liststates_state=' + state);

} // end list_states

/*** =submitSearch
----------------------------------------------------------------------------------------------------
 *
 * Description:
 *
 * => country
 * => state
 *
 * <= (null)
 *
*/
function submitSearch(field) {

//	alert('Wrong call at '+field);

} // end submitSearch

/*** =searchDefaultSearchString
----------------------------------------------------------------------------------------------------
 *
 * Description: Handles default message in the search field.
 *
 * => (null)
 *
 * <= true
 *
*/
function searchDefaultSearchString() {

	if (Modernizr.input.placeholder) {
		return true;
	}

	/* default text */
	$('#search_string').focusin(function(event) {
		if ($(this).val() == $(this).attr('placeholder')) {
			$(this).val('');
		}
	})
	.focusout(function(event) {
		if ($('#search_string').val() == '') {
			$('#search_string').val($('#search_string').attr('placeholder'));
		}
	})
	.focusout();

	return true;

} // end searchDefaultSearchString

/*** =searchAjaxPerformCall
----------------------------------------------------------------------------------------------------
 *
 * Description: AJAX implementation of search.
 *
 * @param url URL to call AJAX on
 *
 */
function searchAjaxPerformCall(url,firstPage) {
	var params = '?'+url;

	if (params != '?') {
//		var extendedExpanded = $('#extended').val();
	//	params += '&ajax=1&extended='+extendedExpanded;

		$("#loadingclass").css('display','block');
		$.ajax({
			type	: 'GET',
			dataType: 'text',
			data	: 'ajax=1',
			url 	: params,
			original_params	: params,
			success : function(data) {
				$('#search-form').parent().html(innerShiv(data));
				$('#timeinterval').change();
				searchBindEvents();

				var anchor = this.original_params.substr(this.original_params.indexOf('?')+1);

				if (!firstPage) {
//					window.location = '#'+anchor;
				} else {
					searchBindExtendedSearchButton(true,true);
				}

				/* handles language switcher parameters */
				if ($('#lang_switcher').data('original_link') == null) {
					var curLink = $('#lang_switcher').attr('href');
					$('#lang_switcher').data('original_link',curLink);
				}
				$('#lang_switcher').attr('href', $('#lang_switcher').data('original_link') + '&' + anchor);

				/* shows proper search title */

				document.title = $('#page_title').html();
			},
			complete: function() {
				$("#loadingclass").css('display','none');
			}
		});
	}

	return true;

} // end searchAjaxPerformCall

/**
 * Manage metro dropdown
 *
 * @param string city Inputed city name
 *
 * @return /
 *
 * @requireIn document.ready
 *
 * @onPage edit address
*/
function manageMetroList(city, metros) {
	$("#faddress-metro_station").html(metros);
	if ($("#faddress-metro_station option[title='"+city+"']")) {
		$("#faddress-metro_station option").each(function() {
			if($(this).attr('title') != city) {$(this).remove();}
		});
	}
}



/*** =searchBindExtendedSearchButton
----------------------------------------------------------------------------------------------------
 *
 * Description: Advanced search hide / show. Binds events to show / hide extended search area.
 *
 * Todo: check if this has default-state handling
 *
 * @param firstTime Is this the first time we call this?
 * @param justHide Run only hide functions and no binding
 */
function searchBindExtendedSearchButton(firstTime,justHide) {

	if (justHide != true) {
		$('#advanced-search h2').click(
			function () {
				if($(this).hasClass('expanded-switch')){
					$(this).text('Detailed search').removeClass('expanded-switch').addClass('contracted-switch');
					$(this).parents('.detailed-search-expanded').removeClass('detailed-search-expanded');
					$('.search-detailed').slideUp('fast');
					$('#extended').val('0');
				}
				else if($(this).hasClass('contracted-switch')) {
					$(this).text('Hide search').removeClass('contracted-switch').addClass('expanded-switch');
					$(this).parents('#search-header').addClass('detailed-search-expanded');
					$('.search-detailed').slideDown('fast');
					$('#extended').val('1');
				}
			}
		);
	}

	var regexExtended=/extended=[0-1]/;
	if (regexExtended.test(window.location.hash)) {
		if (window.location.hash.indexOf('extended=0') >= 0) {
			$('#advanced-search h2').text('Detailed search').removeClass('expanded-switch').addClass('contracted-switch');
			$('#advanced-search h2').parents('.detailed-search-expanded').removeClass('detailed-search-expanded');
			$('.search-detailed').hide();
			$('#extended').val('0');
		} else {
			$('#advanced-search h2').text('Hide search').removeClass('contracted-switch').addClass('expanded-switch');
			$('#advanced-search h2').parents('#search-header').addClass('detailed-search-expanded');
			$('.search-detailed').slideDown('fast');
			$('#extended').val('1');
		}
	} else if (firstTime == true) {
		if ($('#advanced-search h2').hasClass('expanded-switch')) {
			// first time hide extended search
			$('#advanced-search h2').text('Detailed search').removeClass('expanded-switch').addClass('contracted-switch');
			$('#advanced-search h2').parents('.detailed-search-expanded').removeClass('detailed-search-expanded');
			$('#extended').val('0');
		}
		$('.search-detailed').hide();
	}

} // end searchBindExtendedSearchButton

/*** =searchChangeTimeInterval
----------------------------------------------------------------------------------------------------
 *
 * Description: Takes care of proper interval dropdown values depending on chosen interval.
 *
 * => (null)
 *
 * <= (null)
 *
*/
function searchChangeTimeInterval() {
	var value = $(this).val();

	if (value == "0") {
		$('form#search-fields select[name^="to["], form#search-fields select[name^="from["]')
			.removeAttr('disabled')
			.removeClass('darkgray');
		return true;
	} else {
		$('form#search-fields select[name^="to["], form#search-fields select[name^="from["]')
			.attr('disabled','disabled')
			.addClass('darkgray');
	}

	var date = new Date();
	var startDate, endDate;

	switch (value) {
		case "2":
			startDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()-date.getDay()+8);
			endDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate()+7);
			break;
		case "3":
			startDate = new Date(date.getFullYear(), date.getMonth(), 1);
			endDate = new Date(startDate.getFullYear(), startDate.getMonth()+1, 1);
			break;
		case "4":
			startDate = new Date(date.getFullYear(), date.getMonth()+1, 1);
			endDate = new Date(startDate.getFullYear(), startDate.getMonth()+1, 1);
			break;
		case "1":
		default:
			startDate = new Date(date.getFullYear(), date.getMonth(), date.getDate()-date.getDay()+1);
			endDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate()+7);
			break;
	}

	$('#datepicker_from').datepicker('setDate', startDate);
	$('#datepicker_to').datepicker('setDate', endDate);

	$('select[name="from[d]"]').val(startDate.getDate());
	$('select[name="from[m]"]').val(startDate.getMonth()+1);
	$('select[name="from[Y]"]').val(startDate.getFullYear());

	$('select[name="to[d]"]').val(endDate.getDate());
	$('select[name="to[m]"]').val(endDate.getMonth()+1);
	$('select[name="to[Y]"]').val(endDate.getFullYear());
} // end searchChangeTimeInterval

/*** =searchAddShowAllFilters
----------------------------------------------------------------------------------------------------
 *
 * Description: Binds "show all" to filters.
 *
 * => (null)
 *
 * <= (null)
 *
*/

function searchAddShowAllFilters() {
	var i18n = $('ul.filter-categories').data('showall');
	if (!i18n) {
		i18n = 'Show all';
	}

	$('ul.filter-categories').each(function(index,Element) {
		if ($('li:not(\'.filter-category\')', this).length > 5) {
			$('li:gt(5):not(\'.jsClickMore\')', this).hide();
			$(this).append('<li class="jsClickMore"><span class="small-text">'+i18n+'</span></li>');
		}
	});

	$('li.jsClickMore').click(function(event) {
		$('li', $(this).parent()).show();
		$(this).hide();
	});

} // end searchAddShowAllFilters


/**
 * Binds datepicker to selectors for date ranges
 *
 * @longdesc This will hide selectors for date formats, insert new input field
 *			 and bind datepicker to them.
 */
function searchBindDatePicker() {
	$('select[name^="from["], select[name^="to["]').hide();
	$('select[name^="from["]').parent().append('<input type="text" id="datepicker_from" class="medium" readonly="readonly" />');
	$('select[name^="to["]').parent().append('<input type="text" id="datepicker_to" class="medium" readonly="readonly" />');

	var minimumDate = new Date();
	minimumDate.setDate(1);


	var daysMin = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];
	if (document.location.href.indexOf('/de/') > 0) {
		daysMin = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];
	}


	$('#datepicker_from, #datepicker_to').datepicker({
		showOn			: "focus",
		dateFormat		: "dd.mm.yy",
		dayNamesMin		: daysMin,
		minDate			: minimumDate,
		onSelect: function(dateText, inst) {
			var selectField = $(this).attr('id').substr(11);

			$('select[name="'+selectField+'[d]"]').val(inst.selectedDay);
			$('select[name="'+selectField+'[m]"]').val(inst.selectedMonth+1);
			$('select[name="'+selectField+'[Y]"]').val(inst.selectedYear);

			$('#timeinterval').attr('selectedIndex', $('#timeinterval').attr('length')-1);
		}
	});

	if ($('select[name="from[d]"]').val()) {
		var fromDate = new Date($('select[name="from[Y]"]').val(),
			$('select[name="from[m]"]').val()-1, $('select[name="from[d]"]').val());
		$('#datepicker_from').datepicker('setDate',fromDate);
	}
	if ($('select[name="to[d]"]').val()) {
		var toDate = new Date($('select[name="to[Y]"]').val(),
			$('select[name="to[m]"]').val()-1, $('select[name="to[d]"]').val());
		$('#datepicker_to').datepicker('setDate',toDate);
	}
}


/**
 * Adds search history anchor
 *
 * @param event jQuery event object
 */
function searchAddAnchorHistory(event) {
	var params;

	/* were we called from jQuery event? */
	if (typeof(event) == 'object') {
		event.preventDefault();
		var fromSubmit = 0;


		switch(event.data.type) {
			case 'link':
				params = $(this).attr('href');
				break;
			case 'select':
			case 'submit':
				$('#search_string').focusin();
				params = $(this).closest('form').attr('action')+'?'+
					$(this).closest('form').serialize();
				fromSubmit = 1;
				event.preventDefault();
				break;
			default:
				return false;
		}

		if (params.indexOf('from_submit=') >= 0) {
			params = params.replace(/from_form=[0-1]/,'from_submit='+fromSubmit);
		} else {
			params += '&'+'from_submit='+fromSubmit;
		}
	}
	/* call came from search page 'history', just take parameter as query string */
	else {
		params = '?'+event;
	}
	if (params.indexOf('extended=') >= 0) {
		params = params.replace(/extended=[0-1]/,'extended='+$('#extended').val());
	} else {
		params += '&'+'extended='+$('#extended').val();
	}

	var anchor;

	/* reroute search to ajax friendly url */
	if (window.location.search != '') {
		var searchQuery = window.location.search.substring(1).split('&');
		var paramsQuery;

		if (params.indexOf('?') != -1) {
			paramsQuery = params.substring(params.indexOf('?')+1).split('&');
		} else {
			paramsQuery = params.split('&');
		}

		var searchArray = {};
		var paramsArray = {};

		for (var i in searchQuery) {
			var pair = searchQuery[i].split(/=/);
			if (pair.length == 2) {
				searchArray[pair[0]] = decodeURI(pair[1]);
			}
		}

		for (var i in paramsQuery) {
			var pair = paramsQuery[i].split(/=/);
			if (pair.length == 2) {
				searchArray[pair[0]] = decodeURI(pair[1]);
			}
		}

		anchor = http_build_query(searchArray);
		window.location = window.location.protocol+'//'+window.location.host+window.location.pathname+'#'+anchor;
		return false;
	} else {
		anchor = params.substring(params.indexOf('?')+1);
		Hash.go(anchor);
	}

	return false;
}

/**
----------------------------------------------------------------------------------------------------
 *
 * Description: (re)Binds all events to search form / results.
 *
 * @param firstTime Is this the first time we call this?
 *
 * @return boolean TRUE always
 */
function searchBindEvents(firstTime) {
	searchAddShowAllFilters();

	if (isRunningIE6OorBelow != true) {
		$('a.ajaxSearchable').bind('click', {type: 'link'}, searchAddAnchorHistory);
		$('select.ajaxSearchable ').bind('change', {type: 'select'}, searchAddAnchorHistory);
		$('form#search-form button:submit').bind('click', {type: 'submit'}, searchAddAnchorHistory);
	}

	$('#timeinterval')
		.bind('change', searchChangeTimeInterval)
		.change();

	searchBindExtendedSearchButton(firstTime);
	searchDefaultSearchString();
	searchBindDatePicker();
	return true;
} // end searchBindEvents


/**
 * This calls AJAX to reload content from search anchor
 *
 * @param firstPage TRUE if content should be reloaded on page without hash values
 */
function searchReloadSearchFromAnchor(firstPage) {
//	if (window.location.hash.length > 1) {
//		searchAjaxPerformCall(window.location.hash.substr(1),false);
//	} else if (firstPage) {
//		searchAjaxPerformCall(window.location.search.substr(1),true);
//	}
}

/**
 * Description: Responsible for calling right functions
 * based on selected loyalty_card. This is used on cart.html page
 * when loyalty program is enabled.
 *
 * @return void
 */
function handleLoyaltyProgramService() {
    var cardTypeSeletor = $('#lp_card_type');
    var currentVal = cardTypeSeletor.val();

    switch (currentVal){
        default:
            proccesLoyaltyCardType(currentVal);
    }

    // card type show hide toggler
    $('#lp_card_type').bind('change', function(){
         proccesLoyaltyCardType($(this).val());
    });
}

/**
 * Description: Responsible for calling right
 * procces for given cardtype
 * 1 - Kontramark card type handling
 * 2 - Russina Loyalty card handling
 *
 * @see function handleLoyaltyProgramService()
 *
 * @param integer cardType
 */
function proccesLoyaltyCardType(cardType) {

    switch (cardType) {
        case '2' :
             loyaltyCardProcessLoyaltyCardType();
            break;

        case '1' :
             loyaltyCardProcessKontramarkaType();
            break;

        default:
             loyaltyCardResetCardType();
            break;
    }
}

/**
 * Description: Reset loyalty card type selection
 * Hide all input fields inside a form
 *
 * @return bool always true;
 **/
function loyaltyCardResetCardType() {

    $('#loyalty_service input').each(function(){
        if ($(this).attr('id') != 'lp_card_type' && $(this).attr('id') != 'loyalty_program_service_id') {
            loyaltyCardToggleElement( '#' + $(this).attr('id'), 'hide');
        }
    });

     $('#loyalty_service select').each(function(){
        if ($(this).attr('id') != 'lp_card_type') {
            loyaltyCardToggleElement( '#' + $(this).attr('id'), 'hide');
        }
    });

    return true;
}

/**
 * Description: Procces elements which needs to be shown
 * for kontramarka card type. This type requires only one field.
 * Required fields: lp_barcode
 *
 * @return void
 **/
function loyaltyCardProcessKontramarkaType() {
    // always first hide all elements
    loyaltyCardResetCardType();
    loyaltyCardToggleElement('#lp_barcode', 'show');
}

/**
 * Description: Procces elements which needs to be shown
 * for russian loyalty_card type. This type requires
 * Required fields: lp_barcode, lp_spent_ampunt_type
 *
 * @return void
 **/
function loyaltyCardProcessLoyaltyCardType() {
    var currVal = $('#lp_spent_amount_type').val();

    // always first hide all elements
    loyaltyCardResetCardType();
    loyaltyCardFieldSpentAmount(currVal);

    loyaltyCardToggleElement('#lp_barcode','show');
    loyaltyCardToggleElement('#lp_spent_amount_type','show');

    $('#lp_spent_amount_type').bind('change', function(){
        loyaltyCardFieldSpentAmount($(this).val());
    });
}
/**
 * toggles form input element parent tag (div or li) to visible or hiden
 *
 * @return bool;
 */
function loyaltyCardToggleElement(element, mode){
    if ($(element).parent('div').length > 0) {
        el = $(element).parent('div');
        switch (mode) {
            case 'hide':
            case 0:
                 el.hide();
            break;

            default:
                el.show();
        }
    }

    return true;
}

/**
 * Enable button if (one or more) performance is selected
 *
 * @param /
 *
 * @return /
 *
 * @requireIn document.ready
 *
 * @onPage performance page
*/
function manageReserveButton() {
	$("#frm_choose button").attr('disabled', true).removeClass('action-btn');
	var sum;

	sum = 0;
	$("#frm_choose select").each(function() {
		sum += parseInt($(this).val());
	});

	if(sum == 0) {
		$("#frm_choose button").attr('disabled', true).removeClass('action-btn');

	} else {
		$("#frm_choose button").attr('disabled', false).addClass('action-btn');
	}

	$("#frm_choose select").change(function() {

		sum = 0;
		$("#frm_choose select").each(function() {
			sum += parseInt($(this).val());
		});

		if(sum == 0) {
			$("#frm_choose button").attr('disabled', true).removeClass('action-btn');

		} else {
			$("#frm_choose button").attr('disabled', false).addClass('action-btn');
		}

	});

}

/**
 * Description: This is called within  loyaltyCardProcessLoyaltyCardType()
 * function when user selects how much bonus he wants to spent
 * It triggers showing and hiding of lp_spent_amount field.
 * Required fields: lp_spent_amount
 *
 * @return void
 */
function loyaltyCardFieldSpentAmount(currentSpentType) {

    switch (currentSpentType) {
        case '2':
            // choosed to use custum number of bonuses
             loyaltyCardToggleElement('#lp_spent_amount','show');
        break;

        default:
            // choosed to not use any card bouses
            loyaltyCardToggleElement('#lp_spent_amount','hide');
            $('#lp_spent_amount').val('');

        break;
    }
    return true;
}


/**
 * Tell a friend functionality
 */


function tellFriendHandleErrors(data)
{
    $('#tell-a-friend .notice').hide();

    $('#tellfriend_fieldset .error').remove();

    if (data.name_from.error != 0) {
        $($('#tellfriend_fieldset ol').children().get(0)).append('<div class="error">'+data.name_from.error_msg+'</div>');
    }
    if (data.name_to.error != 0) {
        $($('#tellfriend_fieldset ol').children().get(2)).append('<div class="error">'+data.name_to.error_msg+'</div>');
    }
    if (data.email_from.error != 0) {
        $($('#tellfriend_fieldset ol').children().get(1)).append('<div class="error">'+data.email_from.error_msg+'</div>');
    }
    if (data.email_to.error != 0) {
        $($('#tellfriend_fieldset ol').children().get(3)).append('<div class="error">'+data.email_to.error_msg+'</div>');
    }
    if (data.captcha && (data.captcha.error != 0)) {
        $('#captcha_image').attr('src', '/images/captcha.gif?' + (new Date()).getMilliseconds());
        $('#captcha').val('');
        $($('#tellfriend_fieldset ol').children().get(6)).append('<div class="error">'+data.captcha.error_msg+'</div>');
    }
    if (data.recaptcha && (data.recaptcha.error != 0)) {
        $('#recaptcha_widget').append('<div class="error">'+data.recaptcha.error_msg+'</div>');
    }
    if (data.text.error != 0) {
        $($('#tellfriend_fieldset ol').children().get(4)).append('<div class="error">'+data.text.error_msg+'</div>');
    }

}

/**
 * Handles after-sending settings
 */
function tellFriendHandleSend(send) {
    Recaptcha.reload();
    $('#tell-a-friend .notice').show();

    $('#name_from').val('');
    $('#name_to').val('');
    $('#email_from').val('');
    $('#email_to').val('');
    $('#text').val('');
    $('#recaptcha').val('');
}

function tellFriend()
{

    $('#tell-a-friend .notice').hide();
    $('#tell-a-friend').hide();

    $('#tell-a-friend > form').submit(
        function() {
            $.post(
                $('input[name="ajax_target"]').attr('value') + 'handle_module_data.html?module=tell_friend&ajax=1&' + $('input[name="ajax_action"]').attr('value'),
                $(this).serialize(),
                function(data){
                    tellFriendHandleErrors(data);

                    if (data.error == false) {
                        tellFriendHandleSend(data.send);
                    }
                },
                'json'
            );
            return false;
        }
    );
}

$(document).bind('onBeforeJsUnhide', function() {
	if (window.location.hash.length > 1) {
		$('#search-results').remove();
		$('#search-filter').remove();
		searchReloadSearchFromAnchor();
	} else {
		$('#search-results').hide();
		$('#search-filter').hide();
	}
});

/* after jsHide disable */
$(document).bind('onAfterJsUnhide', function() {
	$('#search-results').show();
	$('#search-filter').show();
});
