/**
 * SWFMacMouseWheel v2.0: Mac Mouse Wheel functionality in flash - http://blog.pixelbreaker.com/
 *
 * SWFMacMouseWheel is (c) 2007 Gabriel Bucknall and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 * Dependencies: 
 * SWFObject v2.2 <http://code.google.com/p/swfobject/>
 * Copyright (c) 2007 Geoff Stearns, Michael Williams, and Bobby van der Sluis
 * This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
 */

/*

*/
var swfmacmousewheel = function()
{
	if( !swfobject ) return null;
	
	var 
		u = navigator.userAgent.toLowerCase(),
		p = navigator.platform.toLowerCase(),
		mac = p ? /mac/.test(p) : /mac/.test(u);	
	
	// fake class return for non-mac;
	if( !mac ) return { registerObject: function(objectIdStr){} };
	
	var 
		safari = navigator.userAgent.toLowerCase().indexOf( 'safari') != -1,
		regObjArr = [],
		fullBrowserObject,
		activeTarget,
		timerId,
		hasDOMListeners = false,
		extKey = Math.random();
	
	function registerObjectForWheel( objectIdStr )
	{
		if( fullBrowserObject ) return;
		
		regObjArr[regObjArr.length] = objectIdStr;
		
		timerId = setInterval( "swfmacmousewheel.externalRegistrationBridge("+extKey+")", 200 );
	
		checkObjectRegistration();
		addDOMListeners();
	};
	
	function registerFullBrowserObject( objectIdStr )
	{
		fullBrowserObject = objectIdStr;
		addDOMListeners();
	}
	
	function checkObjectRegistration()
	{	
		var
			allRegistered = true,
			i,
			obj;
			
		for( i=0; i<regObjArr.length; i++ )
		{
			obj = swfobject.getObjectById( regObjArr[ i ] )
			if( obj == null )
			{
				allRegistered = false;
				continue;
			}
				
			if( obj.onmouseover == undefined )
			{
				obj.onmouseover = mouseOverHandler;
				obj.onmouseout = mouseOutHandler;	
			}
		}
		
		if( allRegistered ) clearInterval( timerId );
	}
	
	function mouseOverHandler( e )
	{
		activeTarget = e.currentTarget;
	}
	
	function mouseOutHandler( e )
	{
		activeTarget = null;
	}
	
	function deltaFilter(event)
	{
		var delta = 0;
        if (event.wheelDelta) {
			delta = event.wheelDelta/120;
			if (window.opera) delta *= 2;
        } else if (event.detail) {
            delta = -event.detail;
        }
        if (event.preventDefault) event.preventDefault();
		return delta;
	}
	
	function deltaDispatcher(event)
	{
		if( fullBrowserObject )
		{
			var obj = swfobject.getObjectById( fullBrowserObject );
			if( typeof( obj.externalMouseEvent ) == 'function' ) obj.externalMouseEvent( deltaFilter(event) );
			return;
		}
		
		if( !activeTarget ) return;
			
		var obj = activeTarget;
			
		if( typeof( obj.externalMouseEvent ) == 'function' ) obj.externalMouseEvent( deltaFilter(event) );
	}
	
	function addDOMListeners()
	{
		if( hasDOMListeners ) return;
		
		if (window.addEventListener) window.addEventListener('DOMMouseScroll', deltaDispatcher, false);
		window.onmousewheel = document.onmousewheel = deltaDispatcher;
	}
			
	return {
		/*
		Private method, needed to be publicised for setInterval to access it.
		Cannot be executed from outside this class as extKey is an internal function variable.
		*/
		externalRegistrationBridge: function( key )
		{
			if( key != extKey ) return;
			checkObjectRegistration();
		},
			
		/*
		Register a flash movie embedded in the page
		*/
		registerObject: function( objectIdStr )
		{
			registerObject( objectIdStr );
		},
		
		/*
		Reguster a flash movie that takes up 100% of the browser window (no others can be registered)
		*/
		registerFullBrowserObject: function( objectIdStr )
		{
			registerFullBrowserObject( objectIdStr );
		}
	};
}();



