35 | An Article
36 |
37 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non
38 |
39 |
40 | tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor. Pellentesque auctor nisi id magna
41 |
42 |
43 | consequat sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet. Ut convallis libero in urna ultrices accumsan. Donec sed odio eros. Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus. Cum so
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/example/css/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/binarymind/jquery-navigate/0cc549344c52fa15d375e78cf2f9cff379c37bfd/example/css/.DS_Store
--------------------------------------------------------------------------------
/example/css/custom.css:
--------------------------------------------------------------------------------
1 | /* body loading animation */
2 | html { -webkit-font-smoothing: antialiased; }
3 | @keyframes bodyLoading {
4 | 0% {transform:scale(1.5,1.5);opacity:0;}
5 | 100% {transform:scale(1,1);opacity:1;}
6 | }
7 | @-webkit-keyframes bodyLoading {
8 | 0% {-webkit-transform:scale3d(1.5,1.5,1.5);opacity:0;}
9 | 100% {-webkit-transform:scale3d(1,1,1);opacity:1;}
10 | }
11 | @-moz-keyframes bodyLoading {
12 | 0% {-moz-transform:scale3d(1.5,1.5,1.5);opacity:0;}
13 | 100% {-moz-transform:scale3d(1,1,1);opacity:1;}
14 | }
15 | @-ms-keyframes bodyLoading {
16 | 0% {-ms-transform:scale(1.5,1.5);opacity:0;}
17 | 100% {-ms-transform:scale(1,1);opacity:1;}
18 | }
19 | body {-webkit-animation:bodyLoading 0.4s ease-in-out forwards;-moz-animation:bodyLoading 0.4s ease-out 0s 1 alternate forwards;}
20 |
21 | .header {height:40px;}
22 |
23 | /* HEADER */
24 | #logo {position:absolute;left:4px;top:4px;background:url("http://www.jquery-css.com/i/logo.gif") no-repeat scroll left center transparent;width:31px;height:31px;display:block}
25 | #headerContent {padding:10px 5px 5px 50px;text-align:left;}
26 |
27 | /* MAIN NAVIGATION BAR */
28 | #mainNav ul {background:#F4F4F4;border-style:solid;border-width:1px 0;border-color:white white #CCC white;padding:8px 0}
29 |
30 | /* PAGE CONTENT */
31 | .article {padding:10px;text-align:left;background:white;box-shadow:-10px 0 10px #CCC}
32 |
33 |
--------------------------------------------------------------------------------
/example/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Home
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
35 |
36 | Welcome to the navigate example
37 |
38 |
39 | Climate science
40 |
57 |
58 |
59 | Threats to the natural world
60 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
--------------------------------------------------------------------------------
/example/js/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/binarymind/jquery-navigate/0cc549344c52fa15d375e78cf2f9cff379c37bfd/example/js/.DS_Store
--------------------------------------------------------------------------------
/example/js/example.js:
--------------------------------------------------------------------------------
1 | $(document).ready(function() {
2 | //**** OPTIONAL ****
3 | // Example of a custom ajax insert function
4 | (function($) {
5 | $.fn.fadeInsert = function(options) {
6 | console.log(options);
7 | //the option is an array : {html:the ajax html, scripts: the scripts that already are in the html, customData:any data you associated to this state during navigate}
8 | var that = $(this);
9 | that.fadeOut(300, function(){
10 | that.html(options.html);
11 | that.fadeIn(300, function(){
12 | that.trigger({type:"finishrefreshinsert"});
13 | });
14 | });
15 | return this;
16 | };
17 | })(jQuery);
18 |
19 | //show you the events of navigate
20 | $("html")
21 | .on('donerefresh', "body", function(){
22 | $("#info").html(document.location.href+" loaded");
23 | })
24 | .on('startrefresh', "body", function(){
25 | $("#info").html('loading....');
26 | })
27 | .on('failrefresh', "body", function(){
28 | $("#info").html('Error loading....');
29 | });
30 | //**** /OPTIONAL ****
31 |
32 | //THIS IS THE ONLY NEEDED LINE
33 | //Just init navigate and any link without target="_blank" will become an ajax link
34 | $.navigate.init();
35 | });
--------------------------------------------------------------------------------
/example/js/modernizr.js:
--------------------------------------------------------------------------------
1 | /* Modernizr 2.6.2 (Custom Build) | MIT & BSD
2 | * Build: http://modernizr.com/download/#-backgroundsize-boxshadow-cssanimations-cssgradients-csstransforms3d-csstransitions-draganddrop-history-input-inputtypes-geolocation-touch-shiv-cssclasses-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-forms_placeholder-load
3 | */
4 | ;window.Modernizr=function(a,b,c){function B(a){j.cssText=a}function C(a,b){return B(n.join(a+";")+(b||""))}function D(a,b){return typeof a===b}function E(a,b){return!!~(""+a).indexOf(b)}function F(a,b){for(var d in a){var e=a[d];if(!E(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function G(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:D(f,"function")?f.bind(d||b):f}return!1}function H(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return D(b,"string")||D(b,"undefined")?F(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),G(e,b,c))}function I(){e.input=function(c){for(var d=0,e=c.length;d',a,""].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},y=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=D(e[d],"function"),D(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),z={}.hasOwnProperty,A;!D(z,"undefined")&&!D(z.call,"undefined")?A=function(a,b){return z.call(a,b)}:A=function(a,b){return b in a&&D(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=v.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(v.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(v.call(arguments)))};return e}),r.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:x(["@media (",n.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},r.geolocation=function(){return"geolocation"in navigator},r.history=function(){return!!a.history&&!!history.pushState},r.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},r.backgroundsize=function(){return H("backgroundSize")},r.boxshadow=function(){return H("boxShadow")},r.cssanimations=function(){return H("animationName")},r.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return B((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),E(j.backgroundImage,"gradient")},r.csstransforms3d=function(){var a=!!H("perspective");return a&&"webkitPerspective"in g.style&&x("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},r.csstransitions=function(){return H("transition")};for(var J in r)A(r,J)&&(w=J.toLowerCase(),e[w]=r[J](),u.push((e[w]?"":"no-")+w));return e.input||I(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)A(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},B(""),i=k=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.hasEvent=y,e.testProp=function(a){return F([a])},e.testAllProps=H,e.testStyles=x,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+u.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f/;
99 | var check=data.match(re);
100 | if(check && check.length>0) {
101 | check=check[0].replace(/^$/, 'div>');
103 | } else check=data;
104 |
105 | //GET THE HEAD
106 | var re = //;
107 | var headHtml=data.match(re);
108 | if(headHtml && headHtml.length>0) {
109 | headHtml=headHtml[0].replace(/^$/, 'div>');
111 | headHtml = $(headHtml).html()
112 | } else headHtml="";
113 | //Remove the scripts tags
114 | //-------------------------------------------------------------------------
115 | check = check.replace(new RegExp('';
141 | });
142 | myHtml += myScriptsHtml;
143 | if(!myHtml) {
144 | target.trigger({type:"failrefresh", clickedSelector:options.clickedSelector});
145 | return;
146 | }
147 |
148 | //GET THE REFRESH INSERT METHOD
149 | var insertFunction = target.attr('refresh-insert-function');
150 | if(!insertFunction) insertFunction=options.refreshInsertFunction;//"html";
151 |
152 | //SWITCH CONTENT
153 | target.off("finishrefreshinsert").one("finishrefreshinsert", function() {
154 | //check status
155 | var newRefreshStatus = element.attr("refresh-status");
156 | var currentStatus = target.attr("refresh-status");
157 | if(newRefreshStatus && currentStatus != newRefreshStatus) {
158 | target.trigger({
159 | type:"refreshstatuschanged",
160 | clickedSelector:options.clickedSelector,
161 | oldStatus:currentStatus,
162 | newStatus:newRefreshStatus
163 | });
164 | //target.trigger("refreshstatuschanged", options.clickedSelector);
165 | }
166 |
167 | target.trigger({type:"donerefresh", clickedSelector:options.clickedSelector});
168 | options.callback({
169 | clickedSelector:options.clickedSelector
170 | });
171 | });
172 | if(target[insertFunction]) {
173 | //manage standard jQuery insertion functions
174 |
175 | if(insertFunction=="append" ||insertFunction=="prepend"||insertFunction=="html") {
176 | target[insertFunction](myHtml);
177 | target.trigger({type:"finishrefreshinsert"});
178 | } else if(insertFunction == "appendTo" || insertFunction=="prependTo") {
179 | $(''+myHtml+'
').children().each(function(){
180 | $(this)[insertFunction](target);
181 | });
182 | target.trigger({type:"finishrefreshinsert"});
183 | } else {
184 | target[insertFunction]({html:myHtml, head:headHtml, scripts:myScriptsHtml, customData:options.customData});
185 | }
186 | }
187 | else if(window[insertFunction]) {
188 | window[insertFunction]({html:myHtml, head:headHtml, scripts:myScripts, customData:options.customData});
189 | }
190 | };
191 |
192 | if(!options.html)
193 | currentCall= $.ajax({
194 | type: "GET",
195 | cache:options.cache,
196 | context:target,
197 | url: targetUrl,
198 | timeout:8000,
199 | dataType: "html"})
200 | .done(myDoneFunc)
201 | .fail(function(){
202 | currentCall.abort();
203 | currentCall=null;
204 | $(this).trigger({type:"failrefresh", clickedSelector:options.clickedSelector});
205 | });
206 | else myDoneFunc(options.html);
207 | } else {
208 | target.trigger({type:"donerefresh", clickedSelector:options.clickedSelector});
209 | }
210 |
211 | //CLEAN CURRENT TIMER IF MANUAL FORCE REFRESH
212 | //----------------------------------------------------------------------
213 | var refreshTimer = $.refresh.refreshTimers[targetSelector];
214 | if(options.resetInterval && refreshTimer) {
215 | //if we force the refresh and a timer exists, we clear the current timer
216 | clearInterval(refreshTimer);
217 | delete refreshTimer;
218 | }
219 |
220 | //CHECK IF WE SET A REFRESH INTERVAL TIMER
221 | //----------------------------------------------------------------------
222 | var refreshTimerTime = target.attr('refresh-interval');
223 | if(!refreshTimerTime) return;
224 | refreshTimerTime = parseInt(refreshTimerTime);
225 | if(options.resetInterval && refreshTimerTime>0) {
226 |
227 | //set timer refresh for this target
228 | $.refresh.refreshTimers[targetSelector] = setInterval(function(){
229 | target.refresh({refresh:true, resetInterval : false});
230 | },refreshTimerTime);
231 | }
232 |
233 | };
234 | })(jQuery);
235 |
236 | // -------------------------------------------------------------------
237 | // NAVIGATE
238 | // -------------------------------------------------------------------
239 | // by default, ajax navigate only if history is taken in charge by html5
240 | window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c ")&&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.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),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;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),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);return 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(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),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=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");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.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),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,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window)
241 |
242 | jQuery.navigate = {
243 | active:false,
244 | historyStates : new Array(),
245 | defaultCache:true,
246 | ajaxLinks : 'a:not(.noAjax)[rel!="external"][target!="_blank"], .ajaxLink',
247 | discreteLinks : 'a:not(.noAjax)[rel!="external"][target!="_blank"], .ajaxLink',
248 | defaultInsertFunction:'defaultRefreshInsert',
249 | stateChanged : function(event){ // Note: We are using statechange instead of popstate
250 | var State = History.getState(false, false);
251 | var reverse = History.getState().internal == false;
252 |
253 | //get target and content
254 | var target = State.data.target ? $(State.data.target) : $("body");
255 | var content = State.data.content ? ' '+State.data.content : '';
256 |
257 | //get previous state
258 | var previousState = null;
259 | if(History.savedStates.length>1)
260 | previousState = History.getStateByIndex(-2);
261 |
262 | if(previousState ==null) {
263 | //first load
264 | //transform clicks to discrete clicks
265 | $("body").find($.navigate.discreteLinks).each(function(){
266 | $(this).discreteClick();
267 | });
268 | $("body").refresh({refresh:false});
269 | return;
270 | } else {
271 | var previousTarget = previousState.data.target ? $(previousState.data.target) : $("body");
272 | previousTarget.stopRefresh();
273 | }
274 | var myOptions = {
275 | refresh:true,
276 | url:State.url,
277 | content:State.data.content,
278 | status:State.data.status,
279 | html:State.data.html,
280 | clickedSelector:State.data.clickedSelector,
281 | callback:function() {
282 | target.find($.navigate.discreteLinks).each(function(){
283 | $(this).discreteClick();
284 | });
285 | },
286 | cache:$.navigate.defaultCache,
287 | customData:State.data.customData
288 | };
289 | if(State.data.insert) myOptions.refreshInsertFunction = State.data.insert;
290 | target.refresh(myOptions);
291 |
292 | //done
293 | return false;
294 | },
295 | init:function(options) {
296 | options = $.extend(
297 | {
298 | ajaxLinks : this.ajaxLinks,
299 | discreteLinks : this.discreteLinks,
300 | defaultInsertFunction:$.navigate.defaultInsertFunction
301 | },options);
302 | this.active = options.active;
303 | this.defaultInsertFunction = options.defaultInsertFunction;
304 | this.ajaxLinks = options.ajaxLinks;
305 | this.discreteLinks = options.discreteLinks;
306 |
307 | if(typeof options.active == "undefined") {
308 | if(typeof Modernizr == "undefined") {
309 | console.log('if not specified any other "active" parameter, navigate tests Modernizr.history to get active, Modernizr undefined => navigate will not get active')
310 | this.active = false;
311 | } else {
312 | this.active = Modernizr.history;
313 | }
314 | }
315 | if(!this.active) {
316 | $("body").trigger("donerefresh");
317 | return;
318 | }
319 | // Prepare HISTORY
320 | var History = window.History; // Note: We are using a capital H instead of a lower h
321 | if ( !History.enabled ) {
322 | // History.js is disabled for this browser.
323 | // This is because we can optionally choose to support HTML4 browsers or not.
324 | return false;
325 | }
326 | //Navigate when click
327 | $("html").on("click",$.navigate.ajaxLinks, function(e) {
328 | var that = $(this);
329 | return that.navigate();
330 | });
331 |
332 | // Bind to StateChange Event
333 | History.Adapter.bind(window,'statechange',$.navigate.stateChanged);
334 |
335 | //push the first state
336 | $.navigate.stateChanged();
337 | }
338 | };
339 | (function($) {
340 | // get unique selector as #id if have id otherwise create id and return the proper selector
341 | $.fn.getSelector = function(){
342 | var me=$(this);
343 | if(me.is("body")) {return 'body';} else
344 | if(!$.isWindow(me[0])){
345 | var toReturn = me.attr('id'); if(!toReturn){toReturn = "me-" + Math.floor(Math.random()*1000000); me.attr('id', toReturn);}
346 | me=null;
347 | return '#'+toReturn;
348 | } else {me=null;return window;} //this is the window
349 | };
350 | $.fn.discreteClick = function(){
351 | var that = $(this);
352 | if(that.attr("href") !="javascript://") {
353 | that.attr("ajax-href", that.attr("href"));
354 | that.attr("href", "javascript://");
355 | }
356 | };
357 |
358 | /**
359 | * This function navigate in ajax thanks to the data of this element
360 | * target : the jquery selector in which we insert the data
361 | * href : the url from which we take the data
362 | * content : the jquery selector in the href page from which we take the data
363 | * title : the page new title
364 | **/
365 | $.fn.navigate = function(options){
366 | var me = $(this);
367 | var baseOptions = {
368 | html:null
369 | };
370 |
371 | /* get the href */
372 | //cancel if this is a js link only
373 | var href=me.attr('ajax-href');
374 | if(!href) href=me.attr('href');
375 |
376 | if(href =="javascript://") return true;
377 | if(!href) href = document.location.href;
378 |
379 |
380 | //ie add the absolute location on href attribute
381 | var base = window.location.href.substring(0, window.location.href.lastIndexOf("/") + 1);
382 | href = href.replace(base, "");
383 |
384 |
385 | //don't do anything on links with rel="external" or target = blank or target of potential other domain
386 | baseOptions.url = href;
387 |
388 | /* get the ajax content */
389 | var content = me.attr('ajax-content');
390 | if(!content) content = 'body';
391 | baseOptions.content = content;
392 |
393 | /* get the target */
394 | var target = me.attr('ajax-target');
395 | if(!target) target = me.attr("target");
396 | if(!target) target = "body";
397 | baseOptions.target = target;
398 |
399 | /* get the title */
400 | var title = me.attr('title');
401 | if(!title) title=document.title;
402 | baseOptions.title = title;
403 |
404 | /* get the status */
405 | var status = $(target).attr('refresh-status');
406 | if(!status) status=null;
407 | baseOptions.status = status;
408 |
409 | /* get the insert method */
410 | var insert = me.attr('refresh-insert-function');
411 | if(!insert) insert = me.attr('ajax-insert')
412 | if(!insert) insert=null;
413 | baseOptions.insert = insert;
414 |
415 | options = $.extend(baseOptions,options);
416 | History.pushState(
417 | {
418 | target:options.target,
419 | content:options.content,
420 | insert:options.insert,
421 | status:options.status,
422 | clickedSelector:null,
423 | html:options.html,
424 | customData : options.customData
425 | },
426 | options.title, options.url
427 | );
428 |
429 | return false;
430 | };
431 | })(jQuery);
432 | /*
433 | $(document).ready(function() {
434 | //normal use :
435 | $.navigate.init();
436 |
437 | //you can add these parameters :
438 | //$.navigate.init({
439 | // active: any test you want returning a boolean (by default : Modernizr.history),
440 | // ajaxLinks : 'any selector you want for your ajax links',
441 | // defaultInsertFunction:'any jquery object attached function you want'
442 | //});
443 | }); */
444 |
--------------------------------------------------------------------------------
/example/list.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | List
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
33 |
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/navigate.js:
--------------------------------------------------------------------------------
1 | // by default, ajax navigate only if history is taken in charge by html5
2 | window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c ")&&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.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),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;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),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);return 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(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),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=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");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.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),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,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window)
3 |
4 | //-------------------------------------------------------------------
5 | //REFRESH
6 | //-------------------------------------------------------------------
7 | jQuery.refresh = {
8 | ajaxCalls : new Array(),
9 | refreshTimers : new Array(),
10 | defaultCache : false
11 | };
12 | (function($) {
13 | // get unique selector as #id if have id otherwise create id and return the proper selector
14 | $.fn.getSelector = function(){
15 | var me=$(this);
16 | if(me.is("body")) {return 'body';} else
17 | if(!$.isWindow(me[0])){
18 | var toReturn = me.attr('id'); if(!toReturn){toReturn = "me-" + Math.floor(Math.random()*1000000); me.attr('id', toReturn);}
19 | me=null;
20 | return '#'+toReturn;
21 | } else {me=null;return window;} //this is the window
22 | };
23 | $.fn.stopRefresh = function(options){
24 | var target = $(this);
25 | target.trigger("stoprefresh");
26 | var targetSelector = target.getSelector();
27 | var targetRefreshTimer = $.refresh.refreshTimers[targetSelector];
28 | //first reset the timer
29 | if(targetRefreshTimer) {
30 | clearInterval(targetRefreshTimer);
31 | delete targetRefreshTimer;
32 | }
33 | //then reset the current call
34 | var currentCall = $.refresh.ajaxCalls[targetSelector];
35 | if(currentCall) {
36 | currentCall.abort();
37 | delete currentCall;
38 | }
39 | };
40 | $.fn.defaultRefreshInsert = function(options) {
41 | //options = {html:value, scripts:value}
42 | $(this).html(options.html);
43 | $(this).trigger({type:"finishrefreshinsert"});
44 |
45 | };
46 | $.fn.refresh = function(options){
47 | var target = $(this);
48 | var targetSelector = target.getSelector();
49 | if(typeof options == "boolean") {
50 | options = {refresh:options};
51 | //force refresh : options=true or options.refresh==true
52 | }
53 | //else if(typeof options=="undefined") options = {};
54 | options = $.extend(
55 | {
56 | html : null,
57 | refresh : target,
58 | resetInterval : true,
59 | url : null,
60 | content:targetSelector,
61 | clickedSelector:$(this).getSelector(),
62 | callback:function(){},
63 | cache:$.refresh.defaultCache,
64 | insertFunction:$.navigate.defaultInsertFunction,
65 | customData:null,
66 | timeout:8000
67 | },options);
68 |
69 |
70 | //WE REFRESH OR NOT
71 | //----------------------------------------------------------------------
72 | //check if we do have to refresh
73 | var refreshFunction = target.attr("data-refresh-function");
74 | if(typeof refreshFunction != "undefined") {
75 | //SWITCH CONTENT
76 | if(target[refreshFunction]) target[refreshFunction]();
77 | else refreshFunction();
78 | } else if(options.refresh) {
79 | var currentCall = $.refresh.ajaxCalls[targetSelector];
80 | if(currentCall) {
81 | target.trigger("stoprefresh");
82 | currentCall.abort();
83 | }
84 |
85 | //get the url to call, in order :
86 | //1 - the option
87 | //2 - the refresh-url attribute
88 | //3 - the current location
89 | var targetUrl = options.url;
90 | if(!targetUrl) {
91 | var refreshUrl = target.attr("data-refresh-url");
92 | if(refreshUrl) targetUrl = refreshUrl;
93 | else targetUrl = window.location.href;
94 | }
95 | var myRefreshId = target.attr("data-refresh-id");
96 | target.trigger({type:"startrefresh", clickedSelector:options.clickedSelector});
97 |
98 | var myDoneFunc = function(data) {
99 | currentCall = null;
100 | //Remove the body tag not to load all scripts and header of the loaded page
101 | //-------------------------------------------------------------------------
102 | var re = //;
103 | var check=data.match(re);
104 | if(check && check.length>0) {
105 | check=check[0].replace(/^$/, 'div>');
107 | } else check=data;
108 |
109 | //GET THE HEAD
110 | var re = //;
111 | var headHtml=data.match(re);
112 | if(headHtml && headHtml.length>0) {
113 | headHtml=headHtml[0].replace(/^$/, 'div>');
115 | headHtml = $(headHtml).html()
116 | } else headHtml="";
117 |
118 | //Remove the scripts tags
119 | //-------------------------------------------------------------------------
120 | var noscripts = check.match(/]*>([\s\S]*?)<\/noscript>/gm);
121 | check = check.replace(new RegExp('', 'g'),'div>');
123 |
124 | var scripts = check.match(/