/*
 * FavoriteIt - jQuery plugin.
 * 
 * @author Ludovic Pecate
 * 
 * 
 * Version: 1.0.0
 * 
 * Requires: 1.4.2+
 * 
 * Examples:
 * 
 * $('li.save-me').favoriteIt();
 * 
 * $('.save-ads').favoriteIt({
		cookieName: 'saved-ads',
		parentContainerSelector: '#menu-bis',
		url: baseUrl+'json/?format=json',
		onSuccess: function(data, target){
			var html = '';
			for (var i in data) {
				html += '<a href="'+p.url+'">'+data[i].nom+'</a><br />';
			}
			target.html(html);
		}
	});
 * 
 */

(function($){
	$.favoriteIt = function (p) {
		// Parameters could be :
		p = $.extend({
			applyTo: $('#favorite > li'),
			menuId: 'favorite-it-menu',
			label: '',
			addLabel: 'Add en element',
			deleteLabel: 'Delete',
			saveLabel: 'Save this item',
			savedLabel: 'Saved',
			favoriteMenuLabel: 'My favorites',
			elementsDelimiter: ',',
			cookieName: 'saved-items',
			parentContainerSelector: null,
			url: '',
			itemUrlKey: 'details/',
			cache: false,
			scrollToMenuOnSave: true,
			savedClass: '',
			saveClass: '',
			deleteItemClass: ''
		}, p);
		
		if (p.parentContainerSelector) {
			var ads = [];
			if ($.cookie(p.cookieName) && $.cookie(p.cookieName).length > 0) {
				ads = $.cookie(p.cookieName).split(',');
			}
			$(p.parentContainerSelector).append('<ul class="favorite-it-menu" id="'+p.menuId+'"><li><span class="favorite-it-menu-item">'+p.favoriteMenuLabel+' ('+ads.length+')</span></li></ul>');
			$('.favorite-it-menu').append('<li class="favorite-it-list"></li>');
		}
		
		function updateFavoriteItList() {
			if ($.cookie(p.cookieName) && p.parentContainerSelector) {
				var saved = $.cookie('saved-ads');
				if (saved) {
					if (p.url.length > 0) {
						// Get files list from a server
						$.ajax({
							url: p.url,
							data: 'ids='+saved,
							dataType: 'json',
							cache: p.cache,
							beforeSend: function(xhr){
								$('.favorite-it-list').html('Chargement...');
							},
							success: function(data){
								$('#'+p.menuId).effect('highlight', {}, 2000);
								if (!data.error) {
									$('.favorite-it-list').html('');
									var url = $.cookie(p.cookieName+'-url');
									for (var i in data) {
										$('.favorite-it-list').append('<a href="'+url.replace('{id}', data[i].id)+'">'+data[i].nom+'&nbsp;&nbsp;<span class="'+p.deleteItemClass+'"></span></a>')
											.find('a:last').hover(function(){
												$('span', this).show();
											}, function(){
												$('span', this).hide();
											})
											.find('span:last').css({cursor: 'pointer', display: 'none'}).data('id', data[i].id).click(function() {
												// Supprime l'annonce des favoris
												var id = $(this).data('id');
												var saved = $.cookie(p.cookieName);
												
												var savedArray = saved.split(p.elementsDelimiter);
												var newAds = [];
												for (var i in savedArray) {
													if (savedArray[i] != id && savedArray[i].length > 0) {
														newAds.push(savedArray[i]);
													}
												}
												// On retire l'annonce
												$.cookie(p.cookieName, newAds.join(','), { expires: 365, path: '/' });
												updateFavoriteItCounter();
												updateFavoriteItList();
												return false;
											});
										
									}
									if ($.browser.msie && parseInt($.browser.version) < 8) {
										$('.favorite-it-list').find('.'+p.deleteItemClass).html('&nbsp;&nbsp;&nbsp;&nbsp;')
											.css({
												paddingLeft: '0',
												textDecoration: 'none'
											});
									}
								} else {
									$('.favorite-it-list').html(data.error);
								}
							},
							error: function(xhr, status, errorThrown){
								$('.favorite-it-it-list').html('<p>Le chargement n\'a pas abouti :'
										+errorThrown+'<br>'+status+''+xhr.statusText+'</p>');
							}
						});
					}
				}
			}
		}
		
		// Met à jour le compteur d'élements favoris
		function updateFavoriteItCounter() {
			var ads = [];
			if ($.cookie(p.cookieName) && $.cookie(p.cookieName).length > 0) {
				ads = $.cookie(p.cookieName).split(',');
			} else {
				$('.favorite-it-list').html('');
			}
			
			$('.favorite-it-menu-item')
				.text(p.favoriteMenuLabel+' ('+ads.length+')')
				.hide()
				.fadeIn('slow');
		}
		
		updateFavoriteItList();	
		
		return p.applyTo.each(function() {
			var $$ = $(this);
			
			// Création de l'élément de menu Mes
			updateFavoriteItList();
			
			// Sauvegarde d'une annonce
			$$.click(function() {
				// stocke l'URL de la page de détails
				$.cookie(p.cookieName+'-url',
						location.href.substring(0, location.href.lastIndexOf(p.itemUrlKey))+p.itemUrlKey+'{id}',
						{ expires: 365, path: '/' });
				
				var saved = $.cookie(p.cookieName);
				
				var id = ($(this).attr('id').split('-'))[1];
				// If no ads saved
				if (!saved) {
					saved = '';
				}
				else {
					saved += p.elementsDelimiter;
				}
				var savedArray = saved.split(p.elementsDelimiter);
				
				// Check for all ads saved
				var alreadySaved = false;
				for (var i in savedArray) {
					if (savedArray[i] == id) {
						alreadySaved = true;
						break;
					}
				}
				
				// Pas encore sauvegardée
				if (!alreadySaved) {
					// On sauvegarde l'annonce
					$.cookie(p.cookieName, saved+id, { expires: 365, path: '/' });
					$(this).find('a').text(p.savedLabel)
						.removeClass(p.saveClass)
						.addClass(p.savedClass);
					updateFavoriteItCounter();
					updateFavoriteItList();
					$(this).find('a').effect('transfer', {
							to: '#'+p.menuId,
							className: 'ui-effects-transfer'
						}, 1000
					);
					// Scroll to Menu
					if (p.scrollToMenuOnSave) {
						//location.hash = '#'+p.menuId;
						$('html, body').animate({
							scrollTop: $('#'+p.menuId).offset().top
						}, 500);
					}
				}
				// Déjà sauvegardée
				else {
					var newAds = [];
					for (var i in savedArray) {
						if (savedArray[i] != id && savedArray[i].length > 0) {
							newAds.push(savedArray[i]);
						}
					}
					// On retire l'annonce
					$.cookie(p.cookieName, newAds.join(','), { expires: 365, path: '/' });
					$(this).find('a').text(p.saveLabel)
						.removeClass(p.savedClass)
						.addClass(p.saveClass);
						updateFavoriteItCounter();
						updateFavoriteItList();
				}
			}).each(function() { // Au chargement de la page
				var saved = $.cookie(p.cookieName);
				var id = ($(this).attr('id').split('-'))[1];
				if (saved) {
					var savedArray = saved.split(',');
					var alreadySaved = false;
					for (var i in savedArray) {
						// Si l'annonce en cours est sauvegardée
						if (savedArray[i] == id) {
							$(this).find('a').text(p.savedLabel)
								.removeClass(p.saveClass)
								.addClass(p.savedClass);
							break;
						}
					}
				}
			});
		});
	};
})(jQuery);
