/* 
 *  Mouse wheel support for OS X - implemented in javascript because Adobe
 *  hasn't implemented it in the mac version of Flash Player  >:(
 *
 *  Copyright (c) 2007-2008 Ali Rantakari ( http://hasseg.org/blog )
 *
 *  Requires related ActionScript 3 class:
 *  org.hasseg.externalMouseWheel.ExternalMouseWheelSupport
 *
 *
 *  Changelog:
 *  ---------------------------------------------------------------------------------
 *  VERSION 1.0 (Ali Rantakari)
 *  July 2007
 *
 *  - Initial implementation
 *
 *
 *  ---------------------------------------------------------------------------------
 *  VERSION 1.5 (Changes by Pavel fljot, http://inreflected.com)
 *  Jan 2008
 *
 *  - Added statement to support Safari under Windows
 *
 *
 *  ---------------------------------------------------------------------------------
 *  VERSION 2.0 (Changes by Ali Rantakari)
 *  Apr 2008
 *
 *  - Changed structure of JavaScript so that everything is encapsulated
 *    inside one top-level function
 *  - Added support for modifier keys (ctrl (i.e. command on a Mac,) alt, shift)
 *  - Fixed code for determining coordinates on different (recent) browsers
 *  - Added support for registering multiple Flash objects and their container DIVs
 *
 *
 *  ---------------------------------------------------
 *  This code is licensed under the MIT License:
 *
 *  Permission is hereby granted, free of charge, to any person obtaining a copy
 *  of this software and associated documentation files (the "Software"), to deal
 *  in the Software without restriction, including without limitation the rights
 *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *  copies of the Software, and to permit persons to whom the Software is
 *  furnished to do so, subject to the following conditions:
 *
 *  The above copyright notice and this permission notice shall be included in
 *  all copies or substantial portions of the Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 *  THE SOFTWARE.
 */

//function()
//{
//    // create unique namespace
//    if (typeof eb == "undefined" || !eb) eb = {};
//
//    // let's not allow other deltas than +/- 3 because that's what flash player does:
//    var keepDeltaAtPlusMinusThree = true;
//
//
//    // an associative array, where the keys are the ids of flash
//    // objects that have registered for the mouse wheel support, and
//    // the values their respective container div elements.
//    var f = [];
//
//
//    // helper function courtesy of the Adobe peepz
//    eb.thisMovie = function(movieName)
//    {
//        if (navigator.appName.indexOf("Microsoft") != -1) {
//            return window[movieName];
//        } else {
//            return document[movieName];
//        }
//    };
//
//    // helper functions for getting the position of
//    // an element
//    // from:  http://blog.firetree.net/2005/07/04/javascript-find-position/
//    eb.findPosX = function(obj)
//    {
//        var curleft = 0;
//        if (obj.offsetParent)
//            while (1)
//            {
//                curleft += obj.offsetLeft;
//                if (!obj.offsetParent)
//                    break;
//                obj = obj.offsetParent;
//            }
//        else if (obj.x)
//            curleft += obj.x;
//        return curleft;
//    };
//
//    eb.findPosY = function(obj)
//    {
//        var curtop = 0;
//        if (obj.offsetParent)
//            while (1)
//            {
//                curtop += obj.offsetTop;
//                if (!obj.offsetParent)
//                    break;
//                obj = obj.offsetParent;
//            }
//        else if (obj.y)
//            curtop += obj.y;
//        return curtop;
//    };
//
//    // helper function for searching the user-agent string
//    eb.uaContains = function(str)
//    {
//        return (navigator.userAgent.indexOf(str) != -1);
//    };
//
//
//    // Handler for mouse wheel event:
//    eb.onWheelHandler = function(event)
//    {
//        var delta = 0;
//        if (!event) event = window.event;
//        if (event.wheelDelta)
//        {
//            // Safari
//            delta = event.wheelDelta / 120;
//            if (window.opera) delta = -delta;
//        }
//        else if (event.detail) // Firefox
//            delta = -event.detail * 3;
//
//        if (keepDeltaAtPlusMinusThree)
//        {
//            if (delta > 0) delta = 3;
//            else if (delta == 0) delta = 0;
//            else delta = -3;
//        }
//
//        if (delta)
//        {
//
//            var thisFlashMovieId = null;
//            for (var j in f)
//                if (f[j] != null && f[j] == event.currentTarget) thisFlashMovieId = j;
//
//            var thisMouse;
//
//            if (eb.uaContains("Camino"))
//                thisMouse = {x:event.layerX, y:event.layerY};
//            else if (eb.uaContains('Firefox'))
//                thisMouse = {x:(event.layerX - eb.findPosX(event.currentTarget)), y:(event.layerY - eb.findPosY(event.currentTarget))};
//            else
//                thisMouse = {x:event.offsetX, y:event.offsetY};
//
//            thisMouse.ctrlKey = (eb.uaContains('Mac')) ? (event.metaKey || event.ctrlKey) : event.ctrlKey;
//            thisMouse.altKey = event.altKey;
//            thisMouse.shiftKey = event.shiftKey;
//            thisMouse.buttonDown = false;
//
//            if (eb.thisMovie(thisFlashMovieId).dispatchExternalMouseWheelEvent)
//                eb.thisMovie(thisFlashMovieId).dispatchExternalMouseWheelEvent(delta, thisMouse.x, thisMouse.y,
//                        thisMouse.ctrlKey, thisMouse.altKey,
//                        thisMouse.shiftKey, thisMouse.buttonDown);
//        };
//
//        // Prevent default actions caused by mouse wheel
//        eb.blockEvent(event);
//    };
//
//    eb.blockEvent = function (event)
//    {
//        if (!event)
//        {
//            event = window.event;
//        }
//        if(event.stopPropagation) event.stopPropagation();
//        else event.cancelBubble = true;
//        if(event.preventDefault) event.preventDefault();
//        else event.returnValue = false;
//    };
//
//    eb.initCaptureFor = function(aFlashObjectId)
//    {
//        // find flash object's div container
////        var parentdiv = document.getElementById(aFlashObjectId).parentNode;
////        while (parentdiv != null && parentdiv.nodeName != "DIV")
////            parentdiv = parentdiv.parentNode;
////
////        if (parentdiv != undefined && parentdiv != null)
////        {
////            if (eb.uaContains('Mac') && !eb.uaContains('Safari') && !eb.uaContains('Chrome'))
////            {
////                f[aFlashObjectId] = parentdiv;
////                if (parentdiv.addEventListener) parentdiv.addEventListener('DOMMouseScroll', eb.onWheelHandler, false); // Firefox
////                parentdiv.onmousewheel = eb.onWheelHandler;
////                return true;
////            }
////            else
////            {
////                if (parentdiv.addEventListener) parentdiv.addEventListener('DOMMouseScroll', eb.blockEvent, false); // Firefox
////                parentdiv.onmousewheel = eb.blockEvent;
////            }
////        }
////        else
////            return false;
//
//        if (eb.uaContains('Mac') || eb.uaContains('Safari'))
//        {
//            alert("chrome");
//            // find flash object's div container
//            var parentdiv = document.getElementById(aFlashObjectId).parentNode;
//            while(parentdiv != null && parentdiv.nodeName != "DIV")
//                parentdiv = parentdiv.parentNode;
//
//            if (parentdiv != undefined && parentdiv != null)
//            {
//                f[aFlashObjectId] = parentdiv;
//
//                if (parentdiv.addEventListener) parentdiv.addEventListener('DOMMouseScroll', onWheelHandler, false); // Firefox
//                parentdiv.onmousewheel = eb.onWheelHandler; // Safari
//
//                return true;
//            }
//            else
//                return false;
//        }
//        else
//            return false;
//
//
//
//    };
//
//}

var extMouseWheel = function()
{
	// let's not allow other deltas than +/- 3 because that's what flash player does:
	var keepDeltaAtPlusMinusThree = true;


	// an associative array, where the keys are the ids of flash
	// objects that have registered for the mouse wheel support, and
	// the values their respective container div elements.
	var f = [];




	// helper function courtesy of the Adobe peepz
	var thisMovie = function(movieName)
	{
		if (navigator.appName.indexOf("Microsoft") != -1) {
			return window[movieName];
		} else {
			return document[movieName];
		}
	};

	// helper functions for getting the position of
	// an element
	// from:  http://blog.firetree.net/2005/07/04/javascript-find-position/
	var findPosX = function(obj)
	{
		var curleft = 0;
		if(obj.offsetParent)
			while(1)
			{
			  curleft += obj.offsetLeft;
			  if(!obj.offsetParent)
				break;
			  obj = obj.offsetParent;
			}
		else if(obj.x)
			curleft += obj.x;
		return curleft;
	};
	var findPosY = function(obj)
	{
		var curtop = 0;
		if(obj.offsetParent)
			while(1)
			{
			  curtop += obj.offsetTop;
			  if(!obj.offsetParent)
				break;
			  obj = obj.offsetParent;
			}
		else if(obj.y)
			curtop += obj.y;
		return curtop;
	};

	// helper function for searching the user-agent string
	var uaContains = function(str)
	{
		return (navigator.userAgent.indexOf(str) != -1);
	};






	// Handler for mouse wheel event:
	var onWheelHandler = function(event)
	{
		var delta = 0;
		if (!event) event = window.event;
		if (event.wheelDelta)
		{
			// Safari
			delta = event.wheelDelta/120;
			if (window.opera) delta = -delta;
		}
		else if (event.detail) // Firefox
			delta = -event.detail*3;

		if (keepDeltaAtPlusMinusThree)
		{
			if (delta > 0) delta = 3;
			else if (delta == 0) delta = 0;
			else delta = -3;
		}

		if (delta)
		{

			var thisFlashMovieId = null;
			for (var j in f)
				if (f[j] != null && f[j] == event.currentTarget) thisFlashMovieId = j;

			var thisMouse;

			if (uaContains("Camino"))
				thisMouse = {x:event.layerX, y:event.layerY};
			else if (uaContains('Firefox'))
				thisMouse = {x:(event.layerX - findPosX(event.currentTarget)), y:(event.layerY - findPosY(event.currentTarget))};
			else
				thisMouse = {x:event.offsetX, y:event.offsetY};

			thisMouse.ctrlKey = (uaContains('Mac')) ? (event.metaKey || event.ctrlKey) : event.ctrlKey;
			thisMouse.altKey = event.altKey;
			thisMouse.shiftKey = event.shiftKey;
			thisMouse.buttonDown = false;

			if (thisMovie(thisFlashMovieId).dispatchExternalMouseWheelEvent)
				thisMovie(thisFlashMovieId).dispatchExternalMouseWheelEvent(delta, thisMouse.x, thisMouse.y,
																			thisMouse.ctrlKey, thisMouse.altKey,
																			thisMouse.shiftKey, thisMouse.buttonDown);
		};

		// Prevent default actions caused by mouse wheel
		if (event.preventDefault) event.preventDefault();
		event.returnValue = false;

	};

	return {
		// initialize mouse wheel capturing by setting the listener
		// (this is called from within the Flash app):
		initCaptureFor: function(aFlashObjectId)
		{
			if (uaContains('Mac') || uaContains('Safari'))
			{
				// find flash object's div container
				var parentdiv = document.getElementById(aFlashObjectId).parentNode;
				while(parentdiv != null && parentdiv.nodeName != "DIV")
					parentdiv = parentdiv.parentNode;

				if (parentdiv != undefined && parentdiv != null)
				{
					f[aFlashObjectId] = parentdiv;

					if (parentdiv.addEventListener) parentdiv.addEventListener('DOMMouseScroll', onWheelHandler, false); // Firefox
					parentdiv.onmousewheel = onWheelHandler; // Safari

					return true;
				}
				else
					return false;
			}
			else
				return false;
		}
	};

}();

