/**
 * HIGEWheel - remove dependencies of mouse wheel on each browser.
 *
 * Copyright (c) 2008 Takanobu Izukawa (humming.via-kitchen.com) and
 *                    Spark project    (www.libspark.org)
 *
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 */
(function ()
{
    // do nothing if already defined `HIGEWheel`.
    if (window.HIGEWheel) return;

    var HIGEWheel = window.HIGEWheel = function (id)
    {
        this.setUp(id);
        if (HIGEWheel.browser.msie)
            this.bind4msie();
        else
            this.bind();
    };

    HIGEWheel.prototype = {
        setUp: function (id)
        {
            var el = document.getElementById(id);
            if (HIGEWheel.browser.safari||HIGEWheel.browser.msie)
                el = el.parentNode;
            this.target = el;
            this.eventType = HIGEWheel.browser.mozilla ? "DOMMouseScroll" : "mousewheel";
        },

        bind: function ()
        {
            this.target.addEventListener(this.eventType, function (evt)
            {
                var delta = 0, name = evt.target.nodeName.toLowerCase();
                // check target node.
                if (name != 'object' && name != 'embed') return;
                // kill process.
                evt.preventDefault();
                evt.returnValue = false;
                // execute wheel event if exists.
                if (!evt.target.externalMouseEvent) return;
                // fix delta value.
                switch (true)
                {
                    case HIGEWheel.browser.mozilla:
                        delta = -evt.detail;
                        break;

                    case HIGEWheel.browser.safari:
                    case HIGEWheel.browser.opera:
                        delta = evt.wheelDelta / 80;
                        break;

                    default:
                        break;
                }
                evt.target.externalMouseEvent(delta);
            }, false);
        },

        bind4msie: function ()
        {
            this.target.attachEvent('onmousewheel', function ()
            {
                var evt = window.event;
                var _name = evt.srcElement.nodeName.toLowerCase();
                if (_name != "object" && _name != 'embed') return;
                evt.returnValue = false;
            });
        }
    };

    HIGEWheel.browser = (function (ua)
    {
        return {
            safari: /webkit/.test(ua),
            opera: /opera/.test(ua),
            msie: /msie/.test(ua) && !/opera/.test(ua),
            mozilla: /mozilla/.test(ua) && !/(compatible|webkit)/.test(ua)
        }
    })(navigator.userAgent.toLowerCase());

})();
