(function(a,b){"use strict";var c=a.console||b,d=a.document,e=a.navigator,f=a.amplify||!1,g=a.setTimeout,h=a.clearTimeout,i=a.setInterval,j=a.clearInterval,k=a.JSON,l=a.alert,m=a.History=a.History||{},n=a.history;k.stringify=k.stringify||k.encode,k.parse=k.parse||k.decode;if(typeof m.init!="undefined")throw new Error("History.js Core has already been loaded...");m.init=function(){if(typeof m.Adapter=="undefined")return!1;typeof m.initCore!="undefined"&&m.initCore(),typeof m.initHtml4!="undefined"&&m.initHtml4();return!0},m.initCore=function(){if(typeof m.initCore.initialized!="undefined")return!1;m.initCore.initialized=!0;var o,p;m.options=m.options||{},m.options.hashChangeInterval=m.options.hashChangeInterval||100,m.options.safariPollInterval=m.options.safariPollInterval||500,m.options.doubleCheckInterval=m.options.doubleCheckInterval||500,m.options.storeInterval=m.options.storeInterval||1e3,m.options.busyDelay=m.options.busyDelay||250,m.options.debug=m.options.debug||!1,m.options.initialTitle=m.options.initialTitle||d.title,m.temp={internal:!1,expectedStateId:!1,ignore:0,same:!1,anchor:!1},m.intervalList=[],m.clearAllIntervals=function(){var a,b=m.intervalList;if(typeof b!="undefined"&&b!==null){for(a=0;a<b.length;a++)j(b[a]);m.intervalList=null}},m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.debug=function(){(m.options.debug||!1)&&m.log.apply(m,arguments)},m.log=function(){var a=typeof c!="undefined"&&typeof c.log!="undefined"&&typeof c.log.apply!="undefined",b=d.getElementById("log"),e,f,g,h,i;a?(h=Array.prototype.slice.call(arguments),e=h.shift(),typeof c.debug!="undefined"?c.debug.apply(c,[e,h]):c.log.apply(c,[e,h])):e="\n"+arguments[0]+"\n";for(f=1,g=arguments.length;f<g;++f){i=arguments[f];if(typeof i=="object"&&typeof k!="undefined")try{i=k.stringify(i)}catch(j){}e+="\n"+i+"\n"}b?(b.value+=e+"\n-----\n",b.scrollTop=b.scrollHeight-b.clientHeight):a||l(e)},m.getInternetExplorerMajorVersion=function(){var a=m.getInternetExplorerMajorVersion.cached=typeof m.getInternetExplorerMajorVersion.cached!="undefined"?m.getInternetExplorerMajorVersion.cached:function(){var a=3,b=d.createElement("div"),c=b.getElementsByTagName("i");while((b.innerHTML="<!--[if gt IE "+ ++a+"]><i></i><![endif]-->")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.bugs={},m.bugs.safariIFrame=Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)&&a.parent!==a),m.bugs.safariHash=Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),m.bugs.safariPoll=Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),m.bugs.noHashPopState=Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),m.bugs.noInitialPopState=Boolean(!m.emulated.pushState&&(e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)||/Gecko\//.test(e.userAgent))),m.bugs.ieDoubleCheck=Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),m.bugs.hashEscape=Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7),m.enabled=!m.emulated.pushState,m.isEmptyObject=function(a){for(var b in a)if(a.hasOwnProperty(b))return!1;return!0},m.cloneObject=function(a){var b,c;a?(b=k.stringify(a),c=k.parse(b)):c={};return c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;a+="/";return a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/");return c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"});return c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,""));return c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=m.getFullUrl(a),c=b,d=m.getBaseUrl(),e=m.getRootUrl();m.emulated.pushState&&(c=c.replace(d,"")),c=c.replace(e,"/"),/^\.?\.?\//.test(c)===!1&&(e+c===b?c="/"+c:c="./"+c),c=c.replace(/^(\.\/)+/g,"./").replace(/\#$/,"");return c},m.store=f?f.store("History.store")||{}:{},m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url,c.internal=m.temp.internal,c.same=m.temp.same,c.anchor=c.anchor||m.temp.anchor);return c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=String(Math.floor(Math.random()*1e3));if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.data=m.cloneObject(a.data),b.anchor=m.extractAnchor(b.url),b.hash=m.getShortUrl(b.url),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_anchor.*/,"").replace(/\??\&_suid.*/,"").replace(/#.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;b.anchor&&(/\?/.test(b.hash)||(b.hash+="?"),m.emulated.pushState&&(b.hash+="&_anchor="+b.anchor),b.url+="#"+b.anchor),b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl);return b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};d=m.normalizeState(d);return d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b=m.normalizeState(a),c,d;c={data:b.data,title:a.title,url:a.url},d=k.stringify(c);return d},m.getStateId=function(a){var b=m.normalizeState(a),c;c=b.id;return c},m.getHashByState=function(a){var b,c=m.normalizeState(a);b=c.hash;return b},m.extractAnchor=function(a){var b,c,d;b=a.replace(/^[^#]+#?/,""),b||(c=/(.*)\&_anchor=([a-zA-Z0-9_\-]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"");return b||!1},m.extractId=function(a){var b,c,d;c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"";return b||!1},m.isTraditionalAnchor=function(a){var b=!/[^a-zA-Z0-9_\-]/.test(a);return b},m.extractState=function(a,b,c){var d=null,e,f,g;b=b||!1,c=typeof c=="undefined"?!0:c,a=a,e=m.extractId(a),e&&(d=m.getStateById(e)),d||(f=m.getFullUrl(a),e=m.getIdByUrl(f)||!1,e&&(d=m.getStateById(e)),!d&&b&&(!!c||!m.isTraditionalAnchor(a))&&(d=m.createStateObject(null,null,f)));return d},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.getStateById(m.savedStates[m.savedStates.length-1])},m.getLastStoredState=function(){return m.getStateById(m.storedStates[m.storedStates.length-1])},m.hasUrlDuplicate=function(a){var b=!1,c;c=m.extractState(a.url),b=c&&c.id!==a.id;return b},m.storeState=function(a){if(m.isLastStoredState(a))return a;m.urlToId[a.url]=a.id,m.storedStates.push(a.id);return a},m.isLastStoredState=function(a){var b=!1,c,d,e;m.storedStates.length&&(c=m.getLastStoredState(),d=a.id,e=c.id,b=d===e);return b},m.isLastSavedState=function(a,b){var c=!1,d,e,f,g,h;m.savedStates.length&&(d=m.getLastSavedState(),b?(g={data:a.data,title:a.title,url:a.cleanUrl},h={data:d.data,title:d.title,url:d.cleanUrl},c=k.stringify(g)===k.stringify(h)):(e=a.id,f=d.id,c=e===f));return c},m.saveState=function(a){if(m.isLastSavedState(a))return a;m.savedStates.push(a.id);return a},m.getStateByIndex=function(a){var b=null,c;typeof a=="undefined"?c=m.savedStates[m.savedStates.length-1]:a<0?c=m.savedStates[m.savedStates.length+a]:c=m.savedStates[a],b=m.getStateById(c);return b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.decodeURI(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);b=m.unescapeString(b);return b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){if(b!==!1&&m.busy()){m.debug("History.setHash: we must wait",arguments),m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b});return!1}m.debug("History.setHash: called",a);var c=m.escapeHash(a),e,f,g;m.busy(!0),e=m.extractState(a,!0,!1),e&&!m.emulated.pushState?(m.debug("History.setHash: Hash is a state so skipping the hash set with a direct pushState call",arguments),m.pushState(e.data,e.title,e.url,!1)):d.location.hash!==c&&(m.bugs.safariHash?(f=m.getPageUrl(),g=m.extractState(f.replace(/#.*/,"")),g?m.pushState(g.data,g.title,g.url+"#"+c,!1):m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c);return m},m.escapeHash=function(b){var c=m.normalizeHash(b);c=a.encodeURI(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?"));return c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");b=m.unescapeHash(b);return b},m.setTitle=function(a){var b=typeof a=="string"?a:a.title,c,e;b||(e=m.getStateByIndex(0),e&&e.url===(a.url||d.location.href)&&(b=e.title||m.options.initialTitle)),c=d.getElementsByTagName("title");if(c.length===1)try{c[0].innerHTML=b.replace("<","&lt;").replace(">","&gt;").replace(" & "," &amp; ")}catch(f){}d.title=b;return m},m.queues=[],m.busy=function(a){typeof a!="undefined"?(m.debug("History.busy: changing ["+(m.busy.flag||!1)+"] to ["+(a||!1)+"]",m.queues.length),m.busy.flag=a):typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);var b,c,d,e;m.busy.flag||(h(m.busy.timeout),b=function(){if(!m.busy.flag)for(c=m.queues.length-1;c>=0;--c){d=m.queues[c];if(d.length===0)continue;e=d.shift(),m.fireQueueItem(e),m.busy.timeout=g(b,m.options.busyDelay)}},m.busy.timeout=g(b,m.options.busyDelay));return m.busy.flag},m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a);return m},m.queue=function(a,b){typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a);return m},m.clearQueue=function(){m.busy.flag=!1,m.queues=[];return m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){m.stateChanged=!0,m.doubleCheckClear();return m},m.doubleCheckClear=function(){m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1);return m},m.doubleCheck=function(a){m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){m.doubleCheckClear(),m.stateChanged||(m.debug("History.doubleCheck: State has not yet changed, trying again",arguments),a());return!0},m.options.doubleCheckInterval));return m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(b&&!m.isLastSavedState(b))c=b;else return;c||(m.debug("History.safariStatePoll: new"),c=m.createStateObject()),m.debug("History.safariStatePoll: trigger"),m.Adapter.trigger(a,"popstate");return m},m.back=function(a){m.debug("History.back: called",arguments);if(a!==!1&&m.busy()){m.debug("History.back: we must wait",arguments),m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a});return!1}m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1);return!0},m.forward=function(a){m.debug("History.forward: called",arguments);if(a!==!1&&m.busy()){m.debug("History.forward: we must wait",arguments),m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a});return!1}m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1);return!0},m.go=function(a){m.debug("History.go: called",arguments);var b,c;c=(a<0?a*-1:a)-1,c&&m.queue(function(){m.temp.ignore=c,m.busy(!1)});if(a>0)for(b=1;b<=a;++b)m.forward();else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(b=-1;b>=a;--b)m.back()}return m},m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a=f.store("History.store")||{},b;a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState)m.idToState.hasOwnProperty(b)&&(a.idToState[b]=m.idToState[b]);for(b in m.urlToId)m.urlToId.hasOwnProperty(b)&&(a.urlToId[b]=m.urlToId[b]);for(b in m.stateToId)m.stateToId.hasOwnProperty(b)&&(a.stateToId[b]=m.stateToId[b]);m.store=a,f.store("History.store",a)},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload)),m.emulated.pushState?(p=function(){},m.pushState=m.pushState||p,m.replaceState=m.replaceState||p):(m.onPopState=function(b,c){var e,f,g,h=!1,i=!1,j=!1;m.doubleCheckComplete(),e=m.getHash();if(e){f=m.extractState(e||d.location.href,!0,!1);if(f){m.debug("History.onPopState: state anchor",e,f),m.replaceState(f.data,f.title,f.url,!1);return!1}m.debug("History.onPopState: traditional anchor",e)}i=m.Adapter.extractEventData("state",b,c)||!1,i?h=m.getStateById(i):m.temp.expectedStateId?h=m.getStateById(m.temp.expectedStateId):h=m.extractState(d.location.href),h||(e&&(g=m.extractState(d.location.href.replace(/#.*/,"")),g&&(h=m.createStateObject(g.data,g.title,d.location.href))),h||(h=m.createStateObject(null,null,d.location.href)));if(m.temp.ignore){--m.temp.ignore,m.busy(!1);return!1}if(m.temp.internal==="hashchange"){if(m.isLastSavedState(h)){m.busy(!1);return!1}m.temp.internal=!1}m.temp.expectedStateId||(m.temp.internal=!1),m.temp.expectedStateId=!1,m.temp.same=m.isLastSavedState(h,!0),m.storeState(h),m.saveState(h),m.setTitle(h),m.Adapter.trigger(a,"statechange"),m.busy(!1);return!0},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){m.debug("History.pushState: called",arguments);if(e!==!1&&m.busy()){m.debug("History.pushState: we must wait",arguments),m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e});return!1}m.busy(!0);var f=m.createStateObject(b,c,d),g;e!==!1&&(m.temp.internal="pushState"),m.temp.same=m.isLastSavedState(f,!0),m.isLastSavedState(f)?(m.Adapter.trigger(a,"statechange"),m.busy(!1)):(m.storeState(f),n.pushState(f.id,f.title,f.url),m.temp.expectedStateId=f.id,m.Adapter.trigger(a,"popstate"));return!0},m.replaceState=function(b,c,d,e){m.debug("History.replaceState: called",arguments);if(e!==!1&&m.busy()){m.debug("History.replaceState: we must wait",arguments),m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e});return!1}m.busy(!0);var f=m.createStateObject(b,c,d),g;e!==!1&&(m.temp.internal="replaceState"),m.temp.same=m.isLastSavedState(f,!0),m.isLastSavedState(f)?(m.Adapter.trigger(a,"statechange"),m.busy(!1)):(m.storeState(f),n.replaceState(f.id,f.title,f.url),m.temp.expectedStateId=f.id,m.Adapter.trigger(a,"popstate"));return!0},++m.temp.ignore,m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval)),m.bugs.safariIFrame&&(o=m.getState(),n.pushState(o.data,o.title,o.url)),m.bugs.noHashPopState&&(m.Adapter.bind(a,"hashchange",function(){m.temp.internal="hashchange",m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.bugs.noInitialPopState&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"popstate")})),m.bugs.noInitialPopState&&m.Adapter.trigger(a,"popstate"))},m.init()})(window)
