(function(){

var Controller = {

    setup: function(container){
        this.url = getHost() + "/page/categoryAllView/gettreedata",

        this.rootNode = $(container).children("div");

        this.branchNodeTemplate = $(this.rootNode).children('.branchNode').clone();

        this.leafNodeTemplate = $(this.rootNode).children('.leafNode').clone();

        $(this.rootNode).children().remove();
    },

    //カテゴリーツリーを表示するトリガー
    dispatch: function(){

        ajaxRequest(this.url, null, $.proxy(this.complete, this));

    },

    //Ajaxのコールバックメソッド
    complete: function(response){
        if (!response) {
            return;
        }

        if (response.count <= 0){
            this.empty(response.message);
            return;
        }

        if (response.status == 0) {
            this.failure(response.message);
        } else {
            this.success(response.categories);
        }
    },

    //カテゴリーツリーを取得した時
    success: function(categories){

        //レンダラーの初期化
        Renderer.setup({
            root: this.rootNode,
            baseURL: getOriginalHost() + "/category/",
            branchNodeTemplate: this.branchNodeTemplate,
            leafNodeTemplate: this.leafNodeTemplate
        });

        Renderer.render(categories);

    },

    //カテゴリーがない場合
    empty: function(message){
        var first = $(this.leafNodeTemplate).clone();

        $("a",  first).remove();
        $("span",  first).text(message);

        $(this.rootNode).append(first);
    },

    //カテゴリー情報を取得に失敗した時
    failure: function(message){
        this.empty(message);
    }

};


var Renderer = {

    setup: function(options){
        for (var key in options) {
            this[key] = options[key];
        }
    },

    //カテゴリーツリーを描画する
    render: function(categories){

        this.createFirstNodes(this.root, categories);

    },

    //最上位のカテゴリーの描画
    createFirstNodes: function(parent, items){

        var i = 0,
            size = 0,
            item = null,
            element = null;

        if (items.length <= 0) {
            return;
        }

        for (; size = items.length, i < size; i++){

            item = items[i];

            element = this.createBranchNode({
                id: item.GOODS_CATG_ID,
                label: item.CATG_NAME
            });

            //下位カテゴリーがある場合は描画する
            if (item.Second) {
                this.createSecondaryNodes(element, item.Second);
            }

            //末尾に挿入する
            $(parent).append(element);
        }
    },

    //第2階層のカテゴリーの描画
    createSecondaryNodes: function(parent, items){

        var i = 0,
            size = 0,
            item = null,
            element = null;

        if (items.length <= 0) {
            return;
        }

        for (; size = items.length, i < size; i++){

            item = items[i];

            element = this.createBranchNode({
                id: item.GOODS_CATG_ID,
                label: item.CATG_NAME
            });

            if (item.Third) {
                this.createThirdaryNodes(element, item.Third);
            }

            $(parent).children("li:last").append(element);
        }

    },

    //第3階層のカテゴリーの描画
    createThirdaryNodes: function(parent, items){

        var i = 0,
            size = 0,
            item = null,
            element = null;

        if (items.length <= 0) {
            return;
        }

        for (; size = items.length, i < size; i++){

            item = items[i];

            element = this.createLeafNode({
                id: item.GOODS_CATG_ID,
                label: item.CATG_NAME
            });

            $(parent).children("li:last").append(element);

        }

    },

    createBranchNode: function(item){
        return this.createNode('branch', item);
    },

    createLeafNode: function(item){
        return this.createNode('leaf', item);
    },

    //カテゴリーノードの生成
    createNode: function(type, item){

        var template = (type == 'branch') ? this.branchNodeTemplate : this.leafNodeTemplate;
        var element = $(template).clone();

        $("a", element).attr("href", this.baseURL + item.id)
            .text(htmlspecialchars_decode(item.label));

        return element;

    }

};

//レンダリングするルートのノードの取得
var container = $("script:last").parents("div:first");

$(function(){

    //コントローラの初期化
    Controller.setup(container);

    //コントローラーを実行する
    Controller.dispatch.call(Controller);

});

})();

