var cart = Class.create();
cart.prototype = {
    initialize: function(){
        if(addUrlConf != ''){
            this.addUrl = addUrlConf;
        } else {
            this.addUrl = '/servlet/Satellite?c=Page&cid=1177646699221&pagename=bisyojo%2FPage%2FB_CartXMLTemplate&sc=';
        }
        if(showUrlConf != ''){
            this.showUrl = showUrlConf;
        } else {
            this.showUrl = '/servlet/Satellite?c=Page&cid=1177646699221&pagename=bisyojo%2FPage%2FB_CartXMLTemplate&sc=';
        }
        this.logincart = $('CART');
        this.category = $('TYPE');//商品種別
        this.count = $('COUNT');//冊数
        this.viewcartBtn = $$('div.view a img')[0];//カートを見るボタン
        this.addtocartBtns = $$('td.tright input');//カートに追加ボタン
        this.f = $$('form');//カート部分のフォーム
        //observeの代わり
        if(this.f[2]){
            this.f[2].onsubmit = function(){
                return false;
            }
        }
        //バスケットエリア
        this.basket = '<div id="basket"></div>';
        this.basket = this.createBasket(this.basket);
        Element.setStyle(this.basket, {
        'position': 'absolute',
        'zIndex': '100',
        'marginTop': '-50px',
        'overflow': 'hidden',
        'width': Element.getDimensions(this.logincart).width + 'px'
        });
        if(navigator.appName.charAt(0)=="N"){
            Element.setStyle(this.basket, {'marginTop': '-47px'});
        }
        if(navigator.appVersion.indexOf("Safari") > -1){
            Element.setStyle(this.basket, {'marginTop': '-60px'});
        }
        Element.observe(window.document, 'mousemove', this.capture.bindAsEventListener(this));
        Element.observe(this.viewcartBtn, 'mouseover', this.viewCart.bindAsEventListener(this));
        this.addtocartBtns.invoke('observe', 'click', this.addToCart.bindAsEventListener(this));
    },
    createBasket: function(elem){
        new Insertion.After(this.logincart, elem);
        return $('basket');
    },
    capture: function(e){
        this.mouseX = Event.pointerX(e);
        this.mouseY = Event.pointerY(e);
        if($('CARTOV') && !this.sw){
            if(!Position.within(this.quickCart, this.mouseX, this.mouseY) && !Position.within(this.logincart, this.mouseX, this.mouseY)){
                this.way = -1;
                this.doSlideCart(true, 500);
            }
        }
    },
    doSlideCart: function(sw, time){
        this.sw = sw;
        this.time = time;
        if(this.timer)clearTimeout(this.timer);
        if(this.interval) clearInterval(this.interval);
        this.interval = setInterval(this.slideCart.bind(this),1);
    },
    slideCart: function(){
        var currentY = Number(Element.getStyle(this.quickCart, 'top').match(/[-0-9]+/));
        var targetY = (this.way == 1)? 0 : this.quickCartHeight * this.way;
        var step;
        new function(){
            step = Math.ceil((currentY - targetY)/5);
            currentY -= step;
        }
        Element.setStyle(this.quickCart, {'top': currentY + 'px'});
        if(this.way == 1 && step > -1){
            clearInterval(this.interval);
            this.way = -1;
            if(this.sw){
                this.timer = setTimeout(this.doSlideCart.bind(this),3000);
            }
        }else if(this.way == -1 && step <= 0){
            clearInterval(this.interval);
            Element.remove(this.quickCart);
            if(navigator.appVersion.indexOf("Safari") > -1 || navigator.appName.charAt(0)=="N") Element.setStyle(this.basket, {'height': '0px'});
            //opera
            if(navigator.appVersion.indexOf("Opera") > -1) var x=1; Element.setStyle(this.basket, {'height': '0px'});
            var cartflag = document.getElementsByClassName('cartflag');
            if(cartflag.length > 0){
                this.addToCart;
            }
        }
    },
    addToCart: function(e){
        this.work = 1;
        Element.setStyle(this.basket, {'height': ''});
        if(e) var elem = Event.element(e);
        if(elem) var thisname = elem.name;
        var thisname = elem.name;

        var body = document.getElementsByTagName('body');

        var flagHTML = '<input type="hidden" class="cartflag" value="'+thisname+'">';
        new Insertion.Bottom(body[0], flagHTML);

        var cartflag = document.getElementsByClassName('cartflag');
        if(cartflag.length > 0){
            var thisname = cartflag[0].value;
            Element.remove(cartflag[0]);
        }
        thissplit = thisname.split("_");
        var cate = thissplit[0];
        var bid = thissplit[1];
        //本の種類チェック
        var res = checkbook(cate);
        if(!res){
            var vali = chkerror(bid, cate)
            if(!vali){
                var param = 'cate=' + cate + '&bid=' + bid;
                var url = this.addUrl;
                var myAjax = new Ajax.Request(
                url,
                {method: 'post', parameters: param, onComplete: this.showAddedBook.bind(this)});
            }else{
                alert(vali);
            }
        }else{
            alert(res);
        }
        if(e) Event.stop(e);
    },
    viewCart: function(){
        if(this.work==1) Element.setStyle(this.basket, {'height': ''});
        this.work = 2;
        if(!$('CARTOV') || this.sw){
            this.cookies = document.cookie + ";";
            //クッキー利用可でクッキーが存在する場合
            if(navigator.cookieEnabled && iscookie(this.cookies, "numbers_b")){
                //クッキーの取得
                var j, s, v;
                this.bary = new Array();
                this.numbers = iscookie(this.cookies, "numbers_b");
                this.btype = cookieparts(this.numbers, "btype");
                this.pall = cookieparts(this.numbers, "pall");
                this.call = cookieparts(this.numbers, "call");
                names = new Array("title", "subtitle", "headtitle", "author", "price");
                for(s=0; s<5; s++){
                    if(this.cookies.indexOf("cook_b"+s+"=") != -1){
                        this.cook = iscookie(this.cookies, "cook_b"+s);
                        this.bary[s] = new Array();
                        for(v=0; v<names.length; v++){
                            this.bary[s][names[v]] = cookieparts(this.cook, names[v]);
                        }
                    }
                }
                //クッキーの取得完了
                this.inserthtml(this);
            }else{
                //AJAX
                var param = "";
                var url = this.showUrl;
                var ajax = new Ajax.Request(
                url,
                {method: 'post', parameters: param, onComplete: this.showBooks.bind(this)});
            }
        }
    },
    showBooks: function(res){
        var xmlsorce = res.responseXML;
        var books = xmlsorce.getElementsByTagName('books');
        var k, j;
        this.pall = '';
        var eflag = 0;
        this.call = 0;
        var cate = books[0].getAttribute('category');
        this.btype = getflag(cate);
        //エラー判定
        for(k=0; k<books.length; k++){
            for(j=0; j<books[k].childNodes.length; j++){
                if(books[k].childNodes[j].tagName=='error'){
                    eflag = 1;
                    break;
                }
                if(books[k].childNodes[j].tagName=='total'){
                    this.pall += books[k].childNodes[j].firstChild.nodeValue;
                }
                if(books[k].childNodes[j].tagName=='all_book'){
                    this.call += parseInt(books[k].childNodes[j].firstChild.nodeValue);
                }
            }
        }
        if(eflag == 0){
            books = new Array;
            books = xmlsorce.getElementsByTagName('book');
            var u, r;
            this.bary = new Array;
            for(u=0; u<books.length; u++){
                this.bary[u] = new Array;
                for(r=0; r<books[u].childNodes.length; r++){
                    if(this_array(books[u].childNodes[r].tagName)){
                        if(books[u].childNodes[r].firstChild){
                            this.bary[u][books[u].childNodes[r].nodeName] = books[u].childNodes[r].firstChild.nodeValue;
                        } else {
                            this.bary[u][books[u].childNodes[r].nodeName] = '';
                        }
                    }
                }
            }
        }
        this.inserthtml(this);
    },
    inserthtml: function(req){
        var showall = '<div id="CARTOV"><div class="content">';
        showall += '<p class="status">新しくカートに入れた書籍</p><p class="more"><a href="/servlet/Satellite?c=Page&cid=1176570377879&p=1176293008718&pagename=bisyojo%2FB_Simple4">全て見る</a></p>';
        for(w=0; w<this.bary.length; w++){
            if(w==this.bary.length-1){
                var li = '<p class="items last">';
            }else{
                var li = '<p class="items">';
            }
            showall += li+'<span>'+req.btype+'<br /></span>';
            showall += '<strong>'+req.bary[w]['headtitle']+'&nbsp;'+req.bary[w]['title']+'&nbsp;'+req.bary[w]['subtitle']+'</strong>';
            showall += '<br /><span>'+req.bary[w]['author']+'</span><br />'+pricelimit(req.bary[w]['price'])+'円</p>';
        }
        showall += '<p class="total">商品合計金額（税込）<br /><strong><span id="SUM">'+pricelimit(req.pall)+'</span>円</strong></p>';
        showall += '<div class="view"><a href="/servlet/Satellite?c=Page&cid=1176570377879&p=1176293008718&pagename=bisyojo%2FB_Simple4"><img src="/common_img_b/b3_btn_01.gif" alt="カートを見る" width="109" height="31" /></a>';
        showall += '</div></div><img src="/common_img_b/b3_line06.gif" alt="" width="190" height="44" class="foot" /></div>';
        Element.update(this.basket, '');
        Element.update(this.basket, showall);
        Element.setStyle($('CARTOV'), {'position': 'absolute'});
        this.quickCart = $('CARTOV');
        this.quickCartHeight = Element.getDimensions(this.quickCart).height + 10;
        this.way = 1;
        Element.setStyle(this.quickCart, {'top': '-' + this.quickCartHeight + 'px', 'visibility': 'visible'});
        Element.setStyle(this.basket, {'height': this.quickCartHeight + 'px'});
        this.doSlideCart(false);
    },
    showAddedBook: function(res){
        var xmlsorce = res.responseXML;
        var books = xmlsorce.getElementsByTagName('books');
        var k, j;
        var pall = '';
        var error = '';
        var eflag = 0;
        var call = 0;
        var w, first_title, first_sub, first_head, first_author, first_price = '';
        var cate = books[0].getAttribute('category');
        var btype = getflag(cate);
        for(k=0; k<books.length; k++){
            for(j=0; j<books[k].childNodes.length; j++){
                if(books[k].childNodes[j].tagName=='error'){
                    error += books[k].childNodes[j].firstChild.nodeValue;
                    eflag = 1;
                    break;
                }
                if(books[k].childNodes[j].tagName=='total'){
                    pall += books[k].childNodes[j].firstChild.nodeValue;
                }
                if(books[k].childNodes[j].tagName=='all_book'){
                    call += parseInt(books[k].childNodes[j].firstChild.nodeValue);
                }
            }
        }
        if(eflag == 0){
            books = new Array;
            books = xmlsorce.getElementsByTagName('book');
            var u, r;
            bary = new Array;
            for(u=0; u<books.length; u++){
                bary[u] = new Array;
                for(r=0; r<books[u].childNodes.length; r++){
                    if(this_array(books[u].childNodes[r].tagName)){
                        if(books[u].childNodes[r].firstChild){
                            bary[u][books[u].childNodes[r].nodeName] = books[u].childNodes[r].firstChild.nodeValue;
                        } else {
                            bary[u][books[u].childNodes[r].nodeName] = '';
                        }
                    }
                }
            }
        }else{
            alert(error);
            return false;
        }
        for(w=0; w<bary.length; w++){
            if(first_price == ''){
                first_title = bary[w]['title'];
                first_sub = bary[w]['subtitle'];
                first_head = bary[w]['headtitle'];
                first_author = bary[w]['author'];
                first_price = bary[w]['price'];
            }
        }
        var first = '<div id="CARTOV"><div class="content">';
        first += '<p class="put"><img src="/common_img_b/txt_cart.gif" alt="下記商品がカートに追加されました。" title="下記商品がカートに追加されました。" /></p>';
        first += '<p class="putitem"><span>'+btype+'<br /></span><strong>'+first_head+'&nbsp;'+first_title+'&nbsp;'+first_sub+'</strong>';
        first += '<br /><span>'+first_author+'</span><br /><span id="cartprice">'+pricelimit(first_price)+'円</span></p></div>';
        first += '<img src="/common_img_b/b3_line06.gif" alt="" width="190" height="44" class="foot" /></div>';
        Element.update(this.category, btype);
        Element.update(this.count, call);
        Element.update(this.basket, '');
        Element.update(this.basket, first);
        Element.setStyle($('CARTOV'), {'position': 'absolute'});
        if(navigator.appVersion.indexOf("Safari") != -1){
            var safari = parseInt(Element.getStyle(this.basket, 'margin-top'));
            safari -= 60;
            Element.setStyle(this.basket, {'margin-top': safari + 'px'});
        }
        Element.setStyle($('cartprice'), {
        'display': 'block',
        'textAlign': 'right',
        'fontSize': '100%',
        'fontWeight': 'bold'
        });
        this.quickCart = $('CARTOV');
        this.quickCartHeight = Element.getDimensions(this.quickCart).height + 10;
        this.way = 1;
        Element.setStyle(this.quickCart, {'top': '-' + this.quickCartHeight + 'px', 'visibility': 'visible'});
        Element.setStyle(this.basket, {'height': this.quickCartHeight + 'px'});
        insertcookie(btype, pall, call, bary);
        this.doSlideCart(true);
    }
}
Element.observe(window, 'load', function(){
    new cart();
});
//クッキーがあるか検査
function iscookie(thecookie, param){
    rat = param + "=";
    cookiestart = thecookie.indexOf(rat);
    if(cookiestart != -1){
        cookieend = thecookie.indexOf(";", cookiestart);
        return unescape(thecookie.substring(cookiestart + rat.length, cookieend));
    }else{
        return false;
    }
}
//各クッキー取得
function cookieparts(thecookie, param){
    if(thecookie){
        var rat = "@"+param+"@";
        var starter1 = thecookie.indexOf(rat);
        var starter2 = (rat).length;
        var starter = starter1+starter2;
        var ender   = thecookie.indexOf("@"+param+"End");
        var cook = unescape(thecookie.substring(starter, ender));
        return cook;
    } else {
        return false;
    }
}
function getflag(cate){
    if(cate==0) return '本';
    if(cate==1) return '電子書籍';
    if(cate==2) return 'ドラマCD';
    return false;
}
function this_array(param){
    if(param == 'headtitle' || param == 'title' || param == 'subtitle' || param == 'author' || param == 'price'){
        return true;
    }else{
        return false;
    }
}
function pricelimit(sourceStr) {
    var destStr = sourceStr;
    var tmpStr = "";
    while (destStr != (tmpStr = destStr.replace(/^([+-]?\d+)(\d\d\d)/,"$1,$2"))) {
        destStr = tmpStr;
    }
    return destStr;
}
function checkbook(b_flag){
    var cookies = document.cookie + ";";
    var numcoo = iscookie(cookies, "numbers_b");
    var cooflag = cookieparts(numcoo, "btype");
    if(cooflag){
        if(cooflag == getflag(b_flag)){
            return false;
        }else{
            if(b_flag==0){
                return '本は電子書籍と同時に購入できません。';
            }
            if(b_flag==1){
                return '電子書籍は本と同時に購入できません。';
            }
            if(b_flag==2){
                return false;
            }
        }
    }else{
        return false;
    }
}
function chkerror(id, cate){
    if(id.length == 4){
        if(cate == 0 || cate == 1 || cate == 2 || cate == 3){
            return false;
        }
    }
    return '選択された商品が特定できません。再度商品を選択してください。';
}
function insertcookie(btype, pall, call, bary){
    document.cookie = "numbers_b=@btype@"+escape(btype)+'@btypeEnd'+"@pall@"+escape(pall)+'@pallEnd'+"@call@"+escape(call)+'@callEnd;';
    var g='';
    for(g=0; g<bary.length; g++){
        document.cookie = "cook_b"+g+"=@title@"+escape(bary[g]['title'])+'@titleEnd'+"@subtitle@"+escape(bary[g]['subtitle'])+'@subtitleEnd'+"@headtitle@"+escape(bary[g]['headtitle'])+'@headtitleEnd'+"@author@"+escape(bary[g]['author'])+'@authorEnd'+"@price@"+escape(bary[g]['price'])+'@priceEnd;';
    }
}