;(function(d){
    d.require("dijit._base.scroll");
    d.require("dijit._base.place");
    //d.require("dojo.fx.easing");
    
    d.cart = {
        
        deleteConnections: [],
        
        init: function() {
	
	    if(d.isIE && d.isIE < 7) {
	        return false;
	    }
        
            // connect add butons
            d.query('.addToCartButton').forEach(function(node){
                d.connect(node,'onclick',this,function(evt){
                    this.onAddCartButtonClick(evt,node.id);
                });
            },this);
            
            // connect remove buttons
            this.reconnectDeleteButtons();
            
            // connect right col for movement
            var col = d.query('.content_right');
            if(col && col.length) {
                this.rightColummn = col[0];
                d.style(this.rightColummn,{
                    'position': 'absolute',
                    'right': 0,
                    'top': 0
                });
                d.connect(window,'onscroll',this,'handleScroll');   
            }
	    
	    // ensure height
	    this.provideHeight();
        },
        
        reconnectDeleteButtons: function() {
            dojo.forEach(this.deleteConnections,function(conn){
                d.disconnect(conn);
            });
            d.query('.deleteFromCartButton').forEach(function(node){
                this.deleteConnections.push(d.connect(node,'onclick',this,function(evt){
                    this.onDeleteButtonClick(evt,node.value);
                }));
            },this);
        },
        
        onAddCartButtonClick: function(evt,id) {
            d.stopEvent(evt);
            this.addToCart(id);
        },
        
        addToCart: function(id) {
            d.xhrPost({
                url: window.location.href,
                handleAs: 'json',
                timeout: 5000,
                postData: 'Warenkorba=add&KENNUNG='+id+'&xhr=1',
                load: d.hitch(this,'loadItem'),
                error: d.hitch(this,function(resp,ioArgs){
                    this.onAddError(resp,id);
                })
            });
        },
        
        loadItem: function(resp,ioArgs) {
            
            // check if given item already exists
            if(resp.itemInCart) {
                return this.itemAlreadyInCart();
            }
            
            // check if cart is empty
            var emptyNode = d.byId('emptyCartIndicator');
            if(emptyNode) {
                d.destroy(emptyNode);
            }
                
            // place new item
            var node = d.place(resp.content,'cartFooter','before');
            d.animateProperty({ node: node, duration:350,
                properties: {
                    opacity: { start: '0', end: '1'}
                }
            }).play();
            this.reconnectDeleteButtons();
	    
	    this.provideHeight();
        },
        
        onAddError: function(resp,id) {
            //console.error('Oops, there was an error!');
            d.byId('addItemForm_'+id).submit();
        },
        
        itemAlreadyInCart: function() {
            console.info('That item is already in cart!');
            return true;
        },
        
        onDeleteButtonClick: function(evt,id) {
            d.stopEvent(evt);
            this.removeFromCart(id);
        },
        
        removeFromCart: function(id) {
            d.xhrPost({
                url: window.location.href,
                handleAs: 'json',
                timeout: 5000,
                postData: 'Warenkorb=delete&WID='+id+'&xhr=1',
                load: d.hitch(this,function(resp,ioArgs){
                    this.removeItem(resp,id);
                }),
                error: d.hitch(this,'onRemoveError')
            });
        },
        
        removeItem: function(resp,id) {
            if(resp.status && resp.status === 'success') {
                var node = d.byId('cartItem_'+id);
                if(node) {
                    d.anim(node,{'opacity': 0},350,d._defaultEasing,d.hitch(this,function(){
                        d.destroy(node);
                        this.checkIfCartIsEmpty();
                    }));
                } else { // hu? we can't find that node?
                    this.onRemoveError(resp,id);
                }
            } else { // deletion failure
                this.onRemoveError(resp,id);
            }
        },
        
        onRemoveError: function(resp,id) {
            //console.error('Deletion failed for '+id+'!');
            d.query('form',d.byId('cartItem_'+id))[0].submit();
        },
        
        checkIfCartIsEmpty: function() {
            var items = d.query('.cartSingleItem');
            if(!items || !items.length || items.length < 1) {
                d.place('<p id="emptyCartIndicator">Ihr Angebotskorb ist derzeit leer.</p>','cartFooter','before');
            }
        },
        
        /* ------------- scrolling ----------------*/
        
        handleScroll: function(evt) {
            
            // get header heights...
            var hc = d.coords(d.query('.content_container')[0]);
            var topDistance = hc.t;
            
            // get scroll pos
            var viewTop = dijit.getViewport().t;
            
            // beautify offset
            var offset = 10;
            
            var top = viewTop > topDistance ? (viewTop - topDistance + offset) : 0;
            
            d.anim(this.rightColummn,{'top': top},200);
        },
	
	/* ----------- height ------------- */
	
	provideHeight: function() {
		var leftCol = d.query('.content_left')[0],
			rc = d.coords(this.rightColummn),
			lc = d.coords(leftCol);
		if(rc.h > lc.h) {
			d.style(leftCol,'height',rc.h + 'px');
		}
	}
    };
    
    d.addOnLoad(d.hitch(d.cart,'init'));
})(dojo);
