/*
 * Manageing pricerequest basket
 */

(function($) {
	$.fn.of_basket = function(settings){
		
		var config = {
			counter: null,
			trigger: null,
			overview: null,
			basketPrefix: 'w'
		};
 
     	if(settings){
			$.extend(config,settings);
		} 
		
		var filledBasket = false;
		
		// set storage and change counter
		_setStorage = function(storageName,counterObject,names,counterActive){
			
			//  zu beginn immer leeren
			$.Storage.remove(storageName);
			
			switch(storageName){
				
				case 'basket':
				
					// neue counter zahl
					var amount = 0;
					
					// falls items vorhanden wieder füllen
					if(names.length > 0){
						
						// data array
						var data = [];
		
						$.each(names,function(i,v){
								
							var thisAmount = parseInt($.trim(v[0]));
							var thisName = $.trim(v[1]);
							var thisNr = (v[2] != null && v[2] != '') ? $.trim(v[2]) : '';
							
							if(thisAmount != null && !isNaN(thisAmount) && $.type(thisAmount) === 'number' && thisName != ''){	
								
								// amount = amount + thisAmount;

								data[i] = [];
								data[i][0] = thisAmount;
								data[i][1] = thisName;
								data[i][2] = thisNr;
								
								// alert(data[i][0]);
							}	
							
						});
						
						amount = names.length;
						
						if(counterActive){
							counterObject.text(amount);
						}		
						
						$.Storage.set(storageName,$.toJSON(data));
						
						filledBasket = true;
						
					}
					else {
						
						if(counterActive){
							counterObject.text(amount);
						}
						
						filledBasket = false;
						
					}
				break;
			}
	
		};
		
		// get storage 
		_getStorage = function(storageName){

			var storage = $.parseJSON($.Storage.get(storageName));
			
			switch(storageName){
				
				case 'basket':
					filledBasket = (!storage || storage == '' || storage.length <= 0) ? false : true;
				break;
			}
			
			return storage;
		};
		
		// check storage 
		_checkStorage = function(storageName,counterObject){

			var storage = $.parseJSON($.Storage.get(storageName));
			var amount = 0;
			
			hasStorage = (!storage || storage == '' || storage.length <= 0) ? false : true;
			
			if(hasStorage){
				
				/*
				$.each(storage,function(i,v){
								
					var thisAmount = parseInt($.trim(v[0]));
							
					if(thisAmount > 0 && thisAmount != null && !isNaN(thisAmount) && $.type(thisAmount) === 'number'){	
								
						amount = amount + thisAmount;
					}	
							
				});
				*/
				
				amount = storage.length;
			}
			
			counterObject.text(amount);

			return hasStorage;
		};
		
		// baue basket auf
		_buildBasket = function(basketObject,itemCounter,itemName,itemAmount,itemNr){
		
			var thisCounter = (itemCounter + 1);
			
			var newItemAmount = (itemAmount > 0) ? itemAmount : '';
			
			var nameTemplate = '<div id="' + config.basketPrefix + '-Artikel-wrap' + thisCounter + '" class="w-basket-wrap">';
			nameTemplate += '<label for="' + config.basketPrefix + '-Artikel' + thisCounter + '">Artikel-Nr. oder Name</label>';
			nameTemplate += '<input class="w-basket-name readonly" id="' + config.basketPrefix + '-Artikel' + thisCounter + '" name="' + config.basketPrefix + '-Artikel' + thisCounter + '" type="text" readonly="readonly" value="' + itemName + '" />';
			nameTemplate += '<label class="artikelanzahl" for="' + config.basketPrefix + '-Anzahl' + thisCounter + '">Anzahl</label>';
			nameTemplate += '<input class="w-basket-amount artikelanzahl" id="' + config.basketPrefix + '-Anzahl' + thisCounter + '" name="' + config.basketPrefix + '-Anzahl' + thisCounter + '" type="text" value="' + newItemAmount + '" />';
			nameTemplate += '<input class="w-basket-nr artikelnummer" id="' + config.basketPrefix + '-Artikelnummer' + thisCounter + '" name="' + config.basketPrefix + '-Artikelnummer' + thisCounter + '" type="hidden" value="' + itemNr + '" />';
			nameTemplate += '<a href="#" class="w-basket-delete"></a>';
			nameTemplate += '<br class="clear" />';
			nameTemplate += '</div>';
					
			basketObject.find('#basketitems').append(nameTemplate);
		};
		
		this.each(function(){
			
			var adder = $(config.trigger);
			var overview = $(config.overview);
			var counter = $(config.counter);
			
			var itemCounter = 0;
			
			if(adder.length > 0){
				
				var basket = $(this);

				var activeAdder = null;
				
				// basket event  for new items
				basket.bind('addItem',function(){
					
					var thisBasket = $(this);
					var names = [];
					
					// Hole Daten aus Storage
					var storage = _getStorage('basket');
					
					// build item storage
					if(filledBasket){
						
						$.each(storage,function(key,val){

							if(val != null){
								
								names.push(val);
								
								// erhöhe counter
								itemCounter++;
							}
						});
					}

					// build item for specific product
					if(activeAdder != null){
						
						var thisActiveAdder = $(activeAdder);
						
						var newName = [];
						newName[0] = 0;
						newName[1] = thisActiveAdder.next('p').text();
						newName[2] = thisActiveAdder.attr('rel');
						
						names.push(newName);
						
						// erhöhe counter
						itemCounter++;
					}
					
					// falls items vorhanden sind
					if(itemCounter > 0){

						// set storage and change counter
						_setStorage('basket',counter,names,true);
					}

				}).trigger('addItem');

				// binde click event an adder button, ergänze item und erhöhe counter
				adder.bind('click',function(e){
					
					e.preventDefault();
					
					activeAdder = this;
					
					$(activeAdder).prev('img').effect('transfer',{
						to: '#duckytransfer',
						className: 'ui-effects-transfer'
					},'slow',function(){
						
						// trigger basket event
						basket.trigger('addItem');
					});					
				});
			}
			
			if(overview.length > 0){

				if(_checkStorage('basket',counter)){
					
					var deleter = null;
					var amounter = null;
					
					// Hole Daten aus Storage
					var storage = _getStorage('basket');
					
					// build item storage
					if(filledBasket){
						
						$.each(storage,function(key,val){

							if(val != null){
								
								// build up basket
								_buildBasket(overview,itemCounter,val[1],val[0],val[2]);
								
								// erhöhe counter
								itemCounter++;
							}
						});	
						
						deleter = $('.w-basket-delete');
						amounter = $('.w-basket-amount');
						
						addWrap = $('.w-basket-wrap');
						
						overview.prev('h3').append('<a href="#" id="deleteall">Merkliste leeren</a>');
						
						var deleteAll = $('#deleteall');
						
						deleteAll.bind('click',function(e){
							
							e.preventDefault();
							
							$.Storage.remove('basket');
							
							addWrap.remove();
							
							counter.text(0);
						});
						
						addWrap.parent('#basketitems').find('.w-basket-wrap:last').append('<div class="spacer"></div>');
					
						// binde click event an deleter button und lösche item
						deleter.live('click',function(e){
							
							e.preventDefault();
							
							var thisDeleter = $(this);
							var thisItem = thisDeleter.parents('.w-basket-wrap');
							var deleteId = thisItem.attr('id').slice(13);
							
							thisItem = thisItem.add('#w-Artikel-wrap' + deleteId);
							
							// lösche item
							thisItem.remove();
							
							// get trigger items
							amounts = overview.find('.w-basket-amount');
							names = overview.find('.w-basket-name');
							nrs = overview.find('.w-basket-nr');
							
							//if(amounts.length > 0){
								
								// data array
								var data = [];
								
								amounts.each(function(i){
									
									var thisVal = $(this).val();
									
									var thisAmount = (thisVal != '') ? parseInt(thisVal) : 0;
									var thisName = $.trim(names.eq(i).val());
									var thisNr = (nrs.eq(i).val() != null && nrs.eq(i).val() != '') ? $.trim(nrs.eq(i).val()) : '';
									
									if(thisAmount != null && !isNaN(thisAmount) && $.type(thisAmount) === 'number' && thisName != ''){	

										// extend array level
										data[i] = [];
				
										data[i][0] = thisAmount;
										data[i][1] = thisName;
										data[i][2] = thisNr;
										
										//alert(data[i][1]);
										
									}	
								});
								
								// set storage and change counter
								_setStorage('basket',counter,data,true);
							//}
							
						});
						
						// binde change event an amounter 
						amounter.live('click change keyup blur focus',function(e){
							
							//e.preventDefault();
							
							var thisAmounter = $(this);
							
							// get trigger items
							amounts = overview.find('.w-basket-amount');
							names = overview.find('.w-basket-name');
							nrs = overview.find('.w-basket-nr');
							
							if(amounts.length > 0){
								
								// data array
								var data = [];
								
								amounts.each(function(i){
									
									var thisVal = $(this).val();
									
									var thisAmount = (thisVal != '') ? parseInt(thisVal) : 0;
									var thisName = $.trim(names.eq(i).val());
									var thisNr = (nrs.eq(i).val() != null && nrs.eq(i).val() != '') ? $.trim(nrs.eq(i).val()) : '';
									
									if(thisAmount != null && !isNaN(thisAmount) && $.type(thisAmount) === 'number' && thisName != ''){	

										// extend array level
										data[i] = [];
				
										data[i][0] = thisAmount;
										data[i][1] = thisName;
										data[i][2] = thisNr;
										
										//alert(data[i][1]);
										
									}	
								});
								
								// set storage and change counter
								_setStorage('basket',counter,data,false);
							}
						});
					}
				}
			}
			
			if(overview.length <= 0 && adder.length <= 0){
				_checkStorage('basket',counter)
			}
		});
		
		return this;
	};
})(jQuery);


/*
 * Init 
 */
$(document).ready(function(){
	
	$('#basket').of_basket({
		counter: '#counter',
		trigger: '.listitem a',
		overview: '#overview'
	});
	
	var storageFlush = $('#storageflush');
	
	// Sobald diese Flag gefunden wird leere storage
	if(storageFlush.length > 0){
		storageFlush.bind('flushIt',function(e){
			$.Storage.remove('basket');
		}).trigger('flushIt');
	}
});
