;(function ($) { // plugin body start

$.fn.carCategorySelector = function() {

    var _handler = function() {

        var _container = this;

        /**
         * 車種
         *
         */
        var _carType  = 0;

        /**
         * 廠牌
         *
         */
        var _carBrand = 0;

        /**
         * 車系
         *
         */
        var _carClass = 0;

        /**
         * 車款
         *
         */
        var _carStyle = 0;

        /**
         * 完成選單後要執行的 Callback
         *
         */
        var categoriesSelectorUpdateCallback = function () {};

        /**
         * 初始化
         *
         */
        var initCategory = function () {
            $('.carTypesSelector', _container).selectOptions(String(_carType));
            carTypesChange.apply($('.carTypesSelector', _container));
        }

        /**
         * 車種變更
         *
         */
        var carTypesChange = function () {
            $('.carClasses', _container).hide();
            $.post(
                baseUrl + '/ajax/category/carbrands',
                {
                    type: $(this).val(),
                    user: $('.carUserId', _container).val()
                },
                carBrandsUpdate,
                'json'
            );
        }

        /**
         * 更新廠牌
         */
        var carBrandsUpdate = function (json) {
            _buildOptions(json, '.carBrandsSelector', _carBrand);
            carBrandsChange.apply($('.carBrandsSelector', _container));
        }

        /**
         * 廠牌變更
         *
         */
        var carBrandsChange = function () {
            $.post(
                baseUrl + '/ajax/category/carstyles',
                {
                    brand: $(this).val(),
                    user: $('.carUserId', _container).val()
                },
                carStylesUpdate,
                'json'
            );
        }

        /**
         * 如果是 BenZ 或 BMW 的話會更新車系及車款
         * 如果是其他廠牌就只更新車款
         */
        var carStylesUpdate = function (json) {
            // 如果遇到 BenZ 或 BMW 時
            var brand = $('.carBrandsSelector', _container).val();
            if (OCAR_AUTOCAR_BENZ == brand || OCAR_AUTOCAR_BMW == brand) {
                $('.carClasses', _container).show();
                $('.carClassesSelector', _container).show();
                _buildOptions(json, '.carClassesSelector', _carClass);
                carClassesChange.apply($('.carClassesSelector', _container));
            } else {
                $('.carClasses', _container).hide();
                _buildOptions(json, '.carStylesSelector', _carStyle);
                carStylesChange.apply($('.carStylesSelector', _container));
            }
        }

        /**
         * 車系變更
         *
         */
        var carClassesChange = function () {
            $.post(
                baseUrl + '/ajax/category/carclassesstyles',
                {
                    classid: $(this).val(),
                    user: $('.carUserId', _container).val()
                },
                carClassesStylesUpdate,
                'json'
            );
        }

        /**
         * 更新車款
         *
         */
        var carClassesStylesUpdate = function (json) {
            _buildOptions(json, '.carStylesSelector', _carStyle);
            carStylesChange.apply($('.carStylesSelector', _container));
        }

        /**
         * 車款變更
         *
         */
        var carStylesChange = function () {
            var type    = parseInt($('.carTypesSelector', _container).val(), 10);
            var brand   = parseInt($('.carBrandsSelector', _container).val(), 10);
            var classid = parseInt($('.carClassesSelector', _container).val(), 10);
            var style   = parseInt($('.carStylesSelector', _container).val(), 10);
            fullIdPath = '';
            if (0 != type) {
                fullIdPath += _fillZero(type);
            }
            if (0 != brand) {
                fullIdPath += ',' + _fillZero(brand);
            }
            if (0 != classid && (OCAR_AUTOCAR_BENZ == brand || OCAR_AUTOCAR_BMW == brand)) {
                fullIdPath += ',' + _fillZero(classid);
            }
            if (0 != style) {
                fullIdPath += ',' + _fillZero(style);
            }
            $('.carFullIdPath', _container).val(fullIdPath);

            var parentId = parseInt(_right(fullIdPath, 10), 10);
            if (isNaN(parentId)) parentId = 0;
            $('.carParentId', _container).val(parentId);

            categoriesSelectorUpdateCallback();
        }

        var _fillZero = function (id) {
            return ('0000000000' + id).substr(('' + id).length, 10);
        }

        var _right = function (str, n) {
            if (n <= 0)
               return '';
            else if (n > String(str).length)
               return str;
            else {
               var len = String(str).length;
               return String(str).substring(len, len - n);
            }
        }

        /**
         * 建立選項
         *
         */
        var _buildOptions = function (json, selector, selectedId) {
            var selected = true;
            $(selector).removeOption(/./);
            for (id in json) {
                selected = (String(selectedId) == String(id)) ? true : false;
                $(selector).addOption(id, json[id], selected);
            }
        }

        /**
         * 設定初始值
         *
         */
        var categorySelectorSetFullIdPath = function (fullIdPath) {
            if (undefined == fullIdPath) return;
            var idSet = String(fullIdPath).split(',');
            if (1 <= idSet.length) {
                _carType  = parseInt(idSet[0], 10);
            }
            if (2 <= idSet.length) {
                _carBrand = parseInt(idSet[1], 10);
            }
            if (4 == idSet.length) {
                _carClass = parseInt(idSet[2], 10);
                _carStyle = parseInt(idSet[3], 10);
                return;
            }
            else if (3 == idSet.length) {
                _carClass = parseInt(idSet[2], 10);
                _carStyle = parseInt(idSet[2], 10);
            }
        }

        /**
         * 取得層級數
         *
         */
        var getLevelNum = function () {
            var _fullIdPath = $('.carFullIdPath', _container).val();
            return String(_fullIdPath).split(',').length;
        }

        $('.carClassesSelector', _container).hide();
        $('.carTypesSelector', _container).change(carTypesChange);
        $('.carBrandsSelector', _container).change(carBrandsChange);
        $('.carClassesSelector', _container).change(carClassesChange);
        $('.carStylesSelector', _container).change(carStylesChange);
        categorySelectorSetFullIdPath($('.carFullIdPath', _container).val());
        initCategory();
    };

    return this.each(_handler);
};

})(jQuery);

/**
 * 初始化
 *
 */
$(document).ready(function () {
    $('.carCategorySelector').carCategorySelector();
});