Advertisement
Guest User

Untitled

a guest
Jul 6th, 2014
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 148.50 KB | None | 0 0
  1. // ==UserScript==
  2. // @name PageZipper
  3. // @namespace http://userstyles.org
  4. // @description autopagerize
  5. // @author pagezipper
  6. // @homepage http://userstyles.org/styles/15692
  7. // @include http://*
  8. // @include https://*
  9. // ==/UserScript==
  10.  
  11. /** PageZipper - www.printwhatyoulike.com/pagezipper
  12. * A bookmarklet to make any page infinte scroll
  13. * Written by Jonathan Koomjian (jonathan@printwhatyoulike.com)
  14. *
  15. * You are free to reuse this software.
  16. * Please be friendly and include a link back to the PageZipper
  17. * homepage (http://www.printwhatyoulike.com/pagezipper) on
  18. * the website of any software which incorporates PageZippper code.
  19. *
  20. * PageZipper is open source
  21. * Contributions are welcome - https://github.com/jkoomjian/PageZipper
  22. *
  23. *
  24. * Version 0.8 - April 16, 2014
  25. *
  26. * /; ;\
  27. * __ \\____//
  28. * /{_\_/ `'\____
  29. * \___ (o) (o }
  30. * _____________________________/ :--'
  31. * ,-,'`@@@@@@@@ @@@@@@ \_ `__\
  32. * ;:( @@@@@@@@@ @@@ \___(o'o)
  33. * :: ) @@@@ @@@@@@ ,'@@( `===='
  34. * :: : @@@@@: @@@@ `@@@:
  35. * :: \ @@@@@: @@@@@@@) ( '@@@'
  36. * ;; /\ /`, @@@@@@@@@\ :@@@@@)
  37. * ::/ ) {_----------------: :~`,~~;
  38. * ;;'`; : ) : / `; ;
  39. * ;;; : : ; : ; ; :
  40. * `'` / : : : : : :
  41. * )_ \__; ";" :_ ; \_\ `,','
  42. * :__\ \ * `,'* \ \ : \ * 8`;'* *
  43. * `^' \ :/ `^' `-^-' \v/ : \/
  44. *
  45. *
  46. */
  47.  
  48.  
  49. /*!
  50. * jQuery JavaScript Library v1.4.4
  51. * http://jquery.com/
  52. *
  53. * Copyright 2010, John Resig
  54. * Dual licensed under the MIT or GPL Version 2 licenses.
  55. * http://jquery.org/license
  56. *
  57. * Includes Sizzle.js
  58. * http://sizzlejs.com/
  59. * Copyright 2010, The Dojo Foundation
  60. * Released under the MIT, BSD, and GPL Licenses.
  61. *
  62. * Date: Thu Nov 11 19:04:53 2010 -0500
  63. */
  64. (function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
  65. h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"||
  66. h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
  67. "`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
  68. e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
  69. "margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
  70. a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
  71. C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
  72. s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
  73. j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
  74. toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
  75. -1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
  76. if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--;
  77. if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
  78. b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
  79. !F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
  80. l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z],
  81. z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j,
  82. s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v=
  83. s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)||
  84. [];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u,
  85. false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
  86. k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
  87. scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
  88. false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
  89. 1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
  90. "none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
  91. c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
  92. else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this,
  93. a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=
  94. c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
  95. a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",
  96. colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===
  97. 1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "),
  98. l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,
  99. "__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
  100. if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r=
  101. a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
  102. attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
  103. b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
  104. c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
  105. arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
  106. d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
  107. c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b=
  108. w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
  109. 8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
  110. "click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
  111. d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
  112. fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
  113. d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
  114. Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
  115. c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
  116. var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
  117. "form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
  118. xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
  119. B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
  120. "file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
  121. 0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
  122. a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
  123. 1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d===
  124. "object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}});
  125. c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
  126. (function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i,
  127. [y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
  128. break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
  129. q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
  130. l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*"));
  131. return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!==
  132. B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
  133. POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()===
  134. i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=
  135. i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g,
  136. "")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
  137. m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
  138. true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
  139. g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]-
  140. 0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n===
  141. "first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
  142. i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
  143. if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
  144. g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1;
  145. for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"),
  146. i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
  147. n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
  148. function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
  149. p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
  150. t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
  151. function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML;
  152. c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},
  153. not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
  154. h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
  155. c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
  156. 2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
  157. b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
  158. e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1,
  159. "<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
  160. c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
  161. wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
  162. prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
  163. this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
  164. return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
  165. else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=
  166. c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a,
  167. b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):
  168. this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",
  169. prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument||
  170. b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length-
  171. 1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));
  172. d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i,
  173. jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,
  174. zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),
  175. h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b);
  176. if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=
  177. d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left;
  178. e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
  179. ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===
  180. "object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
  181. !this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
  182. getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
  183. script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
  184. !T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache=
  185. false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset;
  186. A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?noopenpopup(h,b.url,b.async,b.username,b.password):noopenpopup(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type",
  187. b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
  188. c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
  189. c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]=
  190. encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",
  191. [b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),
  192. e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});
  193. if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",
  194. 3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",
  195. d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,
  196. d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)===
  197. "inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L||
  198. 1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
  199. d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
  200. Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)}
  201. var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
  202. this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
  203. this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
  204. c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
  205. b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
  206. h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle;
  207. for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+=
  208. parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
  209. height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
  210. f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
  211. "marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a,
  212. e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&&
  213. c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
  214. c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+
  215. b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window);
  216.  
  217. function PageZipper() {
  218.  
  219. /*------------------ Configuration -------------------*/
  220. //TODO add non-english synonyms
  221. this.nextSynonyms = [
  222. //beware, the order of this list is referenced elsewhere!
  223. {syn: "next", weight: 100},
  224. {syn: "older", weight: 80},
  225. {syn: "previous", weight: 60},
  226. {syn: "forward", weight: 50},
  227. {syn: "continue", weight: 45},
  228. {syn: ">", weight: 40, humanReadableOnly: true},
  229. {syn: ">>", weight: 30, humanReadableOnly: true},
  230. {syn: "more", weight: 20},
  231. {syn: "page", weight: 10},
  232. {syn: "-1", weight: 0, humanReadableOnly: true, pageBar: true} //for nav bars that list pages 1234, list the next page
  233. ];
  234. this.minimumPageBuffer = 1; //number of unread pages to keep queued
  235. this.minimumPageBufferGallery = 4; //# unread pages with image galleries
  236. this.poster_image_margin_top = 40; //how close from the top edge of the browser should the next poster image be placed
  237. this.poster_image_margin_bottom = 10; //how close from the bottom edge of the browser should the next poster image be placed
  238. this.in_compat_mode = false; //in compat/iframe mode? default is ajax mode
  239. this.debug = false;
  240.  
  241. /*------------------------- PageZipper Instance Variables ------------------*/
  242. this.pages = []; //page, nextLink, posterImg
  243. this.is_running = false;
  244. this.is_loading_page = false;
  245. this.loader_type = "";
  246. this.ctrl_key_pressed = false;
  247. this.curr_next_synonym = null; //keep track of which next synonym we use- then use it only- otherwise when we reach the end of a gallery, we will get the back/previous link
  248. this.onePosterPerPageMode = false;
  249. this.displayMode = "text"; //can be 'image' or 'text' depending on if this is an image gallery
  250. this.currDomain;
  251. this.url_list;
  252. this.media_path;
  253. }
  254. //stashing jQuery here so we can get it out of the global scope - required by FF addon reviewers
  255. PageZipper.jq = jQuery.noConflict(true);
  256.  
  257.  
  258. /*------------------------- Initialize ----------------------*/
  259. PageZipper.prototype.loadPageZipper = function() {
  260.  
  261. //start with some housekeeping
  262. this.jq = PageZipper.jq;
  263. this.ajax = new PageZipperAjax();
  264. this.iframe = new PageZipperIframe();
  265.  
  266. //add in Node value - ff provides these, but they do not exist for the extension ?!?! Or for IE
  267. if (!window['Node']) {
  268. window.Node = {
  269. ELEMENT_NODE: 1,
  270. TEXT_NODE: 3
  271. }
  272. }
  273.  
  274. pgzp().currDomain = pgzp().getDomain(pgzp().win.location.href);
  275. pgzp().url_list = [ pgzp().win.location.href ];
  276. if (pgzp().loader_type != "autorun") {
  277. pgzp().addExistingPage(pgzp().win.location.href, pgzp().doc.body);
  278. pgzp().displayMode = pgzp().calculateDisplayMode(pgzp().pages[0]);
  279. if (pgzp().displayMode == 'image' && pgzp().pages[0].posterImgs.length == 1) {
  280. pgzp().onePosterPerPageMode = true;
  281. pgzp().minimumPageBuffer = pgzp().minimumPageBufferGallery;
  282. }
  283. //Override document.write to prevent additional pages from writing to this closed page and messing everything up! - won't apply in iframes
  284. if (!pgzp().in_compat_mode) {
  285. //FF makes this hard due to security: mikeconley.ca/blog/2009/05/02/overriding-firefox's-windowalert-part-2/ developer.mozilla.org/en/XPCNativeWrapper
  286. var currDoc = pgzp().loader_type == "ffextension" ? document.getElementById('content').contentWindow.wrappedJSObject.document : pgzp().doc;
  287. currDoc.write = currDoc.writeln = currDoc.open = currDoc.close = function(str) { return; };
  288. }
  289. }
  290. }
  291.  
  292. PageZipper.prototype.runPageZipper = function() {
  293. pgzp().jq(pgzp().doc).bind("keydown", this.keyDown)
  294. pgzp().jq(pgzp().doc).bind("keyup", this.keyUp)
  295. if (pgzp().loader_type != "ffextension") pgzp().jq(pgzp().win).bind("resize", this.positionMenu); //gets called on new tab in ffext
  296. pgzp().addMenu();
  297. pgzp().updateButtonState(pgzp().in_compat_mode, 'compat');
  298. this.is_running = pgzp().win.setInterval(pgzp().mainBlock, 250);
  299. }
  300.  
  301. PageZipper.prototype.stopPageZipper = function() {
  302. if (this.is_running) {
  303. pgzp().win.clearInterval(this.is_running);
  304. this.is_running = null;
  305. pgzp().removeMenu();
  306. pgzp().jq(pgzp().doc).unbind("keydown", this.keyDown);
  307. pgzp().jq(pgzp().doc).unbind("keyup", this.keyUp);
  308. if (pgzp().loader_type != "ffextension") pgzp().jq(pgzp().win).unbind("resize", this.positionMenu);
  309.  
  310. //compat only - turn off key bindings added to every iframe
  311. if (pgzp().in_compat_mode) {
  312. for (var i=1; i<pgzp().pages.length; i++){
  313. pgzp().jq(pgzp().pages[i].ifrDoc).unbind("keydown", this.keyDown);
  314. pgzp().jq(pgzp().pages[i].ifrDoc).unbind("keyup", this.keyUp);
  315. }
  316. }
  317. }
  318. }
  319.  
  320. /*------------------------- Main Block ----------------------*/
  321. PageZipper.prototype.mainBlock = function() {
  322. if (!pgzp()) return; //Firefox when we have switched tabs
  323. var currPageIndex = pgzp().getCurrentPage();
  324. var currViewablePage = pgzp().getViewableCurrentPage(currPageIndex);
  325.  
  326. // var nextLinkObj = pgzp().pages[pgzp().pages.length-1]["nextLinkObj"]
  327. // console.log("is loading: " + !pgzp().is_loading_page + "# pages: " + pgzp().pages.length + " nextLink: " + (nextLinkObj ? nextLinkObj.url : 'none') + " currPageIndex: " + currPageIndex + " currViewablePage: " + currViewablePage);
  328.  
  329. pgzp().menuSetCurrPageNumber(currViewablePage + 1);
  330. pgzp().setPageVisibility(currViewablePage);
  331.  
  332. if (!pgzp().is_loading_page &&
  333. pgzp().pages[pgzp().pages.length-1]["nextLinkObj"] && //has next link
  334. ((pgzp().pages.length - currPageIndex - 1) < pgzp().minimumPageBuffer) //scrolling
  335. ) {
  336. pgzp().is_loading_page = true;
  337. pgzp().loadPage( pgzp().pages[pgzp().pages.length-1].nextLinkObj.url );
  338. }
  339. }
  340.  
  341. /*------------------------- Determine Current Page ----------------------*/
  342. //returns the 0-based index of the current displayed page in pgzp().pages
  343. PageZipper.prototype.getCurrentPage = function() {
  344. var i, currPage, currPageTop, currPageBottom;
  345. var currViewBottom = pgzp().screen.getScrollTop() + pgzp().screen.getViewportHeight();
  346. for (i=0; i<pgzp().pages.length; i++) {
  347. currPage = pgzp().pages[i].inPageElem;
  348. currPageTop = pgzp().findPos(currPage).y;
  349.  
  350. //if this is the last elem, calculate from bottom of page, else calculate distance to next page
  351. if (i == (pgzp().pages.length - 1)) {
  352. currPageBottom = pgzp().screen.getDocumentHeight();
  353. //if this is the last page, and page bottom does not extend to bottom, set currPageBottom to currViewBottom
  354. if (currPageBottom < currViewBottom) currPageBottom = currViewBottom;
  355. } else {
  356. currPageBottom = pgzp().findPos( pgzp().pages[ (i+1) ].inPageElem ).y;
  357. }
  358.  
  359. //curr page if we have the following order on the page
  360. // pageTop
  361. // viewBottom
  362. // pageBottom
  363. // pgzp.log("currPageTop: " + currPageTop + " browser bottom: " + currViewBottom + " currPageBottom: " + currPageBottom + " isGood" + (currPageTop <= currViewBottom && currViewBottom <= currPageBottom) + " currPage: " + i);
  364. if (currPageTop <= currViewBottom && currViewBottom <= currPageBottom) {
  365. return i;
  366. }
  367. }
  368. return pgzp().pages.length; //we're at the end of pgzp().pages
  369. }
  370.  
  371. //gets the current page as viewed by user - whichever page takes up the most space on page is current viewable page
  372. PageZipper.prototype.getViewableCurrentPage = function(currPage) {
  373. //update page # once next page takes up more than 50% of space in viewport
  374. var currPageObj = pgzp().pages[currPage];
  375.  
  376. if ((pgzp().findPos(currPageObj.inPageElem).y - Math.abs(pgzp().screen.getScrollTop())) > (pgzp().screen.getViewportHeight() / 2)) {
  377. return currPage - 1;
  378. }
  379. return currPage;
  380. }
  381.  
  382. /*------------------------- Display Mode ----------------------*/
  383.  
  384. PageZipper.prototype.calculateDisplayMode = function(currPage){
  385. var textArea = 0, imgArea = 0;
  386. var i=0, txtP, imgs = {};
  387.  
  388. //first calculate the area of all text on this page
  389. var txtP = pgzp().doc.createElement("div");
  390. txtP.style.clear = "both";
  391. txtP.appendChild( pgzp().doc.createTextNode( pgzp().getAllTextOnPage(currPage.elemContent) ));
  392. pgzp().doc.body.appendChild(txtP);
  393. textArea = txtP.offsetWidth * txtP.offsetHeight;
  394. pgzp().doc.body.removeChild(txtP);
  395.  
  396. //calculate area of poster imgs
  397. if (currPage.posterImgs == null) currPage.posterImgs = pgzp().getPosterImagesOnPage(currPage.elemContent);
  398.  
  399. //make sure we remove all duplicates! This is important for sites like google and yahoo which use the same image multiple times (sprite.png)
  400. for (i=0; i<currPage.posterImgs.length; i++) {
  401. imgs[ currPage.posterImgs[i].src ] = currPage.posterImgs[i];
  402. }
  403.  
  404. for (var imgUrl in imgs) {
  405. var img = imgs[imgUrl];
  406. imgArea += img.offsetHeight * img.offsetWidth;
  407. }
  408.  
  409. //pgzp().log("textArea: " + textArea + " imgArea: " + imgArea + " mode: " + ((textArea >= imgArea) ? "text" : "image"));
  410. return (textArea >= imgArea) ? "text" : "image";
  411. }
  412.  
  413. PageZipper.prototype.getAllTextOnPage = function(pageHtml) {
  414. var str = "";
  415.  
  416. pgzp().depthFirstRecursion(pageHtml, function(curr) {
  417. if (curr.nodeType == Node.TEXT_NODE && curr.parentNode.nodeType == Node.ELEMENT_NODE && typeof(curr.parentNode.tagName) == "string") {
  418. try {
  419. var tagName = curr.parentNode.tagName.toLowerCase();
  420. //filter out obvious bad stuff. could be improved, but works well enough as is
  421. if (tagName == "div" || tagName == "span" || tagName == "p" || tagName == "td")
  422. str += curr.nodeValue + "\n";
  423. } catch (ex) {
  424. console.dir(curr);
  425. }
  426. }
  427. });
  428. return str;
  429. }
  430.  
  431. /*------------------------- Hide Old Pages ----------------------*/
  432. //hide pages farther than 10 pages back. This conserves the browsers resources and
  433. //prevents it from getting slowed down by displaying dozens of pages
  434. //Leave the first page showing, and make sure the current page is always showing
  435. PageZipper.prototype.setPageVisibility = function(currPageIndex) {
  436.  
  437. //make sure the current page is visible
  438. var currPage = pgzp().pages[currPageIndex];
  439. if (currPage.elemContent.style.visibility == "hidden") {
  440. currPage.elemContent.style.visibility = "visible";
  441. }
  442.  
  443. //hide pages farther back than 10 (show the first page)
  444. if (currPageIndex > 5) {
  445. var oldPage = pgzp().pages[currPageIndex - 5];
  446. if (oldPage.elemContent.style.visibility != "hidden") oldPage.elemContent.style.visibility = "hidden";
  447. }
  448. }
  449.  
  450. /* Handle Compatibility Mode */
  451.  
  452. PageZipper.prototype.toggleCompatMode = function() {
  453. pgzp().is_loading_page = true; //don't load any more pages
  454.  
  455. //scroll to top
  456. pgzp().win.scrollTo(0, 0);
  457.  
  458. //update menupgzp().addIframePlaceholder();
  459. pgzp().menuIncrementPagesLoaded(1);
  460.  
  461. //remove all loaded pages - except existing page!
  462. while (pgzp().pages.length > 1) {
  463. var currPage = pgzp().pages.pop();
  464. pgzp().jq( currPage.elemContent ).remove();
  465. pgzp().url_list.pop();
  466. }
  467.  
  468. //set compat mode
  469. pgzp().in_compat_mode = !pgzp().in_compat_mode;
  470.  
  471. //make sure we have the iframe placeholder
  472. if (pgzp().jq(pgzp().doc).find("#pgzp_iframe_placeholder").length == 0) {
  473. pgzp().addIframePlaceholder();
  474. }
  475.  
  476. //update menu
  477. pgzp().updateButtonState(pgzp().in_compat_mode, 'compat');
  478.  
  479. pgzp().is_loading_page = false; //resume
  480. }
  481.  
  482.  
  483. /*------------------------- Image Stuff ----------------------*/
  484. //return array of all poster images on page
  485. PageZipper.prototype.getPosterImagesOnPage = function(page) {
  486. var posterImgs = [], filteredImages = [];
  487. var okImgDomains = {"www.flickr.com": 1};
  488. var isFillerImg = function(img) {
  489.  
  490. //ignore all images of size less than 100x100 - these can't possibly be big enough to be poster images
  491. if ( (img.offsetWidth * img.offsetHeight) < (100 * 100) ) {
  492. filteredImages.push(img);
  493. return true;
  494. }
  495.  
  496. //ignore images which are links to different domains - ie ads, widgets, or logos pointing to home page
  497. var p = img.parentNode;
  498. if (p.nodeType == Node.ELEMENT_NODE && p.tagName.toLowerCase() == "a") {
  499. //pgzp().log("domain: " + pgzp().getDomain(p.href) + " diff domain: " + (pgzp().getDomain(p.href) != pgzp().currDomain) + " home: " + (p.href == ('http://' + pgzp().currDomain)));
  500. if (pgzp().getDomain(p.href) != pgzp().currDomain && okImgDomains[pgzp().getDomain(p.href)] != 1) {
  501. return true;
  502. }
  503. }
  504.  
  505. return false;
  506. }
  507.  
  508. var getBiggestImg = function(imgs) {
  509. var biggestImg = null;
  510. for (var i=0; i<imgs.length; i++) {
  511. if (biggestImg == null || ((imgs[i].offsetWidth * imgs[i].offsetHeight) > (biggestImg.offsetWidth * biggestImg.offsetHeight))) {
  512. biggestImg = imgs[i];
  513. }
  514. }
  515. return biggestImg;
  516. }
  517.  
  518. //get all images on given page
  519. var imgs = pgzp().convertToArray( page.getElementsByTagName("img") );
  520. //pgzp().logList(imgs, "#imgs: " + imgs.length + " + urls", "#{o.src}: #{o.parentNode.tagName} url: #{o.parentNode.href}");
  521.  
  522. //filter out unimportant images
  523. pgzp().filter(imgs, isFillerImg);
  524. //pgzp().logList(imgs, "#imgs: " + imgs.length + " + urls after filter", "#{o.src}: #{o.parentNode.tagName} url: #{o.parentNode.href}");
  525.  
  526. if (imgs.length < 2) return imgs; //if 0 or 1 imgs, just return
  527.  
  528. //sort by size
  529. imgs.sort(function(a, b) {
  530. var sizeA = a.offsetWidth * a.offsetHeight;
  531. var sizeB = b.offsetWidth * b.offsetHeight;
  532. return sizeB - sizeA;
  533. });
  534. //pgzp().logList(imgs, "imgs ordered by size", "#{o.offsetWidth * o.offsetHeight}\t#{o.src}");
  535.  
  536. //if just 1 img per page, return biggest img
  537. if (pgzp().onePosterPerPageMode) return [ imgs[0] ];
  538.  
  539. //Add back in the largest filtered image
  540. //the idea here is that we are looking for a series of large images, all about the same size
  541. //we find these by comparing to the sizes of the other images on the page, and finding the largest gaps between image sizes
  542. //so we need 1 image we know is outside the group to compare against
  543. //since biggestSmallImg image is smallest in imgs, it will always get filtered out
  544. var biggestSmallImg = getBiggestImg(filteredImages);
  545. if (biggestSmallImg) imgs.push(biggestSmallImg);
  546.  
  547. //mark the largest gap in size between image sizes, then delete all images after the gap
  548. var biggestGap = [0, 1]; //gap, index of bigger elem
  549. for (var i=1; i<imgs.length; i++) {
  550. var bigger = imgs[i-1], biggerSize = bigger.offsetHeight * bigger.offsetWidth;
  551. var smaller = imgs[i], smallerSize = smaller.offsetHeight * smaller.offsetWidth;
  552. var relGap = (biggerSize == 0 || smallerSize == 0 ? 0 : (biggerSize / smallerSize)), absGap = (biggerSize - smallerSize), totalGap = (relGap * absGap);
  553. //pgzp().log("rel gap: " + relGap + " abs gap: " + absGap + " total gap: " + totalGap + " smallerSize: " + smallerSize + " biggerSize: " + biggerSize + " smaller img: " + imgs[i].src);
  554. if (totalGap >= biggestGap[0]) {
  555. biggestGap = [totalGap, i];
  556. }
  557. }
  558.  
  559. //remove all images after the gap
  560. //pgzp().log("biggest gap: " + biggestGap[0] + " at img: " + imgs[biggestGap[1]].src);
  561. imgs.splice(biggestGap[1], (imgs.length - biggestGap[1]) );
  562.  
  563. //return poster imgs, ordered by y position - top to bottom
  564. imgs.sort(function(a, b) {
  565. return pgzp().findPos(a).y - pgzp().findPos(b).y;
  566. });
  567. //pgzp().logList(imgs, "#poster imgs: " + imgs.length + " ordered by y", "#{pgzp().findPos(o).y}\t#{o.src}");
  568.  
  569. return imgs;
  570. }
  571.  
  572. //if a given image is taller than the viewport, resize the image to fit perfectly in the viewport
  573. PageZipper.prototype.resizeImageToViewport = function(img) {
  574. var usableViewport = pgzp().screen.getViewportHeight() - pgzp().poster_image_margin_top - pgzp().poster_image_margin_bottom;
  575. if (img.offsetHeight > usableViewport) {
  576. //scale image
  577. img.style.width = ( usableViewport / img.offsetHeight ) * img.offsetWidth + 'px';
  578. img.style.height = usableViewport + 'px';
  579. }
  580. }
  581.  
  582. //go to the next poster image
  583. //TODO combine goToNext and goToPrevious
  584. PageZipper.prototype.goToNextPosterImage = function() {
  585. var browserBorderTop = pgzp().screen.getScrollTop() + pgzp().poster_image_margin_top + 1; //start looking for next poster image below this line
  586. var top_margin;
  587.  
  588. for (var i=0; i<pgzp().pages.length; i++) {
  589. //calculate the largest image here - we leave this as late as possible b/c all images on page have to be loaded
  590. if (pgzp().pages[i].posterImgs == null) pgzp().pages[i].posterImgs = pgzp().getPosterImagesOnPage(pgzp().pages[i].elemContent);
  591.  
  592. for (var j=0; j<pgzp().pages[i].posterImgs.length; j++) {
  593. var currPosterImg = pgzp().pages[i].posterImgs[j];
  594. var pos = pgzp().findPos(currPosterImg);
  595. //pgzp().log("page " + i + " of " + pgzp.pages.length + " : " + pos.y + " body: " + pgzp.pages[i].page + " " + pgzp.pages[i].page.id);
  596. //array should be ordered top to bottom
  597. if (pos.y > browserBorderTop) {
  598.  
  599. //make sure this is not a centered image
  600. if (currPosterImg["pgzpCenterOffset"] && ((parseInt(currPosterImg["pgzpCenterOffset"], 10) + browserBorderTop) >= pos.y)) continue;
  601.  
  602. pgzp().resizeImageToViewport(currPosterImg);
  603.  
  604. //center image
  605. var center_margin = (pgzp().screen.getViewportHeight() - currPosterImg.offsetHeight) / 2
  606. if (center_margin > pgzp().poster_image_margin_top) {
  607. top_margin = center_margin;
  608. currPosterImg["pgzpCenterOffset"] = center_margin;
  609. } else {
  610. top_margin = pgzp().poster_image_margin_top;
  611. }
  612.  
  613. var amountToScroll = pos.y - top_margin - pgzp().screen.getScrollTop();
  614. pgzp().win.scrollBy(0, amountToScroll);
  615. return;
  616. }
  617. }
  618. }
  619. }
  620.  
  621. PageZipper.prototype.goToPreviousPosterImage = function() {
  622. var browserBorderBottom = pgzp().screen.getScrollTop() + pgzp().screen.getViewportHeight() - pgzp().poster_image_margin_top - 1; //start looking for next poster above below this line
  623. var top_margin;
  624.  
  625. //iterate from bottom to top- find first image w/top above browser top
  626. for (var i=(pgzp().pages.length-1); i>=0; i--) {
  627. if (pgzp().pages[i].posterImgs == null) pgzp().pages[i].posterImgs = pgzp().getPosterImagesOnPage(pgzp().pages[i].elemContent);
  628.  
  629. for (var j=(pgzp().pages[i].posterImgs.length-1); j>=0; j--) {
  630. var currPosterImg = pgzp().pages[i].posterImgs[j];
  631. var pos = pgzp().findPos(currPosterImg);
  632. //array should be ordered top to bottom
  633. if (pos.y < browserBorderBottom) {
  634.  
  635. //make sure this is not a centered image
  636. if (currPosterImg["pgzpCenterOffset"] && ((parseInt(currPosterImg["pgzpCenterOffset"], 10) + pgzp().screen.getScrollTop() - 1) <= pos.y)) continue;
  637.  
  638. pgzp().resizeImageToViewport(currPosterImg);
  639.  
  640. //center image
  641. var center_margin = (pgzp().screen.getViewportHeight() - currPosterImg.offsetHeight) / 2
  642. if (center_margin > pgzp().poster_image_margin_top) {
  643. top_margin = center_margin;
  644. currPosterImg["pgzpCenterOffset"] = center_margin;
  645. } else {
  646. top_margin = pgzp().poster_image_margin_top;
  647. }
  648.  
  649. var amountToScroll = (pos.y - top_margin) - pgzp().screen.getScrollTop();
  650. pgzp().win.scrollBy(0, amountToScroll);
  651. return;
  652. }
  653. }
  654. }
  655. }
  656.  
  657. /*------------------------- Javascript Toolbox by Matt Kruse ----------------------*/
  658. /**
  659. * Copyright (c)2005-2008 Matt Kruse (http://www.javascripttoolbox.com/lib/util/source.php)
  660. *
  661. * Dual licensed under the MIT and GPL licenses.
  662. * This basically means you can use this code however you want for
  663. * free, but don't claim to have written it yourself!
  664. * Donations always accepted: http://www.JavascriptToolbox.com/donate/
  665. *
  666. * Please do not link to the .js files on javascripttoolbox.com from
  667. * your site. Copy the files locally to your server instead.
  668. *
  669. */
  670.  
  671.  
  672. // Util function to default a bad number to 0
  673. // --------------------------------------------------------------------
  674. PageZipper.prototype.zero = function(n) {
  675. return (!pgzp().defined(n) || isNaN(n))?0:n;
  676. };
  677.  
  678. // Determine if a reference is defined
  679. PageZipper.prototype.defined = function(o) {
  680. return (typeof(o)!="undefined");
  681. };
  682.  
  683. /* ******************************************************************* */
  684. /* CSS FUNCTIONS */
  685. /* ******************************************************************* */
  686. PageZipper.prototype.css = (function(){
  687. var css = {};
  688.  
  689. // Convert an RGB string in the form "rgb (255, 255, 255)" to "#ffffff"
  690. css.rgb2hex = function(rgbString) {
  691. if (typeof(rgbString)!="string" || !pgzp().defined(rgbString.match)) { return null; }
  692. var result = rgbString.match(/^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*/);
  693. if (result==null) { return rgbString; }
  694. var rgb = +result[1] << 16 | +result[2] << 8 | +result[3];
  695. var hex = "";
  696. var digits = "0123456789abcdef";
  697. while(rgb!=0) {
  698. hex = digits.charAt(rgb&0xf)+hex;
  699. rgb>>>=4;
  700. }
  701. while(hex.length<6) { hex='0'+hex; }
  702. return "#" + hex;
  703. };
  704.  
  705. // Convert hyphen style names like border-width to camel case like borderWidth
  706. css.hyphen2camel = function(property) {
  707. if (!pgzp().defined(property) || property==null) { return null; }
  708. if (property.indexOf("-")<0) { return property; }
  709. var str = "";
  710. var c = null;
  711. var l = property.length;
  712. for (var i=0; i<l; i++) {
  713. c = property.charAt(i);
  714. str += (c!="-")?c:property.charAt(++i).toUpperCase();
  715. }
  716. return str;
  717. };
  718.  
  719. // Get the currently-applied style of an object - expects propery in dash form - ex. border-left-width
  720. css.getStyle = function(o, property) {
  721. if (o==null) { return null; }
  722. var val = null;
  723. var camelProperty = css.hyphen2camel(property);
  724. // Handle "float" property as a special case
  725. if (property=="float") {
  726. val = css.getStyle(o,"cssFloat");
  727. if (val==null) {
  728. val = css.getStyle(o,"styleFloat");
  729. }
  730. }
  731. else if (o.currentStyle && pgzp().defined(o.currentStyle[camelProperty])) {
  732. val = o.currentStyle[camelProperty];
  733. }
  734. else if (pgzp().win.getComputedStyle) {
  735. val = pgzp().win.getComputedStyle(o,null).getPropertyValue(property);
  736. }
  737. else if (o.style && pgzp().defined(o.style[camelProperty])) {
  738. val = o.style[camelProperty];
  739. }
  740. // For color values, make the value consistent across browsers
  741. // Convert rgb() colors back to hex for consistency
  742. if (/^\s*rgb\s*\(/.test(val)) {
  743. val = css.rgb2hex(val);
  744. }
  745. // Lowercase all #hex values
  746. if (/^#/.test(val)) {
  747. val = val.toLowerCase();
  748. }
  749. return val;
  750. };
  751.  
  752. // Set a style on an object
  753. css.setStyle = function(o, property, value) {
  754. if (o==null || !pgzp().defined(o.style) || !pgzp().defined(property) || property==null || !pgzp().defined(value)) { return false; }
  755. if (property=="float") {
  756. o.style["cssFloat"] = value;
  757. o.style["styleFloat"] = value;
  758. } else if (property=="opacity") {
  759. o.style['-moz-opacity'] = value;
  760. o.style['-khtml-opacity'] = value;
  761. o.style.opacity = value;
  762. if (pgzp().defined(o.style.filter)) {
  763. o.style.filter = "alpha(opacity=" + value*100 + ")";
  764. }
  765. } else {
  766. o.style[css.hyphen2camel(property)] = value;
  767. }
  768.  
  769. return true;
  770. };
  771.  
  772. // Determine if an object or class string contains a given class.
  773. css.hasClass = function(obj,className) {
  774. if (!pgzp().defined(obj) || obj==null || !RegExp) { return false; }
  775. var re = new RegExp("(^|\\s)" + className + "(\\s|$)");
  776. if (typeof(obj)=="string") {
  777. return re.test(obj);
  778. } else if (typeof(obj)=="object" && obj.className) {
  779. return re.test(obj.className);
  780. }
  781. return false;
  782. };
  783.  
  784. // Add a class to an object
  785. css.addClass = function(obj,className) {
  786. if (typeof(obj)!="object" || obj==null || !pgzp().defined(obj.className)) { return false; }
  787. if (obj.className==null || obj.className=='') {
  788. obj.className = className;
  789. return true;
  790. }
  791. if (pgzp().css.hasClass(obj,className)) { return true; }
  792. obj.className = obj.className + " " + className;
  793. return true;
  794. };
  795.  
  796. // Remove a class from an object
  797. css.removeClass = function(obj,className) {
  798. if (typeof(obj)!="object" || obj==null || !pgzp().defined(obj.className) || obj.className==null) { return false; }
  799. if (!pgzp().css.hasClass(obj,className)) { return false; }
  800. var re = new RegExp("(^|\\s+)" + className + "(\\s+|$)");
  801. obj.className = obj.className.replace(re,' ');
  802. return true;
  803. };
  804.  
  805. // Fully replace a class with a new one
  806. css.replaceClass = function(obj,className,newClassName) {
  807. if (typeof(obj)!="object" || obj==null || !pgzp().defined(obj.className) || obj.className==null) { return false; }
  808. pgzp().css.removeClass(obj,className);
  809. pgzp().css.addClass(obj,newClassName);
  810. return true;
  811. };
  812.  
  813. return css;
  814. })();
  815.  
  816.  
  817. /* ******************************************************************* */
  818. /* SCREEN FUNCTIONS */
  819. /* ******************************************************************* */
  820. PageZipper.prototype.screen = (function() {
  821. var screen = {};
  822.  
  823. // Get a reference to the body
  824. screen.getBody = function() {
  825. if (pgzp().doc.body) {
  826. return pgzp().doc.body;
  827. }
  828. if (pgzp().doc.getElementsByTagName) {
  829. var bodies = pgzp().doc.getElementsByTagName("BODY");
  830. if (bodies!=null && bodies.length>0) {
  831. return bodies[0];
  832. }
  833. }
  834. return null;
  835. };
  836.  
  837. // Get the amount that the main document has scrolled from top
  838. screen.getScrollTop = function() {
  839. if (pgzp().doc.documentElement && pgzp().defined(pgzp().doc.documentElement.scrollTop) && pgzp().doc.documentElement.scrollTop>0) {
  840. return pgzp().doc.documentElement.scrollTop;
  841. }
  842. if (pgzp().doc.body && pgzp().defined(pgzp().doc.body.scrollTop)) {
  843. return pgzp().doc.body.scrollTop;
  844. }
  845. return null;
  846. };
  847.  
  848. // Get the height of the entire document
  849. screen.getDocumentHeight = function() {
  850. var body = pgzp().screen.getBody();
  851. var innerHeight = (pgzp().defined(self.innerHeight)&&!isNaN(self.innerHeight))?self.innerHeight:0;
  852. if (pgzp().doc.documentElement && (!pgzp().doc.compatMode || pgzp().doc.compatMode=="CSS1Compat")) {
  853. var topMargin = parseInt(pgzp().css.getStyle(body,'margin-top'),10) || 0;
  854. var bottomMargin = parseInt(pgzp().css.getStyle(body,'margin-bottom'), 10) || 0;
  855. return Math.max(body.offsetHeight + topMargin + bottomMargin, pgzp().doc.documentElement.clientHeight, pgzp().doc.documentElement.scrollHeight, pgzp().zero(self.innerHeight));
  856. }
  857. return Math.max(body.scrollHeight, body.clientHeight, pgzp().zero(self.innerHeight));
  858. };
  859.  
  860. // Get the width of the viewport (viewable area) in the browser window
  861. screen.getViewportWidth = function() {
  862. if (pgzp().doc.documentElement && (!pgzp().doc.compatMode || pgzp().doc.compatMode=="CSS1Compat")) {
  863. return pgzp().doc.documentElement.clientWidth;
  864. } else if (pgzp().doc.compatMode && pgzp().doc.body) {
  865. return pgzp().doc.body.clientWidth;
  866. }
  867. return screen.zero(self.innerWidth);
  868. };
  869.  
  870. // Get the height of the viewport (viewable area) in the browser window
  871. screen.getViewportHeight = function() {
  872. if (!pgzp().win.opera && pgzp().doc.documentElement && (!pgzp().doc.compatMode || pgzp().doc.compatMode=="CSS1Compat")) {
  873. return pgzp().doc.documentElement.clientHeight;
  874. } else if (pgzp().doc.compatMode && !pgzp().win.opera && pgzp().doc.body) {
  875. return pgzp().doc.body.clientHeight;
  876. }
  877. return pgzp().zero(self.innerHeight);
  878. };
  879.  
  880. return screen;
  881. })();
  882.  
  883. /*------------------------ Menu Stuff ----------------------------*/
  884. PageZipper.prototype.addMenu = function() {
  885. var css = " \
  886. #pgzp_menu a, #pgzp_menu a * {border: 0; text-decoration: none;} \
  887. #pgzp_menu {position: fixed; top: 0px; float:left; padding: 0px 5px; background-color: #D3D3D3; color: black; z-index: 2147483647;} \
  888. .pgzp_block {display: block; float: left; line-height: 32px;} \
  889. .pgzp_button {display: block; width: 32px; height: 32px;} \
  890. a.pgzp_button_prev_active {background: transparent url('${media_path}32-gnome-prev.png') no-repeat scroll top left; } \
  891. a:hover.pgzp_button_prev_active {background-image: url('${media_path}32-gnome-prev_red.png'); } \
  892. a.pgzp_button_prev_inactive {background: transparent url('${media_path}32-gnome-prev_gray.png') no-repeat scroll top left; } \
  893. a.pgzp_button_next_active {background: transparent url('${media_path}32-gnome-next.png') no-repeat scroll top left; } \
  894. a:hover.pgzp_button_next_active {background-image: url('${media_path}32-gnome-next_red.png'); } \
  895. a.pgzp_button_next_inactive {background: transparent url('${media_path}32-gnome-next_gray.png') no-repeat scroll top left; } \
  896. #pgzp_button_compat {padding-left: 6px;} \
  897. .pgzp_button_compat_active {background: transparent url('${media_path}compat-mode.png') no-repeat scroll 4px 4px;} \
  898. .pgzp_button_compat_inactive {background: transparent url('${media_path}compat-mode-inactive.png') no-repeat scroll 4px 4px;} \
  899. #pgzp_curr_page {font-size: 24px;} \
  900. #pgzp_loaded_pages {font-size: 18px;} \
  901. ";
  902.  
  903. var html = " \
  904. <div id='pgzp_menu'> \
  905. <a href='javascript:pgzp().goToNext(-1)' id='pgzp_button_prev' class='pgzp_block pgzp_button pgzp_button_prev_active' title='Previous - Cntrl Up or Cntrl <'></a> \
  906. <a href='javascript:pgzp().goToNext(1)' id='pgzp_button_next' class='pgzp_block pgzp_button pgzp_button_next_active' title='Next - Cntrl Down or Cntrl >'></a> \
  907. <div class='pgzp_block' style='padding-left: 5px;'><span id='pgzp_curr_page' title='Current Page'>1</span><span id='pgzp_loaded_pages' title='Pages Loaded'>/1</span></div> \
  908. <a href='javascript:pgzp().toggleCompatMode()' id='pgzp_button_compat' class='pgzp_block pgzp_button pgzp_button_compat_inactive' title='Compatibility Mode - Slower, but less likely to encounter problems'></a> \
  909. <a href='http://www.printwhatyoulike.com/pagezipper' target='_blank' title='PageZipper Home' class='pgzp_block pgzp_button' style='margin-left: -6px'> \
  910. <img src='${media_path}zipper_32.png' alt='PageZipper!' style='border-width: 0px' /> \
  911. </a> \
  912. </div> \
  913. ";
  914.  
  915. //replace ${media_path} with actual value
  916. css = pgzp().jq.trim( css.replace(/\$\{media_path\}/g, pgzp().media_path) );
  917. html = pgzp().jq.trim( html.replace(/\$\{media_path\}/g, pgzp().media_path) );
  918.  
  919. //insert css
  920. var cssElem = pgzp().doc.createElement('style');
  921. cssElem.setAttribute("type", "text/css");
  922. if (cssElem.styleSheet) {
  923. cssElem.styleSheet.cssText = css; //IE only
  924. } else {
  925. cssElem.appendChild( pgzp().doc.createTextNode(css) ); //everyone else
  926. }
  927. pgzp().doc.getElementsByTagName('head')[0].appendChild(cssElem);
  928.  
  929. //insert html
  930. var div = pgzp().doc.createElement("div");
  931. div.innerHTML = html;
  932. div = div.childNodes[0];
  933. pgzp().doc.body.appendChild(div);
  934. pgzp().positionMenu();
  935.  
  936. //make some changes for the extension
  937. if (pgzp().loader_type == "ffextension" || pgzp().loader_type == "chromeext") {
  938. var fixLink = function(linkId, eventHandler) {
  939. var link = pgzp().doc.getElementById(linkId);
  940. link.removeAttribute("href");
  941. pgzp().jq(link).bind("click", eventHandler);
  942. }
  943. fixLink("pgzp_button_prev", pgzp().prevArrow)
  944. fixLink("pgzp_button_next", pgzp().nextArrow)
  945. fixLink("pgzp_button_compat", pgzp().toggleCompatMode)
  946. }
  947. }
  948.  
  949. PageZipper.prototype.positionMenu = function() {
  950. var div = pgzp().doc.getElementById('pgzp_menu');
  951. //if (div) b/c sometimes iframes included by the page call resize
  952. if (div) div.style.left = (pgzp().screen.getViewportWidth() - div.offsetWidth - 30) + 'px';
  953. }
  954.  
  955. PageZipper.prototype.removeMenu = function() {
  956. var menu = pgzp().doc.getElementById('pgzp_menu');
  957. if (menu) pgzp().doc.body.removeChild(menu);
  958. }
  959.  
  960. PageZipper.prototype.menuIncrementPagesLoaded = function(numPages) {
  961. var loadedPages = pgzp().doc.getElementById("pgzp_loaded_pages"), num;
  962. if (loadedPages) {
  963. //just to make this more confusing, parseInt is in window, not window.content in ff-extension
  964. num = parseInt(loadedPages.innerHTML.replace("/", "", "g"), 10);
  965. num = numPages ? numPages : num+1;
  966. loadedPages.innerHTML = "/" + num;
  967. }
  968. }
  969.  
  970. PageZipper.prototype.menuSetCurrPageNumber = function(currPage) {
  971. var currPageObj = pgzp().pages[currPage - 1];
  972. pgzp().doc.getElementById("pgzp_curr_page").innerHTML = currPage;
  973.  
  974. //disable/enable arrows as required
  975. if (pgzp().displayMode == "text") {
  976. pgzp().updateButtonState((currPage != 1), "prev"); //if on first page, prev disabled, else enabled
  977. pgzp().updateButtonState((currPage != pgzp().pages.length), "next"); //if on last page next, disabled, else enabled
  978. } else {
  979. var top = pgzp().screen.getScrollTop();
  980.  
  981. //for prev, only disable when we are above first img on first page
  982. var displayPrev = (pgzp().findPos(pgzp().pages[0].posterImgs[0]).y < top)
  983. pgzp().updateButtonState(displayPrev, "prev");
  984. //for next, disble if currPage == lastPage and we are below last image on page
  985. var disableNext = (currPage == pgzp().pages.length &&
  986. currPageObj.posterImgs &&
  987. pgzp().findPos( currPageObj.posterImgs[ currPageObj.posterImgs.length-1 ] ).y < (top+pgzp().poster_image_margin_top+1)
  988. );
  989. pgzp().updateButtonState(!disableNext, "next");
  990. }
  991. }
  992.  
  993. //buttonName = 'prev' or 'next' or 'compat'
  994. PageZipper.prototype.updateButtonState = function(enable, buttonName) {
  995. var button = pgzp().doc.getElementById("pgzp_button_" + buttonName);
  996. var activeClass = "pgzp_button_" + buttonName + "_active";
  997. var inactiveClass = "pgzp_button_" + buttonName + "_inactive";
  998.  
  999. if (enable) {
  1000. pgzp().css.replaceClass(button, inactiveClass, activeClass);
  1001. } else {
  1002. pgzp().css.replaceClass(button, activeClass, inactiveClass);
  1003. }
  1004.  
  1005. if (buttonName == 'compat') {
  1006. button.title = enable ? button.title.replace('disabled', 'enabled') : button.title.replace('enabled', 'disabled');
  1007. }
  1008. }
  1009.  
  1010. /*------------------------- Menu Events ----------------------*/
  1011. PageZipper.prototype.keyDown = function(event) {
  1012. //pgzp().log("key down: " + event.which, true);
  1013. switch (event.which) {
  1014. //down arrow, >
  1015. case 40:
  1016. case 190:
  1017. if (pgzp().ctrl_key_pressed) {
  1018. pgzp().goToNext(1);
  1019. pgzp().noBubble(event);
  1020. }
  1021. break;
  1022. //up arrow, <
  1023. case 38:
  1024. case 188:
  1025. if (pgzp().ctrl_key_pressed) {
  1026. pgzp().goToNext(-1);
  1027. pgzp().noBubble(event);
  1028. }
  1029. break;
  1030. //seperate handler for cntrl
  1031. //treat apple key like cntrl
  1032. case 17:
  1033. case 224:
  1034. pgzp().ctrl_key_pressed = true;
  1035. break;
  1036. }
  1037. }
  1038.  
  1039. PageZipper.prototype.keyUp = function(event) {
  1040. //pgzp().log("key up: " + event.which, true);
  1041. switch (event.which) {
  1042. //cntrl
  1043. case 17:
  1044. case 224:
  1045. pgzp().ctrl_key_pressed = false;
  1046. break;
  1047. }
  1048. }
  1049.  
  1050. /*------------------------- Page Stuff ----------------------*/
  1051. PageZipper.prototype.goToNext = function(inc){
  1052. var currPageIndex = pgzp().getViewableCurrentPage(pgzp().getCurrentPage());
  1053.  
  1054. if (pgzp().displayMode == 'text') {
  1055. pgzp().goToNextPage(inc, currPageIndex);
  1056. } else {
  1057. if (inc > 0)
  1058. pgzp().goToNextPosterImage();
  1059. else
  1060. pgzp().goToPreviousPosterImage();
  1061. }
  1062. }
  1063.  
  1064. //For FF Extension
  1065. PageZipper.prototype.nextArrow = function(){pgzp().goToNext(1);}
  1066. PageZipper.prototype.prevArrow = function(){pgzp().goToNext(-1);}
  1067.  
  1068. PageZipper.prototype.goToNextPage = function(inc, currPageIndex) {
  1069. var currPage, pos, amountToScroll, ps;
  1070. currPageIndex += inc;
  1071. if (currPageIndex in pgzp().pages) {
  1072. currPage = pgzp().pages[currPageIndex].inPageElem;
  1073. //if currPage has a p elem, scroll to first p
  1074. // ps = currPage.getElementsByTagName("p");
  1075. // //make sure this p is visible
  1076. // if (ps.length > 0 && pgzp().css.getStyle(ps[0], "display") != "none" && pgzp().findPos(ps[0]).y > 10) {
  1077. // amountToScroll = pgzp().findPos(ps[0]).y - pgzp().screen.getScrollTop() - 40; //a little margin
  1078. // } else {
  1079. amountToScroll = pgzp().findPos(currPage).y - pgzp().screen.getScrollTop();
  1080. // }
  1081. pgzp().win.scrollBy(0, amountToScroll);
  1082. }
  1083. }
  1084.  
  1085. /*------------------------- Get Next Page URL ----------------------*/
  1086. //NextLink object we will be scoring
  1087. //isReadableText = human readable content- not url
  1088. PageZipper.prototype.NextLink = function(text, link, alreadyLoaded, isHumanReadableText) {
  1089. this.text = text;
  1090. this.link = link;
  1091. this.syn = '';
  1092. this.isHumanReadableText = (isHumanReadableText == undefined) ? true : isHumanReadableText;
  1093. this.isVisibleText = false; //is this.text visible on the page?
  1094. this.alreadyLoaded = alreadyLoaded;
  1095. this.url = link.href;
  1096. this.finalScore = null;
  1097. this.trialScores = {};
  1098. this.addScore = function(trialName, score, isNormalized) {
  1099. var normalizedKey = isNormalized ? 'normalizedScore' : 'unnormalizedScore';
  1100. if (!this.trialScores[trialName]) this.trialScores[trialName] = {};
  1101. this.trialScores[trialName][normalizedKey] = score;
  1102. }
  1103. this.getScore = function(trialName, isNormalized) {
  1104. //for trials which do not get normalized, just return unnormalized score
  1105. if (isNormalized && pgzp().trials[trialName].noNormailization) isNormalized = false;
  1106. var normalizedKey = isNormalized ? 'normalizedScore' : 'unnormalizedScore';
  1107. return this.trialScores[trialName][normalizedKey];
  1108. }
  1109. this.calculateTotalScore = function() {
  1110. this.finalScore = 0;
  1111. if (pgzp().debug) var debugStr = "Calculate Final Score: " + this.text + ": " + this.url;
  1112. for (var trial in this.trialScores) {
  1113. if (pgzp().trials.hasOwnProperty(trial)) {
  1114. var nScore = this.getScore(trial, true);
  1115. var weight = pgzp().trials[trial].weight;
  1116. this.finalScore += nScore * weight;
  1117. if (pgzp().debug) debugStr += "\n\t" + trial + "\t\t\t" + nScore + "\tx\t" + weight + "\t=\t" + (nScore * weight);
  1118. }
  1119. }
  1120. //pgzp().log(debugStr + "\nFinal Score:\t" + this.finalScore);
  1121. return this.finalScore;
  1122. }
  1123. this.isSynNumber = function() {
  1124. return pgzp().isNumber(this.syn);
  1125. }
  1126. }
  1127.  
  1128. //Trials - These are the tests we will use to score the links
  1129. PageZipper.prototype.trials = {
  1130. 'contains_next_syn': {
  1131. 'doScore': function(nextLink) {
  1132. var i, currWord, score = 0;
  1133. for (i=0; i<pgzp().nextSynonyms.length; i++) {
  1134. currWord = pgzp().nextSynonyms[i];
  1135. //+ for containing a keyword
  1136. if (nextLink.text.toLowerCase().indexOf(currWord.syn) >= 0) {
  1137. if (currWord['humanReadableOnly']) {
  1138. if (
  1139. !nextLink.isHumanReadableText || //don't allow index as syn on urls
  1140. nextLink.text.toLowerCase().indexOf("comment") >= 0 //blogs often say something link '2 comments' - ignore this
  1141. ) continue;
  1142. }
  1143. //make sure syns are not included as part of something else - ex 'page 2', not '2009', 'older' not placeholder.jpg
  1144. //for human readable, identify breaks by whitespace, for non-human readable, use any non a-z character
  1145. //'next' is never used outside its meaning, so dont worry about it
  1146. if (currWord.syn != "next" && !pgzp().isStandaloneWord(currWord.syn, nextLink.text, nextLink.isHumanReadableText)) continue;
  1147. if (currWord['pageBar'] && !nextLink.isPageBar) continue; //if this is a # from page bar, make sure this link is actually in page bar
  1148. //pgzp().log("adding syn: " + currWord.syn + " to " + nextLink.url);
  1149. if (currWord.weight >= score) {
  1150. score = currWord.weight; //assign weight for keyword used
  1151. nextLink.syn = currWord.syn;
  1152. }
  1153. } else if (!currWord['humanReadableOnly'] && nextLink.url.toLowerCase().indexOf(currWord.syn) >= 0) {
  1154. //also check urls
  1155. if (!pgzp().isStandaloneWord(currWord.syn, nextLink.url, false)) continue;
  1156. if (currWord.weight >= score) {
  1157. score = currWord.weight; //assign weight for keyword used
  1158. nextLink.syn = currWord.syn;
  1159. }
  1160. }
  1161. }
  1162. return score;
  1163. },
  1164. 'weight': 100,
  1165. 'noNormailization': true
  1166. },
  1167. //urls similar to known next urls are more likely to be correct
  1168. 'url_similarity': {
  1169. 'doScore': function(nextLink) {
  1170. var lastUrl, currUrl, shorter, longer, score = 0, notMatchingPos = -1, i;
  1171. lastUrl = pgzp().pages[ pgzp().pages.length-1 ].url;
  1172. currUrl = nextLink.url;
  1173. if (lastUrl.length <= currUrl.length) {
  1174. shorter = lastUrl;
  1175. longer = currUrl;
  1176. } else {
  1177. shorter = currUrl;
  1178. longer = lastUrl;
  1179. }
  1180.  
  1181. //subtract points for differences in length
  1182. score = shorter.length - longer.length;
  1183.  
  1184. //add points for matching chars, remove for different chars
  1185. for (i=0; i<shorter.length; i++) {
  1186. if (shorter.charAt(i) == longer.charAt(i)) {
  1187. score++;
  1188. } else {
  1189. score--;
  1190. if (notMatchingPos < 0) notMatchingPos = i;
  1191. }
  1192. }
  1193.  
  1194. //if the two urls are the same except 1 number, which is off by 1, that is a dead giveaway
  1195. if (notMatchingPos > 0 &&
  1196. pgzp().isNumber(longer.charAt(notMatchingPos)) && pgzp().isNumber(shorter.charAt(notMatchingPos)) &&
  1197. (Math.abs(pgzp().getNumberAtPos(shorter, notMatchingPos) - pgzp().getNumberAtPos(longer, notMatchingPos)) == 1)
  1198. ) {
  1199. score += 100;
  1200. }
  1201. return score;
  1202. },
  1203. 'weight': 70,
  1204. 'noNormailization': true
  1205. },
  1206. //if multiple links have the same text but point to different urls, they are not next links
  1207. 'duplicate_text': {
  1208. 'doScore': function(nextLink) {
  1209. var score = 100;
  1210. if (pgzp().linkTextIndex[nextLink.text] && pgzp().linkTextIndex[nextLink.text].length > 0) {
  1211. //subtract 20 points for each additional url
  1212. score = score - (pgzp().linkTextIndex[nextLink.text].length - 1) * 20;
  1213. }
  1214. return score;
  1215. },
  1216. 'weight': 60
  1217. },
  1218. 'url_ends_in_number': {
  1219. 'doScore': function(nextLink) {
  1220. var results = nextLink.url.match(/^.*?(\d+)(\/+|\.\w+)?$/);
  1221. //verify url ends in number & number is < 99 - we want /page=3 not /abx43923829
  1222. if (results && (parseInt(results[1], 10) < 99))
  1223. return 100;
  1224. else
  1225. return 0;
  1226. },
  1227. 'weight': 20
  1228. },
  1229. 'begins_or_ends_with_next_syn': {
  1230. 'doScore': function(nextLink) {
  1231. if (nextLink.syn && (pgzp().startsWith(nextLink.syn, nextLink.text.toLowerCase()) || pgzp().endsWith(nextLink.syn, nextLink.text.toLowerCase())))
  1232. return 100;
  1233. else
  1234. return 0;
  1235. },
  1236. 'weight': 20
  1237. },
  1238. 'text_size': {
  1239. 'doScore': function(nextLink) {
  1240. //points for larger size per char
  1241. return Math.floor( (nextLink.link.offsetWidth * nextLink.link.offsetHeight) / nextLink.text.length );
  1242. },
  1243. 'weight': 10
  1244. },
  1245. 'chars_in_text': {
  1246. 'doScore': function(nextLink) {
  1247. //-1pt for each char in text
  1248. return nextLink.text.length * -1;
  1249. },
  1250. 'weight': 10
  1251. }
  1252. };
  1253.  
  1254. PageZipper.prototype.getNextLink = function(body) {
  1255. var allNextLinks = pgzp().getAllScoredLinks(body)
  1256. if (allNextLinks.length <= 0) return null;
  1257.  
  1258. var highestLink = pgzp().getHighestTotalScore(allNextLinks);
  1259.  
  1260. //keep track of the matching next syn - if it changes, assume we are using a different link and have reached the end of the set
  1261. //stop here if highestLink has a different syn than the first link
  1262. if (pgzp().pages.length > 1 && //don't check on first page
  1263. !pgzp().pages[0].nextLinkObj.isSynNumber() && !highestLink.isSynNumber() && //only compare if we are not using page indexes
  1264. pgzp().pages[0].nextLinkObj.syn != highestLink.syn)
  1265. return null;
  1266. return highestLink;
  1267. }
  1268.  
  1269. PageZipper.prototype.getAutorunNextLink = function(body) {
  1270. var scoredLinks = [];
  1271. var allNextLinks = pgzp().getAllScoredLinks(body)
  1272. if (allNextLinks.length <= 0) return null;
  1273.  
  1274. for (var i=0; i<allNextLinks.length; i++) {
  1275. var score = allNextLinks[i].calculateTotalScore();
  1276. scoredLinks.push( [score, allNextLinks[i]] );
  1277. }
  1278.  
  1279. //sort
  1280. scoredLinks.sort(function(a, b){
  1281. return b[0] - a[0];
  1282. });
  1283.  
  1284. // pgzp().log(scoredLinks);
  1285.  
  1286. //make sure the top link has a score of at least 15000
  1287. if (scoredLinks[0][0] < 15000) return null;
  1288.  
  1289. //check if the top link is 30% than the next link
  1290. for (i=1; i<scoredLinks.length; i++) {
  1291.  
  1292. if (scoredLinks[i][1].url == scoredLinks[0][1].url) {
  1293. continue;
  1294. }
  1295.  
  1296. //next smallest link must be at least 30% smaller
  1297. if ( (scoredLinks[i][0] / scoredLinks[0][0]) > .7) {
  1298. return null;
  1299. } else {
  1300. return scoredLinks[0][1];
  1301. }
  1302. }
  1303.  
  1304. //only 1 good link
  1305. return scoredLinks[0][1];
  1306. }
  1307.  
  1308. PageZipper.prototype.getAllScoredLinks = function(body) {
  1309. var allNextLinks = pgzp().getAllNextLinks(body);
  1310. var pageBarInfo = pgzp().getCurrentPageNumberFromPageBar(allNextLinks);
  1311. // pgzp().log("looking for page #: " + (pageBarInfo[0] + 1) + " w/confidence: " + pageBarInfo[1]);
  1312. pgzp().nextSynonyms[pgzp().nextSynonyms.length-1].syn = (pageBarInfo[0] + 1) + ""; //update nextSynonyms
  1313. pgzp().nextSynonyms[pgzp().nextSynonyms.length-1].weight = pageBarInfo[1]; //update weight/confidence
  1314. pgzp().linkTextIndex = pgzp().indexDuplicateLinks(allNextLinks);
  1315. pgzp().filter(allNextLinks, function(link) {return link.alreadyLoaded;}); //filter out already loaded links, needed by pageBar, but not anymore
  1316. pgzp().scoreLinks(allNextLinks);
  1317. pgzp().normalizeLinks(allNextLinks);
  1318. return allNextLinks;
  1319. }
  1320.  
  1321. //get all links and score them
  1322. PageZipper.prototype.scoreLinks = function(allNextLinks) {
  1323. if (pgzp().debug) var debugMsg = '';
  1324. for (var trial in pgzp().trials) {
  1325. if (pgzp().trials.hasOwnProperty(trial)) { //block out stuff added by site with Object.prototype
  1326. for (var i=0; i<allNextLinks.length; i++) {
  1327. allNextLinks[i].addScore(trial, pgzp().trials[trial].doScore(allNextLinks[i]));
  1328. if (pgzp().debug) debugMsg += "\nScore " + trial + " " + allNextLinks[i].text + ": " + allNextLinks[i].getScore(trial);
  1329. //remove any links which scored 0 on containing a keyword - do it here so we don't have to continue scoring links we know are bad
  1330. if (trial == 'contains_next_syn' && allNextLinks[i].getScore('contains_next_syn') <= 0) {
  1331. allNextLinks.splice(i, 1);
  1332. i--;
  1333. }
  1334. }
  1335. }
  1336. }
  1337. // pgzp().log(debugMsg);
  1338. }
  1339.  
  1340. //normalize scores from 1-100
  1341. PageZipper.prototype.normalizeLinks = function(allLinks) {
  1342. for (var trial in pgzp().trials) {
  1343. //block out stuff added by site with Object.prototype, trials not meant to be normailzed
  1344. if (pgzp().trials.hasOwnProperty(trial) && !pgzp().trials[trial].noNormailization) {
  1345. pgzp().normalizeTrialSet(trial, allLinks);
  1346. }
  1347. }
  1348. }
  1349.  
  1350. //takes a trial name, normalizes all scores to between 0 and 100
  1351. PageZipper.prototype.normalizeTrialSet = function(trialName, allLinks) {
  1352. //get highest and lowest scores
  1353. var highest, lowest = 0; //add zero so we don't normalize to 0 and 100 for urls which are 1 char apart
  1354. for (var i=0; i<allLinks.length; i++) {
  1355. var score = allLinks[i].getScore(trialName);
  1356. if (highest == null || score > highest) highest = score;
  1357. if (lowest == null || score < lowest) lowest = score;
  1358. }
  1359.  
  1360. //now normalize
  1361. if (pgzp().debug) var debugMsg = 'Normalizing Trial Set: ' + trialName;
  1362. var curve = (highest == lowest) ? 0 : (100 / (highest - lowest));
  1363. for (var i=0; i<allLinks.length; i++) {
  1364. var score = allLinks[i].getScore(trialName);
  1365. var nScore = Math.floor((score - lowest) * curve);
  1366. allLinks[i].addScore(trialName, nScore, true);
  1367. if (pgzp().debug) debugMsg += "\nNScore " + i + ": " + allLinks[i].text + ": score: " + score + " curve: " + curve + " higest: " + highest + " lowest: " + lowest + " nscore: " + nScore;
  1368. }
  1369. //pgzp().log(debugMsg);
  1370. }
  1371.  
  1372. //calculate total score
  1373. PageZipper.prototype.getHighestTotalScore = function(allNextLinks) {
  1374. var highestScoringLink = null;
  1375. for (var i=0; i<allNextLinks.length; i++) {
  1376. var score = allNextLinks[i].calculateTotalScore();
  1377. if (highestScoringLink == null || score >= highestScoringLink.finalScore) {
  1378. highestScoringLink = allNextLinks[i];
  1379. }
  1380. }
  1381.  
  1382. if (pgzp().debug) {
  1383. var debugMsg = 'Final Score ' + allNextLinks.length;
  1384. allNextLinks.sort(function (a, b) {
  1385. return b.finalScore - a.finalScore;
  1386. });
  1387. for (i=0; i<allNextLinks.length; i++) {
  1388. debugMsg += "\n" + allNextLinks[i].finalScore + ": " + allNextLinks[i].text + ": " + allNextLinks[i].url;
  1389. }
  1390. // pgzp().log(debugMsg);
  1391. }
  1392.  
  1393. return highestScoringLink;
  1394. }
  1395.  
  1396. PageZipper.prototype.getAllNextLinks = function(body) {
  1397. var allNextLinks = [];
  1398. var links = body.getElementsByTagName("a"); //get all the links in the page
  1399.  
  1400. var pageUrl = pgzp().getUrlWOutAnchors( pgzp().pages[ pgzp().pages.length-1 ].url );
  1401. for (var i=0; i<links.length; i++) {
  1402. //ignore all links which point to a different domain than the existing domain
  1403. //pgzp().log("currdomain: " + pgzp().currDomain + " currLink: " + pgzp().getDomain(links[i].href) + " full Link: " + links[i].href + " relative: " + links[i].getAttribute("href"));
  1404. if (
  1405. links[i].href &&
  1406. pgzp().getDomain(links[i].href) == pgzp().currDomain && //link points to this domain
  1407. (links[i].href.indexOf("#") < 0 || pageUrl != pgzp().getUrlWOutAnchors(links[i].href)) //avoid links to an anchor in current page, but include normal links curr page
  1408. ) {
  1409. pgzp().addLinkComponents(links[i], allNextLinks, pgzp().contains(pgzp().url_list, links[i].href)); //mark links we've already loaded
  1410. }
  1411. }
  1412. //pgzp().logList(links, "All Links", "#{o.text}\t#{o.link}");
  1413. return allNextLinks;
  1414. }
  1415.  
  1416. //returns an array of all NextLink texts that could be derived from this link
  1417. PageZipper.prototype.addLinkComponents = function(link, allNextLinks, alreadyLoaded) {
  1418. var NextLink = pgzp().NextLink;
  1419. var search = function(rootNode) {
  1420. for (var i=0; i<rootNode.childNodes.length; i++) {
  1421. var curr = rootNode.childNodes[i];
  1422.  
  1423. //check if this node is useful
  1424. if (curr.nodeType == Node.TEXT_NODE && curr.nodeValue && pgzp().jq.trim(curr.nodeValue).length > 0) {
  1425. var nl = new NextLink(curr.nodeValue, link, alreadyLoaded);
  1426. nl.isVisibleText = true;
  1427. allNextLinks.push(nl);
  1428. //check for image link
  1429. } else if (curr.nodeType == Node.ELEMENT_NODE && curr.tagName.toLowerCase() == "img") {
  1430. if (curr.alt) allNextLinks.push(new NextLink(curr.alt, link, alreadyLoaded));
  1431. if (curr.title) allNextLinks.push(new NextLink(curr.title, link, alreadyLoaded));
  1432. if (curr.src) allNextLinks.push(new NextLink(curr.src, link, alreadyLoaded, false));
  1433. } else {
  1434. //continue
  1435. search(curr);
  1436. }
  1437. }
  1438. }
  1439.  
  1440. if (link.title) allNextLinks.push(new NextLink(link.title, link));
  1441. if (link.alt) allNextLinks.push(new NextLink(link.alt, link));
  1442. search(link);
  1443. }
  1444.  
  1445.  
  1446. //---------------------------------- Page Bar ---------------------------------------
  1447.  
  1448. //determine the current page number from a list of page numbers on the page ie. 1 2 3 4 5
  1449. //returns [page #, confidence]
  1450. PageZipper.prototype.getCurrentPageNumberFromPageBar = function(allNextLinks) {
  1451. var allSequences = [], i = 0, currSeq = [], currNextLink, pageBar, pageBarScore = 0, pageNum, tmpPageBarScore;
  1452. var currPageUrl = pgzp().pages[ pgzp().pages.length-1 ].url;
  1453.  
  1454. //first find all consecutive numerical links, put them in arrays
  1455. for (i=0; i<allNextLinks.length; i++) {
  1456. currNextLink = allNextLinks[i];
  1457. if (currNextLink.isVisibleText) { //only want text which actually appears on the page (one link may have multiple entries in allNextLinks)
  1458. if (pgzp().isNumber(currNextLink.text)) {
  1459. pageNum = parseInt(currNextLink.text, 10);
  1460. if (pageNum >= 0 && pageNum < 1000) {
  1461. currNextLink.pageNum = pageNum;
  1462. currSeq.push(currNextLink);
  1463. }
  1464. } else {
  1465. if (currSeq.length > 0) {
  1466. allSequences.push(currSeq);
  1467. currSeq = [];
  1468. }
  1469. }
  1470. }
  1471. }
  1472. if (currSeq.length > 0) allSequences.push(currSeq);
  1473.  
  1474. //now find the sequence numerical links most likely to be the page bar
  1475. for (i=0; i<allSequences.length; i++) {
  1476. tmpPageBarScore = pgzp().__scorePageBar(allSequences[i]);
  1477. if (tmpPageBarScore >= pageBarScore) {
  1478. pageBarScore = tmpPageBarScore;
  1479. pageBar = allSequences[i];
  1480. }
  1481. }
  1482.  
  1483. if (!pageBar) return [-1, 0]; //no page bar on this page
  1484.  
  1485. //sort pageBar lowest to highest
  1486. pageBar.sort( function(a,b){
  1487. return a.pageNum - b.pageNum;
  1488. });
  1489. // pgzp().logList(pageBar, "indexes ordered by size", "#{o.pageNum}\t#{o.text}");
  1490.  
  1491. //mark pageBar for later
  1492. for (i=0; i<pageBar.length; i++) pageBar[i].isPageBar = true;
  1493.  
  1494. //some page bars include links for the current page- ex. 1 2 3 4 where 1 is a link which is highlighted
  1495. for (i=0; i<pageBar.length; i++) {
  1496. if (pageBar[i].url == currPageUrl) {
  1497. return [pageBar[i].pageNum, 120];
  1498. }
  1499. }
  1500.  
  1501. //there are 3 possibilities
  1502.  
  1503. //curr page is in the middle - detect by finding missing page
  1504. if (pageBar.length >= 2) {
  1505. var currPageNum, prevPageNum = pageBar[0].pageNum;
  1506. for (i=1; i<pageBar.length; i++) {
  1507. currPageNum = pageBar[i].pageNum;
  1508.  
  1509. if (Math.abs(currPageNum - prevPageNum) == 2) {
  1510. //currPage should not have been visited yet - it is the next page.
  1511. //check this to avoid getting tripped up by bad page bars - ex. 1, 2, 3, 5, 6, 8, 9, 12, 13, 14
  1512. //pgzp().log("currNextPage " + currPageNum + " url: " + pageBar[i].url + " visited previously: " + pgzp().contains(pgzp().url_list, pageBar[i].url));
  1513. if (!pgzp().contains(pgzp().url_list, pageBar[i].url)) {
  1514. return [currPageNum - 1, 120];
  1515. }
  1516. } else {
  1517. prevPageNum = currPageNum;
  1518. }
  1519. }
  1520. }
  1521.  
  1522. //curr page is at beginning - detect if first # in sequence is 2 or 1 (page bar starts at 1 or 0)
  1523. if (pageBar[0].pageNum == 2) return [1, 40];
  1524. // if (pageBar[0].pageNum == 1) return [0, 10];
  1525.  
  1526. //curr page is last page
  1527. return [pageBar[pageBar.length-1].pageNum, 30];
  1528. }
  1529.  
  1530. //score page bar
  1531. PageZipper.prototype.__scorePageBar = function(pageBar) {
  1532. var similarityScore = pgzp().trials['url_similarity'].doScore(pageBar[0]);
  1533. var totalScore = pageBar.length + (similarityScore / 20);
  1534. // pgzp().log("page bar length: " + pageBar.length + " sim score: " + similarityScore + " total score: " + totalScore);
  1535. return totalScore;
  1536. }
  1537.  
  1538. //if multiple links have the same text but point to different urls, they are not next links
  1539. //make an array of all text on how many unique urls they point to
  1540. PageZipper.prototype.indexDuplicateLinks = function(allNextLinks) {
  1541. var textIndex = {}; //{text, [urls]}
  1542. var currLink;
  1543. for (var i=0; i<allNextLinks.length; i++) {
  1544. currLink = allNextLinks[i];
  1545. if (textIndex[currLink.text]) {
  1546. if (!pgzp().contains(textIndex[currLink.text], currLink.url)) {
  1547. textIndex[currLink.text].push(currLink.url);
  1548. }
  1549. } else {
  1550. textIndex[currLink.text] = [currLink.url];
  1551. }
  1552. }
  1553. return textIndex;
  1554. }
  1555.  
  1556. /*------------------------- Load Page In Ajax ----------------------*/
  1557. function PageZipperAjax() {
  1558.  
  1559. /*----- Add New Page -----*/
  1560.  
  1561. //takes a url, returns a div containing the body content of the page at url
  1562. this.loadPage = function(url) {
  1563. //load page
  1564. pgzp().jq.ajax({url: url,
  1565. dataType: 'html',
  1566. success: function(data){
  1567. //try to get only the body, but use the entire doc if we cant locate it
  1568. var results = data.match(/<body.*?>([\w\W]*?)<\/body>/i);
  1569. data = (results && results.length >= 2) ? results[1] : data;
  1570. //remove all js to prevent pgzp.doc.write() from messing us up!
  1571. //data = data.replace(/<script[\w\W]*?>[\w\W]*?<\/script>/ig, '').replace(/<script[\w\W]*?\/>/ig, '').replace(/<noscript>([\w\W]*?)<\/noscript>/ig, "$1");
  1572. //pgzp().log("body: " + data);
  1573. pgzp().ajax.processPageAdd(url, data);
  1574. }
  1575. });
  1576. }
  1577.  
  1578. this.processPageAdd = function(url, nextPageData) {
  1579. var nextPage = pgzp().ajax.buildPageFromData(url, nextPageData);
  1580. pgzp().pages.push(nextPage);
  1581. pgzp().url_list.push( nextPage.url ); //track urls we've already loaded, so they don't get loaded again
  1582. pgzp().ajax.copyPage(nextPage.elemContent);
  1583. pgzp().ajax.removeAbsolutePositioning(nextPage.elemContent);
  1584. pgzp().menuIncrementPagesLoaded();
  1585. nextPage.nextLinkObj = pgzp().getNextLink(nextPage.elemContent); //very slow- do this after the page has been loaded
  1586. pgzp().is_loading_page = false;
  1587.  
  1588. //make sure that the page load is working - if the doc height hasn't increased, switch to compat mode
  1589. if (pgzp().pages.length >= 3) {
  1590. var second_page = pgzp().jq( pgzp().pages[1].elemContent );
  1591. var last_page = pgzp().jq( pgzp().pages[pgzp().pages.length-1].elemContent );
  1592. if (last_page.offset().top <= second_page.offset().top) {
  1593. pgzp().toggleCompatMode();
  1594. }
  1595. }
  1596.  
  1597. pgzp().mainBlock(); //continue the loop
  1598. }
  1599.  
  1600. this.buildPageFromData = function(url, data) {
  1601. var page = pgzp().doc.createElement("div");
  1602. page.id = "pgzp_page" + pgzp().pages.length;
  1603. page.style.clear = 'both';
  1604. page.innerHTML = data;
  1605. return pgzp().buildPage(url, page);
  1606. }
  1607.  
  1608. /*----- Utils -----*/
  1609. this.copyPage = function(body) {
  1610. pgzp().doc.body.appendChild(body);
  1611. }
  1612.  
  1613. //switch position: absolute with position: relative
  1614. this.removeAbsolutePositioning = function(body) {
  1615. pgzp().jq( pgzp().doc.body ).children().each(function() {
  1616. if (pgzp().jq(this).css("position") == "absolute") pgzp().jq(this).css("position", "static");
  1617. });
  1618. }
  1619. }
  1620.  
  1621. /*------------------------- Load Page With Iframe ----------------------*/
  1622. function PageZipperIframe() {
  1623.  
  1624. //takes a url, returns a div containing the body content of the page at url
  1625. this.loadPage = function(url) {
  1626. var ifrspan = pgzp().doc.createElement('span');
  1627. //ffextensions really do not like onload - call it in some weird dimension where pgzp() is not defined
  1628. var onloadstr = pgzp().loader_type == "ffextension" ? "" : "onload=\"pgzp().iframe.processPageAddComplete('pgzp_page"+pgzp().pages.length+"')\"";
  1629.  
  1630. ifrspan.innerHTML = "<iframe id='pgzp_page"+pgzp().pages.length+"' class='pgzp_page_added' "+onloadstr+" style='clear: both; display: block; border-width: 0; overflow: hidden;' scroll='no' frameBorder='0'></iframe>";
  1631. var ifr = ifrspan.childNodes[0];
  1632. pgzp().jq(pgzp().doc).find("#pgzp_iframe_placeholder").append(ifr);
  1633. ifr.src = url;
  1634. pgzp().runOnIframeLoad(ifr, pgzp().iframe.processPageAdd);
  1635. ifr.style.width = (pgzp().doc.body.offsetWidth -5) + 'px';
  1636. }
  1637.  
  1638. //Call as soon as Dom is ready
  1639. this.processPageAdd = function() {
  1640. var iframe = pgzp().jq(pgzp().doc).find(".pgzp_page_added").last()[0]; //get the last iframe loaded
  1641. var nextPage = pgzp().buildPage(iframe.src, iframe);
  1642. pgzp().pages.push(nextPage);
  1643. pgzp().url_list.push( nextPage.url ); //track urls we've already loaded, so they don't get loaded again
  1644. pgzp().iframe.setIFrameHeight(nextPage);
  1645. pgzp().menuIncrementPagesLoaded();
  1646. pgzp().jq(nextPage.ifrDoc).bind("keydown", this.keyDown);
  1647. pgzp().jq(nextPage.ifrDoc).bind("keyup", this.keyUp);
  1648. nextPage.nextLinkObj = pgzp().getNextLink( nextPage.elemContent ); //very slow- do this after the page has been loaded
  1649. pgzp().is_loading_page = false;
  1650. }
  1651.  
  1652. //Call once everything is fully loaded
  1653. this.processPageAddComplete = function(ifrId) {
  1654. var page = pgzp().iframe.getPageById(ifrId); //sometimes this is called before the iframe is loaded
  1655. if (page) pgzp().iframe.setIFrameHeight(page);
  1656. }
  1657.  
  1658. this.setIFrameHeight = function(page) {
  1659. page.inPageElem.style.height = pgzp().getDocumentHeight(page.ifrDoc) + 'px';
  1660. }
  1661.  
  1662. //check for abs pos and abs position the iframe if necessary
  1663. this.setAbsolutePositioning = function(page) {
  1664. var origDocH, ifr = page.inPageElem;
  1665.  
  1666. //get the element before this one in doc.body
  1667. var iframes = pgzp().jq(pgzp().doc).find(".pgzp_page_added");
  1668. if (iframes.length >= 2) {
  1669. origDocH = iframes[iframes.length-2].pgzpDocHeightAfterAdd;
  1670. } else {
  1671. origDocH = pgzp().doc.body.pgzpDocHeightAfterAdd;
  1672. }
  1673.  
  1674. var pos = pgzp().findPos(ifr)
  1675. if (pos.y < Math.max(origDocH-50, 10)) {
  1676. ifr.style.position = "absolute";
  1677. ifr.style.top = origDocH + "px";
  1678. ifr.style.left = "0px";
  1679. }
  1680. }
  1681.  
  1682. this.getPageById = function(id) {
  1683. for (var i=0; i<pgzp().pages.length; i++) {
  1684. if (pgzp().pages[i].ifrId && pgzp().pages[i].ifrId == id) {
  1685. return pgzp().pages[i]
  1686. }
  1687. }
  1688. return null;
  1689. }
  1690. }
  1691.  
  1692. /* Determine if the iframe dom is ready
  1693. * we cant use onload b/c that waits until every single file in the html page is loaded - takes forever
  1694. * amazingly, I couldn't find a good solution for this problem on the net
  1695. * this solution is pretty basic, but seems to work
  1696. */
  1697. PageZipper.prototype.runOnIframeLoad = function(iframeElem, callback) {
  1698. pgzp()._ril_ifr = iframeElem;
  1699. pgzp()._ril_callback = callback;
  1700. pgzp()._ril_int = pgzp().win.setInterval(pgzp()._runOnIframeLoad2, 50); //check every 50msec
  1701. }
  1702. PageZipper.prototype._runOnIframeLoad2 = function() {
  1703. var ifrDoc = pgzp()._ril_ifr.contentWindow.document, validReadyStates = /loaded|interactive|complete/;
  1704.  
  1705. //IE seems to not handle interactive state properly - dom is still being created when readyState = interactive
  1706. if (pgzp().jq.browser.msie) {
  1707. validReadyStates = /loaded|complete/
  1708. }
  1709.  
  1710. //pgzp().log("readyState: " + ifrDoc.readyState);
  1711. if (
  1712. ifrDoc.body && //checking for body b/c chrome has a bizarre habit of starting in readyState=complete and then switch to readyState=loading
  1713. ifrDoc.body.childNodes.length > 0 &&
  1714. validReadyStates.test(ifrDoc.readyState)
  1715. ) {
  1716. //Dom has loaded!
  1717. pgzp().win.clearInterval(pgzp()._ril_int);
  1718. pgzp()._ril_callback();
  1719. }
  1720. }
  1721.  
  1722. PageZipper.prototype.buildPage = function(url, elemContent) {
  1723. var page = {
  1724. 'url': url,
  1725. 'elemContent': elemContent, //dom node containing this page's content
  1726. 'nextLinkObj': null, //NextLink obj
  1727. 'posterImgs': null,
  1728. 'inPageElem': elemContent
  1729. };
  1730.  
  1731. //iframe only
  1732. if (elemContent.tagName.toLowerCase() == "iframe") {
  1733. page.ifrWin = elemContent.contentWindow;
  1734. page.ifrDoc = elemContent.contentWindow.document;
  1735. //page.inPageElem = elemContent; //dom elem in base page containing iframe (body on 1st page) - used by findPos
  1736. page.elemContent = page.ifrDoc.body;
  1737. page.ifrDoc.pgzp_iframe_id = elemContent.id;
  1738. page.ifrId = elemContent.id;
  1739. }
  1740.  
  1741. return page;
  1742. }
  1743.  
  1744.  
  1745.  
  1746. //takes a url, returns a div containing the body content of the page at url
  1747. PageZipper.prototype.loadPage = function(url) {
  1748. pgzp().in_compat_mode ? pgzp().iframe.loadPage(url) : pgzp().ajax.loadPage(url);
  1749. }
  1750.  
  1751. PageZipper.prototype.addExistingPage = function(url, body) {
  1752.  
  1753. var nextPage = pgzp().buildPage(url, body);
  1754.  
  1755. if (pgzp().in_compat_mode) {
  1756. pgzp().addIframePlaceholder();
  1757. } else {
  1758. pgzp().ajax.removeAbsolutePositioning(nextPage.elemContent);
  1759. }
  1760.  
  1761. pgzp().pages.push(nextPage);
  1762.  
  1763. //must set this here, else will try to get largest image on all of pgzp.doc.body, which may be multiple pages by the time it is called
  1764. nextPage.posterImgs = pgzp().getPosterImagesOnPage(nextPage.elemContent);
  1765.  
  1766. //very slow- do this after the page has been loaded
  1767. nextPage.nextLinkObj = pgzp().getNextLink(nextPage.elemContent);
  1768.  
  1769. return nextPage;
  1770. }
  1771.  
  1772. PageZipper.prototype.addIframePlaceholder = function() {
  1773. var placeholder = pgzp().jq("<div/>").attr('id', 'pgzp_iframe_placeholder').css({position: 'absolute', top: pgzp().jq(document).height()+'px', left: '0px'});
  1774. pgzp().jq(pgzp().doc.body).append(placeholder);
  1775. }
  1776.  
  1777. /*-------------------------------- Utilities ----------------------*/
  1778.  
  1779. PageZipper.prototype.startsWith = function(pattern, str) {
  1780. return str.indexOf(pattern) === 0;
  1781. }
  1782. PageZipper.prototype.endsWith = function(pattern, str) {
  1783. var d = str.length - pattern.length;
  1784. return d >= 0 && str.lastIndexOf(pattern) === d;
  1785. }
  1786.  
  1787. PageZipper.prototype.log = function(html, override) {
  1788. if (pgzp().debug || override) {
  1789. if (pgzp().win["console"]) {
  1790. pgzp().win.console.log(html);
  1791. return;
  1792. }
  1793.  
  1794. var div = pgzp().doc.createElement("textarea");
  1795. pgzp().doc.body.appendChild(div);
  1796. div.value = html;
  1797.  
  1798. }
  1799. }
  1800.  
  1801. //handles log strings in form "msg: #{o.src}" where o is the object in the list
  1802. PageZipper.prototype.logList = function(list, initialStr, listStr) {
  1803. var interpolate = function (s, o) {
  1804. return s.replace(/\#\{([^}]+)\}/g, function (match, exp) {
  1805. return eval(exp);
  1806. });
  1807. }
  1808.  
  1809. for (var i=0; i<list.length; i++) {
  1810. initialStr += "\n" + interpolate(listStr, list[i]);
  1811. }
  1812. pgzp().log(initialStr);
  1813. }
  1814.  
  1815. PageZipper.prototype.noBubble = function(event) {
  1816. if (event) {
  1817. event.cancelBubble = true; //IE
  1818. if (event.stopPropagation)
  1819. event.stopPropagation(); //Everyone else
  1820. event.returnValue = false; //required by stupid browsers which do not respect cancelling bubbling on arrow keys - IE and Safari
  1821. }
  1822. return event;
  1823. }
  1824.  
  1825. //Find the length of page the user has left to read, in px
  1826. PageZipper.prototype.getRemaningBufferSize = function() {
  1827. //pgzp().log("jtDocH: " + pgzp.screen.getDocumentHeight() + " jtScroll: " + pgzp.screen.getScrollTop() + " jtViewport: " + pgzp.screen.getViewportHeight());
  1828. var left = pgzp().screen.getDocumentHeight() - pgzp().screen.getScrollTop() - pgzp().screen.getViewportHeight();
  1829. if (left < 0) return 0;
  1830. return Math.floor(left);
  1831. }
  1832.  
  1833. //http://www.quirksmode.org/js/findpos.html
  1834. PageZipper.prototype.findPos = function(obj) {
  1835. var curleft = 0, curtop = 0, objOrig = obj;
  1836. if (obj.offsetParent) {
  1837. do {
  1838. curleft += obj.offsetLeft || parseInt(obj.style.left.replace("px", ""), 10) || 0;
  1839. curtop += obj.offsetTop || parseInt(obj.style.top.replace("px", ""), 10) || 0;
  1840. } while (obj = obj.offsetParent);
  1841. }
  1842.  
  1843. //if obj is inside an iframe, curtop will be the pos inside the iframe
  1844. //add the y of the iframe to make currtop absolute
  1845. if (objOrig.ownerDocument != pgzp().win.parent.document) {
  1846. //get iframe
  1847. var ifr = pgzp().doc.getElementById( objOrig.ownerDocument.pgzp_iframe_id );
  1848. if (ifr) {
  1849. var ifrPos = pgzp().findPos(ifr);
  1850. curleft += ifrPos.x;
  1851. curtop += ifrPos.y;
  1852. }
  1853. }
  1854.  
  1855. return {"x": curleft, "y": curtop};
  1856. }
  1857.  
  1858. PageZipper.prototype.getDocumentHeight = function(doc) {
  1859. var body = doc.body, html = doc.documentElement;
  1860. return Math.max( body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight );
  1861. }
  1862.  
  1863. PageZipper.prototype.isNumber = function(str) {
  1864. return str && (typeof(str) == "number" || (typeof(str) == "string" && (str.search(/^\d+$/) >= 0)));
  1865. }
  1866.  
  1867. PageZipper.prototype.getDomain = function(url) {
  1868. if (url.match("http://localhost/")) return "localhost";
  1869.  
  1870. var hna = url.match(/^http[s]?\:\/\/([\S]+?\.\w+)(\/.*)?$/i);
  1871. //absolute url
  1872. if (hna) {
  1873. //remove subdomains if they exist
  1874. var parts = hna[1].split(".");
  1875. if (parts.length > 2)
  1876. return parts[parts.length-2] + "." + parts[parts.length-1];
  1877. return hna[1];
  1878. }
  1879. //javascript
  1880. hna = url.match(/^javascript\:.*$/i);
  1881. if (hna) {
  1882. return null;
  1883. }
  1884. //relative link
  1885. return pgzp().currDomain;
  1886. }
  1887.  
  1888. /* Removes the anchor part of urls */
  1889. PageZipper.prototype.getUrlWOutAnchors = function(url) {
  1890. if (url.indexOf("#") >= 0) {
  1891. var results = url.match(/(.*?)#.*/);
  1892. if (results.length > 0) return results[1];
  1893. }
  1894. return url;
  1895. }
  1896.  
  1897. PageZipper.prototype.convertToArray = function(a) {
  1898. var b = [];
  1899. for (var i=0; i<a.length; i++) b.push(a[i]);
  1900. return b;
  1901. }
  1902.  
  1903. /* Remove all elements from the given array on which filter returns true */
  1904. PageZipper.prototype.filter = function(arr, filter) {
  1905. for (var i=0; i<arr.length; i++) {
  1906. if (filter(arr[i])) {
  1907. arr.splice(i, 1);
  1908. i--;
  1909. }
  1910. }
  1911. }
  1912.  
  1913. PageZipper.prototype.depthFirstRecursion = function(root, callback) {
  1914. for (var i=0; i<root.childNodes.length; i++) {
  1915. //for now only include visible content
  1916. if (root.childNodes[i].nodeType == 3 ||
  1917. (root.childNodes[i].nodeType == 1 && pgzp().css.getStyle(root.childNodes[i], "display") != "none")) {
  1918. pgzp().depthFirstRecursion(root.childNodes[i], callback);
  1919. }
  1920. }
  1921. callback(root);
  1922. }
  1923.  
  1924. PageZipper.prototype.contains = function(ar, obj) {
  1925. if(Array.indexOf){
  1926. return ar.indexOf(obj) != -1;
  1927. } else {
  1928. //stupid IE!!!
  1929. for(var i=0; i<ar.length; i++){
  1930. if(ar[i]==obj){
  1931. return true;
  1932. }
  1933. }
  1934. return false;
  1935. }
  1936. }
  1937.  
  1938. PageZipper.prototype.getContentType = function() {
  1939. var metas = pgzp().doc.getElementsByTagName("head")[0].getElementsByTagName("meta");
  1940. for (var i=0; i<metas.length; i++) {
  1941. if (metas[i].getAttribute("http-equiv") && metas[i].getAttribute("http-equiv").toLowerCase() == "content-type" && metas[i].getAttribute("content"))
  1942. return metas[i].getAttribute("content");
  1943. }
  1944. return null;
  1945. }
  1946.  
  1947. /* Is word an actual word, or is it part of something else
  1948. * ie. isStandaloneWord('older', 'more older entries') => true
  1949. * isStandaloneWord('older', 'update folder settings') => false
  1950. */
  1951. PageZipper.prototype.isStandaloneWord = function(word, text, humanReadable) {
  1952. var delimiter = humanReadable ? "\\s" : "[^a-zA-Z]" ;
  1953. return new RegExp("^(.*" + delimiter + "+)?" + word + "(" + delimiter + "+.*)?$", "i").test(text);
  1954. }
  1955.  
  1956. /* Given a string and a position (0 based), find the full # at that position.
  1957. * ex. ('ab324', 3) returns 324
  1958. * return -1 if no # is found
  1959. */
  1960. PageZipper.prototype.getNumberAtPos = function(str, pos) {
  1961. var currNum = "" + str.charAt(pos);
  1962. var currPos = pos - 1;
  1963.  
  1964. //walk forward
  1965. while(currPos >= 0 && pgzp().isNumber(str.charAt(currPos))) {
  1966. currNum = str.charAt(currPos) + currNum;
  1967. currPos--;
  1968. }
  1969.  
  1970. //walk backward
  1971. currPos = pos + 1;
  1972. while(currPos < str.length && pgzp().isNumber(str.charAt(currPos))) {
  1973. currNum += str.charAt(currPos);
  1974. currPos++;
  1975. }
  1976.  
  1977. return pgzp().isNumber(currNum) ? parseInt(currNum, 10) : -1;
  1978. }
  1979.  
  1980. /*------------------------- Load Bookmarklet ----------------------*/
  1981.  
  1982. /* Get the local copies of all our important variables
  1983. * Required because in FF extension 'window' points to the browser dom window - is global across all tabs
  1984. * window.content is the tab scope */
  1985. function pgzp() {
  1986. return window.currPgzp;
  1987. }
  1988.  
  1989. /*------------------------- Bookmarklet ----------------------*/
  1990.  
  1991. function _pgzpInitBookmarklet() {
  1992. window.currPgzp = new PageZipper();
  1993. pgzp().win = window;
  1994. pgzp().doc = window.document;
  1995. pgzp().loader_type = "bookmarklet";
  1996. //pgzp().media_path = "http://127.0.0.1/pgzp/src/ffextension/skin/";
  1997. pgzp().media_path = "http://www.printwhatyoulike.com/static/pagezipper/ui/";
  1998. pgzp().loadPageZipper();
  1999. }
  2000.  
  2001. function _pgzpToggleBookmarklet() {
  2002. if (pgzp().is_running) {
  2003. pgzp().stopPageZipper();
  2004. } else {
  2005. pgzp().runPageZipper();
  2006. }
  2007. }
  2008.  
  2009. //Start!
  2010. _pgzpInitBookmarklet();
  2011. _pgzpToggleBookmarklet();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement