/**
 * implement class-list for ie<10
 * @ignore
 * @author lifesinger@gmail.com, yiminghe@gmail.com
 */
KISSY.add('dom/class-list', function (S, Dom) {
    var SPACE = ' ',
        RE_CLASS = /[\n\t\r]/g;

    function norm(elemClass) {
        return (SPACE + elemClass + SPACE).replace(RE_CLASS, SPACE);
    }

    return S.mix(Dom, {

        _hasClass: function (elem, classNames) {
            var elemClass = elem.className,
                className,
                cl,
                j;
            if (elemClass) {
                className = norm(elemClass);
                for (j = 0, cl = classNames.length; j < cl; j++) {
                    if (className.indexOf(SPACE + classNames[j] + SPACE) < 0) {
                        return false
                    }
                }
                return true;
            }
            return false;
        },

        _addClass: function (elem, classNames) {
            var elemClass = elem.className,
                normClassName,
                cl = classNames.length,
                setClass,
                j;
            if (elemClass) {
                normClassName = norm(elemClass);
                setClass = elemClass;
                j = 0;
                for (; j < cl; j++) {
                    if (normClassName.indexOf(SPACE + classNames[j] + SPACE) < 0) {
                        setClass += SPACE + classNames[j];
                    }
                }
                setClass = S.trim(setClass);
            } else {
                setClass = classNames.join(' ');
            }
            elem.className = setClass;
        },

        _removeClass: function (elem, classNames) {
            var elemClass = elem.className,
                className,
                cl = classNames.length,
                j,
                needle;
            if (elemClass && cl) {
                className = norm(elemClass);
                j = 0;
                for (; j < cl; j++) {
                    needle = SPACE + classNames[j] + SPACE;
                    // 一个 cls 有可能多次出现:'link link2 link link3 link'
                    while (className.indexOf(needle) >= 0) {
                        className = className.replace(needle, SPACE);
                    }
                }
                elem.className = S.trim(className);
            }
        },

        '_toggleClass': function (elem, classNames, force) {
            var j, className,
                result,
                method,
                self = this,
                removed = [],
                added = [],
                cl = classNames.length;
            for (j = 0; j < cl; j++) {
                className = classNames[j];
                result = self._hasClass(elem, [className]);
                method = result ? force !== true && "remove" :
                    force !== false && "add";
                if (method == 'remove') {
                    removed.push(className)
                } else if (method == 'add') {
                    added.push(className);
                }
            }
            if (added.length)
                self._addClass(elem, added);
            if (removed.length)
                self._removeClass(elem, removed);
        }

    });

}, {
    requires: ['dom/base']
});