/**
 * @ignore
 * tree management utils
 * @author yiminghe@gmail.com
 */
KISSY.add("tree/tree-manager", function (S, Node, DelegateChildrenExtension) {
    var UA = S.UA,
        ie = S.Env.host.document.documentMode || UA.ie,
        Features = S.Features,
        Gesture = Node.Gesture,
        isTouchEventSupported = Features.isTouchEventSupported();

    /**
     * Manage tree node for tree root
     * @class KISSY.Tree.Manager
     */
    function TreeManager() {
    }

    TreeManager.ATTRS = {
        /**
         * Whether show root node.
         * Defaults to: true.
         * @cfg {Boolean} showRootNode
         */
        /**
         * @ignore
         */
        showRootNode: {
            value: true,
            view: 1
        },
        /**
         * Current selected tree node.
         * @property {KISSY.Tree.Node} selectedItem
         * @readonly
         */
        /**
         * @ignore
         */
        selectedItem: {},

        // only root node is focusable
        focusable: {
            value: true
        },

        handleMouseEvents: {
            value: true
        }
    };

    S.augment(TreeManager, DelegateChildrenExtension, {
        isTree: 1,

        __bindUI: function () {
            var self = this,
                prefixCls = self.get('prefixCls'),
                delegateCls = prefixCls + 'tree-node',
                events = Gesture.tap;

            events += ' ';

            if (!isTouchEventSupported) {
                events += (ie && ie < 9 ? "dblclick " : "");
            }

            self.$el.delegate(events, '.' + delegateCls,
                self.handleChildrenEvents, self);
        },

        // 单选
        '_onSetSelectedItem': function (n, ev) {
            // 仅用于排他性
            if (n && ev.prevVal) {
                ev.prevVal.set("selected", false, {
                    data: {
                        byPassSetTreeSelectedItem: 1
                    }
                });
            }
        },

        '_onSetShowRootNode': function (v) {
            this.get("rowEl")[v ? "show" : "hide"]();
        }
    });

    return TreeManager;
}, {
    requires: [
        'node',
        'component/extension/delegate-children'
    ]
});