	
	var objBasket = {
		basketInstance:this,
		
		properties: {
			basketElement:'#minibasket',
			basketAnimation:'fade',
			basketDestinationElement:'#domain-search-results',
			fetchingBasket:false,
			eventElement:window,
			seoProductTypeId:5,
			summaryUrl:'/basket/summary',
			eventContainer: []
		},
		
		events: {
			removed:'basket.itemRemoved',
			updated:'basket.updated',
			added:'basket.itemAdded',
			domainAdded:'basket.domainAdded',
			domainUpgrade:'basket.domainAddedUpgrade',
			
			voucherCode: {
				added:'basket.voucherCodeAdded',
				removed:'basket.voucherCodeRemoved',
				invalid:'basket.voucherCodeInvalid',
				removed:'basket.voucherCodeRemoved'
			},
			
			slider: {
				adding:'basket.sliderAdding',
				added:'basket.sliderAdded',
				removing:'basket.sliderRemoving',
				removed:'basket.sliderRemoved',
				packageAdded:'basket.sliderPackageAdded',
				packageUpgrade:'basket.sliderPackageAddedUpgrade'
			}
		},
		
		notify: function(event,params) {
			//$(objBasket.properties.eventElement).trigger(event,params);
			if(objBasket.properties.eventContainer[event]) {
				for(i in objBasket.properties.eventContainer[event]) {
					if($(objBasket.properties.eventContainer[event][i])) {
						$(objBasket.properties.eventContainer[event][i]).trigger(event,params);
					}
				}
			}
		},
		
		observe: function(event,callback,eventElement) {
			if(eventElement) {
				$(eventElement).unbind(event);
				$(eventElement).bind(event,callback);
				if(!objBasket.properties.eventContainer[event]) {
					objBasket.properties.eventContainer[event] = [];
				}
				objBasket.properties.eventContainer[event].push(eventElement);
			} else {
				$(objBasket.properties.eventElement).unbind(event);
				$(objBasket.properties.eventElement).bind(event,callback);
				
				if(!objBasket.properties.eventContainer[event]) {
					objBasket.properties.eventContainer[event] = [];
				}
				objBasket.properties.eventContainer[event].push(objBasket.properties.eventElement);
			}
		},
		
		forget: function(event) {
			$(objBasket.properties.eventElement).unbind(event);
			if(objBasket.properties.eventContainer[event]) {delete objBasket.properties.eventContainer[event] }
		},
		
		setBasketDestination: function(element) {
			this.properties.basketDestinationElement = element;
		},
		
		setBasketElement: function(element) {
			this.properties.basketElement = element;
		},
		
		getBasketElement: function() {
			return this.properties.basketElement;
		},
		
		setBasketAnimation: function(animation) {
			this.properties.basketAnimation = animation;
		},
		
		pulseBasket: function() {
			
		},
		
		attachBasketEvents: function() {
			
		},
		
		removeBasketEvents: function() {
			
		},
		
		addVoucherCode: function(code) {
			$.ajax({
				type:		'post',
				dataType:	'json',
				url:		'/basket/voucher-code/add',
				data:		{'code':code},
				success:	function(r) {
					if(r != null) {
						if(r.isValid == true) {
							objBasket.notify(objBasket.events.voucherCode.added, r);
						} else {
							objBasket.notify(objBasket.events.voucherCode.invalid, r);
						}
					}
				}
			});
		},
		
		removeVoucherCode: function(code) {
			$.ajax({
				type:		'post',
				dataType:	'json',
				url:		'/basket/voucher-code/remove',
				data:		{'code':code},
				success:	function(r) {
					if(r != null) {
						if(r != null) {
							objBasket.notify(objBasket.events.voucherCode.removed, r);
						}
					}
				}
			});
		},
		
		removeBasketItem: function(keyword,index,typeId) {
			$.ajax({
	            type:       'post',
	            dataType:   'json',
	            url:        '/basket/index/remove',
	            data:       {'keyword':keyword,index:index,type:typeId},
	            //async:		false,
	            success:    function(r) {
	                if(r != null) {
						// inform results if applicable that something 
						// was removed from the basket
	                    if($('#results').length > 0) {
	                    	// leaving this is for legacy code, may remove
	                    	$('#results').trigger('basket.itemRemoved');
	                    	objBasket.notify(objBasket.events.removed);
						} else {
							objBasket.notify(objBasket.events.removed);
						}
	                }
	            }
	          }); 
		},
		
		closeBasket: function() {
			this.removeBasketEvents();
			
			   switch(this.properties.basketAnimation) {
				   case "fade":
					   $(this.properties.basketElement).hide().fadeOut(1000);
					   break;
				   case "slide":
					   $(this.properties.basketElement).hide().slideUp(1000);
				   default:
					   $(this.properties.basketElement).hide().fadeIn(1000);
			   }
			   
			   $(this.properties.basketElement).remove();
		},
		
		getBasket: function() {
			if(!this.properties.fetchingBasket) {
				this.properties.fetchingBasket = true;
				if($(this.properties.basketElement).length > 0) {
					$(this.properties.basketElement + ' .title').html('Updating<span style="position:relative;left:110px;top:5px;">'+getLoaderImage('miniBasketLoader',true)+'</span>');
				}
				
				this.removeBasketEvents();
			       
				$.ajax({
		           type:      'post',
		           dataType:  'html',
		           url:       '/basket',
				   //async:     false,
				   complete: function() {
					   $(window).trigger(objBasket.events.updated);
					   objBasket.properties.fetchingBasket = false;
				   },
		           success:   function(r) {
		              if(r != null) {
					    if ($(objBasket.properties.basketElement).length > 0) {
						   $(objBasket.properties.basketElement).remove();
						   $(objBasket.properties.basketDestinationElement).append(r);
	                       
						   switch(objBasket.properties.basketAnimation) {
							   case "fade":
								   $(objBasket.properties.basketElement).hide().fadeIn(1000);
								   break;
							   case "slide":
								   //$(objBasket.properties.basketElement).hide().slideDown(1000);
							   default:
								   $(objBasket.properties.basketElement).hide().fadeIn(1000);
						   }
						   
						   objBasket.attachBasketEvents();
						} else {
							$(objBasket.properties.basketDestinationElement).append(r);
							
							switch(objBasket.properties.basketAnimation) {
							   case "fade":
								   $(objBasket.properties.basketElement).hide().fadeIn(1000);
								   break;
							   case "slide":
								   $(objBasket.properties.basketElement).hide().slideDown(1000);
							   default:
								   $(objBasket.properties.basketElement).hide().fadeIn(1000);
						   }
	
						   objBasket.attachBasketEvents();
						}
					  }
		           }   
		       });
			}
		},
		
		removeDomainFromBasket: function(keyword) {
			$.ajax({
                type:       'post',
                dataType:   'json',
                url:        '/basket/domain/remove',
                data:       {'index':keyword},
                //async:		false,
                success:    function(r) {
                    if(r != null) {
                    	objBasket.notify(objBasket.events.removed);
                    	
                    }
                }
            });
		},
		
		updateDomainProduct: function (id,keyword) {
		  	//var itemId = null;
            $.ajax({
                type:       'post',
                dataType:   'json',
                url:        '/basket/domain/update',
                data:       {'productId':id,'keyword':keyword},
                //async:      false,
                success:    function(r) {
                    if(r != null) {
                        objBasket.getBasket();
                        objBasket.pulseBasket();
                        objBasket.notify(objBasket.events.updated, [r])
                    }
                }
            });
            
            //return itemId;
		},
		
		removeDomainPrivacyFromBasket: function(packageName) {
			$.ajax({
                type:       'post',
                dataType:   'json',
                url:        '/basket/private-domain/remove',
                data:       {'index':packageName},
                //async:      false,
                success:    function(r) {
                    if(r.success == true) {
                        value = r.value;
                        objBasket.notify(objBasket.events.removed, [r.value]);
                    }
                }
            });
		},
		
		addDomainPrivacyToBasket: function(privacyId,packageName) {
			//var itemId = null;
			$.ajax({
				type:		'post',
				dataType:	'json',
				url:		'/basket/private-domain/add',
				data:		{'privacyId':privacyId,'index':packageName},
				//async:		false,
				success:	function(r) {
					if(r != null) {
						itemId = r;
						objBasket.notify(objBasket.events.added, [itemId]);
					}
				}
			});
			
			//return itemId;
		},
		
		addSiteBuilderToBasket: function(productId,packageIndex) {
			objBasket.notify(objBasket.events.slider.adding);
			
			$.ajax({
				type:       'post',
				dataType:   'json',
				url:        '/basket/sitebuilder/add',
				data:       {'id':productId,'index':packageIndex},
				//async:      false,
				success:    function(r) {
					if(r != null) {
						objBasket.notify(objBasket.events.slider.added);
					}
				}
			});
			
			
		},
		
		removeSiteBuilderFromBasket: function(packageIndex) {
			$.ajax({
				type:       'post',
				dataType:   'json',
				url:        '/basket/sitebuilder/remove',
				data:       {'index':packageIndex},
				//async:      false,
				success:    function(r) {
					if(r != null) {
						objBasket.notify(objBasket.events.slider.removed);
					}
				}
			});
		},
		
		addEmailToBasket: function(productId,packageIndex) {
			$.ajax({
				type:       'post',
				dataType:   'json',
				url:        '/basket/email/add',
				data:       {'id':productId,'index':packageIndex},
				//async:      false,
				success:    function(r) {
					if(r != null) {
						objBasket.notify(objBasket.events.slider.added);
					}
				}
			});
		},
		
		removeEmailFromBasket: function(packageIndex) {
			$.ajax({
				type:       'post',
				dataType:   'json',
				url:        '/basket/email/remove',
				data:       {'index':packageIndex},
				//async:      false,
				success:    function(r) {
					if(r != null) {
						objBasket.notify(objBasket.events.slider.removed);
					}
				}
			});
		},
		
		addFreeDomainToBasket: function(id,keyword,itemData) {
			//var data = null;

			$.ajax({
				type:       'post',
				dataType:   'json',
				url:        '/basket/domain/add',
				data:       {'id':id,'keyword':keyword,'itemData':itemData},
				//async:      false,
				success:    function(r) {
					if(r != null) {
						data = r;
						objBasket.notify(objBasket.events.added, [data]);
					}
				}
			});
			
			//return data;
		},
		
		addDomainToBasket: function(id,keyword) {
			//var data = null;

			$.ajax({
				type:       'post',
				dataType:   'json',
				url:        '/basket/domain/add',
				data:       {'id':id,'keyword':keyword},
				//async:      false,
				success:    function(r) {
					if(r != null) {
						data = r;
						objBasket.notify(objBasket.events.domainAdded, [data]);
						objBasket.notify(objBasket.events.domainUpgrade);
					}
				}
			});
			
			//return data;
		},
		
		addDomainUpsellToBasket: function(id,keyword,suffix) {
			$.ajax({
				type:       'post',
				dataType:   'json',
				url:        '/basket/domain/add-upsell',
				data:       {'id':id,'keyword':keyword,'suffix':suffix},
				//async:      false,
				success:    function(r) {
					if(r != null) {
						data = r;
						objBasket.notify(objBasket.events.domainAdded, [data]);
						objBasket.notify(objBasket.events.domainUpgrade);
					}
				}
			});
		},
		
		addProductToBasketWithoutDomain: function(type,productId,domainName) {
			$.ajax({
				type:       'post',
				dataType:   'json',
				url:        '/basket/index/create-order-package',
				data:       {'name':domainName},
				//async:      false,
				success:    function(r) {
					if(r != null) {
						objBasket.addProductToBasket(type,productId,domainName);
					}
				}
			});
		},
		
		addProductToBasket: function(type,productId,domainName) {
			switch(type) {
				case 'email':
					this.addEmailToBasket(productId,domainName);
					break;
				case 'sitebuilder':
					this.addSiteBuilderToBasket(productId,domainName);
					break;
				case 'seo':
					this.addSeoProductToBasket(productId, domainName);
					break;
			}
		},
		
		addSeoProductToBasket: function(productId,domainName) {
			$.ajax({
				type:       'post',
				dataType:   'json',
				url:        '/basket/index/add',
				data:       {id:productId,index:domainName,typeId:this.properties.seoProductTypeId},
				//async:      false,
				success:    function(r) {
					if(r != null) {
						objBasket.notify(objBasket.events.added);
					}
				}
			});
		},
		
		addSliderPackageToBasket: function(packageData) {
			$.ajax({
				type:       'post',
				dataType:   'json',
				url:        '/basket/index/add-slider-package',
				data:       packageData,
				//async:      false,
				success:    function(r) {
					if(r != null) {
						objBasket.notify(objBasket.events.slider.packageAdded);
						objBasket.notify(objBasket.events.slider.packageUpgrade);
					}
				}
			});
		},
		
		removeUpgradeItem: function(productInstanceId) {
			$.ajax({
	            type:       'post',
	            dataType:   'json',
	            url:        '/basket/upgrade/remove',
	            async:		false,
	            data:       {'productInstanceId':productInstanceId},
	            success:    function(r) {
	                if(r != null) {
	                	
	                }
	            }
	        });
		},
		
		changeUpgradeProductInstance: function(index,typeId,productInstanceId) {
			$.ajax({
	            type:       'post',
	            dataType:   'json',
	            url:        '/basket/upgrade/change-upgrade-instance',
	            data:       {'index':index,'typeId':typeId,'productInstanceId':productInstanceId},
	            async:		false,
	            success:    function(r) {
	                if(r != null) {
	                	
	                }
	            }
	        });
		},
		
		setUpgradeInstance: function(index,typeId,productInstanceId,ignoreEvent) {
			if(ignoreEvent) {
				$.ajax({
		            type:       'post',
		            dataType:   'json',
		            url:        '/sitebuilder/upgrade',
		            data:       {'index':index,'typeId':typeId,'productInstanceId':productInstanceId},
		            async:		false,
		            success:    function(r) {
		                if(r != null) {
		                	
		                }
		            }
		        });
			} else {
				
				$(window).unbind(objBasket.events.slider.packageAdded);
				$(window).bind(objBasket.events.slider.packageAdded,function() {
					$.ajax({
			            type:       'post',
			            dataType:   'json',
			            url:        '/sitebuilder/upgrade',
			            data:       {'index':index,'typeId':typeId,'productInstanceId':productInstanceId},
			            async:		false,
			            success:    function(r) {
			                if(r != null) {
			                	
			                }
			            }
			        });
				});
			}
		}
	};

				
		var objBasketHover = {
				
			config : {
				
				scrollUp : '.mini-basket .scroll-up',
				
				scrollDown : '.mini-basket .scroll-down',
				
				ulList : '#items',
				
				intInterval : 0,
				
				intItems : 5,
				
				intRowHeight : 37
				
			},
				
			listen : function() {

				$( objBasketHover.config.scrollUp ).live("mouseover mouseout", function(event) { ( event.type == "mouseover" ) ? objBasketHover.scrollUp() : objBasketHover.clear();} );
				
				$( objBasketHover.config.scrollDown ).live("mouseover mouseout", function(event) { ( event.type == "mouseover" ) ? objBasketHover.scrollDown() : objBasketHover.clear(); } );
				
			},
			
			clear : function() {
				
				clearInterval( this.config.intInterval );
				
			},
			
			scrollUp : function() {
				
				this.config.intInterval = setInterval(function() { 
					var cssTop = parseInt( $( objBasketHover.config.ulList ).css('top') ); 
					if( !cssTop || cssTop < 0 ) {
						$( objBasketHover.config.ulList ).animate({top : '+='+objBasketHover.config.intRowHeight}, 300);
					}
				}, 300);

			}, 
			
			scrollDown : function() {

				this.config.intInterval = setInterval(function() {  
					var cssTop = parseInt( $( objBasketHover.config.ulList ).css('top') );
					
					if(!cssTop) {cssTop = 0;}
					
					if( cssTop > ( 0 - ( parseInt( $( objBasketHover.config.ulList ).height() ) - ( objBasketHover.config.intItems * objBasketHover.config.intRowHeight ) ) ) ) {	
						$( objBasketHover.config.ulList ).animate({top : '-='+objBasketHover.config.intRowHeight}, 300); 
					}
				}, 300);
				
			}
				
		};
		$(function() {
			objBasketHover.listen( );
		});
		
