
window.EXANIMO = window.EXANIMO || {};
EXANIMO.namespace = function(ns)
{
    if (!ns || !ns.length)
        return;

    var levels = ns.split('.');
    var nsobj = EXANIMO;

    // EXANIMO is implied, so it is ignored if it is included
    for (var i = (levels[0] == 'EXANIMO') ? 1 : 0; i < levels.length; i++)
    {
        nsobj[levels[i]] = nsobj[levels[i]] || {};
        nsobj = nsobj[levels[i]];
    }

    return nsobj;
}
    EXANIMO.namespace('EXANIMO.utils');
    EXANIMO.utils.getBrowserInfo = function()
    {
        if (navigator.appName.indexOf('Microsoft Internet') != -1)
            return {browser: 'MSIE'};
        if (navigator.userAgent.indexOf('Safari') != -1)
            return {browser: 'SAFARI'};
        else
            return {browser: 'OTHER'};
    }

    EXANIMO.namespace('EXANIMO.utils');
    EXANIMO.utils.getSWFObject = function(id)
    {
        if (window.document[id])
            return window.document[id];
        if (navigator.appName.indexOf('Microsoft Internet') == -1)
            if (document.embeds && document.embeds[id])
                return document.embeds[id];
        else
            return document.getElementById(id);
    }

EXANIMO.namespace('EXANIMO.managers');
if (!EXANIMO.managers.StateManager)
{
    EXANIMO.managers.StateManager = {


        CHECK_RATE: 100,
        stateChangeHandler: null,
        event: null,

        _initialized: false,
        _autoInitInterval: setInterval(
            function()
            {
                if (document.body && !EXANIMO.managers.StateManager._initialized)
                {
                    EXANIMO.managers.StateManager.initialize();
                }
            },
            10
        ),
        _checkInterval: null,
        _method: null,
        _swf: null,
        _oldStateID: null,
        _refreshPage: null,
        _cancelLoad: false,
        initialize: function(swf)
        {
            // Stop trying to auto-initialize and reset StateManager.
            clearInterval(EXANIMO.managers.StateManager._autoInitInterval);
            clearInterval(EXANIMO.managers.StateManager._checkInterval);
            EXANIMO.managers.StateManager._initialized = true;

            // If a SWF was provided, remember it.
            if (typeof swf != 'undefined')
            {
                EXANIMO.managers.StateManager._swf = typeof(swf) == 'string' ? EXANIMO.utils.getSWFObject(swf) : swf || null;
            }

            // Decide which method to use by (blech!) browser sniffing.
            var browserInfo = EXANIMO.utils.getBrowserInfo();
            switch(browserInfo.browser)
            {
                case 'MSIE':
                    EXANIMO.managers.StateManager._method = 'IFRAME';
                    break;
                case 'SAFARI':
                    EXANIMO.managers.StateManager._method = 'LINK';
                    break;
                default:
                    EXANIMO.managers.StateManager._method = 'HASH';
                    break;
            }

            switch(EXANIMO.managers.StateManager._method)
            {
                case 'HASH':

                    var initialState = EXANIMO.managers.StateManager._getStateID();
                   EXANIMO.managers.StateManager._oldStateID = null;
                 

                    // Watch to see if the hash changes.
                    var checkForHashChange = function()
                    {
                        var stateID = EXANIMO.managers.StateManager._getStateID();

                        if (stateID != EXANIMO.managers.StateManager._oldStateID)
                        {
                            EXANIMO.managers.StateManager._oldStateID = stateID;
                            EXANIMO.managers.StateManager._dispatchEvent(stateID)
                        }
                    }

                    EXANIMO.managers.StateManager._checkInterval = setInterval(checkForHashChange, EXANIMO.managers.StateManager.CHECK_RATE);

                    break;
                case 'IFRAME':
				
                
                    EXANIMO.managers.StateManager._refreshPage = false;

                    // Create and attach the iframe.
                    var iframe = document.createElement('iframe');
                    iframe.setAttribute('src', 'about:blank');
                    iframe.setAttribute('name', 'EXANIMO-managers-StateManager-iFrame');
                    iframe.setAttribute('id', 'EXANIMO-managers-StateManager-iFrame');
                    iframe.style.visibility = 'hidden';
                    iframe.style.width = '0';
                    iframe.style.height = '0';
                    iframe.style.position = 'absolute';
                    iframe.style.overflow = 'hidden';
                    document.body.appendChild(iframe);

                    // If a state id is already present in the hash, go to it.
                    var stateID = EXANIMO.managers.StateManager._getStateID();
                   
                        setTimeout(
                            function()
                            {
                                EXANIMO.managers.StateManager._dispatchEvent(stateID)
                            },
                            0
                        );
                   

                    // Update the page and hash from the iframe.
                  
                    frames['EXANIMO-managers-StateManager-iFrame'].document.open();
                    if (stateID)
                    {
                        frames['EXANIMO-managers-StateManager-iFrame'].document.write('<script>parent.document.location.hash = "' + (stateID) + '"; parent.EXANIMO.managers.StateManager._updateIFrame("' + stateID + '");</script>');
                    }else{
                        frames['EXANIMO-managers-StateManager-iFrame'].document.write('<script>parent.document.location.hash = ""; parent.EXANIMO.managers.StateManager._updateIFrame();</script>');
                    frames['EXANIMO-managers-StateManager-iFrame'].document.close();
                    }
                    
                  

                    break;

                case 'LINK':

                    document.location.EXANIMO = document.location.EXANIMO || {};
                    document.location.EXANIMO.managers = document.location.EXANIMO.managers || {};
                    document.location.EXANIMO.managers.StateManager = document.location.EXANIMO.managers.StateManager || {};

                    var loc = document.location.EXANIMO.managers.StateManager;

                 
                    window.onunload = function()
                    {
                        loc.oldHistoryLength = -1;
                    }

                    if (loc.deepLink)
                    {
                    	loc.oldHistoryLength = -1;
						loc.deepLink = null;                   	
                    }

                    // Create a list of the states we click through.
                    if (typeof loc.stateList == 'undefined')
                    {
                        loc.stateList = [EXANIMO.managers.StateManager._getStateID()];
                        loc.deepLink = loc.stateList[0];

                        loc.offset = history.length - 1;
                        while (loc.offset)
                        {
                            loc.stateList.unshift(null);
                            loc.offset--;
                        }
                        delete loc.offset;

                        loc.oldHistoryLength = document.location.hash ? -1 : history.length;

                    }

                    // Watch to see if the length of the history object changes.
                    var checkForHistoryLengthChange = function()
                    {
                        var loc = document.location.EXANIMO.managers.StateManager;

                        if (EXANIMO.managers.StateManager._cancelLoad)
                        {
                            EXANIMO.managers.StateManager._cancelLoad = false;
                            loc.oldHistoryLength = history.length;
                            return;
                        }

                        if (history.length != loc.oldHistoryLength)
                        {
                            var stateID = loc.stateList[history.length - 1];

                            EXANIMO.managers.StateManager._dispatchEvent(stateID)
                            loc.oldHistoryLength = history.length;
                        }
                    }

                    EXANIMO.managers.StateManager._checkInterval = setInterval(checkForHistoryLengthChange, EXANIMO.managers.StateManager.CHECK_RATE);

                    break;

            }
        },

        setState: function(stateID, title)
        {
        	
            // Set the title.
            if (title)
            {
                EXANIMO.managers.StateManager.setTitle(title);
            }

            // Block infinite loops.
            if (EXANIMO.managers.StateManager.event) return;

            switch(EXANIMO.managers.StateManager._method)
            {
                case 'HASH':
        
	                  document.location.hash = stateID;
	                  EXANIMO.managers.StateManager._oldStateID = stateID;
                	

                    break;

                case 'IFRAME':

                    EXANIMO.managers.StateManager._setIFrame(stateID);

                    break;

                case 'LINK':

                    EXANIMO.managers.StateManager._cancelLoad = true;

                    var a = document.createElement('a');
                    a.setAttribute('href', '#' + stateID);

                    var evt = document.createEvent('MouseEvents');
                    evt.initEvent('click', true, true);
                    a.dispatchEvent(evt);

                    document.location.EXANIMO.managers.StateManager.stateList.push(stateID);

                    break;

            }
            EXANIMO.managers.StateManager._dispatchEvent(stateID, true);

        },


        setTitle: function(title)
        {
           window.document.title = title || ' ';
        },

        _dispatchEvent: function(stateID, manual)
        {
        	
            stateID = stateID;
			
           
            if ((typeof EXANIMO.utils.JSInterface != 'undefined') && (EXANIMO.utils.JSInterface.swfObject))
            {
                EXANIMO.managers.StateManager._swf = EXANIMO.managers.StateManager._swf || EXANIMO.utils.JSInterface.swfObject;
            }

            
            if (EXANIMO.managers.StateManager._swf)
            {
              
                if (!manual && EXANIMO.managers.StateManager._swf.dispatchStateChangeEvents)
                {
                    EXANIMO.managers.StateManager._swf.dispatchStateChangeEvents(stateID);
                }
            }


            else
            {
                EXANIMO.managers.StateManager.event = {id: stateID};

                // If a handler is set, call it.
                if (EXANIMO.managers.StateManager.stateChangeHandler)
                {
                    EXANIMO.managers.StateManager.stateChangeHandler(EXANIMO.managers.StateManager.event);
                }

                if (manual)
                {
                    if (EXANIMO.managers.StateManager.stateSetHandler)
                    {
                        EXANIMO.managers.StateManager.stateSetHandler(EXANIMO.managers.StateManager.event);
                    }
                }
                else
                {
                    if (EXANIMO.managers.StateManager.stateRevisitedHandler)
                    {
                        EXANIMO.managers.StateManager.stateRevisitedHandler(EXANIMO.managers.StateManager.event);
                    }
                }

                EXANIMO.managers.StateManager.event = null;
            }
           
         },


        _getStateID: function()
        {
            return document.location.href.split('#')[1];
        },


       
        _setIFrame: function(stateID)
        {
            EXANIMO.managers.StateManager._refreshPage = false;
            var iframe = document.getElementById('EXANIMO-managers-StateManager-iFrame');

            switch(EXANIMO.managers.StateManager._method)
            {
                case 'IFRAME':

                    frames['EXANIMO-managers-StateManager-iFrame'].document.open();
                    frames['EXANIMO-managers-StateManager-iFrame'].document.write('<script>parent.document.location.hash = "' + (stateID) + '"; /* Wait for IE to impose its title before setting ours. */ setTimeout( function(){ parent.EXANIMO.managers.StateManager._updateIFrame("' + stateID + '"); }, 0);</script>');
                    frames['EXANIMO-managers-StateManager-iFrame'].document.close();

                    break;
            }
        },


        _updateIFrame: function(stateID)
        {
            if (EXANIMO.managers.StateManager._refreshPage)
            {
                EXANIMO.managers.StateManager._dispatchEvent(stateID);
            }
            else
            {
                EXANIMO.managers.StateManager._refreshPage = true;
            }
        }

    }
}