//////////////////////////////////////////////////////////////////////
// Plugin: fmBasket
// Purpose: Handle basket interactions throughout the site
//////////////////////////////////////////////////////////////////////
(function($){
 $.fn.fmBasket = function(options) {
  
  // A. set defaults
  var defaults = {
		total_items: "categories",
		total_value: "btn-categories-save",
		
		mini_basket_extra: ".fm-minibasket-extra",
		mini_basket_button: ".fm-minibasket-show",
		mini_basket_remove: ".fm-minibasket-remove",
		mini_basket_scroll_down: "#minibasket-scroll-down",
		mini_basket_scroll_up: "#minibasket-scroll-up",
		
		add_basket_button: "#add-basket",
		product_colour_fld: ".product-colour",
		product_variation_fld: "#product-variation",
		product_qty_fld: "#product-qty",
		product_id_fld: "#product-id",
		
		
		msg_colour: "Please select an available colour option",
		msg_variations: "Please select an available variation", 
		msg_qty: "Please specify a valid quantity", 
		msg_basket_item: "No basket item available",
		
		error_str: "",
		error: false,
		
		basket_item_id: 0,
		product_id: 0,
		colour_id: 0,
		variation_id: 0,
		qty: 0,
		
		
		controller: "basket", 
		action: "add", 
		params: null
  };
  
  var options = $.extend(defaults, options);
   
   
  return this.each(function() {
  	var obj = $(this);
	var objID = obj.attr('id');
	
	options.mini_basket_holder = '#' + objID;
	
	$(options.add_basket_button).click(function() {
		
		$.fn.fmBasket.addItem(options);
		return false;
	});
	
	$(options.mini_basket_button).click(function () {
		//$.fn.fmBasket.showMiniBasket(options);
		options.variation_id = 0;
		options.colour_id = 0;
		options.product_id = 0;
		$.fn.fmBasket.loadAjax(options);
		return false;
	});
	

	$(options.mini_basket_extra).mouseleave(function () {
			$.fn.fmBasket.hideMiniBasket(options);
			return false;
		});
	

	
	$(options.mini_basket_scroll_down).click(function() {
			
			 var curTop  = $('#fm-minibasket-extra-list').css('top');
			 curTop = parseFloat(curTop);
			
			 
			 var curH  = $('#fm-minibasket-extra-list').height();
			 curH = parseFloat(curH);
			 
			  var wrapH  = $('#fm-minibasket-extra-list-wrap-inner').height();
			 wrapH = parseFloat(curH);
			 
			 
			 var target = curTop + curH-81;
			  var maxTarget = 248;
			
			
			
			 if (target >= maxTarget) {
				 $('#fm-minibasket-extra-list').animate({"top": "-=81px"}, "slow", function() {
					
					if (target == maxTarget) {
						
						$('#minibasket-scroll-down').addClass('inactive'); 
					} else {
						$('#minibasket-scroll-down').removeClass('inactive'); 
					}
					
				});
				 $('#minibasket-scroll-up').removeClass('inactive'); 
			 }
			 
			return false;		 
	});
	
	$(options.mini_basket_scroll_up).click(function() {
			 
			 var curTop  = $('#fm-minibasket-extra-list').css('top');
			 curTop = parseFloat(curTop);
			 
			 if (curTop <= -81) {
			 	$('#fm-minibasket-extra-list').animate({"top": "+=81px"}, "slow", function() {
						 var curTop  = $('#fm-minibasket-extra-list').css('top');
			 			curTop = parseFloat(curTop);
						
						var curH  = $('#fm-minibasket-extra-list').height();
						 curH = parseFloat(curH);
						
						if(curTop == 0) {
							$('#minibasket-scroll-up').addClass('inactive'); 
						} else {
							if(curTop < 0) {
								$('#minibasket-scroll-up').removeClass('inactive'); 
							}
						}
						
						if (curTop + curH > 248) {
							$('#minibasket-scroll-down').removeClass('inactive'); 
						} else {
							$('#minibasket-scroll-down').addClass('inactive'); 	
						}
						
						
						
						
				});
			 }
			
			return false;	

	});
	
	
  });
  
  
  
  
 };

// SCROLL MINI BASKET DOWN
$.fn.fmBasket.showMiniBasket = function(options) {
	var status = 'close';
	
	if($(options.mini_basket_extra).is(':hidden')) {
		$(options.mini_basket_holder).addClass('active');
		var status = 'open';
		
		
		$(options.mini_basket_extra).slideDown('fast', function() {
			$(this).addClass('down');
		});
		
		$('#fm-minibasket-shadow').slideDown('fast', function() {
			$(this).addClass('down');
			$('.current_row').effect("pulsate", { times:2 }, 1000);

		});
		
	} else {
		$('.current_row').effect("pulsate", { times:2 }, 1000);	
	}
		
	$('html, body').animate({scrollTop:0}, 'slow'); 
	return false;
};


// SCROLL MINI BASKET UP

$.fn.fmBasket.hideMiniBasket = function(options) {
	var status = 'close';
	
	if($(options.mini_basket_extra).is(':hidden')) {
		$(options.mini_basket_holder).addClass('active');
		var status = 'open';
	}
		
	$(options.mini_basket_extra).slideUp('fast', function() {
		if(status == 'close') {
			$(options.mini_basket_holder).removeClass('active');
			$(this).removeClass('down');
		}
	});
	
	$('#fm-minibasket-shadow').slideUp('fast', function() {
			$(this).removeClass('down');
		});
	
	return false;
};

////////////////////////////////////////////
// ADD ITEM TO BASKET AND LOAD XML
///////////////////////////////////////////
$.fn.fmBasket.addItem = function(options) {
		options.action = 'add';

		// get selected values
		$(options.product_colour_fld+':checked').each(function() { 
		   options.colour_id = this.value; 
		});
		
		
		
		options.variation_id = $(options.product_variation_fld).val();
		options.qty = $(options.product_qty_fld).val();
		options.product_id = $(options.product_id_fld).val();
		
		
		
		params = new Object();
		params.variation_id = options.variation_id;
		params.colour_id = options.colour_id;
		params.product_id = options.product_id;
		params.qty = options.qty;
		options.params = params;
		
		
		
		if ($.fn.fmBasket.validate(options)) {
			
			$.fn.fmBasket.sendAjax(options, params);
			
		} else {
			alert(options.error_str);	
		}
};
$.fn.fmBasket.removeItem = function(options) {
		options.action = 'remove';
		
		params = new Object();
		params.basket_item_id = options.basket_item_id;
		options.params = params;
		
		
		if ($.fn.fmBasket.validate(options)) {
			
			$.fn.fmBasket.sendAjax(options, params);
			
		} else {
			alert(options.error_str);	
		}
};

$.fn.fmBasket.validate = function(options) {
		// prepare error checks
		options.error_str = '';
		options.error = false;
				
		if (options.action == 'add') {
			if(!options.colour_id) {
				options.error_str = options.error_str + options.msg_colour + '\n';
				options.error = true;
			}
	
			if(!options.variation_id) {
				options.error_str = options.error_str +  options.msg_variations + '\n';
				options.error = true;
			}
			
			if(options.qty <= 0) {
				options.error_str = options.error_str + options.msg_qty + '\n';
				options.error = true;
			}
		}
		
		
		if (options.action == 'remove') {
			if(!options.basket_item_id) {
				options.error_str = options.error_str + options.msg_basket_item + '\n';
				options.error = true;
			}
	
			
		}
		
		if (!options.error) {
			return true;	
		} else {
			return false;	
		}
};

$.fn.fmBasket.sendAjax = function(options, params) {
		
		
		
		$.ajax({
			type: "POST",
			url: '/default/'+options.controller+'/'+options.action,
			dataType: "xml",
			data: params,
			success: function(xml) {
		 		
				$.fn.fmBasket.parseXml(options, xml);
				$.fn.fmBasket.showMiniBasket(options);
			}
		});
		
		
};




////////////////////////////////////////////
// LOAD BASKET XML ONLY
///////////////////////////////////////////
$.fn.fmBasket.loadAjax = function(options) {
		params = new Object();
		
		params.product_id = options.product_id;

		$.ajax({
			type: "GET",
			url: "/default/basket/xml/",
			dataType: "xml",
			success: function(xml) {
		 		
				$.fn.fmBasket.parseXml(options, xml);
				$.fn.fmBasket.showMiniBasket(options);
			}
		});
		
		
		
};


//////////////////////////////////////////////////
// READ ANY XML RESPONSE AND POPULATE MINI BASKET
//////////////////////////////////////////////////
$.fn.fmBasket.parseXml = function(options, xml) {
	
	var output = '';
	var summary_node = $(xml).find('summary');
	var total_items = summary_node.find('items').text();
	var total_value = summary_node.find('value').text();
	
	if (total_items == '') { total_items = 0; }
	if (total_value == '') { total_value = '0.00'; }
	
	
	
	var limit = 10;
	var counter = 0;
	$(xml).find('item').each(function(){
		
		if (counter < limit) {
			var title = $(this).find('title').text();
			var qty = $(this).find('qty').text();
			var filename = $(this).find('filename').text();
			var swatch = $(this).find('swatch').text();
			var colour = $(this).find('colour').text();
			var variation = $(this).find('variation').text();
			var slug = $(this).find('slug').text();
			var id = $(this).find('id').text();
			
			
			var product_id = $(this).find('product_id').text();
			var variation_id = $(this).find('variation_id').text();
			var colour_id = $(this).find('colour_id').text();
			var extra_class = '';
			if(product_id == options.product_id && variation_id == options.variation_id && colour_id == options.colour_id) {
				var extra_class = ' current_row';
				
			}
			
			output = output + '<div class="fm-minibasket-row'+extra_class+'">';
			output = output + '<div class="control">';
			output = output + '<a href="#" class="fm-minibasket-remove">'+id+'</a>';
			output = output + '</div>';
			output = output + '<div class="img">';
			
			if(swatch != '') {
				output = output + '<img src="/uploads/images/xs/'+swatch+'" width="60" alt="'+title+'"/>';
			} else {
				if (filename != '') {
					output = output + '<img src="/uploads/images/xs/'+filename+'" width="60" alt="'+title+'"/>';
				}
			}
			output = output + '</div>';
			output = output + '<div class="text">';
			output = output + '<a  href="/index/product/'+slug+'" class="txt3">';
			output = output + title+' x '+qty;
			output = output + '</a>';
			output = output + '<p class="txt3"><strong>Colour</strong>: '+colour+'</p>';
			output = output + '<p class="txt3"><strong>Variation</strong>: '+variation+'</p>';
			output = output + '</div>';
			output = output + '</div>';
			
		}
		counter++;
	});
	
	if(counter > limit) {
		output = output + '<div class="fm-minibasket-viewfull">There are '+ (counter - limit) +' more items in your basket</div>';
	}
	
	if(counter == 0) {
		output = output + '<div class="fm-minibasket-empty">Your basket is empty</div>';
	}
	
	
	if(counter <= 3) {
		
		$('#minibasket-scroll-down').addClass('inactive');
	} else {
		
		$('#minibasket-scroll-down').removeClass('inactive');
	}
	$('#fm-minibasket-extra-list').css("top", "0px");
	$('#minibasket-scroll-up').addClass('inactive');
	
	
	$('.items-num').html(total_items);
	$('.totals-num').html('&pound;' + total_value);
	
	if(total_items > 0) {
		$('.fm-minibasket-summary').addClass('full');
	} else {
		$('.fm-minibasket-summary').removeClass('full');
	}
	
	$('#fm-minibasket-extra-list').html(output);
	
	
	// B. Add button options within returned content
	$(options.mini_basket_remove).click(function () {
		
		options.basket_item_id = $(this).text();
		$.fn.fmBasket.removeItem(options);
		//$.fn.fmBasket.loadAjax(options);
		return false;
	});
	
	
}



})(jQuery);
