$(document).ready(function() {
    $.cart = (function() {
        var cart_is_busy = false;

        var start_cart_timer = function() {
            stop_cart_timer();
            $('#cart').oneTime(2000, 'cart_close_timer', close_cart);
        }

        var stop_cart_timer = function() {
            $('#cart').stopTime('cart_close_timer');
        }

        var dont_start_timer = false;

        var open_cart = function(new_dont_start_timer) {
            dont_start_timer = new_dont_start_timer ? new_dont_start_timer : dont_start_timer;
            stop_cart_timer();
            $('#cart_fixed_wrap').addClass('fixed-cart');
            $('#cart-list').hoverIntent(stop_cart_timer, start_cart_timer);
            $('#cart-link').hoverIntent(function() {
                open_cart(true);
            }, start_cart_timer);
            if ($('#cart').hasClass('cart-is-open') || cart_is_busy) {
                return false;
            } else {
                if ($.browser.msie) {
                    $('#sortGoodsBy').hide();
                }
                cart_is_busy = true;
                stop_cart_timer();
                $('#cart-list').removeClass('dn');

                var h = $('#c-list-inner').height();
                $('#c-list-inner').height('0px');

                $('#cart-top').addClass('vv');
                $('.show-hide').addClass('vv');
                $('#c-list-inner').animate({
                    'height' : h + 'px'
                },
                500,
                'easeOutBounce',
                function() {
                    $('#cart').addClass('cart-is-open');
                    if (dont_start_timer != true) {
                        start_cart_timer();
                    }
                    cart_is_busy = false;
                });
                return true;
            }
        }

        var close_cart = function() {
            stop_cart_timer();
            if ($('#cart').hasClass('cart-is-open') && !cart_is_busy) {
                cart_is_busy = true;
                var h = $('#c-list-inner').height();
                $('#c-list-inner').animate({
                    'height' : '0px'
                },
                250,
                'easeInOutElastic',
                function() {
                    $('#c-list-inner').height(h + 'px');
                    $('#cart-top').removeClass('vv');
                    $('.show-hide').removeClass('vv');
                    $('#cart').removeClass('cart-is-open');
                    $('#cart-list').addClass('dn');
                    if ($.browser.msie) {
                        $('#sortGoodsBy').show();
                    }
                    cart_is_busy = false;
                });
                $('#cart_fixed_wrap').removeClass('fixed-cart');
                return true;
            }
            return false;
        }

        function update_free_delivery_left(data) {
            if ($('#free_delivery_price_left').length > 0 && data.to_free_delivery) {
                if (data.to_free_delivery != true) {
                    $('#free_delivery_price_left .delivery_not_free').removeClass('dn');
                    $('#free_delivery_price_left .price_block').html(data.to_free_delivery);
                    $('#free_delivery_price_left .delivery_free').addClass('dn');
                } else {
                    $('#free_delivery_price_left .delivery_not_free').addClass('dn');
                    $('#free_delivery_price_left .delivery_free').removeClass('dn');
                    $('#free_delivery_price_left .price_block').html(data.to_free_delivery);
                }

            }
        }

        function update_cart_quantities() {
            var url = $('input#update_qtys_url').val();
            $.post(url, $('#cart_form').serialize(),
                function(data) {
                    $('#content-inside-wrap').html(data.content);
                    $('div#cart').html(data.brief);
                    update_free_delivery_left(data);
                });
        }

        function delete_cart_item(item_id, brief) {
            $.post($('input.delete_item_url').val(), {
                'id': item_id,
                'brief': brief
            },
            function(data) {
                $('div#cart').html(data.brief);
                update_free_delivery_left(data);
                if ($('#cart_form').length > 0) {
                    $('#content-inside-wrap').html(data.content);
                }
            });
        }

	function add_free_item_to_cart(good_id) {
	    $.post($('.add_free_to_cart_url').val() + '/' + good_id, {}, function(data) {
                if (data.result == true) {
                    $('div#cart').html(data.brief);
                    if ($('#cart_form').length > 0) {
			$('#content-inside-wrap').html(data.content);
		    }
                }
            });
	}

	$('.add-free-to-cart').live('click', function() {
	    var id = $(this).attr('rel');
	    add_free_item_to_cart(id);
	});

        function add_to_cart(obj) {
            var pid = $(obj).attr('rel');
            var imgid = '';

            var carousel_image_index = $('#single_carousel').length ? current_good_image - 1 : false;

            if (carousel_image_index !== false && $('#item_image_' + carousel_image_index + '_' + pid).offset() !== null) {
                imgid = carousel_image_index + '_' + pid;
            } else {
                imgid = pid;
            }
            //if options exists
            if ($('#goods_option_id').length) {
                if ($('#goods_option_id').val() < 1) {
                    alert(global_msg_choose_options);
                    return false;
                }
            }

            var $form = $(obj).closest('form.add_to_cart_' + pid);

            var post_data = {
                cart_is_open: $('#cart').hasClass('cart-is-open') ? 1 : 0,
                cart_id:	$('#brief_cart_id').val(),
                good_id:	$('.add_to_cart_good_id_' + pid, $form).val(),
                quantity:	$('.add_to_cart_qty_' + pid, $form).val(),
                option_id:	$('.goods_option_id', $form).val()
            };
            var compare_add = $(obj).hasClass('cp_add');

            var $item_image = false;
            var prepend;
            var $item_container = $(obj).closest('.item');

            if (carousel_image_index !== false && $('#item_image_' + imgid).length > 0) {
                $item_image = $('#item_image_' + imgid);
                prepend = $('#one_good');
            } else if ($item_container.length > 0) {
                $item_image = $('.item_image_' + imgid, $item_container);
                prepend = $('.item_image_wrap_' + imgid, $item_container);
            }

            if ($item_image && $item_image.offset() !== null) {
                var productX = $item_image.offset().left;
                var productY = $item_image.offset().top;
                var basketX, basketY;
                if ($('#cart_item_image_' + pid).length) {
                    basketX = $('#cart_item_image_' + pid).offset().left;
                    basketY = $('#cart_item_image_' + pid).offset().top;
                } else {
                    basketX = $('#cart-inner').offset().left;
                    basketY = $('#cart-inner').offset().top;
                }
                var gotoX = basketX - productX;
                var gotoY = basketY - productY;

                var newImageWidth	= $('#cart' + pid).width() / 4;
                var newImageHeight	= $('#cart' + pid).height() / 4;

                $item_image
                .clone()
                .prependTo(prepend)
                .css({
                    'position' : 'absolute',
                    'z-index' : '999999'
                })
                .removeAttr('id')
                .animate({
                    opacity: 0.1,
                    marginLeft: gotoX,
                    marginTop: gotoY,
                    width: newImageWidth,
                    height: newImageHeight
                }, 500, function() {
                    $(this).remove();
                });
            }

            $.post(site_url('cart_controller/add_item'), post_data, function(data) {
                var cp = (compare_add) ? 'cp_' : '';
                var $mess_container = $('.' + cp + 'success_list_' + data.good_id);
                var message;
                if (data.result == true) {
                    $('div#cart').html(data.brief);
                    update_free_delivery_left(data);

                    if (redirect_after_tocart) {
                        window.location = global_cart_url;
                    } else {
                        open_cart();

                        if (typeof $.fancybox == 'function')
                            $.fancybox.close();

                        if ($mess_container.length > 0) {
                            message = data.message ? data.message : global_add_to_cart_success;
                            $mess_container.fadeOut().removeClass('error-list dn').addClass('success-list').html(message).fadeIn();
                        }
                    }
                }
                else {
                    if ($mess_container.length > 0) {
                        message = data.message ? data.message : global_add_to_cart_success;
                        $mess_container.fadeOut().removeClass('success-list dn').addClass('error-list').html(message).fadeIn();
                    }
                }
            });
        }

        /** cart vbrief methods */

        $('#cart-list').hoverIntent(stop_cart_timer, start_cart_timer);
        $('#cart-link').hoverIntent(function() {
            open_cart(true);
        }, start_cart_timer);
        $('#close_cart_link').live('click', function(e) {
            e.preventDefault();
            close_cart();
        });
        $('#cart-link').live('click', function(e) {
            e.preventDefault();
            if ($('#cart').hasClass('cart-is-open')) {
                close_cart();
            }
            else {
                open_cart(true);
            }
        });
        $('#cart-title').live('click', function(e) {
            e.preventDefault();
        });

        $('.cartInput').live('keypress', function(e) {
            if (e.keyCode == 13) {
                e.preventDefault();
                e.stopPropagation();

                var obj = $(this).closest('form').find('.addCart');
                add_to_cart(obj);
            }
        });

        $('.addCart').live('click', function(e) {
            e.preventDefault();
            e.stopPropagation();

            add_to_cart($(this));
        });

        $('#cart_form .update_checkout_qtys').live('click', function(e) {
            e.preventDefault();
            update_cart_quantities();
        });
        $('#cart_form .items-number').live('keyup', function(e) {
            e.preventDefault();

            if (e.keyCode == 13) {
                update_cart_quantities();
            }

            $('#cart_form').bind('submit', function() {
                return false;
            });

        });

        $('#estimate_delivery_zone').live('change', function() {
            $('#estimate_delivery_price').load($('input#estimate_delivery_reload_url').val() + '/' + $(this).val());
        });


        $('.delete_cart_item').live('click', function(e) {
            e.preventDefault();
            var brief = 0;
            if ($(this).hasClass('brief')) {
                brief = 1;
            }
            delete_cart_item($(this).attr('rel'), brief);
            if ($.checkout.is_opened())
                $.checkout.reload_cart_items();
        });

        function toggle_coupon(val, checkout) {
            var coupon = $('#coupon_code_input');
            if (coupon.val() == coupon.attr('title') && val == 'add') {
                coupon.focus();
            }
            else {
                if (checkout == 1) {
                    $('#checkout_summary_section').load(site_url('checkout/update_coupon'), {
                        code: coupon.val(),
                        type: val
                    });
                } else {
                    $('#cart_wrap').load($('input#update_coupon_url').val(), {
                        code: coupon.val(),
                        type: val
                    });
                }

            }
        }

        $('#coupon_code_input').live('keyup', function(e) {
            e.preventDefault();
            if (e.keyCode == 13) {
                var checkout = 0;
                if ($(this).hasClass('checkout')) {
                    checkout = 1;
                }
                toggle_coupon('add', checkout);
            }
        });
        
        $('#add_coupon').live('click', function(e) {
            e.preventDefault();
            var checkout = 0;
            if ($(this).hasClass('checkout')) {
                checkout = 1;
            }
            toggle_coupon('add', checkout);
        });

        $('#remove_coupon').live('click', function(e) {
            e.preventDefault();
            var checkout = 0;
            if ($(this).hasClass('checkout')) {
                checkout = 1;
            }
            toggle_coupon('remove', checkout);
        });
        
        // add global cart functions here
        return {
            add_to_cart : function(o) {
                add_to_cart(o);
            }
        };
    })();
});
