/**
 * Golf Minute
 * 
 * Yet another Kemar joint
 * @version: 1.0 (04.11.2009)
 * @version: 1.1 (27.01.2010)
 *
 */
(function(){
	$(document).ready(function() {
		$('body').addClass('js');
		$('.success').displayMessage(5000);
		$('.scores-trigger').scoresModalPanel();
		$('input:text, input:password', $('#nav')).switchLabelToVal();
		$('#discover-golf').doNotSendDefaultValue();
		$('input:text', $('#home-golf')).hideDefaultValue();
		$('input:text', $('#discover-golf')).hideDefaultValue();
		$('#id_is_student').checkedControl( $('#id_is_senior') );
		$('#golf-pic').imageSwitch();
		$('#add_players').enhanceChoosePlayersForm();
		$('#admin_add_players').enhanceIndexField();
		$('#admin_edit_player').enhanceIndexField();
		$("#admin_add_players input[name*='last_name']").suggestPlayers();// les inputs dont le nom contient 'last_name'
		$('a.popup').click( function(e) { window.open(this.href,'','width=600,height=500,resizable,scrollbars=yes'); e.preventDefault(); });
		$('a.close').click( function(e) { window.close(); e.preventDefault(); });
		$('a.external').attr('target', '_blank');
		$('h1.arrow').enhanceTitles();
		$('#order-form').find('select').change(function(){if(this.value)$('#order-form').submit();}).end().find('input:submit').hide().end().find('label').hide();
		// big forms tooltips
		if($('.tooltip', $('#content')).length) {
			$('.tooltip', $('#content')).tipTip({maxWidth: '260px', delay: 100, edgeOffset: 2});
		};
		// conveniences tooltips
		if($('.conv-pic', $('#conv-container')).length) {
			$('.conv-pic', $('#conv-container')).tipTip({maxWidth: '200px', delay: 100, edgeOffset: -2});
		};
		// admin tooltips
		if($('.tee-help').length) {
			$('.tee-help').tipTip({maxWidth: '200px', delay: 100, edgeOffset: 4});
		};
	});
})();

(function($){

	$.fn.suggestPlayers = function() {

		var player_input = this;

		if (player_input.length) {

			var suggestions_url = $('#suggestions_url').val();

			player_input.each(function(){
				$(this).attr('autocomplete','off');//get rid of the annoying autocomplete in Firefox
				$(this).keyup(init);
				$(this).focus(function(){ return endProcess(); });
				$(this).blur(function(){ setTimeout(function(){ endProcess(); }, 500 ); });
			});
			// prevent form submit on hitting return
			$(document).bind('keydown',function(e){
				if (e.keyCode===13 && $('.suggest-box').length) {//return
					e.preventDefault();
				};
			});
		};
    
		return this;
    
		function init(event) {

			var cur_player_input = $(this);

			// on récupère tout le texte saisi
			var input = $.trim($(cur_player_input).val());
			if (input==='') { return endProcess(); };

			// on arrête si on detecte la touche ESC, BACK, LEFT ou RIGHT
			if (event.keyCode == 27) { return endProcess(); };//esc

			if (/^(37|39)$/.test(event.keyCode)) { return; };//left, right

			// sinon on peut construire le conteneur des suggestions
			buildSuggestionBox( cur_player_input );

			// si on a quelquechose, on arrête si on detecte la touche DOWN, UP ou ENTER => on peut choisir au clavier
			// if (event.keyCode == 40) { selectNextResult(); return; };//down
			// if (event.keyCode == 38) { selectPrevResult(); return; };//up

			// sinon on cherche des suggestions en limitant le nombre de requetes
			getSuggestions(input);
		};

		function endProcess() {
			$('.suggest-box').remove();
			return false;
		};
    
		// Insere le conteneur (ul.suggest-box) de la liste de suggestions
		function buildSuggestionBox(cur_player_input) {
			if (!$('.suggest-box').length) {
				var input = $(cur_player_input);// l'input de saisi
				var suggestion_box = $('<ul></ul>');
				suggestion_box.attr('class','suggest-box').hide();
				suggestion_box.css({
					'width': input.outerWidth(),
					'top': input.position().top + input.outerHeight() + 2,
					'left': input.position().left - 2
				});
				input.parent().append(suggestion_box);
			};
		};

		// on parse le json
		function getSuggestions(input) {

			var suggestion_box = $('.suggest-box');
			var content        = '';
			var results        = '';

			// on récupère les ids des joueurs déjà saisis
			var already_filled_users_ids = $("input[name*='user_id']").map(function() {
			  return this.value !== '' ? this.value : null;
			})

			$.post(
				suggestions_url,
				{ input: input },
				function(data){
					if ( data.length ) {
						var options = [];
						for (i in data) {
							if ( $.inArray( data[i].user.toString(), already_filled_users_ids ) > -1 ) {
								// remove already filled user
								continue;
							};
							var list_item = $('<li><a href="#">' + data[i].last_name + ' ' + data[i].first_name + '</a></li>');
							list_item.data( 'infos', data[i] );
							options.push( list_item );
						};
						if (options.length) {
							//http://orangevolt.blogspot.com/2009/04/howto-use-jquery-append-with-array.html
							suggestion_box.html('').append.apply( suggestion_box, $.isArray(options) ? options : [options]).show();
							$('li a', suggestion_box).click(function(e){
								var fieldset_container = suggestion_box.parent().parent();
								var infos = $(this).parent().data('infos');
								// populate form inputs
								$("input[name*='user_id']",fieldset_container).val( infos.user );
								$("input[name*='last_name']",fieldset_container).val( infos.last_name ).attr('disabled','disabled');
								$("input[name*='first_name']",fieldset_container).val( infos.first_name ).attr('disabled','disabled');
								$("input[name*='index']",fieldset_container).val( infos.index ).attr('disabled','disabled');
								$("input[name*='licence_num']",fieldset_container).val( infos.licence_num ).attr('disabled','disabled');

								fieldset_container.append( '<p class="cancel tar"><a href="#" class="trash">Cancel</a></p>' );
								$('p.cancel a',fieldset_container).click(function(e){
									$("input[name*='user_id']",fieldset_container).val('');
									$("input[name*='last_name']",fieldset_container).val('').removeAttr('disabled');
									$("input[name*='first_name']",fieldset_container).val('').removeAttr('disabled');
									$("input[name*='index']",fieldset_container).val('').removeAttr('disabled');
									$("input[name*='licence_num']",fieldset_container).val('').removeAttr('disabled');
									$(this).remove()
									e.preventDefault();
								});

								e.preventDefault();
								return endProcess();
							});
						};
					} else {
						suggestion_box.hide();
					};
				},
			'json');

		};

		// focus sur le prochain résultat de la liste
		function selectNextResult(){
			if ( $('.suggest-box li.selected').next().length ) {
				$('.suggest-box li.selected').removeClass('selected').next().addClass('selected');
				return;
			} else {
				$('.suggest-box li').removeClass('selected');
				$('.suggest-box li:first').addClass('selected');
				return;
			};
		};

		// focus sur le résultat précédent de la liste
		function selectPrevResult(){
			if ( $('.suggest-box li.selected').prev().length ) {
				$('.suggest-box li.selected').removeClass('selected').prev().addClass('selected');
				return;
			} else {
				$('.suggest-box li').removeClass('selected');
				return;
			};
		};

	};

	$.fn.enhanceIndexField = function() {
		if (!this.length) { return this; };
		var form = $(this);
		var inputs = $("input[name*='index']");// les inputs dont le nom contient 'index'
		form.submit(function(e) {
			// remplace la virgule par un point dans la saisie de l'index
			if ( inputs.length ) {
				inputs.each(function(){
					if ( $(this).val() ) {
						var val = parseFloat( $(this).val().replace(',','.') );
						if ( !isNaN(val) ) {
							$(this).val( val );
						};
					};
				});
			};
		});
	};

	$.fn.selectAllCheckBoxesInColumn = function(params) {
		var options = {
			min_checkboxes: 0,
			column_num: 1,
			main_checkbox_title: ''
		};
		var settings = $.extend( options, params);
		var tables = $(this);
		tables.each(function(){
			var column_checkboxes = $("tr td:nth-child(" + settings.column_num + ") input:checkbox", this);
			if (column_checkboxes.length > settings.min_checkboxes) {
				var th = $("tr th:nth-child(" + settings.column_num + ")", this);
				if (!th.length) {//colspan trick
					th = $("tr th:first-child", this);
				};
				var select_all = $('<input type="checkbox" class="tee-help" />');
				select_all.attr("title", settings.main_checkbox_title).tipTip();
				th.append( select_all ).click(function(e) {
					if (select_all.attr('checked')) {
						column_checkboxes.attr('checked','checked');
					} else {
						column_checkboxes.removeAttr('checked');
					};
				});
			};
		});
		return this;
	};

	$.fn.displayMessage = function(autoclose_time) {

		if (!this.length) { return this; };

		var divs = $(this);
		var autoclose_time = autoclose_time || 4000;

		divs.each(function(i) {
			var h = '-' + ( $(this).outerHeight() + 20 ) + 'px';
			var closed = false;
			$(this)
				.animate({'top': h}, 200, function() {
					var div = $(this);
					div.show();
					setTimeout(function(){
						if (!closed) {
							div.animate({'top': h}, 200, function(){$(this).remove();})
						};
					}, autoclose_time );
				})
				.animate({'top':'0'}, 1000);
			$(this).click(function(e){
				$(this).animate({'top': h}, 200, function(){$(this).remove();});
				closed = true;
				e.preventDefault();
			});
		});
		return this;
	};

	$.fn.checkedControl = function(that) {
		if (!this.length || !that.length) { return this; };
		var student = this, senior = that;
		student.click(function(){ checkOnlyOneItem(student, senior); });
		senior.click(function(){ checkOnlyOneItem(senior, student); });
		function checkOnlyOneItem(clicked_input, other_input) {
			if ( clicked_input.attr('checked') === true ) {
				other_input.attr('checked', false);
			};
		};
		return this;
	};

	$.fn.enhanceChoosePlayersForm = function() {

		if (!this.length) { return this; };

		var form = $(this);

		var user_is_a_player = $('#id_user_is_a_player');// Checkbox, si cochée : le membre participe à la réservation
		if ( user_is_a_player.length ) {
			toggleUser(user_is_a_player);
			user_is_a_player.click(function(){ toggleUser(user_is_a_player); });
		};

		var partners_list = $('.type_container', form);
		if (partners_list.length) {
			partners_list.css('border-bottom','1px solid #bebebd');
			for (var i=1, len=partners_list.length+1; i<len; i++) {
				var noclosure =  function(x) {
					var type       = $('#id_player'+x+'_type'),
					    is_partner = $('#player'+x+'_is_partner'),
					    is_guest   = $('#player'+x+'_is_guest');
					togglePlayerType( type, is_partner, is_guest );
					type.change(function(e){ togglePlayerType( type, is_partner, is_guest ); });
				}(i);
			};
		};

		return this;

		function toggleUser(checkbox) {
			var siblings = checkbox.parent().nextAll();
			if ( checkbox.attr('checked') === true ) {
				checkbox.parent().css('background','#e9f6d7');
				siblings.hide();
				$('select',siblings).val('');
				$('input',siblings).val('');
			} else {
				checkbox.parent().css('background','transparent');
				if ( partners_list && partners_list.length ) {
					// dans ce cas, le membre a des partenaires
					siblings.show();
					togglePlayerType( $('#id_player1_type'), $('#player1_is_partner'), $('#player1_is_guest') );
				} else {
					siblings.show();
				};
			};
		};

		/*
		* select : Select du choix du type de joueur
		* partner_bloc : Div contenant les fields pour un joueur de type partenaire
		* guest_bloc : Div contenant les fields pour un joueur de type guest
		*/
		function togglePlayerType( select, partner_bloc, guest_bloc ) {
			var select_val = select.val();
			if ( select_val === 'guest' ) {
				partner_bloc.hide();
				$('select',partner_bloc).val('');
				guest_bloc.show();
			} else if ( select_val === 'partner' ) {
				guest_bloc.hide();
				$('input',guest_bloc).val('');
				partner_bloc.show();
			} else {
				guest_bloc.hide();
				$('input',guest_bloc).val('');
				partner_bloc.hide();
				$('select',partner_bloc).val('');
			};
		};

	};

	$.fn.enhanceTitles = function() {
		if (!this.length) { return this; };
		var h1s = $(this);
		h1s.each(function(i) {
			var h1 = $(this);
			h1.wrapInner('<a href="#"></a>').toggleClass('arrow-down').css('cursor','pointer');
			// if (i==0) {
			// 	h1.wrapInner('<a href="#"></a>').toggleClass('arrow-down').css('cursor','pointer');
			// } else {
			// 	h1.wrapInner('<a href="#"></a>').next('div.block').toggle();
			// };
			h1.click(function(e){
				$(this).next('div.block').toggle('fast').end().toggleClass('arrow-down');
				e.preventDefault();
			});
		});
		return this;
	};

	$.fn.imageSwitch = function() {

		if (!this.length) { return this; };

		var pics = $('img', this);
		var triggers = $('a', this);

		if (pics.length===1) { return this; };

		pics.wrapAll('<div id="pics-container"></div>')
		$('#pics-container').css({ 'height': $(pics.get(0)).height(), 'position': 'relative' });

		pics.css({ 'position': 'absolute', 'top': 0, 'left': '0' }).hide();
		var first_pic = $(pics.get(0)).show();
		var current_pic_index = 0;

		triggers.click(function(e){
			e.preventDefault();
			var pic_to_hide = $(pics.get(current_pic_index));
			var new_pic_index = triggers.index( this );
			var pic_to_show = $(pics.get(new_pic_index));
			if ( current_pic_index === new_pic_index ) {
				return;
			};
			current_pic_index = new_pic_index;
			pic_to_show.css('z-index', 1).show();
			pic_to_hide
				.css({
					'z-index': 10,
					'opacity': 1
				})
				.animate({'opacity':0}, 500, function(){
					$(this).hide().css('opacity', 1);
				});
		});
	};

	$.fn.switchLabelToVal = function() {
		return this.each(function() {
			var prev = $(this).prev('label');
			var label = prev.text();
			if (prev) {
				prev.hide();
				$(this).val( label );
				$(this).focus(eraseVal);
				$(this).blur(setVal);
			};
			function eraseVal() {
				if ( $(this).val() === label ) {
					$(this).val('');
				};
			};
			function setVal() {
				if ( $(this).val() === '' ) {
					$(this).val(label);
				};
			};
		});
	};

	$.fn.hideDefaultValue = function() {
		return this.each(function() {
			var label = $(this).val();
			$(this).focus(eraseVal);
			$(this).blur(setVal);
			function eraseVal() {
				if ( $(this).val() === label ) {
					$(this).val('');
				};
			};
			function setVal() {
				if ( $(this).val() === '' ) {
					$(this).val(label);
				};
			};
		});
	};

	$.fn.doNotSendDefaultValue = function() {
		if (!this.length) { return this; };
		var form=$(this), dpt_input=$('#id_dpt', form), dpt_input_label=dpt_input.val();
		form.submit(function(e) {
			if ( dpt_input_label === dpt_input.val() ) {
				dpt_input.val('')
			};
		});
	};

	$.fn.scoresModalPanel = function(customParams) {

		if (typeof document.body.style.maxHeight === "undefined") { //if IE 6
			return;
		}
		var params = {
			overlayOpacity: 0.8,
			fadeInTime: 400,
			fadeOutTime: 400
		};
		$.extend(params, customParams);

		return this.each(function() {
			var overlay = $('<div class="modal-overlay"></div>');     // le div à fond noir
			var container = $('<div class="modal-content"></div>');   // le div contenant au dessus du fond noir
			var content = $(this).parent().next('.scores-container'); // le contenu à afficher
			if (!content.length) {
				return;
			};
			content.hide();
			function modalShow(e) {
				$('body').append( overlay.click(modalHide) );
				overlay.css('opacity', params.overlayOpacity).fadeIn( params.fadeInTime );
				container.html( content.clone().fadeIn( params.fadeInTime ) );
				$('body').append( container );
				container.css({
					'margin-left': -(content.outerWidth() / 2),
					'margin-top': -(content.outerHeight() / 2)
				}).fadeIn( params.fadeInTime );
				var close_link = $('.close a:first', container);
				close_link.click( function(e) { modalHide(); e.preventDefault(); } );
				$(document).keydown(handleEscape);
				e.preventDefault();
			};
			function modalHide() {
				$(document).unbind("keydown", handleEscape);
				overlay.fadeOut( params.fadeOutTime, modalRemove );
				container.fadeOut( params.fadeOutTime, modalRemove );
			};
			function modalRemove() {
				$(this).remove();
			};
			function handleEscape(e) {
				if (e.keyCode == 27) {
					modalHide();
				};
			};
			$(this).click( modalShow );
		});
	};

})(jQuery);

// http://www.jslab.dk/library/Date.getISOWeek
// Get ISO week number of the year
// The algorithm is credit to Claus Tøndering and is taken from his calendar FAQ
// See http://www.tondering.dk/claus/cal/node8.html#SECTION00880000000000000000
// for more information
// Integer division: a/b|0
Date.prototype.getISOWeek =
function(utc) {
    var y = utc ? this.getUTCFullYear() : this.getFullYear();
    var m = utc ? this.getUTCMonth() + 1: this.getMonth() + 1;
    var d = utc ? this.getUTCDate() : this.getDate();
    // If month jan. or feb.
    if (m < 3) {
        var a = y - 1;
        var b = (a / 4 | 0) - (a / 100 | 0) + (a / 400 | 0);
        var c = ((a - 1) / 4 | 0) - ((a - 1) / 100 | 0) + ((a - 1) / 400 | 0);
        var s = b - c;
        var e = 0;
        var f = d - 1 + 31 * (m - 1);
    }
    // If month mar. through dec.
    else {
        var a = y;
        var b = (a / 4 | 0) - (a / 100 | 0) + (a / 400 | 0);
        var c = ((a - 1) / 4 | 0) - ((a - 1) / 100 | 0) + ((a - 1) / 400 | 0);
        var s = b - c;
        var e = s + 1;
        var f = d + ((153 * (m - 3) + 2) / 5 | 0) + 58 + s;
    }
    var g = (a + b) % 7;
    // ISO Weekday (0 is monday, 1 is tuesday etc.)
    var d = (f + g - e) % 7;
    var n = f + 3 - d;
    if (n < 0)
    var w = 53 - ((g - s) / 5 | 0);
    else if (n > 364 + s)
    var w = 1;
    else
    var w = (n / 7 | 0) + 1;
    return w;
};

