/**
 * PopCornPages
 * 
 * @version: 1.0 (10.03.2009)
 * @version: 1.1 (29.04.2009) checkAvailability()
 * @version: 1.2 (18.05.2009) enhanceTopForm(), fix enhancePeopleBlock()
 *
 */
(function(){
	$(document).ready(function() {
		$('#lang').transForm();
		$('#user-account').addAccountNav();
		$('#messages-list .message').addMessagesNav();
		$('#id_country').updateStates('#id_state');
		$('#top-form').enhanceTopForm('#top-form :submit');
		$('#form-container .community-container').addButtons();
		$('#form-container .link-container').addButtons();
		$('#account-form, #account-update-form').showLoader();
		$('#username-check').checkAvailability();
		$('#title-check').checkTitleAvailability();
		$('#id_keywords').suggestKeywords();
		$('a.external').attr('target', '_blank');
		$('a.popup').click( function() { window.open(this.href,'','width=600,height=500,resizable,scrollbars=yes'); return false; });
		$('a.close').click( function() { window.close(); return false; });
		$('#history-back').click( function() { window.history.back(); return false; });
	});
	$(window).load(function() {
		$('.people ul li a').enhancePeopleBlock();
		$('#auto-hide-me').delayedHide(5000);
		// $('#admin ul li a').setEqualHeight();
	});
})();

/**
 * delayedHide
 * time en milli-secondes
 */
jQuery.fn.delayedHide = function(time) {

	var boxToHide = $(this),
	time          = time;

	if (boxToHide.length) {
		setTimeout(function(){
			// boxToHide.animate({'opacity':0 }, 600, function(){ boxToHide.remove(); } );
			boxToHide.animate({'opacity':0, 'height':0, 'marginTop':0, 'marginBottom':0, 'paddingTop':0, 'paddingBottom':0 }, 600, function(){ boxToHide.remove(); } );
		}, time );
	};

	return this;

};

/**
 * checkAvailability
 */
jQuery.fn.checkAvailability = function() {

	var trigger    = $(this),
	username_input = $('#id_username'),
	ok_msg         = $('#username-ok'),
	ko_msg         = $('#username-ko');

	if ( trigger.length && username_input.length && ok_msg.length && ko_msg.length ) {
		username_input.attr('autocomplete','off');
		trigger.css({ 'display': 'block' });
		trigger.click(check);
	};

	return this;

	function check(ev) {
		ev.preventDefault();

		var username = jQuery.trim( username_input.val() );
		if (!username) {
			username_input.focus();
			hide_msg();
			return
		};

		hide_msg();

		username_input.after('<span class="static-ajax-loader">&nbsp;</span>');
		$.post(
			'/account/check/availability',
			{ u: username },
			function(data){
				data.is_available ? ok_msg.css({ 'display': 'inline-block' }) : ko_msg.css({ 'display': 'inline-block' });
		}, 'json');
		username_input.nextAll('.static-ajax-loader').eq(0).remove();
	};

	function hide_msg() {
		if ( ok_msg.is(':visible') ) { ok_msg.hide(); };
		if ( ko_msg.is(':visible') ) { ko_msg.hide(); };
	}

};

/**
 * checkAvailability
 */
jQuery.fn.checkTitleAvailability = function() {

	var trigger    = $(this),
	title_input = $('#id_title'),
	ok_msg         = $('#title-ok'),
	ko_msg         = $('#title-ko');

	if ( trigger.length && title_input.length && ok_msg.length && ko_msg.length ) {
		title_input.attr('autocomplete','off');
		trigger.css({ 'display': 'block' });
		trigger.click(check);
	};

	return this;

	function check(ev) {
		ev.preventDefault();

		var title = jQuery.trim( title_input.val() );
		if (!title) {
			title_input.focus();
			hide_msg();
			return
		};

		hide_msg();

		title_input.after('<span class="static-ajax-loader">&nbsp;</span>');
		$.post(
			'/account/check/title/availability',
			{ t: title },
			function(data){
				data.is_available ? ok_msg.css({ 'display': 'inline-block' }) : ko_msg.css({ 'display': 'inline-block' });
		}, 'json');
		title_input.nextAll('.static-ajax-loader').eq(0).remove();
	};

	function hide_msg() {
		if ( ok_msg.is(':visible') ) { ok_msg.hide(); };
		if ( ko_msg.is(':visible') ) { ko_msg.hide(); };
	}

};

/**
 * enhanceTopForm
 */
jQuery.fn.enhanceTopForm = function(submit) {

	var form = $(this),
	submit   = $(submit),
	boxes    = $(':checkbox', form),
	labels   = $('label', form),
	all      = $('#all', form),
	divs     = $('div.field-top-holder',form);

	if ( form.length && submit.length && boxes.length && all.length ) {
		all.click(checkAll);
		divs.mouseover( function(){ $(this).css({ 'cursor': 'pointer' }) } ).click(toggleCheckboxChild);
		boxes.click( toggleCheckbox );
		labels.click( function(ev) { ev.stopPropagation(); } )
		toggleSubmitBtn();
	};

	return this;

	// stop la propagation quand on clique sur une checkbox
	function toggleCheckbox(ev) {
		ev.stopPropagation();
		toggleAllBtn();
		toggleSubmitBtn();
	};

	// un clic sur le div conteneur coche la checkbox enfant
	function toggleCheckboxChild() {
		var checkbox = $(':checkbox', this);
		checkbox.attr('checked') ? checkbox.removeAttr('checked') : checkbox.attr('checked','checked') ;
		toggleAllBtn();
		toggleSubmitBtn();
	};

	// coche ou decoche toutes les checkboxes
	function checkAll() {
		if ( this.checked ) {
			boxes.attr('checked','checked');
		} else {
			boxes.removeAttr('checked');
		};
	};

	// decoche le bouton tout sélectionner au besoin
	function toggleAllBtn() {
		var checkedBoxesLength = $(':checked', form).length,
		boxesLength            = boxes.length;
		if ( checkedBoxesLength !== boxesLength ) {
			all.removeAttr('checked');
		};
	};

	// active ou désactive le bouton submit
	function toggleSubmitBtn() {
		if ( $(':checked', form).length == 0 ) {
			submit.attr('disabled','disabled');
		} else {
			submit.removeAttr('disabled');
		};
	};

};

/**
 * transForm
 * transforme la selectbox de lang en liste
 */
jQuery.fn.transForm = function() {
	var form = $(this);
	if (form.length) {
		form.hide();
		var lang_selectbox = $(':input',form).get(0);
		var lang_submit = $(':submit',form).get(0);
		var content = ''
		for (var i=0, len= lang_selectbox.options.length; i<len; i++) {
			var val  = lang_selectbox.options[i].value,
			txt      = lang_selectbox.options[i].text,
			selected = lang_selectbox.options[i].selected;
			content += '<li>';
			content += (selected) ? ('<strong>' + txt + '</strong>') : ('<a href="#" class="' + val + '">' + txt + '</a>');
			content += (i==len-1) ? '' : ' | ';
			content += '</li>';
		};
		$(lang_selectbox).remove();
		$(lang_submit).remove();
		var lang_list = $('<ul></ul>');
		lang_list.html(content);
		form.append(lang_list);
		var hidden = $('<input type="hidden" value="" name="language" id="language" />');
		form.append(hidden);
		$('li a',lang_list).click(function(e) {
			hidden.val(this.className);
			form.submit();
			e.preventDefault();
		}).css({ 'cursor': 'pointer' });
		form.show();
	};
	return this;
};

/**
 * showLoader
 */
jQuery.fn.showLoader = function() {

	var accountForm = $(this),
	submitBtn       = $('input:submit', accountForm);

	if (accountForm.length && submitBtn.length) {
		accountForm.submit(showLoader);
	};

	return this;

	function showLoader() {
		var span = $('<span class="ajax-loader">&nbsp;</span>');
		submitBtn.before( span );
		span.css({ 'right': (26 + submitBtn.width()) });
		// var img = $('<img width="24" height="24" />')
		// img.attr('src','/site_media/img/loader.gif');
		// img.load(function(){ accountForm.submit(); });
	};

};

/**
 * updateStates
 */
jQuery.fn.updateStates = function(statesBox) {

	var statesBox = $(statesBox),
	countryBox    = this;

	if (statesBox.length) {
		if ( !$('option:selected', statesBox).val() ) {
			statesBox.html("").hide().prevAll('label').eq(0).hide();
		};
		countryBox.change(toggleStates);
		toggleStates();
	};

	return this;

	function toggleStates() {
		if ( !countryBox.val() ) { return; };
		//show ajax loader
		countryBox.after('<span class="static-ajax-loader">&nbsp;</span>');
		//get data depending on country
		$.post(
			'/country/get/states',
			{ c: $('option:selected', countryBox).val() },
			function(data){
				if ( data.length ) {
					var options = '<option value="">---------</option>';
					for (i in data) {
						options += '<option value="' + data[i].pk + '">' + data[i].fields.name + '</option>'
					};
					//display and populate states label and selectbox
					statesBox.html(options).show().prevAll('label').eq(0).show();
				} else {
					statesBox.html("").hide().prevAll('label').eq(0).hide();
				};
		}, 'json');
		//hide ajax loader
		countryBox.nextAll('.static-ajax-loader').eq(0).remove();
	};

};


/**
 * addAccountNav
 */
jQuery.fn.addAccountNav = function() {

	var container = $(this);

	if (container.length) {
		var childs = $('div.section', container);
		if (childs.length) {
			// childs.addClass('noborder');
			var notification = $.grep(childs, function (div) { return div.id == 'notification'; });
			if( notification && !$(notification).children().length ) {
				$(notification).remove();
			};
			childs = $.grep(childs, function (div) { return div.id != 'notification'; });//exclude 'notification' div
			// childs = $.grep(childs, function (div) { return div.className != 'success-box'; });//exclude 'success-box' div
			buildAccountNav(childs);
			$('#user-account-nav li a').click(toggleNav);
		};
	};

	return this;

	function buildAccountNav(blocks) {
		blocks = $(blocks);
		blocks.eq(0).before('<ul id="user-account-nav"></ul>');
		var navContent = '';
		blocks.each(function(i) {
			navContent += '<li><a';
			navContent += ' name="' + (i) + '" href="#">' + $('h2:first', this).text() + '</a></li>';
			$('h2:first', this).hide();
		});
		$('#user-account-nav').html(navContent);
		//prepare current item
		var selectedIndex = Number($.cookie('popcornpages_cur_nav')) || 0;
		if ( /.*my\/popcornpage\/manage\/pcp$/.test(document.referrer) ) {
			selectedIndex = 0;
		};
		$('#user-account-nav li a').eq(selectedIndex).addClass('current');
		blocks.hide().eq(selectedIndex).show();
		$.cookie('popcornpages_cur_nav', selectedIndex)
	};

	function toggleNav(ev) {
		if (!$(this).hasClass('current')) {
			$('#user-account-nav li a').removeClass('current');
			$(this).addClass('current');
			var clicked_index = Number(this.name);
			$.cookie('popcornpages_cur_nav', clicked_index);
			// $(childs).hide().eq( Number(this.name) ).animate({'opacity':0.5},100).show().animate({'opacity':1},'fast');
			$(childs)
				.eq( clicked_index ).animate({'opacity':0.5},100).show().animate({'opacity':1},'fast').end()
				.each(function(i) { if (i !== clicked_index) { $(this).hide(); }; });
		};
		ev.preventDefault();
	};
};

/**
 * addMessagesNav
 */
jQuery.fn.addMessagesNav = function() {

	var messages = $(this);

	if (messages.length && messages.length > 1) {
		initMessagesNav(messages);
		$('#messages-list .page').click(toggleMessage);
		$('#messages-list .trash-dat-message').click(markAsDeleted);
		$('#all').click(markAllAsDeleted);
		$('#messages-delete').submit(function(){ if ( $('input:checked').length == 0 ) { return false; }; });
		toggleSubmit();
	};

	return this;

	function initMessagesNav(messages) {
		// insert pager container
		messages.eq(0).before('<p class="pager"></p>');
		var pager     = $('#messages-list .pager'),
		pager_content = '';
		// build pager items
		messages.each(function(i) {
			pager_content += '<a class="page" href="#">' + (i+1) + '</a>';
		});
		pager_content += '<a class="page view-all" title="All" href="#">&nbsp;</a>';
		pager.append(pager_content);
		var pager_items = $('#messages-list .page');
		pager_items
			.eq(0).addClass('here').end() //first
			.width( pager_items.eq( pager_items.length-2 ).width() ) //same width
			.eq( pager_items.length-1 ).width('auto').end(); //auto size for last button
		messages.hide().eq(0).show();
	};

	function toggleMessage(ev) {
		if ( $(this).hasClass('here') ) {
			ev.preventDefault();
			return;
		} else if ( $(this).hasClass('view-all') ) {
			$('#messages-list .pager .page').removeClass('here');
			$(this).addClass('here');
			$('#messages-list .message').animate({'opacity':0.5},100).show().animate({'opacity':1},'fast');
			ev.preventDefault();
			return;
		} else {
			var msg_index_to_display = $(this).text() - 1;
			$('#messages-list .pager .page').removeClass('here');
			$(this).addClass('here');
			var messages = $('#messages-list .message');
			messages
				.eq( msg_index_to_display ).animate({'opacity':0.5},100).show().animate({'opacity':1},'fast').end()
				.each(function(i) { if (i !== msg_index_to_display) { $(this).hide(); }; });
			ev.preventDefault();
			return;
		};
	};

	function markAsDeleted() {
		var navItem = $('#messages-list .pager .page').get( this.alt );
		if ( this.checked ) {
			$(navItem).addClass('marked');
		} else {
			$(navItem).removeClass('marked');
			$('#all').attr('checked',false);
		};
		toggleSubmit();
	};
	
	function markAllAsDeleted() {
		var navItem = $('#messages-list .pager .page'),
		inputs      = $('input.trash-dat-message');
		if ( this.checked ) {
			$(navItem).addClass('marked');
			inputs.each(function(){ this.checked = true; });
		} else {
			$(navItem).removeClass('marked');
			inputs.each(function(){ this.checked = false; });
		};
		toggleSubmit();
	};

	function toggleSubmit() {
		if ( $('input:checked').length == 0 ) {
			$('#messages-delete input:submit').attr('disabled','disabled');
		} else {
			$('#messages-delete input:submit').removeAttr('disabled');
		};
	};

};

/**
 * setEqualHeight
 */
/*
jQuery.fn.setEqualHeight = function() {

	if (this.length && this.length > 1) {
		var heights = [];
		$(this).each(function(){
			heights.push( $(this).height() );
		});
		var max_height = Math.max.apply(null, heights);
		// height for IE6, min-height for others
		var height_prop = ($.browser.msie && $.browser.version < 7) ?
			$(this).css({'height': max_height+'px'}) :
			$(this).css({'min-height': max_height+'px'});
	};

	return this;

};
*/

/**
 * enhancePeopleBlock
 * vertical align photos in people block
 * create bubbles with people names
 */
jQuery.fn.enhancePeopleBlock = function() {

	var peopleLinks = $(this);

	if (peopleLinks.length) {

		peopleLinks.each(function(i) {
			// variables
			var current_link    = $(this),
			current_link_height = current_link.height(),
			current_link_width  = current_link.width(),
			current_link_title  = this.title,
			pic                 = current_link.children('img').get(0),
			pic_height          = pic.height,
			pic_width           = pic.width;

			// vertical-align imgs in people block
			if ( pic && !isNaN(current_link_height) && !isNaN(pic_height) ) {
				var margin_top = ((current_link_height-pic_height)/2);
				$(pic).css({'margin-top': margin_top});
			};

			// vertical-align imgs in people block
			if ( pic && !isNaN(current_link_width) && !isNaN(pic_width) ) {
				var margin_left = ((current_link_width-pic_width)/2);
				$(pic).css({'margin-left': margin_left});
			};

			// create bubbles and their content, hide them, set their position
			if ( current_link_title && current_link_title.length ) {
				current_link
					.removeAttr('title')
					.append('<span><strong>' + current_link_title + '</strong></span>')
					.find('span')
						.css({
							'display': 'none',
							'bottom': (pic_height + margin_top)
						});
				current_link.find('img').removeAttr('alt');
			};
		});

		peopleLinks.bind('mouseover focus', showBubble);
		peopleLinks.bind('mouseout blur', hideBubble);
	};

	return this;

	function showBubble() {
		$(this).find('span').show();
		this.hideFocus = true;//IE
	};
	function hideBubble() {
		$(this).find('span').hide();
	};

};

/**
 * addButtons
 * create 'add' and 'delete' buttons and their behavior
 */
jQuery.fn.addButtons = function() {

	var initial = 0;// Remmber initial non empty url field

	if (this.length) {
		init(this);
		$(this).find('.add').click(addField);
		$(this).find('.delete').click(deleteField);
	};

	return this;

	function init(fields) {
		// Get initial empty url field index
		$(fields).each(function(i) {
			if ( $(this).find(':input').eq(0).val() || $(this).find(':input').eq(1).val() || $(this).find(':checked').length ) {
				initial = i;
				return;
			};
		});
		$(fields).each(function(i) {
			if (i === initial) {//first
				$(this).append('<a class="add" title="+" href="#">&nbsp;</a>');
			} else if (i==$(fields).length-1) {//last
				$(this).append('<a class="delete last" title="-" href="#">&nbsp;</a>').hide();
			} else if (i > initial) {
				$(this).append('<a class="delete" title="-" href="#">&nbsp;</a><a class="add" title="+" href="#">&nbsp;</a>').hide();
			};
		});
	};

	function addField(ev) {
		if ( $(this).parent().next().length ) {
			$(this)
				.hide()
				.parent()
					.find('.delete').hide().end()//only one delete link at a time
				.next()
					.show().find(':input').eq(0).focus();//display next field
		};
		ev.preventDefault();
	};

	function deleteField(ev) {
		$(this).parent()
			.find('select').val(0).end()
			.find('input').val('').end()
			.hide()
			.prev()
				.find('.add, .delete').show().end()
				.find(':input').eq(0).focus();
		ev.preventDefault();
	};

};

/**
 * suggestKeywords
 * 
 * Props 2 :
 * http://www.mail-archive.com/discuss@jquery.com/msg18931.html (Delay on keypress)
 * http://stackoverflow.com/questions/182630/jquery-tips-and-tricks/382922#382922 (Create an element an keep a reference)
 * 
 */
jQuery.fn.suggestKeywords = function() {

	var delimiter  = ',',
	keywords_input = this,
	search_timeout = undefined,
	activated      = $('#activate-suggestion');

	if (keywords_input.length) {
		keywords_input.keypress(function(e){
			if ( activated.attr('checked') ) {
				if(e.keyCode==13){ e.preventDefault(); };
			};
		});
		keywords_input.keyup(init);
		keywords_input.blur(function(){ setTimeout(function(){ $('#suggestion-box').hide(); }, 500 ); });
		keywords_input.attr('autocomplete','off');//get rid of the annoying autocomplete in Firefox
		activated.click(function(e){
			if ( activated.attr('checked') ) {
				keywords_input.focus();
			};
		});
	};
    
	return this;
    
	function init(event) {
		if ( !activated.attr('checked') ) { return; };
		// on récupère tout le texte saisi
		var input = jQuery.trim( jQuery(keywords_input).val() );
		// on arrête si on a rien
		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 (event.keyCode == 8) { return endProcess(); };//back
		if (/^(37|39)$/.test(event.keyCode)) { return; };//left, right
		// sinon on peut construire le conteneur des suggestions
		buildSuggestionBox( keywords_input );
		// il peut y avoir plein de mots clefs séparés par des virgules, celui qui nous intéresse c'est le dernier
		last_keyword = getLastKeyword( input );
		// on arrête si on a rien
		if (last_keyword === '') { return endProcess(); };
		// 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
		if (event.keyCode == 13) { setKeyChoosenResult(); return; };//enter
		// sinon on cherche des suggestions en limitant le nombre de requetes
		if (search_timeout) { clearTimeout(search_timeout); };
		search_timeout = setTimeout(function() {
			search_timeout = undefined;
			getSuggestions(last_keyword);
		}, 300);
	};

	function endProcess() {
		$('#suggestion-box').hide();
		return false;
	};

	// Retourne le dernier mot clé saisi par l'utilisateur
	// Split une string en fonction du delimiter (ex: mots clefs séparés par des virgules)
	function getLastKeyword(user_input) {
		var keywords = user_input.split( delimiter );
		var last_keyword = jQuery.trim( keywords.pop() );// last array element
		return last_keyword.toLowerCase();
	};
    
	// Insere le conteneur (ul#suggestion-box) de la liste de suggestions
	// et set automatiquement sa position et sa taille
	function buildSuggestionBox(keywords_input) {
		if (!$('#suggestion-box').length) {
			var input = jQuery(keywords_input);// l'input de saisi des mots clefs
			var suggestion_box = $('<ul></ul>');
			suggestion_box.attr('id','suggestion-box').appendTo('body').hide();
			var input_offset = input.offset();
			var body_offset = $('body').offset();
			suggestion_box.css({
				'position': 'absolute',
				'width': (input.width() + 4),
				'top': (input_offset.top + input.height() + 10),
				'left': (input_offset.left - body_offset.left)
			});
		};
	};

	// on va voir si on trouve des suggestion de mots clef
	function getSuggestions(last_keyword) {
		var suggestion_box = $('#suggestion-box'),
		content            = '',
		last_keyword       = last_keyword,
		lang               = $('#id_lang'),
		suggest_lang       = undefined;
		if ( lang.length && $('option:selected', lang).val() ) {
			suggest_lang = $('option:selected', lang).val();
		};
		$.post(
			'/keywords/get/suggestions',
			{ k: last_keyword, l: suggest_lang },
			function(data){
				if ( data.length ) {
					var options = ''
					for (i in data) { content += '<li>' + data[i].fields.keyword + '</li>'; };
					suggestion_box.html( content );
					$('li',$('#suggestion-box')).each(function() { jQuery.highlight(this, last_keyword.toUpperCase()); });
					suggestion_box.show();
					$('#suggestion-box li:first').addClass('selected');// on selectionne le premier resultat par defaut
					$('li', suggestion_box).click(function(e){
						// passe la valeur choisie à la souris à la fonction setResult
						setResult( $(this).text() );
					}).mouseover(function(e){
						$('li', suggestion_box).removeClass('selected');
						$(this).addClass('selected');
					}).css({ 'cursor': 'pointer' });
				} else {
					suggestion_box.hide();
				};
			},
		'json');
	};

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

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

	// passe la valeur choisie au clavier à la fonction setResult
	function setKeyChoosenResult(){
		if ( $('#suggestion-box li.selected').length ) {
			setResult( $('#suggestion-box li.selected').text() );
			$('#suggestion-box li').removeClass('selected');
		};
	};

	// on ajoute la suggestion choisie à la liste
	function setResult(result){
		var result = result;
		var suggestion_box = $('#suggestion-box');
		var keywords = $(keywords_input).val().split( delimiter );
		keywords.pop();
		keywords.push( result.toLowerCase() );
		keywords = jQuery.map(keywords, function (i) { return jQuery.trim(i); });
		keywords = removeDuplicates(keywords);
		keywords = keywords.join( delimiter + ' ' );
		$(keywords_input).val(keywords + delimiter + ' ').focus();
		suggestion_box.hide()
	};

	function removeDuplicates( array ) {
		var ret = [],
		done = {};
		try {
			for (var i = 0, length = array.length; i < length; i++) {
				var id = array[i];
				if (!done[id]) {
					done[id] = true;
					ret.push(array[i]);
				};
			};
		} catch(e) {
			ret = array;
		};
		return ret;
	};

};

/**
 * Cookie plugin
 *
 * set $.cookie('the_cookie', 'the_value');
 * @get $.cookie('the_cookie');
 *
 * http://www.stilbuero.de/2006/09/17/cookie-plugin-for-jquery/
 *
 */
jQuery.cookie = function(name, value, options) {
	if (typeof value != 'undefined') { // name and value given, set cookie
		options = options || {};
		if (value === null) {
			value = '';
			options.expires = -1;
		};
		var expires = '';
		if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
			var date;
			if (typeof options.expires == 'number') {
				date = new Date();
				date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
			} else {
				date = options.expires;
			};
			expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
		};
		// CAUTION: Needed to parenthesize options.path and options.domain
		// in the following expressions, otherwise they evaluate to undefined
		// in the packed version for some reason...
		var path = options.path ? '; path=' + (options.path) : '';
		var domain = options.domain ? '; domain=' + (options.domain) : '';
		var secure = options.secure ? '; secure' : '';
		document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
	} else { // only name given, get cookie
		var cookieValue = null;
		if (document.cookie && document.cookie != '') {
			var cookies = document.cookie.split(';');
			for (var i = 0; i < cookies.length; i++) {
				var cookie = jQuery.trim(cookies[i]);
				// Does this cookie string begin with the name we want?
				if (cookie.substring(0, name.length + 1) == (name + '=')) {
					cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
					break;
				};
			};
		};
		return cookieValue;
	};
};

/*

highlight v2

Highlights arbitrary terms.

<http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html>

MIT license.

Johann Burkard
<http://johannburkard.de>
<mailto:jb@eaio.com>

*/
$(function() {
	jQuery.highlight = document.body.createTextRange ? 
		// Version for IE using TextRanges.
		function(node, te, many) {
			var r = document.body.createTextRange();
			r.moveToElementText(node);
			for (var i = 0; r.findText(te); i++) {
				if (!many && i>0) { return; };
				r.pasteHTML('<span class="highlight">' +  r.text + '<\/span>');
				r.collapse(false);
			};
		}
	: 
		// (Complicated) version for Mozilla and Opera using span tags.
		function(node, te, many) {
			var pos, skip, spannode, middlebit, endbit, middleclone;
			skip = 0;
			if (node.nodeType == 3) {//noeud texte
				pos = node.data.toUpperCase().indexOf(te);
				// if (pos >= 0) {
				if (pos >= 0) {
					spannode = document.createElement('span');
					spannode.className = 'highlight';
					middlebit = node.splitText(pos);
					endbit = middlebit.splitText(te.length);
					middleclone = middlebit.cloneNode(true);
					spannode.appendChild(middleclone);
					middlebit.parentNode.replaceChild(spannode, middlebit);
					skip = 1;
					if (!many) { return; };
				};
			} else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
				for (var i = 0; i < node.childNodes.length; ++i) {
					i += $.highlight(node.childNodes[i], te);
				};
			};
			return skip;
		};
});

jQuery.fn.removeHighlight = function() {
	this.find("span.highlight").each(function() {
		with (this.parentNode) {
			replaceChild(this.firstChild, this);
			normalize();
		};
	});
	return this;
};


