(function($){
    var language = 'en';
    if( location.href.match('neowing.co.jp') ) language = 'ja';

    var language_option = {
        ja: {
            cart_msg: 'カートに追加しました',
            cart_msg_f: 'カートに追加を失敗しました',
            list_msg: 'リストに追加しました',
            list_msg_f: 'リストに追加を失敗しました',
            login_error_msg: 'ログインの必要があります',
            login_title: 'ログインへ',
            sp_template: '<div style="padding: 8px; margin-bottom: 70px; max-height: 200px; overflow-y:scroll;">{{if qty > 0 }}{{each cart}}<div class="clearfix sp_item" style="width:300px; border-bottom: dashed 1px #CCC; padding-bottom: 5px; margin-bottom: 5px;" id="sp_${prodkey}"><div class="img_resize80" style="width:40px; float:left"><a href="${link}"><img src="${image}" alt="${prodkey}" style="width:40px;" /></a></div><ul style="float:left; margin:0; padding:0; list-style:none; width: 250px"><li><a href="${link}">${title}</a></li><li><span class="prod_price">${sales_price}</span>円 x <span class="prod_qty">${qty}</span> = <span class="prod_total">${total}</span>円</li><li><form method="post" style="display:inline"><input type="hidden" id="prodkey" value="${prodkey}" name="prodkey" /><button type="submit" class="button button-white button-x-small" style="font-size:80\%; color:#000;">-1</button><input type="hidden" id="_method" value="DELETE" name="_method" /><input type="hidden" id="all_flg" value="0" name="all_flg" /></form><form method="post" style="display:inline"><input type="hidden" name="inc" value="1" /><input type="hidden" id="prodkey" value="${prodkey}" name="prodkey" /><button type="submit" class="button button-white button-x-small" style="font-size:80%; color:#000;">+1</button><input type="hidden" id="_method" value="POST" name="_method" /></form></li></ul></div>{{/each}}</div><div style="position:absolute; bottom: 3px; border-top: solid 2px #CCC; height:60px; width:100%;text-align:center;"><div><h6>個数: <span id="sp_qty">${qty}</span> 合計: <span id="sp_amount_of_price">${amount_of_price}</span>円</h6></div>{{else}}ショッピンカートは空です{{/if}}<div><a href="/z/shopping_cart/" class="button button-white button-small">カートを見る</a><a href="/z/login/order" class="button button-orange button-small">注文へすすむ</a></div></div></div>'
        },
        en: {
            cart_msg: 'The item has been added to your shopping cart.',
            cart_msg_f: 'An unexpected error occurred. Please try again to add the item to your cart.',
            list_msg: 'The item has been bookmarked in your Saved Items.',
            list_msg_f: 'An unexpected error occurred. Please try again to save the item for later.',
            login_error_msg: 'Sign into your Customer Account or create New Account.',
            login_title: 'Continue',
            sp_template: '<div style="padding: 8px; margin-bottom: 70px; max-height: 200px; overflow-y:scroll;">{{if qty > 0 }}{{each cart}}<div class="clearfix sp_item" style="width:300px; border-bottom: dashed 1px #CCC; padding-bottom: 5px; margin-bottom: 5px;" id="sp_${prodkey}"><div class="img_resize80" style="width:40px; float:left"><a href="${link}"><img src="${image}" alt="${prodkey}" style="width:40px;" /></a></div><ul style="float:left; margin:0; padding:0; list-style:none; width: 250px"><li><a href="${link}">${etitle}</a></li><li><span class="prod_price">${sales_price}</span> yen * <span class="prod_qty">${qty}</span> = <span class="prod_total">${total}</span> yen</li><li><form method="post" style="display:inline"><input type="hidden" id="prodkey" value="${prodkey}" name="prodkey" /><button type="submit" class="button button-white button-x-small" style="font-size:80\%; color:#000;">-1</button><input type="hidden" id="_method" value="DELETE" name="_method" /><input type="hidden" id="all_flg" value="0" name="all_flg" /></form><form method="post" style="display:inline"><input type="hidden" name="inc" value="1" /><input type="hidden" id="prodkey" value="${prodkey}" name="prodkey" /><button type="submit" class="button button-white button-x-small" style="font-size:80%; color:#000;">+1</button><input type="hidden" id="_method" value="POST" name="_method" /></form></li></ul></div>{{/each}}</div><div style="position:absolute; bottom: 3px; border-top: solid 2px #CCC; height:60px; width:100%;text-align:center;"><div><h6>Total Items: <span id="sp_qty">${qty}</span> Sub-Total: <span id="sp_amount_of_price">${amount_of_price}</span> yen</h6></div>{{else}}Your Shopping Cart is empty.{{/if}}<div><a href="/z/shopping_cart/" class="button button-white button-small">View Cart</a><a href="/z/login/order" class="button button-blue button-small">Proceed to Checkout</a></div></div></div>'
        }
    };

    var options = {
        sp_url: '/z/shopping_cart/',
        menu: true,
        language: language,
        sp_menu_content: '<img src="/static/icon/shopping_cart.png" id="sp_icon" />',
        post_success: function(f, data, action){
            var msg;
            if( action == 'add' ) {
                if( data['msg'] ) {
                    msg = data['msg'].join('<br />');
                }
                else {
                    msg = options['cart_msg'];
                }
            }
            if( msg ) $.notifyBar({ html: msg });
        },
        post_failure: function(f, data, action) {
            var msg;
            if( !data['msg'] ) {
                msg = options['cart_msg_f'];
            }
            else {
                msg = data['msg'].join("<br />");
            }
            if( msg ) $.notifyBar({ cls: "error", html: msg });
        },
        format_count_text: function(cnt) { return cnt },
        after_update_shopping_cart: function(self,summary){}
    };

    $.extend(options, language_option[language]);

    var methods = {
        set_sp_post: function() {
            if( $(this).size() > 0 ) {
                $(this).unbind('submit').submit(function(){
                    $(this).neowing('post_shopping_cart');
                    return false;
                });
            }
            return this;
        },
        count_shopping_cart: function() {
            var $this = $(this);
            $.ajax({
                url: options['sp_url'] + 'count',
                cache: false,
                type: 'GET',
                success: function(data) {
                    if( data != '' ) {
                        $this.text(options['format_count_text'](data));
                    }
                }
            });
        },
        post_shopping_cart: function() {
            var $f = $(this);
            var action = 'add';
            var params = $f.serializeArray();
            for( i in params ) {
                if( params[i].name == '_method' && params[i].value.toUpperCase() == 'DELETE' ) {
                    action = 'delete';
                }
                else if( params[i].name == 'inc' && params[i].value ) {
                    action = 'inc';
                }
            }

            if( $('#nw_post_message').size() == 0 ) {
                $('body').append('<div style="font-size:small;position:fixed;bottom:0;left:0;" id="nw_post_message"><img src="/static/icon/ajax-loader2.gif" /></div>');
            }

            var left = Math.floor(($(window).width() - $("#hoge").width()) / 2);
            var top  = Math.floor(($(window).height() - $("#hoge").height()) / 2);
            $('#nw_post_message').css({
                "top": top,
                "left": left,
            }).show();

            $.ajax({
                url: options['sp_url'] + 'json',
                dataType: 'json',
                cache: false,
                type: $f.attr('method'),
                data: $f.serialize(),
                success: function(data) {
                    if( data['status'] == 'OK' ) {
                        options['post_success']($f, data, action);
                        $.neowing.update_shopping_cart(data['summary']);
                        if( options['menu'] ) {
                            $('#shopping_cart_count').neowing('count_shopping_cart');
                        }
                    }
                    else {
                        options['post_failure']($f, data, action);
                    }
                },
                fail: function(){
                    options['post_failure']($f);
                },
                complete: function(){
                    $('#nw_post_message').hide();
                }
            });

            return false;
        },
        add_list_items: function() {
            var key = [];
            var callback = function(){};
            if($(this).is('form')) {
                var form = $(this);
                var s = form.serializeArray();
                for( var k in s ) {
                    if( s[k].name == 'prodkey' ) key.push(s[k].value);
                }
                if( form.attr('action').match('/shopping_cart/') ) {
                    callback = function(data){
                        form.neowing('post_shopping_cart');
                    };
                }
            }
            else if( $(this).is('a') ) {
                var result = $(this).attr('href').match(/\?(.+)$/);
                if( result && result[1] ) {
                    var query = result[1].split('&');
                    for( i in query ) {
                        var pkey = query[i].match(/^prodkey=(.+)$/);
                        if( pkey && pkey[1] ) {
                            key.push(pkey[1]);
                        }
                    }
                }
            }

            $.neowing.login_check(
                function(data) {
                    $.neowing.post_item_list( key, callback );
                },
                function() {
                    var url = location.href;
                    url = url.replace(/^https?:\/\//, '');
                    var path_array = url.split('/');
                    path_array.shift();
                    var path = '/' + path_array.join('/')
                    var msg = options ['login_error_msg']
                        + '<a href="/z/login/?next=' + encodeURI(path) + '">'
                        + options ['login_title'] +'</a>';
                    $.notifyBar({
                        cls: "error",
                        html: msg,
                        close: true,
                        delay: 1000000
                    });
                }
            );
            return false;
        }
    };

    $.neowing = {
        init: function(input_options) {
            $.extend(options, input_options);
            return this;
        },
        login_check: function(success, failure) {
            $.getJSON(
                '/z/login_check',
                function(data){
                    if( data.result == true ) {
                        success(data);
                    }
                    else {
                        failure(data);
                    }
                }
            );
            return this;
        },
        setup_sp_menu: function() {
            if( options['menu'] == true ) {
                if( $('#sp_menu').size() == 0 ) {
                    $('body').append('<div id="sp_menu" class="sp_component" style="width:100px;background-color:#666;position:fixed;filter:alpha(opacity=70);-moz-opacity:0.70;opacity:0.70; top:100px;right:0; border:solid #000 1px; color:#000; font-weight:bold; cursor:pointer;text-align:center;"><a href="#sp_content" id="sp_open">' + options['sp_menu_content'] + '</a><span id="shopping_cart_count" style="font-size:200%;"></span></div>');
                }

                if( $('#sp_content').size() == 0 ) {
                    $('body').append('<div id="sp_content" style="width:360px;"></div>');
                }

                $('#shopping_cart_count').neowing('count_shopping_cart');
                $('a#sp_open').fancybox({
                    overlayOpacity: 0.1,
                    centerOnScroll: true,
                    transitionIn: 'elastic',
                    transitionOut: 'elastic',
                    easingIn: 'linear',
                    onStart: function(){
                        $.neowing.get_shopping_cart();
                        $('#sp_content').show();
                    },
                    onComplete: function(){
                        $('#sp_menu').css({ 'visibility': 'hidden' });
                    },
                    onClosed: function(){
                        $('#sp_content').hide();
                        $('#shopping_cart_count').neowing('count_shopping_cart');
                        $('#sp_menu').css({ 'visibility': 'visible' });
                    }
                });
            }

            return this;
        },
        get_shopping_cart: function() {
            $.ajax({
                url: options['sp_url'] + 'json',
                success: function(data) {
                    $.template( 'sp_tmpl', options['sp_template'] );
                    var html = $.tmpl('sp_tmpl', data);
                    $('#sp_content').html(html);
                    $('#sp_content form').each(function(){
                        $(this).unbind('submit').submit(function(){
                            $(this).neowing('post_shopping_cart');
                            return false;
                        });
                    });
                }
            });
        },
        update_shopping_cart: function(summary) {
            var current_items = {};
            $('#sp_content .sp_item').each(function(){
                var id = $(this).attr('id');
                current_items[id.replace(/^sp_/, '')] = 1;
            });

            for( key in summary['items'] ) {
                delete current_items[key];
                var result = summary['items'][key];
                var qty = result['qty'];
                if( qty > 0 ) {
                    var price = $('#sp_' + key + ' ' + '.prod_price').text();
                    $('#sp_' + key + ' ' + '.prod_qty').text(qty);
                    $('#sp_' + key + ' ' + '.prod_total').text(qty * price);
                }
                else {
                    $('#sp_' + key ).hide('slow').remove();
                }
            }

            for( key in current_items ) {
                $('#sp_' + key).remove();
            }

            $('#sp_qty').text(summary['qty']);
            $('#sp_amount_of_price').text(summary['amount_of_price']);

            options['after_update_shopping_cart'](this, summary);
        },
        post_item_list: function(prodkey, success) {
            var query = [];
            for( i in prodkey ) {
                query.push('prodkey=' + prodkey[i]);
            }

            $.post(
                '/z/my/list/items/new',
                query.join('&'),
                function(data){
                    var msg;
                    if( data['msg'] ) msg = data['msg'].join('<br />');

                    if( data.result > 0 ) {
                        if(!msg) msg = options['list_msg'];
                        $.notifyBar({ html: msg });
                        success(data);
                    } else {
                        if(!msg) msg = options['list_msg_f']
                        $.notifyBar({ cls: "error", html: msg });
                    }
                }
            );
        }
    };

    $.fn.neowing = function( method ) {
        // ie6
        if(!jQuery.support.opacity && !jQuery.support.style && typeof document.documentElement.style.maxHeight == "undefined") {
            return;
        }

        // Method calling logic
        if ( methods[method] ) {
            return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof method === 'object' || ! method ) {
            return methods.init.apply( this, arguments );
        } else {
            $.error( 'Method ' +  method + ' does not exist.' );
        }
    };

})(jQuery);

