pac = {};
pac.ui = pac.ui || {};

pac.ui.headline = {};
/***********************************************************
*
* UI
*
***********************************************************/

pac.ui.init = function()
{
	jQuery.browser.msie6 = jQuery.browser.msie && parseInt(jQuery.browser.version) == 6 && !window["XMLHttpRequest"];
	
  pac.ui.display();
	pac.ui.menuInit();
	pac.ui.headline.init();
	pac.ui.fancyBoxImages('.gallery');
	pac.ui.fancyBoxVideoInit('.gallery-video');
	pac.ui.genericTabsInit();
	
	pac.labels = heap.labels['default'];
};

pac.ui.showMap = function (selector, marker)
{
	var gmapOptions = {
	   zoom:         16,
	   controls:     ["GSmallMapControl"],
	   scrollwheel:  false,
	   maptype:      G_NORMAL_MAP,
		markers: [{latitude: marker.latitude, longitude: marker.longitude}]
	};
	$(selector).gMap(gmapOptions);
}

pac.ui.menuInitPos = function ()
{
	// adjust main menu drop down list width
	var coeff = 8.5; // pixel width for each one (1) character in list item
	$('#nav-main ul ul').each(function(){
		// find longest li string
		var ul = $(this);
		var maxlength = 0;
		var child = ul.children("li");
		child.children("a").each(function(){
			var length = $(this).html().length;
			if (length > maxlength) { maxlength = length; }
		});
		var width = maxlength*coeff;
		if (width > ul.width()) ul.css("width", width); // alter parent ul width
		
		// checks if left offset has to be altered
		if (ul.is(".sublevel")) { ul.css("left", ul.parent().parent().css("width")) };
		
		// check if ul's position is greater than viewport of 1024 px, only if screen res > 1500 px
		if ($(window).width() < 1500) {
			var posX = $('#header').offset().left + $('#header').width(); // the right limit we can't cross
			var ulX = ul.offset().left + ul.width();	// the right offset of given UL
			if (ulX > posX) {
				ul.css("left", -1*(ulX-posX+6))
				  .addClass("reverse");
			}			
		}
	});
}

pac.ui.menuInit = function()
{
	if ($.browser.msie6) return false;
	$('#nav-main ul').droppy();
}

pac.ui.display = function()
{
	// manage toggling link
	$('.toggle').each(function() {
		var h = $(this).prev();
		var t = $(this);
		t.hide();
	  h.addClass("toggler")
		 .click(function() {
	 			var t = $(this).next();
				// major issue with slideToggle() and toggle()
				// does not work for some reason. try it manually
				if (t.css('display') == 'none') {
					t.slideDown(200);
					$(this).addClass("toggler-open");
				} else {
					$(this).removeClass("toggler-open");
					t.slideUp(100);
				}
		  });
		// expand default
		if (t.is(".open")) { h.trigger('click'); }
	});
	
	// split list items in 2 columns
  $('ul.split').each(function() {
	  if($(this).is("ol")) { var ordered = true; }
	  var colsize = Math.round($(this).children("li").size() / 2);
	  $(this).children("li").each(function(i) {
	  	if (i>=colsize) { $(this).addClass('right-col'); }
	  });
	  if(ordered) {
	  	$(this).children('.right-col').insertAfter(this).wrapAll('<ol class="split column-last" start="' + (colsize+1) + '"></ol>').removeClass("right-col");
	  } else {
	  	$(this).children('.right-col').insertAfter(this).wrapAll('<ul class="split column-last"></ul>').removeAttr("class");
	  }
		$(this).next().after('<div class="clearer"></div>');
  });	

	// manage search field auto value
	var searchElem = $('#search-field');
	// var currentVal = searchElem.val();
	// var searchDefault = currentVal == "" ? searchElem.next().html() : currentVal;
	var searchDefault = searchElem.next().html();
	searchElem
		.val(searchDefault)
		.focus(function() {
			$(this).addClass("focus");
			if ($(this).val() == searchDefault) $(this).val("");
		})
		.blur(function() {
			if ($(this).val() == "") {
				$(this).val(searchDefault);
				$(this).removeClass("focus");
			}
		});
	
	// manage single line main menu item postion
	$("#nav-main ul li a").not("ul li ul li a").each(function () { if ($(this).html().indexOf('<') == -1) { $(this).parent().addClass("singleline"); } });
	
	$("a[href^='http']:not(.not-external)").not("a[href^='http:\/\/"+window.location.hostname+"']").attr("target", "_blank").not(":has(img)").addClass("external");
	$("a[href$='pdf']").removeClass("external").addClass("pdf").attr("target", "_blank"); // adds special icon based on href extension

	$(".column + .column", ".content-body").addClass("column-last").after('<div class="clearer"></div>'); // adds clearer after adjacent columns in context	

	// sets equal heights
	$(".equalheight").equalHeight();

}

pac.ui.fancyBoxImages = function(selector)
{
	var opts = {};
	
  if ($(selector).is(".ajax")) {
  	opts.type = 'ajax';
  	opts.ajax = {data: {ajax:true}};
  	opts.width = 630;
  	opts.height = 450;
  	opts.autoDimensions = false;
  	opts.titleFormat = function(title, currentArray, currentIndex, currentOpts) {
		   return '<span id="fancybox-title-wrap">' + title + '</span>';
    };
  } else {
  
  	opts.onComplete = function(currentArray, currentIndex, currentOpts) {
     	$("#fancybox-left-alt").click(function(e) { e.preventDefault(); $.fancybox.prev(); });
			$("#fancybox-right-alt").click(function(e) { e.preventDefault(); $.fancybox.next(); });
    };
    opts.titleFormat = function(title, currentArray, currentIndex, currentOpts) {
		   var subtitle = "";
		   if (title.indexOf(" | ") !== -1) {
		   	temp = title.split(" | ", 2);
		   	title = temp[0];
		   	subtitle = temp[1];
		   }
		   str = '<span id="fancybox-title-wrap">' + title;
		   if (subtitle !== "" && subtitle !== title) str += ' <span id="fancybox-subtitle">' + subtitle + '</span>';
		   str += '</span>';
		   str += '<span id="fancybox-title-nav">';
		   if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex !== 0) str += '<a href="" id="fancybox-left-alt"></a>';
		   if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex != (currentArray.length -1)) str += '<a href="" id="fancybox-right-alt"></a>';
		   str += (currentIndex + 1) + ' ' + pac.labels.page_de + ' ' + currentArray.length;
		   str += '</span>';
		   return str;
     };
  }
	opts.scrolling = "no";
  $(selector).fancybox(opts);
};

pac.ui.fancyBoxVideoInit = function(selector) {
	$(selector).each(function(){
		var dimensions = $(this).attr('rel').split(",");
		pac.ui.fancyBoxVideo("#"+$(this).attr('id'), {
			href: $(this).attr('href'),
			width: parseInt(dimensions[0]),
			height: parseInt(dimensions[1])
		});
	});
}

pac.ui.fancyBoxVideo = function(selector, options)
{	
	var player = heap.urlmap['static'] + "/swf/player.swf";
	var offsetHeight = 50;
	options.params = options.params || {};
	options.params.allowFullScreen = 'true';
	options.params.salign = 'tl';
	options.params.wmode = 'opaque';
	options.params.scale = 'noscale';
	options.params.flashvars = "videoURL="+options.href;
	$(selector).fancybox({
    'titleShow':	false,
		'showNavArrows': false,
		'enableKeydown': false,
		'type' : 'swf',
		'swf': options.params,
		'href': player,
		'width': options.width,
		'height': options.height + offsetHeight,
		'onStart': function () { window.clearInterval(pac.ui.headline.timer) }
  });
};

pac.ui.headline.init = function () {

	pac.ui.headline.elem = {
		main:  $(".headline"),
		pager: $(".headline .pager"),
		bloc:  $(".headline .headline-bloc")
	};

	if (!pac.ui.headline.elem.main.length) return false;
		
	// show first element
	pac.ui.headline.isInit = true;
	pac.ui.headline.show(1);
	pac.ui.headline.setAutoplay(7000); // delay in milliseconds
}

pac.ui.headline.setAutoplay = function (elapsed) {
	pac.ui.headline.timer = window.setInterval(function(){
		// determine active slide
		var current = pac.ui.headline.elem.pager.children(".page-active").children().attr("rel");	
		var next = parseInt(current)+1;
		if (next > pac.ui.headline.elem.pager.children().length) next = 1;
		pac.ui.headline.elem.pager.children(":eq("+(next-1)+")").trigger('click', [false]);
	}, elapsed);
}

pac.ui.headline.show = function (id) {

	id--;
	pac.ui.headline.elem.active = pac.ui.headline.elem.main.children(":eq("+id+")");
	pac.ui.headline.elem.activeId = id;

	// if first initialize
	if (pac.ui.headline.isInit) {
		// hide all other, except one with id
		pac.ui.headline.elem.bloc.not(pac.ui.headline.elem.active).hide();
		pac.ui.headline.fadeInClean();
		pac.ui.headline.isInit = false;
	} else {
		var elem = pac.ui.headline.elem.main.children(".headline-active");
		if (elem.is(':animated')) {
			return false;
		}
		elem.stop().fadeOut(500, pac.ui.headline.fadeInClean());
		elem.removeClass("headline-active");
	}
}

pac.ui.headline.fadeInClean = function ()
{
	var elem = pac.ui.headline.elem.active;
	elem.addClass("headline-active");
	pac.ui.headline.pagerInit();

	if (elem.is(':animated') || pac.ui.headline.isInit) return false;
	elem.stop().fadeIn(1500);
	return false;
}

// in headline pager, bind corresponding color class to active page
pac.ui.headline.colorize = function ()
{
	var colorPalette = pac.ui.headline.elem.active.children("div").attr("class").split(" ").slice(-1).join("");
	pac.ui.headline.elem.pager.children('.page-active')
		.addClass(colorPalette+"-overlay")
		.children().addClass(colorPalette);
}

pac.ui.headline.pagerInit = function ()
{
	// bind methods to navigate through headline panels
	var pager = pac.ui.headline.elem.pager;
	if (pager.length) {
		
		pager.children(".page-active").unbind().click(function(){ return false; });
		pager.children().not(".page-nav, .page-active").unbind().click(function(){

			// userTrigger defines wheter human as clicked on button, or click event automatically triggered by timer
			//if (userTrigger == 'undefined') userTrigger = true;

			// void interval if user has explicitally clicked on pages
			//if (userTrigger) window.clearInterval(pac.ui.headline.timer);

			$(".page", pager).attr("class", "").addClass("page").children("a").attr("class", "");
			$(this).addClass("page-active");

			pac.ui.headline.show($(this).children().attr("rel"));

			return false;
		});
		pac.ui.headline.colorize();
	}	
}

pac.ui.genericTabsInit = function()
{
	$('.tab-panel').hide(); // hide all tab
	$('.tab-panel:first')
		.show() // show first tab
		.parents('.tabs-enabled')
		.prev()
		.find('.tab:first')
		.addClass("active"); // mark first tab as active
		
	$('.tabs-panel .tab a').not('.disabled').click(function(event){
		event.preventDefault();
		if ($(this).parent().is('.active')) return false;
    var target = $(this).attr('rel');
    $('.tabs-panel .tab').removeClass('active');
    $(this).parent().addClass('active');
		$('.tab-panel').hide();
		$('#'+target).stop().fadeIn(300);
    return false;
  });

};

pac.api = {};
pac.api.reservation = {};
heap.api.setup({
	object: pac.api.reservation,
	'api_class':'reservation',
  url: heap.urlmap.pac_api_json,
	methods: ['submit']
});
pac.api.postulation = {};
heap.api.setup({
	object: pac.api.postulation,
	'api_class':'postulation',
  url: heap.urlmap.pac_api_json,
	methods: ['submit']
});
pac.api.contact = {};
heap.api.setup({
	object: pac.api.contact,
	'api_class':'contact',
  url: heap.urlmap.pac_api_json,
	methods: ['submit']
});
pac.api.devenezami = {};
heap.api.setup({
	object: pac.api.devenezami,
	'api_class':'devenezami',
  url: heap.urlmap.pac_api_json,
	methods: ['submit']
});
pac.api.infolettre = {};
heap.api.setup({
	object: pac.api.infolettre,
	'api_class':'infolettre',
  url: heap.urlmap.pac_api_json,
	methods: ['submit']
});

pac.form = {}
pac.form.reservation = {};
pac.form.reservation.init = function()
{
	var formElem = $("#form_reservation");  
	$(".datepicker").datepicker({ dateFormat: "yy-mm-dd", yearRange: '1909:'+((new Date()).getFullYear()+1), showAnim:"fadeIn",'changeMonth':true, 'changeYear':true});
	formElem.children("button").click(function() 	{
		var params = jQuery.forms.toDataStructure(formElem);
		pac.api.reservation.submit(pac.form.callbackReservation, params);
		return false;
	});
	pac.form.callbackReservation = function(response) { pac.form.callback(response, formElem); }
}

pac.form.postulation = {};
pac.form.postulation.init = function()
{
	var formElem = $("#form_postulation");
	formElem.children("button").click(function() 	{
		var params = jQuery.forms.toDataStructure(formElem);
		pac.api.postulation.submit(pac.form.callbackPostulation, params);
		return false;
	});
	pac.form.callbackPostulation = function(response) { pac.form.callback(response, formElem); }
}

pac.form.contact = {};
pac.form.contact.init = function()
{
	var formElem = $("#form_nousjoindre");
	formElem.children("button").click(function() 	{
		var params = jQuery.forms.toDataStructure(formElem);
		pac.api.contact.submit(pac.form.callbackContact, params);
		return false;
	});
	pac.form.callbackContact = function(response) { pac.form.callback(response, formElem, false); }
}

pac.form.devenezami = {};
pac.form.devenezami.init = function()
{
	var formElem = $("#form_devenezami");
	formElem.children("button").click(function() 	{
		var params = jQuery.forms.toDataStructure(formElem);
		pac.api.devenezami.submit(pac.form.callbackDevenezAmi, params);
		return false;
	});
	pac.form.callbackDevenezAmi = function(response) { pac.form.callback(response, formElem, false); }
}

pac.form.infolettre = {};
pac.form.infolettre.init = function()
{
	var formElem = $("#form_infolettre");
	formElem.children("button").click(function() 	{
		var params = jQuery.forms.toDataStructure(formElem);
		pac.api.infolettre.submit(pac.form.callbackInfolettre, params);
		return false;
	});
	pac.form.callbackInfolettre = function(response) { pac.form.callback(response, formElem); }
}

pac.form.medias = {};
pac.form.medias.init = function()
{
	var formElem = $("#form_medias");
	formElem.children("button").click(function() 	{
		var params = jQuery.forms.toDataStructure(formElem);
		heap.api.users.login(pac.form.callbackLogin, params);
		return false;
	});
	$('#logout').bind('click', function() { 
    heap.api.users.logout(pac.form.callbackLogout, {});
    return false;
  });

  pac.form.callbackLogin = function(response) 
	{ 
		if(response.type == heap.SUCCESS) {
		  document.location.reload();
		} else {

			switch (response.code) {
				case "AUTH_WRONG_LOGIN":
			 		selector = $("#username");
			  	break;
				default:
			  	selector = $("#password");
			}
		  $("div.error", formElem).remove();
		  $("input", formElem).removeClass("error");
		  
		  selector.addClass('error');
			$('<div class="error">'+heap.translate(response.code.toLowerCase())+'</div>').insertAfter(selector);
		  $(".error", formElem).fadeIn();
		}
		return false;
	}
}

pac.form.callbackLogout = function(response)
{	
	if(response.type == heap.SUCCESS)
	  document.location.reload();
	/*else
	  alert("ERREUR\n\n" + response.msg);
	*/
	return;
};

pac.form.callback = function(response, elem, doScroll)
{
	elem = $(elem);
	if (doScroll == undefined) doScroll = true;
	if(response.type == heap.SUCCESS) {
    success_send($(elem), doScroll);
	} else {
		$("div.error", elem).remove();
		for (var i in response.data) {          
			var selector = $('input[name='+i+'], textarea[name='+i+'], select[name='+i+']').last();
			selector
				.bind('focus, click, change', function() { 
					$(this)
						.removeClass('error')
						.siblings("div.error:first")
						.fadeOut(100);
					})
					.addClass('error');
			$('<div class="error">'+heap.translate(response.data[i])+'</div>').insertAfter((selector.next().is('label') ? selector.next() : selector));
		};
		$(".error", elem).fadeIn();
	}
}
var success_send = function(form, doScroll){
	$(form).css('height', $(form).height()+'px');
  $('button', form).remove();
	$('fieldset', form).fadeOut('slow', function(){
		$(this).remove();
		
	  $("#merci").fadeIn('slow');
    
    $(form).css('height', '');
    if (doScroll)
		  $('html, body').animate({scrollTop:0}, 'slow');
	});
};	

/*
 * equal height function
*/
jQuery.fn.equalHeight = function () {
    var height        = 0;
    var maxHeight    = 0;

    // Store the tallest element's height
    this.each(function () {
        height        = jQuery(this).outerHeight();
        maxHeight    = (height > maxHeight) ? height : maxHeight;
    });

    // Set element's min-height to tallest element's height
    return this.each(function () {
        var t            = jQuery(this);
        var minHeight    = maxHeight - (t.outerHeight() - t.height());
        var property    = jQuery.browser.msie && jQuery.browser.version < 7 ? 'height' : 'min-height';

        t.css(property, minHeight + 'px');
    });
};


