/*
 * Copyright (c) 2009 Discovery Health Systems.
 * The information contained in this file is the intellectual property of Discovery Health Systems (the owner).
 * No part of this file may be changed, copied or removed by persons other than the owner or persons
 * authorised to do so by the owner.
 */
jQuery.extend({historyCurrentHash:undefined,historyStartHash:undefined,historyCallback:undefined,historyInit:function(callback) {
    jQuery.historyCallback = callback;
    var current_hash = location.hash;
    jQuery.historyCurrentHash = current_hash;
    if (jQuery.browser.msie) {
        if (jQuery.historyCurrentHash == '') {
            jQuery.historyCurrentHash = '#';
        }
        $("body").prepend('<iframe id="jQuery_history" style="display: none;"></iframe>');
        var ihistory = $("#jQuery_history")[0];
        var iframe = ihistory.contentWindow.document;
        iframe.open();
        iframe.close();
        iframe.location.hash = current_hash;
    }
    else if ($.browser.safari) {
        jQuery.historyBackStack = [];
        jQuery.historyBackStack.length = history.length;
        jQuery.historyForwardStack = [];
        jQuery.isFirst = true;
    }
    jQuery.historyCallback(current_hash.replace(/^#/, ''));
    setInterval(jQuery.historyCheck, 100);
},historyAddHistory:function(hash) {
    jQuery.historyBackStack.push(hash);
    jQuery.historyForwardStack.length = 0;
    this.isFirst = true;
},historyCheck:function() {
    if (jQuery.browser.msie) {
        var ihistory = $("#jQuery_history")[0];
        var iframe = ihistory.contentDocument || ihistory.contentWindow.document;
        var current_hash = iframe.location.hash;
        if (current_hash != jQuery.historyCurrentHash) {
            location.hash = current_hash;
            jQuery.historyCurrentHash = current_hash;
            jQuery.historyCallback(current_hash.replace(/^#/, ''));
        }
    } else if ($.browser.safari) {
        if (!jQuery.dontCheck) {
            try {
                var historyDelta = history.length - jQuery.historyBackStack.length;
                if (historyDelta) {
                    jQuery.isFirst = false;
                    if (historyDelta < 0) {
                        for (var i = 0; i < Math.abs(historyDelta); i++)jQuery.historyForwardStack.unshift(jQuery.historyBackStack.pop());
                    } else {
                        for (var i = 0; i < historyDelta; i++)jQuery.historyBackStack.push(jQuery.historyForwardStack.shift());
                    }
                    var cachedHash = jQuery.historyBackStack[jQuery.historyBackStack.length - 1];
                    if (cachedHash != undefined) {
                        jQuery.historyCurrentHash = location.hash;
                        jQuery.historyCallback(cachedHash);
                    }
                } else if (jQuery.historyBackStack[jQuery.historyBackStack.length - 1] == undefined && !jQuery.isFirst) {
                    if (document.URL.indexOf('#') >= 0) {
                        jQuery.historyCallback(document.URL.split('#')[1]);
                    } else {
                        var current_hash = location.hash;
                        jQuery.historyCallback('');
                    }
                    jQuery.isFirst = true;
                }
            } catch(e) {/*do nothing...*/
            }
        }
    } else {
        var current_hash = location.hash;
        if (current_hash != jQuery.historyCurrentHash) {
            jQuery.historyCurrentHash = current_hash;
            jQuery.historyCallback(current_hash.replace(/^#/, ''));
        }
    }
},historyLoad:function(hash) {
    var newhash;
    if (jQuery.browser.safari) {
        newhash = hash;
    }
    else {
        newhash = '#' + hash;
        location.hash = newhash;
    }
    jQuery.historyCurrentHash = newhash;
    if (jQuery.browser.msie) {
        var ihistory = $("#jQuery_history")[0];
        var iframe = ihistory.contentWindow.document;
        iframe.open();
        iframe.close();
        iframe.location.hash = newhash;
        jQuery.historyCallback(hash);
    }
    else if (jQuery.browser.safari) {
        jQuery.dontCheck = true;
        this.historyAddHistory(hash);
        var fn = function() {
            jQuery.dontCheck = false;
        };
        window.setTimeout(fn, 200);
        jQuery.historyCallback(hash);
        location.hash = newhash;
    }
    else {
        jQuery.historyCallback(hash);
    }
}});
