﻿var shoppingCart;

(function($){
        $(function(){
            shoppingCart=new shoppingCartClass();
            shoppingCart.initFloatingShoppingCart();
        
        });

})(jQuery)

function shoppingCartClass(){
    var context=this;
    
    var $=jQuery;
    
    var shoppingCartDomElements={
        shoppingCartElm:null,
        shoppingCartItemsContainerElm:null,
        shoppingCartItemsContainerInnerElm:null,
        scrollBarElm:null,
        shoppingCartStateElm:null,
        messageElm:null,
        numItemsElm:null,
        completeElm:null
        
    };
    
    var shoppingCartItemTemplate;
    var cartItems=[];
    
    
    var scrolldelay;
    var scrollComplete=false;
    var bottomLeftPoint;
    var initialOffset;
    var innerMethods={
        setScrollBar:function(){
             shoppingCartDomElements.scrollBarElm.slider('destroy');
             var scrollHeight = shoppingCartDomElements.shoppingCartItemsContainerInnerElm.height() -shoppingCartDomElements.scrollBarElm.height();
             if(scrollHeight<=0){
                
                return;
                }
              if(!initialOffset)  
                    initialOffset= {top: shoppingCartDomElements.shoppingCartItemsContainerInnerElm.offset().top, left: shoppingCartDomElements.shoppingCartItemsContainerInnerElm.offset().left} ;
              else
                    shoppingCartDomElements.shoppingCartItemsContainerInnerElm.offset(initialOffset);
             shoppingCartDomElements.scrollBarElm.slider({
                    orientation: "vertical",
                    range:"max",
			        min: 0,
			        max: scrollHeight,
			        value: scrollHeight,
			        slide:function(event,ui){
			            var newValue =scrollHeight- ui.value;
			            var newOffset= {top:initialOffset.top-newValue , left:initialOffset.left};
			            shoppingCartDomElements.shoppingCartItemsContainerInnerElm.offset(newOffset);
			            
			            
			        
			        }
			       
             
             });  
                
             
        },
     
        pageScroll:function(callback){
            var callbackUsed=false;
            $('body,html').animate({scrollTop:0},800,function(){
                    //assuring that callback will be hit only once (as we are using both body and html selectors)
                   if(callback && !callbackUsed){
                    callback();
                    callbackUsed=true;
                    
                    }
            
            });
            
          }
    
    };
    
    this.initFloatingShoppingCart=function(callback){
            shoppingCartItemTemplate=$('#shoppingCartItemTemplate');
            shoppingCartDomElements.shoppingCartStateElm=$('.ShoppingCartStateTop');
            shoppingCartDomElements.shoppingCartElm=$('#floatingShoppingCartContainer');
             shoppingCartDomElements.shoppingCartItemsContainerElm=$('#shoppingCartItemsContanier');
             shoppingCartDomElements.shoppingCartItemsContainerInnerElm = $('#shoppingCartItemsContanierInner');
             shoppingCartDomElements.scrollBarElm=$('#scrollBar');
             shoppingCartDomElements.messageElm=$('#floatingShoppingCartMessage');
             shoppingCartDomElements.numItemsElm=$('#cartNumItems');
             shoppingCartDomElements.completeElm=$('#floatingShoppoingCartComplete');
         
              $.ajax({
                        type: "POST",
                        url:'/webservices/productDetailsService.asmx/GetOrderRows',
                        data:null,
                        contentType: "application/json; charset=utf-8",
                        dataType: "json",
                        success: function(data){
                        if(data.d!=null)
                            cartItems= data.d;
                        context.render();
                        context.setNumItems();
                        if(callback)
                            callback();
                        },
                        error: function(){}
                    
                    
                        });
             
             shoppingCartDomElements.shoppingCartStateElm.click(function(event){
                    event.stopPropagation();
                    event.preventDefault();
                      var isVisible= shoppingCartDomElements.shoppingCartElm.is(':visible');
               
               if(!isVisible)
                    context.display('עגלת הקניות',function(){innerMethods.setScrollBar(); });
               else
                    context.hide();
             });
             
             $('body').click(function(){
             if(shoppingCartDomElements.shoppingCartElm.is(':visible'))
                context.hide();
             });
    }
    
    this.render=function(message){
    if(shoppingCartDomElements.shoppingCartItemsContainerInnerElm){
        shoppingCartDomElements.shoppingCartItemsContainerInnerElm.empty();
     
        if(cartItems.length==0)
            shoppingCartDomElements.shoppingCartItemsContainerInnerElm.html('<div class="noDataText">עגלת הקניות שלך ריקה</div>');
        else
            shoppingCartItemTemplate.tmpl(cartItems).appendTo(shoppingCartDomElements.shoppingCartItemsContainerInnerElm);
        
        }
    }
    
    this.setNumItems=function(num){
 
            if(!num){
                num=0;
                $(cartItems).each(function(){
                    num+=this.qty;
                
                });
            }
            shoppingCartDomElements.numItemsElm.html(num);
      
      
            
        
    }
    
    this.showMessage=function(message, messageClass){
        shoppingCartDomElements.messageElm.html(message);
        if(messageClass)
            shoppingCartDomElements.messageElm.attr('class',messageClass);
        else
            shoppingCartDomElements.messageElm.attr('class','');
    }
    
    
    
    
    this.display=function(message,callback,messageClass){
            if(message)
                context.showMessage(message,messageClass)
                
            var sc= shoppingCartDomElements.shoppingCartElm;
            
            sc.effect('slide',{direction:'up'},500, function(){
                   
                if(callback)
                    callback();
            
            });
            //Correctiong Problem with Zoom Effect in IE7
            $('#tint').hide();
    }
    
    
    this.hide=function(callback){
            shoppingCartDomElements.shoppingCartItemsContainerInnerElm.css({top:'0', left:'0'});
          var sc= shoppingCartDomElements.shoppingCartElm;
          sc.effect('slide',{direction:'up', mode:'hide'},500, function(){
                

                if(callback)
                    callback();
                //Correctiong Problem with Zoom Effect in IE7
                 $('#tint').show();
            });
          
    }
    
    this.addToCart=function(productId, productName, size, color, qty,price, img){
        var cartRow= $.grep(cartItems, function(item,index){
            return item.productId=productId && item.size==size && item.color==color;
        });
        
        var addedIndex;
        
        if(cartRow.length>0){
            cartRow[0].qty+=parseInt( qty);
            addedIndex=$.inArray(cartRow[0],cartItems);
        }
        else{
            cartItems.push({productId:productId, size:size, color:color, qty:parseInt(qty), img:img, productName:productName, price:price});
            addedIndex = cartItems.length-1;
            }
        
       context.render();
       innerMethods.pageScroll(function(){
            context.display('<span class="MessageWithV">הפריט נוסף לעגלת הקניות שלך</span>', function(){
            setTimeout(function(){
                shoppingCartDomElements.shoppingCartElm.effect('fold',{},500);
                },3000);
          
                innerMethods.setScrollBar();
                context.focusOnItem(addedIndex);
                
            
        },"itemAdded");
       
       });


        
    }
    
    
    this.refreshAndDisplay=function(message, callback){
        shoppingCartDomElements.shoppingCartStateElm.unbind('click');
        var displayCallback=function(){
                innerMethods.setScrollBar();
                if(callback)
                    callback();
        setTimeout(function(){
              
             
                shoppingCartDomElements.shoppingCartElm.effect('fold',{},500);
                },3000);
             
        }
        
        var psCallBack=function(){
             context.display(message,displayCallback);
        
        };
     
       var initCallback=function(){
         innerMethods.pageScroll(psCallBack);
       
       
       };
        
        context.initFloatingShoppingCart(initCallback);
        
    
    }
    
    this.focusOnItem=function(index){
        var containerHeight=shoppingCartDomElements.shoppingCartItemsContainerElm.height();
        var fullHeight=shoppingCartDomElements.shoppingCartItemsContainerInnerElm.height();
    
        if(fullHeight<=containerHeight)
            return;
        var elmHeight= shoppingCartDomElements.shoppingCartItemsContainerInnerElm.children().first().outerHeight();
        
        var delta= elmHeight*(index+1)-containerHeight;
        
        
        
        
        var requiredOffsetTop=initialOffset.top-elmHeight*index;
        
        var delta2=fullHeight+requiredOffsetTop;
        var newOffset;
        if(delta<0)
            requiredOffsetTop=initialOffset.top;
        

        else if (delta2<containerHeight){
            requiredOffsetTop=  initialOffset.top-(fullHeight-containerHeight);
        
        }
        
        
        var currentOffsetTop =shoppingCartDomElements.shoppingCartItemsContainerInnerElm.offset().top;
        var deltaoffset= '+=' +( requiredOffsetTop-currentOffsetTop);
        
        //shoppingCartDomElements.shoppingCartItemsContainerInnerElm.offset(newOffset);
        shoppingCartDomElements.shoppingCartItemsContainerInnerElm.animate({top: deltaoffset});
         var scrollHeight = shoppingCartDomElements.shoppingCartItemsContainerInnerElm.height() -shoppingCartDomElements.scrollBarElm.height();
        var scrollValue=scrollHeight- (initialOffset.top - requiredOffsetTop);
        shoppingCartDomElements.scrollBarElm.slider('value',scrollValue);
        
    }
  
    
  
}












