/**
 * @ignore
 * observer for dom event.
 * @author yiminghe@gmail.com
 */
KISSY.add('event/dom/base/observer', function (S, Special, BaseEvent) {
    /**
     * observer for dom event
     * @class KISSY.Event.DomEvent.Observer
     * @extends KISSY.Event.Observer
     * @private
     */
    function DomEventObserver(cfg) {
        DomEventObserver.superclass.constructor.apply(this, arguments);
        /**
         * filter selector string or function to find right element
         * @cfg {String} filter
         */
        /**
         * extra data as second parameter of listener
         * @cfg {*} data
         */
    }

    S.extend(DomEventObserver, BaseEvent.Observer, {
        keys: ['fn', 'filter', 'data', 'context', 'originalType', 'groups', 'last'],

        notifyInternal: function (event, ce) {
            var self = this,
                s, t, ret,
                type = event.type,
                originalType;

            if (originalType = self.originalType) {
                event.type = originalType;
            } else {
                originalType = type;
            }

            // context undefined 时不能写死在 listener 中,否则不能保证 clone 时的 this
            if ((s = Special[originalType]) && s.handle) {
                t = s.handle(event, self, ce);
                // can handle
                if (t && t.length > 0) {
                    ret = t[0];
                }
            } else {
                ret = self.simpleNotify(event, ce);
            }

            if (ret === false) {
                event.halt();
            }

            // notify other mousemove listener
            event.type = type;

            return ret;
        }
    });

    return DomEventObserver;
}, {
    requires: ['./special', 'event/base']
});