//あいう
/**
 * アプリケーションインデックスファイル
 *
 * @dependency jquery-1.2.6
 * @dependency jquery-ui-1.6b
 * @charset utf-8
 * @author ishii <ishii[at]s-cubism[dot]jp>
 */

//---------------------------------------------
// グローバルオブジェクト生成
//---------------------------------------------
var $c = ("console" in window && "log" in console)? console.log: function(v){alert(v);};
var Bpla = (function(){

    // Environments and configs setting.
    var baseDir = "/";

    // Global object setting.
    var app = {

        /** ボタンに確認ダイアログ機能を付加する */
        attachConfirming: function(id, text){
            if (text === undefined) {
                text = '入力した内容を送信します。\n\n　　よろしいですか？';
            };
            var button = $('#' + id);
            button.click(function(){

                var prompt_text = text;

                // 会員登録専用の簡易仕様
                if (prompt_text === "__register_supplier") {
                    prompt_text = "メールアドレスを\n\n" + $('#id_email').val() + "\n\nで登録します。\n\nお間違えはありませんか？";
                };

                var yn = confirm(prompt_text);

                if (yn) {
                    // 間を入れないとIE6で指定した直後から無効になり送信できなくなる
                    // .click書き換えでも同様だった
                    setTimeout(function(){
                        button.attr("disabled", true);
                    }, 50);
                };
                return yn
            });
        },

        /** URLを解析してGET値のハッシュを返す */
        parseUrlToParameters: function(url){
            var params = {};
            if (/^.+?\?./.test(url)) {
                var pairs = url.replace(/^.+?\?/, '').split('&');
                for (var i = 0; i < pairs.length; i++) {
                    var pair = pairs[i].split('=');
                    params[pair[0]] = ((pair[1] !== undefined)? pair[1]: "");
                };
            };
            return params;
        },

        /** エラーによる例外を上げる */
        raiseError: function(message, opts){
            opts = opts || {};
            throw new Error(message);
        },

        /** 関数のスコープを束縛する、@see prototype.js */
        bind: function(binded, scope){
            return function() {
                    return binded.apply(scope, arguments);
            };
        },

        /** HTML特殊文字をエスケープする、@see prototype.js */
        escapeHTML: function(str){
            var div = document.createElement('div');
            var text = document.createTextNode(str);
            div.appendChild(text);
            return div.innerHTML;
        },

        /** 配列同士を等価演算する */
        equalArrays: function(a, b){
            return a.sort().toString(a) === b.sort().toString(b);
        }

    };

    // Paths setting.
    app.baseDir = baseDir;
    app.apiDir = app.baseDir + "api/";
    app.jsDir = app.baseDir + "media/js/";
    app.cssDir = app.jsDir + "css/";
    app.imgDir = app.jsDir + "img/";
    app.libDir = app.jsDir + "lib/";
    app.srcDir = app.jsDir + "src/";
    app.dataDir = app.jsDir + "data/";

    return app;
})();


/**
 * 見積明細入力時の自動計算機クラス
 */
Bpla.EstimateDetailAutoCalculator = (function(){

    var TITLE_ID_BASE = 'id_detail_title_';
    var QUANTITY_ID_BASE = 'id_detail_quantity_';
    var PRICE_ID_BASE = 'id_detail_price_';
    var SUB_TOTAL_ID_BASE = 'id_detail_sub_total_';
    var DELETE_ID_BASE = 'id_delete_estimate_detail_';
    var TOTAL_ID = 'id_detail_total';
    var FIELD_SET_COUNT = 8;
    var MB_DIGIT_MAP = [
        ['０', '0'],
        ['１', '1'],
        ['２', '2'],
        ['３', '3'],
        ['４', '4'],
        ['５', '5'],
        ['６', '6'],
        ['７', '7'],
        ['８', '8'],
        ['９', '9']
    ];

    var cls = function(){

        var self = this;

        for (var i = 1; i < FIELD_SET_COUNT + 1; i++) {
            $('#' + QUANTITY_ID_BASE + i)
                .keyup(function(evt){
                    self.attachValidation(evt.target);
                    self.update();
                })
                .blur(function(evt){
                    self.attachValidation(evt.target);
                    self.update();
                })
            ;
            $('#' + PRICE_ID_BASE + i)
                .keyup(function(evt){
                    self.attachValidation(evt.target);
                    self.update();
                })
                .blur(function(evt){
                    self.attachValidation(evt.target);
                    self.update();
                })
            ;
            (function(i){
                $('#' + DELETE_ID_BASE + i)
                    .click(function(evt){
                        $('#' + TITLE_ID_BASE + i).val("");
                        $('#' + QUANTITY_ID_BASE + i).val("");
                        $('#' + PRICE_ID_BASE + i).val("");
                        $('#' + SUB_TOTAL_ID_BASE + i).val("");
                        self.update();
                    })
                ;
            })(i);
        };
    };

    $.extend(cls.prototype, {
        update: function(){
            for (var i = 1; i < FIELD_SET_COUNT + 1; i++) {
                var q = parseFloat($('#' + QUANTITY_ID_BASE + i).val());
                var p = parseInt($('#' + PRICE_ID_BASE + i).val());
                if (isNaN(q) || isNaN(p)) continue;
                $('#' + SUB_TOTAL_ID_BASE + i).val(parseInt(q * p));
            };
            var total = 0;
            for (var i = 1; i < FIELD_SET_COUNT + 1; i++) {
                var st = parseFloat($('#' + SUB_TOTAL_ID_BASE + i).val());
                if (!isNaN(st)) total += st;
            };
            $('#' + TOTAL_ID).val(parseInt(total));
        },
        attachValidation: function(element){
            var v = $(element).val();
            v = this._convertMultiByteDigitToByte(v);
            v = this._removeLetters(v);
            $(element).val(v);
        },
        _convertMultiByteDigitToByte: function(str){
            $.each(MB_DIGIT_MAP, function(i, e){
                var p = new RegExp(e[0], 'g');
                str = str.replace(p, e[1]);
            });
            return str;
        },
        _removeLetters: function(str){
            return str.replace(/[^0-9.]/g, '');
        }
    });

    return cls;
})();


/**
 * 依頼詳細雛型ローダクラス
 */
Bpla.MatterSampleLoader = (function(){

    var cls = function(){

        /**
         * カテゴリを示すキーと、それのビューであるHTMLチェックボックスのIDを結びつける
         * @example {
         *      'it': 'id_category_it'
         *      ,'creatoros': 'id_category_creators'
         *      ...
         * }
         */
        this._checkboxesMap = {};

        this._checkboxes = {};

        /**
         * カテゴリチェックボックス選択パターンと、
         * 読み込むサンプル文章データとを結びつける
         */
        this._dataMap = [
            [["it"], "matter_form/sample_description-it.txt"]
            ,[["creators"], "matter_form/sample_description-creators.txt"]
            ,[["goods"], "matter_form/sample_description-goods.txt"]
            ,[["offices"], "matter_form/sample_description-offices.txt"]
            ,[["documents"], "matter_form/sample_description-documents.txt"]
            ,[["sales"], "matter_form/sample_description-sales.txt"]
        ];

        /** サンプル文章展開先テキストエリア */
        this._textAreaId = null;

    };

    $.extend(cls.prototype, {

        /**
         * @param obj checkboxesMap カテゴリ名とチェックボックスとのマップ
         *                          @see this._checkboxesMap
         */
        linkToHtml: function(checkboxesMap, textAreaId){
            this._checkboxesMap = checkboxesMap;
            this._textAreaId = textAreaId;
            this._initialize();
        },

        _initialize: function(){

            var self = this;

            var textArea = $('#' + this._textAreaId);

            textArea.click(function(evt){
                if (self._isCheckedSomeCategory() === false && textArea.val() === "") {
                    alert("まずは、カテゴリーを選択してください。\n\n詳細の雛型が表示されます。");
                    textArea.trigger("blur"); // フォーカスを外す
                };
            });

            $.each(this._checkboxesMap, function(k, v){
                self._checkboxes[k] = $('#' + v);
            });

            $.each(this._checkboxes, function(category, checkbox){
                checkbox.click(function(evt){
                    // チェックを外した時はアクションさせない
                    if (checkbox.get(0).checked === false) return;
                    var categories = self._getCheckedCategories();
                    var path = self._getDataPath(categories);
                    if (path !== null) {
                        if (textArea.val() !== "") {
                            var yesno = confirm("「詳細」の内容を置き換えます、よろしいですか？");
                            if (!yesno) return;
                        };
                        opts = {
                            url: Bpla.dataDir + path
                            ,type: "GET"
                            ,cache: true
                            ,dataType: "text"
                            ,success: function(response){
                                textArea.val(response);
                            }
                        };
                        $.ajax(opts);
                    };
                });
            });

        },

        _getCheckedCategories: function(){
            var categories = [];
            $.each(this._checkboxes, function(category, checkbox){
                if (checkbox.get(0).checked) categories.push(category);
            });
            return categories;
        },

        /** @param arr categories チェック中のカテゴリリスト */
        _getDataPath: function(categories){
            var path = null;
            $.each(this._dataMap, function(i, v){
                if (Bpla.equalArrays(categories, v[0])) {
                    path = v[1];
                    return false;
                };
            });
            return path;
        },

        /** 少なくともひとつのカテゴリーがチェック済みか */
        _isCheckedSomeCategory: function(){
            var checked = false;
            $.each(this._checkboxes, function(category, checkbox){
                if (checkbox.get(0).checked) checked = true;
            });
            return checked;
        }
    });

    return cls;
})();


/**
 * 画像動的表示ダイアログクラス
 */
Bpla.ImageViewerDialog = (function(){

    /**
     * @param str htmlId 表示ボタンのId
     * @param str imgSrc 画像ファイルへのURL
     */
    var cls = function(htmlId, imgSrc){

        var self = this;
        this._htmlId = htmlId;
        this._imgSrc = imgSrc;
        this._switch = $("#" + htmlId);

        this._container = $('<div></div>')
            .css({
                position: "absolute"
                ,padding: 10
                ,zIndex: 1000
                ,textAlign: "center"
                ,border: "2px solid #D6E3F3"
                ,backgroundColor: "#F0F5FB"
            })
            .append(
                $("<p>画像クリックで閉じる</p>").css({
                    paddingLeft: 5
                    ,fontSize: 12
                    ,textAlign: "left"
                })
            )
            .append(
                $('<div><img src="' + Bpla.dataDir + this._imgSrc + '" /></div>').css({
                    marginTop: 3
                })
            )
            .click(function(evt){
                self._container.hide(0);
            })
        ;

        this._switch.click(function(evt){
            self._container
                .css({
                    top: evt.pageY
                    ,left: evt.pageX
                })
                .show(0)
            ;
            $("body").append(self._container);
        });
    };

    $.extend(cls.prototype, {
    });

    return cls;
})();


/**
 * 総合トップページ上部ブロックのエフェクタクラス
 */
Bpla.TopBlocksEffector = (function(){

    /**
     * @param str   scopeId ブロックリストが格納されている親ブロック要素のID
     *                    検索性能向上・バグ防止のため。直接の親で無くても良い。
     * @param array blockClassnames 6つのブロックのクラス名リスト
     */
    var cls = function(scopeId, blockClassnames){
        var self = this;
        this._scopeId = scopeId;
        this._blockClassnames = blockClassnames;

        $("#" + scopeId).click(function(){
            $.each(self._blockClassnames, function(i, v){
                self._startAnimation(i);
            });
        });
    };

    $.extend(cls.prototype, {
        _reset: function(){
            var self = this;
            $.each(this._blockClassnames, function(i, v){
                var jq = $("#" + self._scopeId).find("." + v);
                jq.removeClass(v + "-reversed");
            });
        },
        _toggle: function(index){
            var classname = this._blockClassnames[index];
            var jq = $("#" + this._scopeId).find("." + classname);
            jq.toggleClass(classname + "-reversed");
        },
        _toggleAll: function(){
            var self = this;
            $.each(this._blockClassnames, function(i, v){
                self._toggle(i);
            });
        },
        _startAnimation: function(index){

            var self = this;
            var defaultInterval = 30;
            var defaultFactor = 1.1;
            var limitInterval = 600;

            var interval = defaultInterval + parseInt(10 * Math.random());
            var factor = defaultFactor + parseFloat(Math.random() / 10);

            (function(ainterval, afactor){

                setTimeout(function(){
                    self._toggle(index);
                    ainterval *= afactor;
                    if (ainterval > limitInterval) return;
                    setTimeout(arguments.callee, ainterval);
                }, ainterval);

            })(interval, factor);
        }
    });

    return cls;
})();
