/*
 * Monotaro AB Test Script
 */

(function($) {
    var name_space = 'monotaroABTest';
    var class_name = 'abtest';

    // ABテストのパターンを返す（a or b)
    var checkPattern = function(name, urchin){
        var pt = abtest_pattern[name];
        if (!pt) {
            $.monotaro.debug('ABTest name setting error. '+name);
            return;
        }
        var sid = readCookie(pt.cookie);
        var reg_str = '^';
        if (pt.ptype > 1) {
            reg_str = reg_str + '(.){'+(pt.ptype-1)+'}';
        }
        reg_str = reg_str + '([02468ace])(.)*$';
        var re = new RegExp(reg_str);
        var match = 'b';
        if (sid.search(re) != -1) {
            match = 'a';
        }
        var locations = location.href.match(/testgroup=(.{1})/);
        if (locations) {
            $.monotaro.debug('group = '+locations[1]);
            if (locations[1] == 'a' || locations[1] == 'b') {
                match = locations[1];
            }
        }
        if (urchin) {
            var uc = pt.urchin;
            if (!uc) {
                uc = '/virtual/monotaro_abtest/' + name + '/' + match;
                $.monotaro.debug(uc);
                $.monotaro.track_event('abtest', 'imp_'+match, name);
                //urchinTracker(uc);
                abtest_pattern[name]['urchin'] = uc;
            }
        }
        return match;
    };

    // ABテストパターンの追加
    var addPattern = function(name, data){
        if (!abtest_pattern[name]) {
            abtest_pattern[name] = data;
        }
    };

    $.fn[name_space] = function(callback, options) {

        var sid = readCookie("sid");
        $.monotaro.debug('ABTest sid='+sid);

        // 設定情報の構築
        var settings = $.extend({
            // プラグインの初期値を設定
        }, options);

        // ABテスト
        var startTest = function(el, params, callback) {
            var name = params.name;
            var pattern = params.pattern;
            $.monotaro.debug('ABTest start '+ name + ' : ' + pattern);

            var match = checkPattern(name, true);
            $.monotaro.debug(match);
            if (match == pattern) {
                el.show();
            }
            if (callback) {
                callback(el, match);
            }
        };

        // ABTestの属性値をパラメータとして取得
        var getABtestParameters = function(el) {
            var attrs = el.get(0).attributes;
            var params = {};
            for (var i=0; i<attrs.length; i++) {
                var attr = attrs[i];
                var attr_name = attr.nodeName;
                var attr_value = attr.value;
                var param_name = attr_name.match(/^abtest_(.*)$/);
                if (param_name) {
                    params[param_name[1]] = attr_value;
                }
            }
            return params;
        };

        // 対象の要素に対して処理実行
        this.each(function() {
            var params = $.extend({}, settings, getABtestParameters($(this)));
            startTest($(this), params, callback);
        });

        //method chain
        return this;
    };

    // 起動時処理
    $(function(){
        $('.'+class_name)[name_space]();
    });

    // グローバルメソッド
    $[name_space] = {
        'checkPattern': checkPattern,
        'addPattern': addPattern,
        'checkA': function(name, urchin) {
            return (checkPattern(name, urchin) == 'a');
        },
        'checkB': function(name, urchin) {
            return (checkPattern(name, urchin) == 'b');
        }
    };

})(jQuery);



