/**
 * History.js HTML4 Support
 * Depends on the HTML5 Support
 * @author Benjamin Arthur Lupton <contact@balupton.com>
 * @copyright 2010-2011 Benjamin Arthur Lupton <contact@balupton.com>
 * @license New BSD License <http://creativecommons.org/licenses/BSD/>
 */(function(a,b){a.History=a.History||{},a._History=a._History||{};var c=a.document,d=a._History,e=a.History;if(typeof e.initHtml4!=="undefined")throw new Error("History.js HTML4 Support has already been loaded...");e.initHtml4=function(){if(typeof e.initHtml5==="undefined"||typeof e.Adapter==="undefined")return!1;d.getInternetExplorerMajorVersion=function(){var a=d.getInternetExplorerMajorVersion.cached=typeof d.getInternetExplorerMajorVersion.cached!=="undefined"?d.getInternetExplorerMajorVersion.cached:function(){var a,b=3,d=c.createElement("div"),e=d.getElementsByTagName("i");while(d.innerHTML="<!--[if gt IE "+ ++b+"]><i></i><![endif]-->",e[0]);return b>4?b:a}();return a},d.isInternetExplorer=function(){var a=d.isInternetExplorer.cached=typeof d.isInternetExplorer.cached!=="undefined"?d.isInternetExplorer.cached:d.getInternetExplorerMajorVersion()!==0;return a},e.emulated.hashChange=Boolean(!("onhashchange"in a||"onhashchange"in c)||d.isInternetExplorer()&&d.getInternetExplorerMajorVersion()<8),d.savedHashes=[],d.isLastHash=function(a){var b=d.getHashByIndex(),c=a===b;return c},d.saveHash=function(a){if(d.isLastHash(a))return!1;d.savedHashes.push(a);return!0},d.getHashByIndex=function(a){var b=null;typeof a==="undefined"?b=d.savedHashes[d.savedHashes.length-1]:a<0?b=d.savedHashes[d.savedHashes.length+a]:b=d.savedHashes[a];return b},d.stateHashExists=function(a){var b=typeof d.statesByHash[a]!=="undefined";return b},d.discardedHashes={},d.discardedStates={},d.discardState=function(a,b,c){e.debug("History.discardState",this,arguments);var f=e.contractState(a),g={discardedState:a,backState:c,forwardState:b};d.discardedStates[f]=g;return!0},d.discardHash=function(a,b,c){e.debug("History.discardState",this,arguments);var f={discardedHash:a,backState:c,forwardState:b};d.discardedHashes[a]=f;return!0},d.discardedState=function(a){var b=e.contractState(a),c=d.discardedStates[b]||!1;return c},d.discardedHash=function(a){var b=d.discardedHashes[a]||!1;return b},d.recycleState=function(a){e.debug("History.recycleState",this,arguments);var b=e.contractState(a);d.discardedState(a)&&delete d.discardedStates[b];return!0},e.emulated.hashChange&&e.Adapter.onDomLoad(function(){d.checkerFunction=null;if(d.isInternetExplorer()){var b="historyjs-iframe",f=c.createElement("iframe");f.setAttribute("id",b),f.style.display="none",c.body.appendChild(f),f.contentWindow.document.open(),f.contentWindow.document.close();var g=null,h=null,i=!1;d.checkerFunction=function(){if(i){e.debug("hashchange.checker: checker is running");return!1}i=!0;var b=e.getHash(),c=d.unescapeHash(f.contentWindow.document.location.hash);b!==g?(g=b,c!==b&&(e.debug("hashchange.checker: iframe hash change","documentHash (new):",b,"iframeHash (old):",c),h=c=b,f.contentWindow.document.open(),f.contentWindow.document.close(),f.contentWindow.document.location.hash=d.escapeHash(b)),e.Adapter.trigger(a,"hashchange")):c!==h&&(e.debug("hashchange.checker: iframe hash out of sync","iframeHash (new):",c,"documentHash (old):",b),h=c,e.setHash(c,!1)),i=!1;return!0}}else{var g=null;d.checkerFunction=function(){var b=e.getHash();b!==g&&(g=b,e.Adapter.trigger(a,"hashchange"));return!0}}setInterval(d.checkerFunction,e.options.hashChangeCheckerDelay);return!0}),e.emulated.pushState&&(d.onHashChange=function(b){e.debug("_History.onHashChange",this,arguments);var f=b&&b.newURL||c.location.href;currentHash=unescape(e.extractHashFromUrl(f)),currentState=null,currentStateHash=null,currentStateHashExits=null;if(d.isLastHash(currentHash)){e.debug("_History.onHashChange: no change"),e.busy(!1);return!1}d.saveHash(currentHash),currentState=e.expandHash(currentHash);if(!currentState){e.debug("_History.onHashChange: traditional anchor"),e.Adapter.trigger(a,"anchorchange"),e.busy(!1);return!1}if(d.isLastState(currentState)){e.debug("_History.onHashChange: no change"),e.busy(!1);return!1}currentStateHash=e.contractState(currentState),e.debug("_History.onHashChange: ","currentStateHash",currentStateHash,"Hash -1",d.getHashByIndex(-1),"Hash -2",d.getHashByIndex(-2),"Hash -3",d.getHashByIndex(-3),"Hash -4",d.getHashByIndex(-4),"Hash -5",d.getHashByIndex(-5),"Hash -6",d.getHashByIndex(-6),"Hash -7",d.getHashByIndex(-7));var g=d.discardedState(currentState);if(g){e.debug("forwardState:",e.contractState(g.forwardState),"backState:",e.contractState(g.backState)),d.getHashByIndex(-2)===e.contractState(g.forwardState)?(e.debug("_History.onHashChange: go backwards"),e.back(!1)):(e.debug("_History.onHashChange: go forwards"),e.forward(!1)),e.busy(!1);return!1}e.debug("_History.onHashChange: success hashchange"),e.pushState(currentState.data,currentState.title,currentState.url,!1);return!0},e.Adapter.bind(a,"hashchange",d.onHashChange),e.pushState=function(b,f,g,h){e.debug("History.pushState",this,arguments);if(e.extractHashFromUrl(g))throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(h!==!1&&e.busy()){e.debug("History.pushState: we must wait",arguments),e.pushQueue({scope:e,callback:e.pushState,args:arguments,queue:h});return!1}e.busy(!0);var i=e.createStateObject(b,f,g),j=e.contractState(i),k=e.getState(),l=e.getStateHash(),m=unescape(e.getHash());d.storeState(i),d.recycleState(i);if(c.title!==i.title){c.title=i.title;try{c.getElementsByTagName("title")[0].innerHTML=i.title}catch(n){}}e.debug("History.pushState: details","newStateHash:",j,"oldStateHash:",l,"html4Hash:",m);if(j===l){e.debug("History.pushState: no change",j);return!1}if(j!==m){e.debug("History.pushState: update hash",j),e.setHash(j,!1);return!1}d.saveState(i),e.debug("History.pushState: trigger popstate"),e.Adapter.trigger(a,"statechange"),e.busy(!1);return!0},e.replaceState=function(a,b,c,f){e.debug("History.replaceState",this,arguments);if(e.extractHashFromUrl(c))throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(f!==!1&&e.busy()){e.debug("History.replaceState: we must wait",arguments),e.pushQueue({scope:e,callback:e.replaceState,args:arguments,queue:f});return!1}e.busy(!0);var g=e.createStateObject(a,b,c),h=e.getState(),i=d.getStateByIndex(-2);d.discardState(h,g,i),e.pushState(g.data,g.title,g.url,!1);return!0},!c.location.hash||c.location.hash==="#"?e.Adapter.onDomLoad(function(){e.debug("Internet Explorer Initial State Change Fix");var a=e.createStateObject({},"",c.location.href);e.pushState(a.data,a.title,a.url)}):e.emulated.hashChange||(e.debug("Firefox Initial State Change Fix"),e.Adapter.onDomLoad(function(){d.onHashChange()})))},e.initHtml4()})(window)
