Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==UserScript==
- // @name PageZipper
- // @namespace http://userstyles.org
- // @description autopagerize
- // @author pagezipper
- // @homepage http://userstyles.org/styles/15692
- // @include http://*
- // @include https://*
- // ==/UserScript==
- /** PageZipper - www.printwhatyoulike.com/pagezipper
- * A bookmarklet to make any page infinte scroll
- * Written by Jonathan Koomjian (jonathan@printwhatyoulike.com)
- *
- * You are free to reuse this software.
- * Please be friendly and include a link back to the PageZipper
- * homepage (http://www.printwhatyoulike.com/pagezipper) on
- * the website of any software which incorporates PageZippper code.
- *
- * PageZipper is open source
- * Contributions are welcome - https://github.com/jkoomjian/PageZipper
- *
- *
- * Version 0.8 - April 16, 2014
- *
- * /; ;\
- * __ \\____//
- * /{_\_/ `'\____
- * \___ (o) (o }
- * _____________________________/ :--'
- * ,-,'`@@@@@@@@ @@@@@@ \_ `__\
- * ;:( @@@@@@@@@ @@@ \___(o'o)
- * :: ) @@@@ @@@@@@ ,'@@( `===='
- * :: : @@@@@: @@@@ `@@@:
- * :: \ @@@@@: @@@@@@@) ( '@@@'
- * ;; /\ /`, @@@@@@@@@\ :@@@@@)
- * ::/ ) {_----------------: :~`,~~;
- * ;;'`; : ) : / `; ;
- * ;;; : : ; : ; ; :
- * `'` / : : : : : :
- * )_ \__; ";" :_ ; \_\ `,','
- * :__\ \ * `,'* \ \ : \ * 8`;'* *
- * `^' \ :/ `^' `-^-' \v/ : \/
- *
- *
- */
- /*!
- * jQuery JavaScript Library v1.4.4
- * http://jquery.com/
- *
- * Copyright 2010, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2010, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Thu Nov 11 19:04:53 2010 -0500
- */
- (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=
- 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"||
- 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,
- "`").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,
- 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,
- "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("<"+
- 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>)?$/,
- 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,
- 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,
- 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},
- 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===
- -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;
- 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--;
- 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",
- 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&&
- !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&&
- 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],
- 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,
- 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=
- 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)||
- [];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,
- 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"),
- 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,
- 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=
- 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=
- 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=
- "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=
- 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);
- 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,
- 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=
- 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,
- 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",
- 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===
- 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," "),
- 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,
- "__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";
- 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=
- 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},
- 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"))&&
- 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};
- 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,
- 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=
- 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("(^|\\.)"+
- 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=
- 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===
- 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===
- "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("(^|\\.)"+
- 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(" "),
- 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||
- 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,
- 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=
- 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};
- 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()!==
- "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,
- 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=
- 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===
- "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]===
- 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,
- 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=
- 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===
- "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}});
- 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){}});
- (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,
- [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];
- 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,
- 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=
- 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("*"));
- 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!==
- 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+\-]*)\))?/,
- 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()===
- 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=
- 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,
- "")+" ";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,
- 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===
- 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"===
- 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]-
- 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===
- "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()===
- 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]];
- 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,
- 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;
- 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"),
- 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);
- 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&&
- 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||
- 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=
- 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?
- 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;
- 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})},
- 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=
- 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):
- 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,
- 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,
- 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&&
- 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,
- "<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=
- 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},
- 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)})},
- 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,
- 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);
- 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;
- 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=
- 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,
- 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")):
- 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",
- 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||
- 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-
- 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"))));
- 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,
- 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,
- 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),
- 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);
- 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=
- 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;
- 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,
- 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===
- "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&&
- !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})},
- 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",
- 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||
- !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=
- 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;
- 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",
- 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&&
- 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||
- 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]=
- 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",
- [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"),
- 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}});
- 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",
- 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",
- 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,
- 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)===
- "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||
- 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,
- 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*
- 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)}
- 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;
- 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||
- 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=
- 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===
- 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&&
- 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;
- 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+=
- 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",
- 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=
- 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,
- "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,
- 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)&&
- 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();
- 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"+
- 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);
- function PageZipper() {
- /*------------------ Configuration -------------------*/
- //TODO add non-english synonyms
- this.nextSynonyms = [
- //beware, the order of this list is referenced elsewhere!
- {syn: "next", weight: 100},
- {syn: "older", weight: 80},
- {syn: "previous", weight: 60},
- {syn: "forward", weight: 50},
- {syn: "continue", weight: 45},
- {syn: ">", weight: 40, humanReadableOnly: true},
- {syn: ">>", weight: 30, humanReadableOnly: true},
- {syn: "more", weight: 20},
- {syn: "page", weight: 10},
- {syn: "-1", weight: 0, humanReadableOnly: true, pageBar: true} //for nav bars that list pages 1234, list the next page
- ];
- this.minimumPageBuffer = 1; //number of unread pages to keep queued
- this.minimumPageBufferGallery = 4; //# unread pages with image galleries
- this.poster_image_margin_top = 40; //how close from the top edge of the browser should the next poster image be placed
- this.poster_image_margin_bottom = 10; //how close from the bottom edge of the browser should the next poster image be placed
- this.in_compat_mode = false; //in compat/iframe mode? default is ajax mode
- this.debug = false;
- /*------------------------- PageZipper Instance Variables ------------------*/
- this.pages = []; //page, nextLink, posterImg
- this.is_running = false;
- this.is_loading_page = false;
- this.loader_type = "";
- this.ctrl_key_pressed = false;
- 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
- this.onePosterPerPageMode = false;
- this.displayMode = "text"; //can be 'image' or 'text' depending on if this is an image gallery
- this.currDomain;
- this.url_list;
- this.media_path;
- }
- //stashing jQuery here so we can get it out of the global scope - required by FF addon reviewers
- PageZipper.jq = jQuery.noConflict(true);
- /*------------------------- Initialize ----------------------*/
- PageZipper.prototype.loadPageZipper = function() {
- //start with some housekeeping
- this.jq = PageZipper.jq;
- this.ajax = new PageZipperAjax();
- this.iframe = new PageZipperIframe();
- //add in Node value - ff provides these, but they do not exist for the extension ?!?! Or for IE
- if (!window['Node']) {
- window.Node = {
- ELEMENT_NODE: 1,
- TEXT_NODE: 3
- }
- }
- pgzp().currDomain = pgzp().getDomain(pgzp().win.location.href);
- pgzp().url_list = [ pgzp().win.location.href ];
- if (pgzp().loader_type != "autorun") {
- pgzp().addExistingPage(pgzp().win.location.href, pgzp().doc.body);
- pgzp().displayMode = pgzp().calculateDisplayMode(pgzp().pages[0]);
- if (pgzp().displayMode == 'image' && pgzp().pages[0].posterImgs.length == 1) {
- pgzp().onePosterPerPageMode = true;
- pgzp().minimumPageBuffer = pgzp().minimumPageBufferGallery;
- }
- //Override document.write to prevent additional pages from writing to this closed page and messing everything up! - won't apply in iframes
- if (!pgzp().in_compat_mode) {
- //FF makes this hard due to security: mikeconley.ca/blog/2009/05/02/overriding-firefox's-windowalert-part-2/ developer.mozilla.org/en/XPCNativeWrapper
- var currDoc = pgzp().loader_type == "ffextension" ? document.getElementById('content').contentWindow.wrappedJSObject.document : pgzp().doc;
- currDoc.write = currDoc.writeln = currDoc.open = currDoc.close = function(str) { return; };
- }
- }
- }
- PageZipper.prototype.runPageZipper = function() {
- pgzp().jq(pgzp().doc).bind("keydown", this.keyDown)
- pgzp().jq(pgzp().doc).bind("keyup", this.keyUp)
- if (pgzp().loader_type != "ffextension") pgzp().jq(pgzp().win).bind("resize", this.positionMenu); //gets called on new tab in ffext
- pgzp().addMenu();
- pgzp().updateButtonState(pgzp().in_compat_mode, 'compat');
- this.is_running = pgzp().win.setInterval(pgzp().mainBlock, 250);
- }
- PageZipper.prototype.stopPageZipper = function() {
- if (this.is_running) {
- pgzp().win.clearInterval(this.is_running);
- this.is_running = null;
- pgzp().removeMenu();
- pgzp().jq(pgzp().doc).unbind("keydown", this.keyDown);
- pgzp().jq(pgzp().doc).unbind("keyup", this.keyUp);
- if (pgzp().loader_type != "ffextension") pgzp().jq(pgzp().win).unbind("resize", this.positionMenu);
- //compat only - turn off key bindings added to every iframe
- if (pgzp().in_compat_mode) {
- for (var i=1; i<pgzp().pages.length; i++){
- pgzp().jq(pgzp().pages[i].ifrDoc).unbind("keydown", this.keyDown);
- pgzp().jq(pgzp().pages[i].ifrDoc).unbind("keyup", this.keyUp);
- }
- }
- }
- }
- /*------------------------- Main Block ----------------------*/
- PageZipper.prototype.mainBlock = function() {
- if (!pgzp()) return; //Firefox when we have switched tabs
- var currPageIndex = pgzp().getCurrentPage();
- var currViewablePage = pgzp().getViewableCurrentPage(currPageIndex);
- // var nextLinkObj = pgzp().pages[pgzp().pages.length-1]["nextLinkObj"]
- // console.log("is loading: " + !pgzp().is_loading_page + "# pages: " + pgzp().pages.length + " nextLink: " + (nextLinkObj ? nextLinkObj.url : 'none') + " currPageIndex: " + currPageIndex + " currViewablePage: " + currViewablePage);
- pgzp().menuSetCurrPageNumber(currViewablePage + 1);
- pgzp().setPageVisibility(currViewablePage);
- if (!pgzp().is_loading_page &&
- pgzp().pages[pgzp().pages.length-1]["nextLinkObj"] && //has next link
- ((pgzp().pages.length - currPageIndex - 1) < pgzp().minimumPageBuffer) //scrolling
- ) {
- pgzp().is_loading_page = true;
- pgzp().loadPage( pgzp().pages[pgzp().pages.length-1].nextLinkObj.url );
- }
- }
- /*------------------------- Determine Current Page ----------------------*/
- //returns the 0-based index of the current displayed page in pgzp().pages
- PageZipper.prototype.getCurrentPage = function() {
- var i, currPage, currPageTop, currPageBottom;
- var currViewBottom = pgzp().screen.getScrollTop() + pgzp().screen.getViewportHeight();
- for (i=0; i<pgzp().pages.length; i++) {
- currPage = pgzp().pages[i].inPageElem;
- currPageTop = pgzp().findPos(currPage).y;
- //if this is the last elem, calculate from bottom of page, else calculate distance to next page
- if (i == (pgzp().pages.length - 1)) {
- currPageBottom = pgzp().screen.getDocumentHeight();
- //if this is the last page, and page bottom does not extend to bottom, set currPageBottom to currViewBottom
- if (currPageBottom < currViewBottom) currPageBottom = currViewBottom;
- } else {
- currPageBottom = pgzp().findPos( pgzp().pages[ (i+1) ].inPageElem ).y;
- }
- //curr page if we have the following order on the page
- // pageTop
- // viewBottom
- // pageBottom
- // pgzp.log("currPageTop: " + currPageTop + " browser bottom: " + currViewBottom + " currPageBottom: " + currPageBottom + " isGood" + (currPageTop <= currViewBottom && currViewBottom <= currPageBottom) + " currPage: " + i);
- if (currPageTop <= currViewBottom && currViewBottom <= currPageBottom) {
- return i;
- }
- }
- return pgzp().pages.length; //we're at the end of pgzp().pages
- }
- //gets the current page as viewed by user - whichever page takes up the most space on page is current viewable page
- PageZipper.prototype.getViewableCurrentPage = function(currPage) {
- //update page # once next page takes up more than 50% of space in viewport
- var currPageObj = pgzp().pages[currPage];
- if ((pgzp().findPos(currPageObj.inPageElem).y - Math.abs(pgzp().screen.getScrollTop())) > (pgzp().screen.getViewportHeight() / 2)) {
- return currPage - 1;
- }
- return currPage;
- }
- /*------------------------- Display Mode ----------------------*/
- PageZipper.prototype.calculateDisplayMode = function(currPage){
- var textArea = 0, imgArea = 0;
- var i=0, txtP, imgs = {};
- //first calculate the area of all text on this page
- var txtP = pgzp().doc.createElement("div");
- txtP.style.clear = "both";
- txtP.appendChild( pgzp().doc.createTextNode( pgzp().getAllTextOnPage(currPage.elemContent) ));
- pgzp().doc.body.appendChild(txtP);
- textArea = txtP.offsetWidth * txtP.offsetHeight;
- pgzp().doc.body.removeChild(txtP);
- //calculate area of poster imgs
- if (currPage.posterImgs == null) currPage.posterImgs = pgzp().getPosterImagesOnPage(currPage.elemContent);
- //make sure we remove all duplicates! This is important for sites like google and yahoo which use the same image multiple times (sprite.png)
- for (i=0; i<currPage.posterImgs.length; i++) {
- imgs[ currPage.posterImgs[i].src ] = currPage.posterImgs[i];
- }
- for (var imgUrl in imgs) {
- var img = imgs[imgUrl];
- imgArea += img.offsetHeight * img.offsetWidth;
- }
- //pgzp().log("textArea: " + textArea + " imgArea: " + imgArea + " mode: " + ((textArea >= imgArea) ? "text" : "image"));
- return (textArea >= imgArea) ? "text" : "image";
- }
- PageZipper.prototype.getAllTextOnPage = function(pageHtml) {
- var str = "";
- pgzp().depthFirstRecursion(pageHtml, function(curr) {
- if (curr.nodeType == Node.TEXT_NODE && curr.parentNode.nodeType == Node.ELEMENT_NODE && typeof(curr.parentNode.tagName) == "string") {
- try {
- var tagName = curr.parentNode.tagName.toLowerCase();
- //filter out obvious bad stuff. could be improved, but works well enough as is
- if (tagName == "div" || tagName == "span" || tagName == "p" || tagName == "td")
- str += curr.nodeValue + "\n";
- } catch (ex) {
- console.dir(curr);
- }
- }
- });
- return str;
- }
- /*------------------------- Hide Old Pages ----------------------*/
- //hide pages farther than 10 pages back. This conserves the browsers resources and
- //prevents it from getting slowed down by displaying dozens of pages
- //Leave the first page showing, and make sure the current page is always showing
- PageZipper.prototype.setPageVisibility = function(currPageIndex) {
- //make sure the current page is visible
- var currPage = pgzp().pages[currPageIndex];
- if (currPage.elemContent.style.visibility == "hidden") {
- currPage.elemContent.style.visibility = "visible";
- }
- //hide pages farther back than 10 (show the first page)
- if (currPageIndex > 5) {
- var oldPage = pgzp().pages[currPageIndex - 5];
- if (oldPage.elemContent.style.visibility != "hidden") oldPage.elemContent.style.visibility = "hidden";
- }
- }
- /* Handle Compatibility Mode */
- PageZipper.prototype.toggleCompatMode = function() {
- pgzp().is_loading_page = true; //don't load any more pages
- //scroll to top
- pgzp().win.scrollTo(0, 0);
- //update menupgzp().addIframePlaceholder();
- pgzp().menuIncrementPagesLoaded(1);
- //remove all loaded pages - except existing page!
- while (pgzp().pages.length > 1) {
- var currPage = pgzp().pages.pop();
- pgzp().jq( currPage.elemContent ).remove();
- pgzp().url_list.pop();
- }
- //set compat mode
- pgzp().in_compat_mode = !pgzp().in_compat_mode;
- //make sure we have the iframe placeholder
- if (pgzp().jq(pgzp().doc).find("#pgzp_iframe_placeholder").length == 0) {
- pgzp().addIframePlaceholder();
- }
- //update menu
- pgzp().updateButtonState(pgzp().in_compat_mode, 'compat');
- pgzp().is_loading_page = false; //resume
- }
- /*------------------------- Image Stuff ----------------------*/
- //return array of all poster images on page
- PageZipper.prototype.getPosterImagesOnPage = function(page) {
- var posterImgs = [], filteredImages = [];
- var okImgDomains = {"www.flickr.com": 1};
- var isFillerImg = function(img) {
- //ignore all images of size less than 100x100 - these can't possibly be big enough to be poster images
- if ( (img.offsetWidth * img.offsetHeight) < (100 * 100) ) {
- filteredImages.push(img);
- return true;
- }
- //ignore images which are links to different domains - ie ads, widgets, or logos pointing to home page
- var p = img.parentNode;
- if (p.nodeType == Node.ELEMENT_NODE && p.tagName.toLowerCase() == "a") {
- //pgzp().log("domain: " + pgzp().getDomain(p.href) + " diff domain: " + (pgzp().getDomain(p.href) != pgzp().currDomain) + " home: " + (p.href == ('http://' + pgzp().currDomain)));
- if (pgzp().getDomain(p.href) != pgzp().currDomain && okImgDomains[pgzp().getDomain(p.href)] != 1) {
- return true;
- }
- }
- return false;
- }
- var getBiggestImg = function(imgs) {
- var biggestImg = null;
- for (var i=0; i<imgs.length; i++) {
- if (biggestImg == null || ((imgs[i].offsetWidth * imgs[i].offsetHeight) > (biggestImg.offsetWidth * biggestImg.offsetHeight))) {
- biggestImg = imgs[i];
- }
- }
- return biggestImg;
- }
- //get all images on given page
- var imgs = pgzp().convertToArray( page.getElementsByTagName("img") );
- //pgzp().logList(imgs, "#imgs: " + imgs.length + " + urls", "#{o.src}: #{o.parentNode.tagName} url: #{o.parentNode.href}");
- //filter out unimportant images
- pgzp().filter(imgs, isFillerImg);
- //pgzp().logList(imgs, "#imgs: " + imgs.length + " + urls after filter", "#{o.src}: #{o.parentNode.tagName} url: #{o.parentNode.href}");
- if (imgs.length < 2) return imgs; //if 0 or 1 imgs, just return
- //sort by size
- imgs.sort(function(a, b) {
- var sizeA = a.offsetWidth * a.offsetHeight;
- var sizeB = b.offsetWidth * b.offsetHeight;
- return sizeB - sizeA;
- });
- //pgzp().logList(imgs, "imgs ordered by size", "#{o.offsetWidth * o.offsetHeight}\t#{o.src}");
- //if just 1 img per page, return biggest img
- if (pgzp().onePosterPerPageMode) return [ imgs[0] ];
- //Add back in the largest filtered image
- //the idea here is that we are looking for a series of large images, all about the same size
- //we find these by comparing to the sizes of the other images on the page, and finding the largest gaps between image sizes
- //so we need 1 image we know is outside the group to compare against
- //since biggestSmallImg image is smallest in imgs, it will always get filtered out
- var biggestSmallImg = getBiggestImg(filteredImages);
- if (biggestSmallImg) imgs.push(biggestSmallImg);
- //mark the largest gap in size between image sizes, then delete all images after the gap
- var biggestGap = [0, 1]; //gap, index of bigger elem
- for (var i=1; i<imgs.length; i++) {
- var bigger = imgs[i-1], biggerSize = bigger.offsetHeight * bigger.offsetWidth;
- var smaller = imgs[i], smallerSize = smaller.offsetHeight * smaller.offsetWidth;
- var relGap = (biggerSize == 0 || smallerSize == 0 ? 0 : (biggerSize / smallerSize)), absGap = (biggerSize - smallerSize), totalGap = (relGap * absGap);
- //pgzp().log("rel gap: " + relGap + " abs gap: " + absGap + " total gap: " + totalGap + " smallerSize: " + smallerSize + " biggerSize: " + biggerSize + " smaller img: " + imgs[i].src);
- if (totalGap >= biggestGap[0]) {
- biggestGap = [totalGap, i];
- }
- }
- //remove all images after the gap
- //pgzp().log("biggest gap: " + biggestGap[0] + " at img: " + imgs[biggestGap[1]].src);
- imgs.splice(biggestGap[1], (imgs.length - biggestGap[1]) );
- //return poster imgs, ordered by y position - top to bottom
- imgs.sort(function(a, b) {
- return pgzp().findPos(a).y - pgzp().findPos(b).y;
- });
- //pgzp().logList(imgs, "#poster imgs: " + imgs.length + " ordered by y", "#{pgzp().findPos(o).y}\t#{o.src}");
- return imgs;
- }
- //if a given image is taller than the viewport, resize the image to fit perfectly in the viewport
- PageZipper.prototype.resizeImageToViewport = function(img) {
- var usableViewport = pgzp().screen.getViewportHeight() - pgzp().poster_image_margin_top - pgzp().poster_image_margin_bottom;
- if (img.offsetHeight > usableViewport) {
- //scale image
- img.style.width = ( usableViewport / img.offsetHeight ) * img.offsetWidth + 'px';
- img.style.height = usableViewport + 'px';
- }
- }
- //go to the next poster image
- //TODO combine goToNext and goToPrevious
- PageZipper.prototype.goToNextPosterImage = function() {
- var browserBorderTop = pgzp().screen.getScrollTop() + pgzp().poster_image_margin_top + 1; //start looking for next poster image below this line
- var top_margin;
- for (var i=0; i<pgzp().pages.length; i++) {
- //calculate the largest image here - we leave this as late as possible b/c all images on page have to be loaded
- if (pgzp().pages[i].posterImgs == null) pgzp().pages[i].posterImgs = pgzp().getPosterImagesOnPage(pgzp().pages[i].elemContent);
- for (var j=0; j<pgzp().pages[i].posterImgs.length; j++) {
- var currPosterImg = pgzp().pages[i].posterImgs[j];
- var pos = pgzp().findPos(currPosterImg);
- //pgzp().log("page " + i + " of " + pgzp.pages.length + " : " + pos.y + " body: " + pgzp.pages[i].page + " " + pgzp.pages[i].page.id);
- //array should be ordered top to bottom
- if (pos.y > browserBorderTop) {
- //make sure this is not a centered image
- if (currPosterImg["pgzpCenterOffset"] && ((parseInt(currPosterImg["pgzpCenterOffset"], 10) + browserBorderTop) >= pos.y)) continue;
- pgzp().resizeImageToViewport(currPosterImg);
- //center image
- var center_margin = (pgzp().screen.getViewportHeight() - currPosterImg.offsetHeight) / 2
- if (center_margin > pgzp().poster_image_margin_top) {
- top_margin = center_margin;
- currPosterImg["pgzpCenterOffset"] = center_margin;
- } else {
- top_margin = pgzp().poster_image_margin_top;
- }
- var amountToScroll = pos.y - top_margin - pgzp().screen.getScrollTop();
- pgzp().win.scrollBy(0, amountToScroll);
- return;
- }
- }
- }
- }
- PageZipper.prototype.goToPreviousPosterImage = function() {
- var browserBorderBottom = pgzp().screen.getScrollTop() + pgzp().screen.getViewportHeight() - pgzp().poster_image_margin_top - 1; //start looking for next poster above below this line
- var top_margin;
- //iterate from bottom to top- find first image w/top above browser top
- for (var i=(pgzp().pages.length-1); i>=0; i--) {
- if (pgzp().pages[i].posterImgs == null) pgzp().pages[i].posterImgs = pgzp().getPosterImagesOnPage(pgzp().pages[i].elemContent);
- for (var j=(pgzp().pages[i].posterImgs.length-1); j>=0; j--) {
- var currPosterImg = pgzp().pages[i].posterImgs[j];
- var pos = pgzp().findPos(currPosterImg);
- //array should be ordered top to bottom
- if (pos.y < browserBorderBottom) {
- //make sure this is not a centered image
- if (currPosterImg["pgzpCenterOffset"] && ((parseInt(currPosterImg["pgzpCenterOffset"], 10) + pgzp().screen.getScrollTop() - 1) <= pos.y)) continue;
- pgzp().resizeImageToViewport(currPosterImg);
- //center image
- var center_margin = (pgzp().screen.getViewportHeight() - currPosterImg.offsetHeight) / 2
- if (center_margin > pgzp().poster_image_margin_top) {
- top_margin = center_margin;
- currPosterImg["pgzpCenterOffset"] = center_margin;
- } else {
- top_margin = pgzp().poster_image_margin_top;
- }
- var amountToScroll = (pos.y - top_margin) - pgzp().screen.getScrollTop();
- pgzp().win.scrollBy(0, amountToScroll);
- return;
- }
- }
- }
- }
- /*------------------------- Javascript Toolbox by Matt Kruse ----------------------*/
- /**
- * Copyright (c)2005-2008 Matt Kruse (http://www.javascripttoolbox.com/lib/util/source.php)
- *
- * Dual licensed under the MIT and GPL licenses.
- * This basically means you can use this code however you want for
- * free, but don't claim to have written it yourself!
- * Donations always accepted: http://www.JavascriptToolbox.com/donate/
- *
- * Please do not link to the .js files on javascripttoolbox.com from
- * your site. Copy the files locally to your server instead.
- *
- */
- // Util function to default a bad number to 0
- // --------------------------------------------------------------------
- PageZipper.prototype.zero = function(n) {
- return (!pgzp().defined(n) || isNaN(n))?0:n;
- };
- // Determine if a reference is defined
- PageZipper.prototype.defined = function(o) {
- return (typeof(o)!="undefined");
- };
- /* ******************************************************************* */
- /* CSS FUNCTIONS */
- /* ******************************************************************* */
- PageZipper.prototype.css = (function(){
- var css = {};
- // Convert an RGB string in the form "rgb (255, 255, 255)" to "#ffffff"
- css.rgb2hex = function(rgbString) {
- if (typeof(rgbString)!="string" || !pgzp().defined(rgbString.match)) { return null; }
- var result = rgbString.match(/^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*/);
- if (result==null) { return rgbString; }
- var rgb = +result[1] << 16 | +result[2] << 8 | +result[3];
- var hex = "";
- var digits = "0123456789abcdef";
- while(rgb!=0) {
- hex = digits.charAt(rgb&0xf)+hex;
- rgb>>>=4;
- }
- while(hex.length<6) { hex='0'+hex; }
- return "#" + hex;
- };
- // Convert hyphen style names like border-width to camel case like borderWidth
- css.hyphen2camel = function(property) {
- if (!pgzp().defined(property) || property==null) { return null; }
- if (property.indexOf("-")<0) { return property; }
- var str = "";
- var c = null;
- var l = property.length;
- for (var i=0; i<l; i++) {
- c = property.charAt(i);
- str += (c!="-")?c:property.charAt(++i).toUpperCase();
- }
- return str;
- };
- // Get the currently-applied style of an object - expects propery in dash form - ex. border-left-width
- css.getStyle = function(o, property) {
- if (o==null) { return null; }
- var val = null;
- var camelProperty = css.hyphen2camel(property);
- // Handle "float" property as a special case
- if (property=="float") {
- val = css.getStyle(o,"cssFloat");
- if (val==null) {
- val = css.getStyle(o,"styleFloat");
- }
- }
- else if (o.currentStyle && pgzp().defined(o.currentStyle[camelProperty])) {
- val = o.currentStyle[camelProperty];
- }
- else if (pgzp().win.getComputedStyle) {
- val = pgzp().win.getComputedStyle(o,null).getPropertyValue(property);
- }
- else if (o.style && pgzp().defined(o.style[camelProperty])) {
- val = o.style[camelProperty];
- }
- // For color values, make the value consistent across browsers
- // Convert rgb() colors back to hex for consistency
- if (/^\s*rgb\s*\(/.test(val)) {
- val = css.rgb2hex(val);
- }
- // Lowercase all #hex values
- if (/^#/.test(val)) {
- val = val.toLowerCase();
- }
- return val;
- };
- // Set a style on an object
- css.setStyle = function(o, property, value) {
- if (o==null || !pgzp().defined(o.style) || !pgzp().defined(property) || property==null || !pgzp().defined(value)) { return false; }
- if (property=="float") {
- o.style["cssFloat"] = value;
- o.style["styleFloat"] = value;
- } else if (property=="opacity") {
- o.style['-moz-opacity'] = value;
- o.style['-khtml-opacity'] = value;
- o.style.opacity = value;
- if (pgzp().defined(o.style.filter)) {
- o.style.filter = "alpha(opacity=" + value*100 + ")";
- }
- } else {
- o.style[css.hyphen2camel(property)] = value;
- }
- return true;
- };
- // Determine if an object or class string contains a given class.
- css.hasClass = function(obj,className) {
- if (!pgzp().defined(obj) || obj==null || !RegExp) { return false; }
- var re = new RegExp("(^|\\s)" + className + "(\\s|$)");
- if (typeof(obj)=="string") {
- return re.test(obj);
- } else if (typeof(obj)=="object" && obj.className) {
- return re.test(obj.className);
- }
- return false;
- };
- // Add a class to an object
- css.addClass = function(obj,className) {
- if (typeof(obj)!="object" || obj==null || !pgzp().defined(obj.className)) { return false; }
- if (obj.className==null || obj.className=='') {
- obj.className = className;
- return true;
- }
- if (pgzp().css.hasClass(obj,className)) { return true; }
- obj.className = obj.className + " " + className;
- return true;
- };
- // Remove a class from an object
- css.removeClass = function(obj,className) {
- if (typeof(obj)!="object" || obj==null || !pgzp().defined(obj.className) || obj.className==null) { return false; }
- if (!pgzp().css.hasClass(obj,className)) { return false; }
- var re = new RegExp("(^|\\s+)" + className + "(\\s+|$)");
- obj.className = obj.className.replace(re,' ');
- return true;
- };
- // Fully replace a class with a new one
- css.replaceClass = function(obj,className,newClassName) {
- if (typeof(obj)!="object" || obj==null || !pgzp().defined(obj.className) || obj.className==null) { return false; }
- pgzp().css.removeClass(obj,className);
- pgzp().css.addClass(obj,newClassName);
- return true;
- };
- return css;
- })();
- /* ******************************************************************* */
- /* SCREEN FUNCTIONS */
- /* ******************************************************************* */
- PageZipper.prototype.screen = (function() {
- var screen = {};
- // Get a reference to the body
- screen.getBody = function() {
- if (pgzp().doc.body) {
- return pgzp().doc.body;
- }
- if (pgzp().doc.getElementsByTagName) {
- var bodies = pgzp().doc.getElementsByTagName("BODY");
- if (bodies!=null && bodies.length>0) {
- return bodies[0];
- }
- }
- return null;
- };
- // Get the amount that the main document has scrolled from top
- screen.getScrollTop = function() {
- if (pgzp().doc.documentElement && pgzp().defined(pgzp().doc.documentElement.scrollTop) && pgzp().doc.documentElement.scrollTop>0) {
- return pgzp().doc.documentElement.scrollTop;
- }
- if (pgzp().doc.body && pgzp().defined(pgzp().doc.body.scrollTop)) {
- return pgzp().doc.body.scrollTop;
- }
- return null;
- };
- // Get the height of the entire document
- screen.getDocumentHeight = function() {
- var body = pgzp().screen.getBody();
- var innerHeight = (pgzp().defined(self.innerHeight)&&!isNaN(self.innerHeight))?self.innerHeight:0;
- if (pgzp().doc.documentElement && (!pgzp().doc.compatMode || pgzp().doc.compatMode=="CSS1Compat")) {
- var topMargin = parseInt(pgzp().css.getStyle(body,'margin-top'),10) || 0;
- var bottomMargin = parseInt(pgzp().css.getStyle(body,'margin-bottom'), 10) || 0;
- return Math.max(body.offsetHeight + topMargin + bottomMargin, pgzp().doc.documentElement.clientHeight, pgzp().doc.documentElement.scrollHeight, pgzp().zero(self.innerHeight));
- }
- return Math.max(body.scrollHeight, body.clientHeight, pgzp().zero(self.innerHeight));
- };
- // Get the width of the viewport (viewable area) in the browser window
- screen.getViewportWidth = function() {
- if (pgzp().doc.documentElement && (!pgzp().doc.compatMode || pgzp().doc.compatMode=="CSS1Compat")) {
- return pgzp().doc.documentElement.clientWidth;
- } else if (pgzp().doc.compatMode && pgzp().doc.body) {
- return pgzp().doc.body.clientWidth;
- }
- return screen.zero(self.innerWidth);
- };
- // Get the height of the viewport (viewable area) in the browser window
- screen.getViewportHeight = function() {
- if (!pgzp().win.opera && pgzp().doc.documentElement && (!pgzp().doc.compatMode || pgzp().doc.compatMode=="CSS1Compat")) {
- return pgzp().doc.documentElement.clientHeight;
- } else if (pgzp().doc.compatMode && !pgzp().win.opera && pgzp().doc.body) {
- return pgzp().doc.body.clientHeight;
- }
- return pgzp().zero(self.innerHeight);
- };
- return screen;
- })();
- /*------------------------ Menu Stuff ----------------------------*/
- PageZipper.prototype.addMenu = function() {
- var css = " \
- #pgzp_menu a, #pgzp_menu a * {border: 0; text-decoration: none;} \
- #pgzp_menu {position: fixed; top: 0px; float:left; padding: 0px 5px; background-color: #D3D3D3; color: black; z-index: 2147483647;} \
- .pgzp_block {display: block; float: left; line-height: 32px;} \
- .pgzp_button {display: block; width: 32px; height: 32px;} \
- a.pgzp_button_prev_active {background: transparent url('${media_path}32-gnome-prev.png') no-repeat scroll top left; } \
- a:hover.pgzp_button_prev_active {background-image: url('${media_path}32-gnome-prev_red.png'); } \
- a.pgzp_button_prev_inactive {background: transparent url('${media_path}32-gnome-prev_gray.png') no-repeat scroll top left; } \
- a.pgzp_button_next_active {background: transparent url('${media_path}32-gnome-next.png') no-repeat scroll top left; } \
- a:hover.pgzp_button_next_active {background-image: url('${media_path}32-gnome-next_red.png'); } \
- a.pgzp_button_next_inactive {background: transparent url('${media_path}32-gnome-next_gray.png') no-repeat scroll top left; } \
- #pgzp_button_compat {padding-left: 6px;} \
- .pgzp_button_compat_active {background: transparent url('${media_path}compat-mode.png') no-repeat scroll 4px 4px;} \
- .pgzp_button_compat_inactive {background: transparent url('${media_path}compat-mode-inactive.png') no-repeat scroll 4px 4px;} \
- #pgzp_curr_page {font-size: 24px;} \
- #pgzp_loaded_pages {font-size: 18px;} \
- ";
- var html = " \
- <div id='pgzp_menu'> \
- <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> \
- <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> \
- <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> \
- <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> \
- <a href='http://www.printwhatyoulike.com/pagezipper' target='_blank' title='PageZipper Home' class='pgzp_block pgzp_button' style='margin-left: -6px'> \
- <img src='${media_path}zipper_32.png' alt='PageZipper!' style='border-width: 0px' /> \
- </a> \
- </div> \
- ";
- //replace ${media_path} with actual value
- css = pgzp().jq.trim( css.replace(/\$\{media_path\}/g, pgzp().media_path) );
- html = pgzp().jq.trim( html.replace(/\$\{media_path\}/g, pgzp().media_path) );
- //insert css
- var cssElem = pgzp().doc.createElement('style');
- cssElem.setAttribute("type", "text/css");
- if (cssElem.styleSheet) {
- cssElem.styleSheet.cssText = css; //IE only
- } else {
- cssElem.appendChild( pgzp().doc.createTextNode(css) ); //everyone else
- }
- pgzp().doc.getElementsByTagName('head')[0].appendChild(cssElem);
- //insert html
- var div = pgzp().doc.createElement("div");
- div.innerHTML = html;
- div = div.childNodes[0];
- pgzp().doc.body.appendChild(div);
- pgzp().positionMenu();
- //make some changes for the extension
- if (pgzp().loader_type == "ffextension" || pgzp().loader_type == "chromeext") {
- var fixLink = function(linkId, eventHandler) {
- var link = pgzp().doc.getElementById(linkId);
- link.removeAttribute("href");
- pgzp().jq(link).bind("click", eventHandler);
- }
- fixLink("pgzp_button_prev", pgzp().prevArrow)
- fixLink("pgzp_button_next", pgzp().nextArrow)
- fixLink("pgzp_button_compat", pgzp().toggleCompatMode)
- }
- }
- PageZipper.prototype.positionMenu = function() {
- var div = pgzp().doc.getElementById('pgzp_menu');
- //if (div) b/c sometimes iframes included by the page call resize
- if (div) div.style.left = (pgzp().screen.getViewportWidth() - div.offsetWidth - 30) + 'px';
- }
- PageZipper.prototype.removeMenu = function() {
- var menu = pgzp().doc.getElementById('pgzp_menu');
- if (menu) pgzp().doc.body.removeChild(menu);
- }
- PageZipper.prototype.menuIncrementPagesLoaded = function(numPages) {
- var loadedPages = pgzp().doc.getElementById("pgzp_loaded_pages"), num;
- if (loadedPages) {
- //just to make this more confusing, parseInt is in window, not window.content in ff-extension
- num = parseInt(loadedPages.innerHTML.replace("/", "", "g"), 10);
- num = numPages ? numPages : num+1;
- loadedPages.innerHTML = "/" + num;
- }
- }
- PageZipper.prototype.menuSetCurrPageNumber = function(currPage) {
- var currPageObj = pgzp().pages[currPage - 1];
- pgzp().doc.getElementById("pgzp_curr_page").innerHTML = currPage;
- //disable/enable arrows as required
- if (pgzp().displayMode == "text") {
- pgzp().updateButtonState((currPage != 1), "prev"); //if on first page, prev disabled, else enabled
- pgzp().updateButtonState((currPage != pgzp().pages.length), "next"); //if on last page next, disabled, else enabled
- } else {
- var top = pgzp().screen.getScrollTop();
- //for prev, only disable when we are above first img on first page
- var displayPrev = (pgzp().findPos(pgzp().pages[0].posterImgs[0]).y < top)
- pgzp().updateButtonState(displayPrev, "prev");
- //for next, disble if currPage == lastPage and we are below last image on page
- var disableNext = (currPage == pgzp().pages.length &&
- currPageObj.posterImgs &&
- pgzp().findPos( currPageObj.posterImgs[ currPageObj.posterImgs.length-1 ] ).y < (top+pgzp().poster_image_margin_top+1)
- );
- pgzp().updateButtonState(!disableNext, "next");
- }
- }
- //buttonName = 'prev' or 'next' or 'compat'
- PageZipper.prototype.updateButtonState = function(enable, buttonName) {
- var button = pgzp().doc.getElementById("pgzp_button_" + buttonName);
- var activeClass = "pgzp_button_" + buttonName + "_active";
- var inactiveClass = "pgzp_button_" + buttonName + "_inactive";
- if (enable) {
- pgzp().css.replaceClass(button, inactiveClass, activeClass);
- } else {
- pgzp().css.replaceClass(button, activeClass, inactiveClass);
- }
- if (buttonName == 'compat') {
- button.title = enable ? button.title.replace('disabled', 'enabled') : button.title.replace('enabled', 'disabled');
- }
- }
- /*------------------------- Menu Events ----------------------*/
- PageZipper.prototype.keyDown = function(event) {
- //pgzp().log("key down: " + event.which, true);
- switch (event.which) {
- //down arrow, >
- case 40:
- case 190:
- if (pgzp().ctrl_key_pressed) {
- pgzp().goToNext(1);
- pgzp().noBubble(event);
- }
- break;
- //up arrow, <
- case 38:
- case 188:
- if (pgzp().ctrl_key_pressed) {
- pgzp().goToNext(-1);
- pgzp().noBubble(event);
- }
- break;
- //seperate handler for cntrl
- //treat apple key like cntrl
- case 17:
- case 224:
- pgzp().ctrl_key_pressed = true;
- break;
- }
- }
- PageZipper.prototype.keyUp = function(event) {
- //pgzp().log("key up: " + event.which, true);
- switch (event.which) {
- //cntrl
- case 17:
- case 224:
- pgzp().ctrl_key_pressed = false;
- break;
- }
- }
- /*------------------------- Page Stuff ----------------------*/
- PageZipper.prototype.goToNext = function(inc){
- var currPageIndex = pgzp().getViewableCurrentPage(pgzp().getCurrentPage());
- if (pgzp().displayMode == 'text') {
- pgzp().goToNextPage(inc, currPageIndex);
- } else {
- if (inc > 0)
- pgzp().goToNextPosterImage();
- else
- pgzp().goToPreviousPosterImage();
- }
- }
- //For FF Extension
- PageZipper.prototype.nextArrow = function(){pgzp().goToNext(1);}
- PageZipper.prototype.prevArrow = function(){pgzp().goToNext(-1);}
- PageZipper.prototype.goToNextPage = function(inc, currPageIndex) {
- var currPage, pos, amountToScroll, ps;
- currPageIndex += inc;
- if (currPageIndex in pgzp().pages) {
- currPage = pgzp().pages[currPageIndex].inPageElem;
- //if currPage has a p elem, scroll to first p
- // ps = currPage.getElementsByTagName("p");
- // //make sure this p is visible
- // if (ps.length > 0 && pgzp().css.getStyle(ps[0], "display") != "none" && pgzp().findPos(ps[0]).y > 10) {
- // amountToScroll = pgzp().findPos(ps[0]).y - pgzp().screen.getScrollTop() - 40; //a little margin
- // } else {
- amountToScroll = pgzp().findPos(currPage).y - pgzp().screen.getScrollTop();
- // }
- pgzp().win.scrollBy(0, amountToScroll);
- }
- }
- /*------------------------- Get Next Page URL ----------------------*/
- //NextLink object we will be scoring
- //isReadableText = human readable content- not url
- PageZipper.prototype.NextLink = function(text, link, alreadyLoaded, isHumanReadableText) {
- this.text = text;
- this.link = link;
- this.syn = '';
- this.isHumanReadableText = (isHumanReadableText == undefined) ? true : isHumanReadableText;
- this.isVisibleText = false; //is this.text visible on the page?
- this.alreadyLoaded = alreadyLoaded;
- this.url = link.href;
- this.finalScore = null;
- this.trialScores = {};
- this.addScore = function(trialName, score, isNormalized) {
- var normalizedKey = isNormalized ? 'normalizedScore' : 'unnormalizedScore';
- if (!this.trialScores[trialName]) this.trialScores[trialName] = {};
- this.trialScores[trialName][normalizedKey] = score;
- }
- this.getScore = function(trialName, isNormalized) {
- //for trials which do not get normalized, just return unnormalized score
- if (isNormalized && pgzp().trials[trialName].noNormailization) isNormalized = false;
- var normalizedKey = isNormalized ? 'normalizedScore' : 'unnormalizedScore';
- return this.trialScores[trialName][normalizedKey];
- }
- this.calculateTotalScore = function() {
- this.finalScore = 0;
- if (pgzp().debug) var debugStr = "Calculate Final Score: " + this.text + ": " + this.url;
- for (var trial in this.trialScores) {
- if (pgzp().trials.hasOwnProperty(trial)) {
- var nScore = this.getScore(trial, true);
- var weight = pgzp().trials[trial].weight;
- this.finalScore += nScore * weight;
- if (pgzp().debug) debugStr += "\n\t" + trial + "\t\t\t" + nScore + "\tx\t" + weight + "\t=\t" + (nScore * weight);
- }
- }
- //pgzp().log(debugStr + "\nFinal Score:\t" + this.finalScore);
- return this.finalScore;
- }
- this.isSynNumber = function() {
- return pgzp().isNumber(this.syn);
- }
- }
- //Trials - These are the tests we will use to score the links
- PageZipper.prototype.trials = {
- 'contains_next_syn': {
- 'doScore': function(nextLink) {
- var i, currWord, score = 0;
- for (i=0; i<pgzp().nextSynonyms.length; i++) {
- currWord = pgzp().nextSynonyms[i];
- //+ for containing a keyword
- if (nextLink.text.toLowerCase().indexOf(currWord.syn) >= 0) {
- if (currWord['humanReadableOnly']) {
- if (
- !nextLink.isHumanReadableText || //don't allow index as syn on urls
- nextLink.text.toLowerCase().indexOf("comment") >= 0 //blogs often say something link '2 comments' - ignore this
- ) continue;
- }
- //make sure syns are not included as part of something else - ex 'page 2', not '2009', 'older' not placeholder.jpg
- //for human readable, identify breaks by whitespace, for non-human readable, use any non a-z character
- //'next' is never used outside its meaning, so dont worry about it
- if (currWord.syn != "next" && !pgzp().isStandaloneWord(currWord.syn, nextLink.text, nextLink.isHumanReadableText)) continue;
- if (currWord['pageBar'] && !nextLink.isPageBar) continue; //if this is a # from page bar, make sure this link is actually in page bar
- //pgzp().log("adding syn: " + currWord.syn + " to " + nextLink.url);
- if (currWord.weight >= score) {
- score = currWord.weight; //assign weight for keyword used
- nextLink.syn = currWord.syn;
- }
- } else if (!currWord['humanReadableOnly'] && nextLink.url.toLowerCase().indexOf(currWord.syn) >= 0) {
- //also check urls
- if (!pgzp().isStandaloneWord(currWord.syn, nextLink.url, false)) continue;
- if (currWord.weight >= score) {
- score = currWord.weight; //assign weight for keyword used
- nextLink.syn = currWord.syn;
- }
- }
- }
- return score;
- },
- 'weight': 100,
- 'noNormailization': true
- },
- //urls similar to known next urls are more likely to be correct
- 'url_similarity': {
- 'doScore': function(nextLink) {
- var lastUrl, currUrl, shorter, longer, score = 0, notMatchingPos = -1, i;
- lastUrl = pgzp().pages[ pgzp().pages.length-1 ].url;
- currUrl = nextLink.url;
- if (lastUrl.length <= currUrl.length) {
- shorter = lastUrl;
- longer = currUrl;
- } else {
- shorter = currUrl;
- longer = lastUrl;
- }
- //subtract points for differences in length
- score = shorter.length - longer.length;
- //add points for matching chars, remove for different chars
- for (i=0; i<shorter.length; i++) {
- if (shorter.charAt(i) == longer.charAt(i)) {
- score++;
- } else {
- score--;
- if (notMatchingPos < 0) notMatchingPos = i;
- }
- }
- //if the two urls are the same except 1 number, which is off by 1, that is a dead giveaway
- if (notMatchingPos > 0 &&
- pgzp().isNumber(longer.charAt(notMatchingPos)) && pgzp().isNumber(shorter.charAt(notMatchingPos)) &&
- (Math.abs(pgzp().getNumberAtPos(shorter, notMatchingPos) - pgzp().getNumberAtPos(longer, notMatchingPos)) == 1)
- ) {
- score += 100;
- }
- return score;
- },
- 'weight': 70,
- 'noNormailization': true
- },
- //if multiple links have the same text but point to different urls, they are not next links
- 'duplicate_text': {
- 'doScore': function(nextLink) {
- var score = 100;
- if (pgzp().linkTextIndex[nextLink.text] && pgzp().linkTextIndex[nextLink.text].length > 0) {
- //subtract 20 points for each additional url
- score = score - (pgzp().linkTextIndex[nextLink.text].length - 1) * 20;
- }
- return score;
- },
- 'weight': 60
- },
- 'url_ends_in_number': {
- 'doScore': function(nextLink) {
- var results = nextLink.url.match(/^.*?(\d+)(\/+|\.\w+)?$/);
- //verify url ends in number & number is < 99 - we want /page=3 not /abx43923829
- if (results && (parseInt(results[1], 10) < 99))
- return 100;
- else
- return 0;
- },
- 'weight': 20
- },
- 'begins_or_ends_with_next_syn': {
- 'doScore': function(nextLink) {
- if (nextLink.syn && (pgzp().startsWith(nextLink.syn, nextLink.text.toLowerCase()) || pgzp().endsWith(nextLink.syn, nextLink.text.toLowerCase())))
- return 100;
- else
- return 0;
- },
- 'weight': 20
- },
- 'text_size': {
- 'doScore': function(nextLink) {
- //points for larger size per char
- return Math.floor( (nextLink.link.offsetWidth * nextLink.link.offsetHeight) / nextLink.text.length );
- },
- 'weight': 10
- },
- 'chars_in_text': {
- 'doScore': function(nextLink) {
- //-1pt for each char in text
- return nextLink.text.length * -1;
- },
- 'weight': 10
- }
- };
- PageZipper.prototype.getNextLink = function(body) {
- var allNextLinks = pgzp().getAllScoredLinks(body)
- if (allNextLinks.length <= 0) return null;
- var highestLink = pgzp().getHighestTotalScore(allNextLinks);
- //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
- //stop here if highestLink has a different syn than the first link
- if (pgzp().pages.length > 1 && //don't check on first page
- !pgzp().pages[0].nextLinkObj.isSynNumber() && !highestLink.isSynNumber() && //only compare if we are not using page indexes
- pgzp().pages[0].nextLinkObj.syn != highestLink.syn)
- return null;
- return highestLink;
- }
- PageZipper.prototype.getAutorunNextLink = function(body) {
- var scoredLinks = [];
- var allNextLinks = pgzp().getAllScoredLinks(body)
- if (allNextLinks.length <= 0) return null;
- for (var i=0; i<allNextLinks.length; i++) {
- var score = allNextLinks[i].calculateTotalScore();
- scoredLinks.push( [score, allNextLinks[i]] );
- }
- //sort
- scoredLinks.sort(function(a, b){
- return b[0] - a[0];
- });
- // pgzp().log(scoredLinks);
- //make sure the top link has a score of at least 15000
- if (scoredLinks[0][0] < 15000) return null;
- //check if the top link is 30% than the next link
- for (i=1; i<scoredLinks.length; i++) {
- if (scoredLinks[i][1].url == scoredLinks[0][1].url) {
- continue;
- }
- //next smallest link must be at least 30% smaller
- if ( (scoredLinks[i][0] / scoredLinks[0][0]) > .7) {
- return null;
- } else {
- return scoredLinks[0][1];
- }
- }
- //only 1 good link
- return scoredLinks[0][1];
- }
- PageZipper.prototype.getAllScoredLinks = function(body) {
- var allNextLinks = pgzp().getAllNextLinks(body);
- var pageBarInfo = pgzp().getCurrentPageNumberFromPageBar(allNextLinks);
- // pgzp().log("looking for page #: " + (pageBarInfo[0] + 1) + " w/confidence: " + pageBarInfo[1]);
- pgzp().nextSynonyms[pgzp().nextSynonyms.length-1].syn = (pageBarInfo[0] + 1) + ""; //update nextSynonyms
- pgzp().nextSynonyms[pgzp().nextSynonyms.length-1].weight = pageBarInfo[1]; //update weight/confidence
- pgzp().linkTextIndex = pgzp().indexDuplicateLinks(allNextLinks);
- pgzp().filter(allNextLinks, function(link) {return link.alreadyLoaded;}); //filter out already loaded links, needed by pageBar, but not anymore
- pgzp().scoreLinks(allNextLinks);
- pgzp().normalizeLinks(allNextLinks);
- return allNextLinks;
- }
- //get all links and score them
- PageZipper.prototype.scoreLinks = function(allNextLinks) {
- if (pgzp().debug) var debugMsg = '';
- for (var trial in pgzp().trials) {
- if (pgzp().trials.hasOwnProperty(trial)) { //block out stuff added by site with Object.prototype
- for (var i=0; i<allNextLinks.length; i++) {
- allNextLinks[i].addScore(trial, pgzp().trials[trial].doScore(allNextLinks[i]));
- if (pgzp().debug) debugMsg += "\nScore " + trial + " " + allNextLinks[i].text + ": " + allNextLinks[i].getScore(trial);
- //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
- if (trial == 'contains_next_syn' && allNextLinks[i].getScore('contains_next_syn') <= 0) {
- allNextLinks.splice(i, 1);
- i--;
- }
- }
- }
- }
- // pgzp().log(debugMsg);
- }
- //normalize scores from 1-100
- PageZipper.prototype.normalizeLinks = function(allLinks) {
- for (var trial in pgzp().trials) {
- //block out stuff added by site with Object.prototype, trials not meant to be normailzed
- if (pgzp().trials.hasOwnProperty(trial) && !pgzp().trials[trial].noNormailization) {
- pgzp().normalizeTrialSet(trial, allLinks);
- }
- }
- }
- //takes a trial name, normalizes all scores to between 0 and 100
- PageZipper.prototype.normalizeTrialSet = function(trialName, allLinks) {
- //get highest and lowest scores
- var highest, lowest = 0; //add zero so we don't normalize to 0 and 100 for urls which are 1 char apart
- for (var i=0; i<allLinks.length; i++) {
- var score = allLinks[i].getScore(trialName);
- if (highest == null || score > highest) highest = score;
- if (lowest == null || score < lowest) lowest = score;
- }
- //now normalize
- if (pgzp().debug) var debugMsg = 'Normalizing Trial Set: ' + trialName;
- var curve = (highest == lowest) ? 0 : (100 / (highest - lowest));
- for (var i=0; i<allLinks.length; i++) {
- var score = allLinks[i].getScore(trialName);
- var nScore = Math.floor((score - lowest) * curve);
- allLinks[i].addScore(trialName, nScore, true);
- if (pgzp().debug) debugMsg += "\nNScore " + i + ": " + allLinks[i].text + ": score: " + score + " curve: " + curve + " higest: " + highest + " lowest: " + lowest + " nscore: " + nScore;
- }
- //pgzp().log(debugMsg);
- }
- //calculate total score
- PageZipper.prototype.getHighestTotalScore = function(allNextLinks) {
- var highestScoringLink = null;
- for (var i=0; i<allNextLinks.length; i++) {
- var score = allNextLinks[i].calculateTotalScore();
- if (highestScoringLink == null || score >= highestScoringLink.finalScore) {
- highestScoringLink = allNextLinks[i];
- }
- }
- if (pgzp().debug) {
- var debugMsg = 'Final Score ' + allNextLinks.length;
- allNextLinks.sort(function (a, b) {
- return b.finalScore - a.finalScore;
- });
- for (i=0; i<allNextLinks.length; i++) {
- debugMsg += "\n" + allNextLinks[i].finalScore + ": " + allNextLinks[i].text + ": " + allNextLinks[i].url;
- }
- // pgzp().log(debugMsg);
- }
- return highestScoringLink;
- }
- PageZipper.prototype.getAllNextLinks = function(body) {
- var allNextLinks = [];
- var links = body.getElementsByTagName("a"); //get all the links in the page
- var pageUrl = pgzp().getUrlWOutAnchors( pgzp().pages[ pgzp().pages.length-1 ].url );
- for (var i=0; i<links.length; i++) {
- //ignore all links which point to a different domain than the existing domain
- //pgzp().log("currdomain: " + pgzp().currDomain + " currLink: " + pgzp().getDomain(links[i].href) + " full Link: " + links[i].href + " relative: " + links[i].getAttribute("href"));
- if (
- links[i].href &&
- pgzp().getDomain(links[i].href) == pgzp().currDomain && //link points to this domain
- (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
- ) {
- pgzp().addLinkComponents(links[i], allNextLinks, pgzp().contains(pgzp().url_list, links[i].href)); //mark links we've already loaded
- }
- }
- //pgzp().logList(links, "All Links", "#{o.text}\t#{o.link}");
- return allNextLinks;
- }
- //returns an array of all NextLink texts that could be derived from this link
- PageZipper.prototype.addLinkComponents = function(link, allNextLinks, alreadyLoaded) {
- var NextLink = pgzp().NextLink;
- var search = function(rootNode) {
- for (var i=0; i<rootNode.childNodes.length; i++) {
- var curr = rootNode.childNodes[i];
- //check if this node is useful
- if (curr.nodeType == Node.TEXT_NODE && curr.nodeValue && pgzp().jq.trim(curr.nodeValue).length > 0) {
- var nl = new NextLink(curr.nodeValue, link, alreadyLoaded);
- nl.isVisibleText = true;
- allNextLinks.push(nl);
- //check for image link
- } else if (curr.nodeType == Node.ELEMENT_NODE && curr.tagName.toLowerCase() == "img") {
- if (curr.alt) allNextLinks.push(new NextLink(curr.alt, link, alreadyLoaded));
- if (curr.title) allNextLinks.push(new NextLink(curr.title, link, alreadyLoaded));
- if (curr.src) allNextLinks.push(new NextLink(curr.src, link, alreadyLoaded, false));
- } else {
- //continue
- search(curr);
- }
- }
- }
- if (link.title) allNextLinks.push(new NextLink(link.title, link));
- if (link.alt) allNextLinks.push(new NextLink(link.alt, link));
- search(link);
- }
- //---------------------------------- Page Bar ---------------------------------------
- //determine the current page number from a list of page numbers on the page ie. 1 2 3 4 5
- //returns [page #, confidence]
- PageZipper.prototype.getCurrentPageNumberFromPageBar = function(allNextLinks) {
- var allSequences = [], i = 0, currSeq = [], currNextLink, pageBar, pageBarScore = 0, pageNum, tmpPageBarScore;
- var currPageUrl = pgzp().pages[ pgzp().pages.length-1 ].url;
- //first find all consecutive numerical links, put them in arrays
- for (i=0; i<allNextLinks.length; i++) {
- currNextLink = allNextLinks[i];
- if (currNextLink.isVisibleText) { //only want text which actually appears on the page (one link may have multiple entries in allNextLinks)
- if (pgzp().isNumber(currNextLink.text)) {
- pageNum = parseInt(currNextLink.text, 10);
- if (pageNum >= 0 && pageNum < 1000) {
- currNextLink.pageNum = pageNum;
- currSeq.push(currNextLink);
- }
- } else {
- if (currSeq.length > 0) {
- allSequences.push(currSeq);
- currSeq = [];
- }
- }
- }
- }
- if (currSeq.length > 0) allSequences.push(currSeq);
- //now find the sequence numerical links most likely to be the page bar
- for (i=0; i<allSequences.length; i++) {
- tmpPageBarScore = pgzp().__scorePageBar(allSequences[i]);
- if (tmpPageBarScore >= pageBarScore) {
- pageBarScore = tmpPageBarScore;
- pageBar = allSequences[i];
- }
- }
- if (!pageBar) return [-1, 0]; //no page bar on this page
- //sort pageBar lowest to highest
- pageBar.sort( function(a,b){
- return a.pageNum - b.pageNum;
- });
- // pgzp().logList(pageBar, "indexes ordered by size", "#{o.pageNum}\t#{o.text}");
- //mark pageBar for later
- for (i=0; i<pageBar.length; i++) pageBar[i].isPageBar = true;
- //some page bars include links for the current page- ex. 1 2 3 4 where 1 is a link which is highlighted
- for (i=0; i<pageBar.length; i++) {
- if (pageBar[i].url == currPageUrl) {
- return [pageBar[i].pageNum, 120];
- }
- }
- //there are 3 possibilities
- //curr page is in the middle - detect by finding missing page
- if (pageBar.length >= 2) {
- var currPageNum, prevPageNum = pageBar[0].pageNum;
- for (i=1; i<pageBar.length; i++) {
- currPageNum = pageBar[i].pageNum;
- if (Math.abs(currPageNum - prevPageNum) == 2) {
- //currPage should not have been visited yet - it is the next page.
- //check this to avoid getting tripped up by bad page bars - ex. 1, 2, 3, 5, 6, 8, 9, 12, 13, 14
- //pgzp().log("currNextPage " + currPageNum + " url: " + pageBar[i].url + " visited previously: " + pgzp().contains(pgzp().url_list, pageBar[i].url));
- if (!pgzp().contains(pgzp().url_list, pageBar[i].url)) {
- return [currPageNum - 1, 120];
- }
- } else {
- prevPageNum = currPageNum;
- }
- }
- }
- //curr page is at beginning - detect if first # in sequence is 2 or 1 (page bar starts at 1 or 0)
- if (pageBar[0].pageNum == 2) return [1, 40];
- // if (pageBar[0].pageNum == 1) return [0, 10];
- //curr page is last page
- return [pageBar[pageBar.length-1].pageNum, 30];
- }
- //score page bar
- PageZipper.prototype.__scorePageBar = function(pageBar) {
- var similarityScore = pgzp().trials['url_similarity'].doScore(pageBar[0]);
- var totalScore = pageBar.length + (similarityScore / 20);
- // pgzp().log("page bar length: " + pageBar.length + " sim score: " + similarityScore + " total score: " + totalScore);
- return totalScore;
- }
- //if multiple links have the same text but point to different urls, they are not next links
- //make an array of all text on how many unique urls they point to
- PageZipper.prototype.indexDuplicateLinks = function(allNextLinks) {
- var textIndex = {}; //{text, [urls]}
- var currLink;
- for (var i=0; i<allNextLinks.length; i++) {
- currLink = allNextLinks[i];
- if (textIndex[currLink.text]) {
- if (!pgzp().contains(textIndex[currLink.text], currLink.url)) {
- textIndex[currLink.text].push(currLink.url);
- }
- } else {
- textIndex[currLink.text] = [currLink.url];
- }
- }
- return textIndex;
- }
- /*------------------------- Load Page In Ajax ----------------------*/
- function PageZipperAjax() {
- /*----- Add New Page -----*/
- //takes a url, returns a div containing the body content of the page at url
- this.loadPage = function(url) {
- //load page
- pgzp().jq.ajax({url: url,
- dataType: 'html',
- success: function(data){
- //try to get only the body, but use the entire doc if we cant locate it
- var results = data.match(/<body.*?>([\w\W]*?)<\/body>/i);
- data = (results && results.length >= 2) ? results[1] : data;
- //remove all js to prevent pgzp.doc.write() from messing us up!
- //data = data.replace(/<script[\w\W]*?>[\w\W]*?<\/script>/ig, '').replace(/<script[\w\W]*?\/>/ig, '').replace(/<noscript>([\w\W]*?)<\/noscript>/ig, "$1");
- //pgzp().log("body: " + data);
- pgzp().ajax.processPageAdd(url, data);
- }
- });
- }
- this.processPageAdd = function(url, nextPageData) {
- var nextPage = pgzp().ajax.buildPageFromData(url, nextPageData);
- pgzp().pages.push(nextPage);
- pgzp().url_list.push( nextPage.url ); //track urls we've already loaded, so they don't get loaded again
- pgzp().ajax.copyPage(nextPage.elemContent);
- pgzp().ajax.removeAbsolutePositioning(nextPage.elemContent);
- pgzp().menuIncrementPagesLoaded();
- nextPage.nextLinkObj = pgzp().getNextLink(nextPage.elemContent); //very slow- do this after the page has been loaded
- pgzp().is_loading_page = false;
- //make sure that the page load is working - if the doc height hasn't increased, switch to compat mode
- if (pgzp().pages.length >= 3) {
- var second_page = pgzp().jq( pgzp().pages[1].elemContent );
- var last_page = pgzp().jq( pgzp().pages[pgzp().pages.length-1].elemContent );
- if (last_page.offset().top <= second_page.offset().top) {
- pgzp().toggleCompatMode();
- }
- }
- pgzp().mainBlock(); //continue the loop
- }
- this.buildPageFromData = function(url, data) {
- var page = pgzp().doc.createElement("div");
- page.id = "pgzp_page" + pgzp().pages.length;
- page.style.clear = 'both';
- page.innerHTML = data;
- return pgzp().buildPage(url, page);
- }
- /*----- Utils -----*/
- this.copyPage = function(body) {
- pgzp().doc.body.appendChild(body);
- }
- //switch position: absolute with position: relative
- this.removeAbsolutePositioning = function(body) {
- pgzp().jq( pgzp().doc.body ).children().each(function() {
- if (pgzp().jq(this).css("position") == "absolute") pgzp().jq(this).css("position", "static");
- });
- }
- }
- /*------------------------- Load Page With Iframe ----------------------*/
- function PageZipperIframe() {
- //takes a url, returns a div containing the body content of the page at url
- this.loadPage = function(url) {
- var ifrspan = pgzp().doc.createElement('span');
- //ffextensions really do not like onload - call it in some weird dimension where pgzp() is not defined
- var onloadstr = pgzp().loader_type == "ffextension" ? "" : "onload=\"pgzp().iframe.processPageAddComplete('pgzp_page"+pgzp().pages.length+"')\"";
- 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>";
- var ifr = ifrspan.childNodes[0];
- pgzp().jq(pgzp().doc).find("#pgzp_iframe_placeholder").append(ifr);
- ifr.src = url;
- pgzp().runOnIframeLoad(ifr, pgzp().iframe.processPageAdd);
- ifr.style.width = (pgzp().doc.body.offsetWidth -5) + 'px';
- }
- //Call as soon as Dom is ready
- this.processPageAdd = function() {
- var iframe = pgzp().jq(pgzp().doc).find(".pgzp_page_added").last()[0]; //get the last iframe loaded
- var nextPage = pgzp().buildPage(iframe.src, iframe);
- pgzp().pages.push(nextPage);
- pgzp().url_list.push( nextPage.url ); //track urls we've already loaded, so they don't get loaded again
- pgzp().iframe.setIFrameHeight(nextPage);
- pgzp().menuIncrementPagesLoaded();
- pgzp().jq(nextPage.ifrDoc).bind("keydown", this.keyDown);
- pgzp().jq(nextPage.ifrDoc).bind("keyup", this.keyUp);
- nextPage.nextLinkObj = pgzp().getNextLink( nextPage.elemContent ); //very slow- do this after the page has been loaded
- pgzp().is_loading_page = false;
- }
- //Call once everything is fully loaded
- this.processPageAddComplete = function(ifrId) {
- var page = pgzp().iframe.getPageById(ifrId); //sometimes this is called before the iframe is loaded
- if (page) pgzp().iframe.setIFrameHeight(page);
- }
- this.setIFrameHeight = function(page) {
- page.inPageElem.style.height = pgzp().getDocumentHeight(page.ifrDoc) + 'px';
- }
- //check for abs pos and abs position the iframe if necessary
- this.setAbsolutePositioning = function(page) {
- var origDocH, ifr = page.inPageElem;
- //get the element before this one in doc.body
- var iframes = pgzp().jq(pgzp().doc).find(".pgzp_page_added");
- if (iframes.length >= 2) {
- origDocH = iframes[iframes.length-2].pgzpDocHeightAfterAdd;
- } else {
- origDocH = pgzp().doc.body.pgzpDocHeightAfterAdd;
- }
- var pos = pgzp().findPos(ifr)
- if (pos.y < Math.max(origDocH-50, 10)) {
- ifr.style.position = "absolute";
- ifr.style.top = origDocH + "px";
- ifr.style.left = "0px";
- }
- }
- this.getPageById = function(id) {
- for (var i=0; i<pgzp().pages.length; i++) {
- if (pgzp().pages[i].ifrId && pgzp().pages[i].ifrId == id) {
- return pgzp().pages[i]
- }
- }
- return null;
- }
- }
- /* Determine if the iframe dom is ready
- * we cant use onload b/c that waits until every single file in the html page is loaded - takes forever
- * amazingly, I couldn't find a good solution for this problem on the net
- * this solution is pretty basic, but seems to work
- */
- PageZipper.prototype.runOnIframeLoad = function(iframeElem, callback) {
- pgzp()._ril_ifr = iframeElem;
- pgzp()._ril_callback = callback;
- pgzp()._ril_int = pgzp().win.setInterval(pgzp()._runOnIframeLoad2, 50); //check every 50msec
- }
- PageZipper.prototype._runOnIframeLoad2 = function() {
- var ifrDoc = pgzp()._ril_ifr.contentWindow.document, validReadyStates = /loaded|interactive|complete/;
- //IE seems to not handle interactive state properly - dom is still being created when readyState = interactive
- if (pgzp().jq.browser.msie) {
- validReadyStates = /loaded|complete/
- }
- //pgzp().log("readyState: " + ifrDoc.readyState);
- if (
- ifrDoc.body && //checking for body b/c chrome has a bizarre habit of starting in readyState=complete and then switch to readyState=loading
- ifrDoc.body.childNodes.length > 0 &&
- validReadyStates.test(ifrDoc.readyState)
- ) {
- //Dom has loaded!
- pgzp().win.clearInterval(pgzp()._ril_int);
- pgzp()._ril_callback();
- }
- }
- PageZipper.prototype.buildPage = function(url, elemContent) {
- var page = {
- 'url': url,
- 'elemContent': elemContent, //dom node containing this page's content
- 'nextLinkObj': null, //NextLink obj
- 'posterImgs': null,
- 'inPageElem': elemContent
- };
- //iframe only
- if (elemContent.tagName.toLowerCase() == "iframe") {
- page.ifrWin = elemContent.contentWindow;
- page.ifrDoc = elemContent.contentWindow.document;
- //page.inPageElem = elemContent; //dom elem in base page containing iframe (body on 1st page) - used by findPos
- page.elemContent = page.ifrDoc.body;
- page.ifrDoc.pgzp_iframe_id = elemContent.id;
- page.ifrId = elemContent.id;
- }
- return page;
- }
- //takes a url, returns a div containing the body content of the page at url
- PageZipper.prototype.loadPage = function(url) {
- pgzp().in_compat_mode ? pgzp().iframe.loadPage(url) : pgzp().ajax.loadPage(url);
- }
- PageZipper.prototype.addExistingPage = function(url, body) {
- var nextPage = pgzp().buildPage(url, body);
- if (pgzp().in_compat_mode) {
- pgzp().addIframePlaceholder();
- } else {
- pgzp().ajax.removeAbsolutePositioning(nextPage.elemContent);
- }
- pgzp().pages.push(nextPage);
- //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
- nextPage.posterImgs = pgzp().getPosterImagesOnPage(nextPage.elemContent);
- //very slow- do this after the page has been loaded
- nextPage.nextLinkObj = pgzp().getNextLink(nextPage.elemContent);
- return nextPage;
- }
- PageZipper.prototype.addIframePlaceholder = function() {
- var placeholder = pgzp().jq("<div/>").attr('id', 'pgzp_iframe_placeholder').css({position: 'absolute', top: pgzp().jq(document).height()+'px', left: '0px'});
- pgzp().jq(pgzp().doc.body).append(placeholder);
- }
- /*-------------------------------- Utilities ----------------------*/
- PageZipper.prototype.startsWith = function(pattern, str) {
- return str.indexOf(pattern) === 0;
- }
- PageZipper.prototype.endsWith = function(pattern, str) {
- var d = str.length - pattern.length;
- return d >= 0 && str.lastIndexOf(pattern) === d;
- }
- PageZipper.prototype.log = function(html, override) {
- if (pgzp().debug || override) {
- if (pgzp().win["console"]) {
- pgzp().win.console.log(html);
- return;
- }
- var div = pgzp().doc.createElement("textarea");
- pgzp().doc.body.appendChild(div);
- div.value = html;
- }
- }
- //handles log strings in form "msg: #{o.src}" where o is the object in the list
- PageZipper.prototype.logList = function(list, initialStr, listStr) {
- var interpolate = function (s, o) {
- return s.replace(/\#\{([^}]+)\}/g, function (match, exp) {
- return eval(exp);
- });
- }
- for (var i=0; i<list.length; i++) {
- initialStr += "\n" + interpolate(listStr, list[i]);
- }
- pgzp().log(initialStr);
- }
- PageZipper.prototype.noBubble = function(event) {
- if (event) {
- event.cancelBubble = true; //IE
- if (event.stopPropagation)
- event.stopPropagation(); //Everyone else
- event.returnValue = false; //required by stupid browsers which do not respect cancelling bubbling on arrow keys - IE and Safari
- }
- return event;
- }
- //Find the length of page the user has left to read, in px
- PageZipper.prototype.getRemaningBufferSize = function() {
- //pgzp().log("jtDocH: " + pgzp.screen.getDocumentHeight() + " jtScroll: " + pgzp.screen.getScrollTop() + " jtViewport: " + pgzp.screen.getViewportHeight());
- var left = pgzp().screen.getDocumentHeight() - pgzp().screen.getScrollTop() - pgzp().screen.getViewportHeight();
- if (left < 0) return 0;
- return Math.floor(left);
- }
- //http://www.quirksmode.org/js/findpos.html
- PageZipper.prototype.findPos = function(obj) {
- var curleft = 0, curtop = 0, objOrig = obj;
- if (obj.offsetParent) {
- do {
- curleft += obj.offsetLeft || parseInt(obj.style.left.replace("px", ""), 10) || 0;
- curtop += obj.offsetTop || parseInt(obj.style.top.replace("px", ""), 10) || 0;
- } while (obj = obj.offsetParent);
- }
- //if obj is inside an iframe, curtop will be the pos inside the iframe
- //add the y of the iframe to make currtop absolute
- if (objOrig.ownerDocument != pgzp().win.parent.document) {
- //get iframe
- var ifr = pgzp().doc.getElementById( objOrig.ownerDocument.pgzp_iframe_id );
- if (ifr) {
- var ifrPos = pgzp().findPos(ifr);
- curleft += ifrPos.x;
- curtop += ifrPos.y;
- }
- }
- return {"x": curleft, "y": curtop};
- }
- PageZipper.prototype.getDocumentHeight = function(doc) {
- var body = doc.body, html = doc.documentElement;
- return Math.max( body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight );
- }
- PageZipper.prototype.isNumber = function(str) {
- return str && (typeof(str) == "number" || (typeof(str) == "string" && (str.search(/^\d+$/) >= 0)));
- }
- PageZipper.prototype.getDomain = function(url) {
- if (url.match("http://localhost/")) return "localhost";
- var hna = url.match(/^http[s]?\:\/\/([\S]+?\.\w+)(\/.*)?$/i);
- //absolute url
- if (hna) {
- //remove subdomains if they exist
- var parts = hna[1].split(".");
- if (parts.length > 2)
- return parts[parts.length-2] + "." + parts[parts.length-1];
- return hna[1];
- }
- //javascript
- hna = url.match(/^javascript\:.*$/i);
- if (hna) {
- return null;
- }
- //relative link
- return pgzp().currDomain;
- }
- /* Removes the anchor part of urls */
- PageZipper.prototype.getUrlWOutAnchors = function(url) {
- if (url.indexOf("#") >= 0) {
- var results = url.match(/(.*?)#.*/);
- if (results.length > 0) return results[1];
- }
- return url;
- }
- PageZipper.prototype.convertToArray = function(a) {
- var b = [];
- for (var i=0; i<a.length; i++) b.push(a[i]);
- return b;
- }
- /* Remove all elements from the given array on which filter returns true */
- PageZipper.prototype.filter = function(arr, filter) {
- for (var i=0; i<arr.length; i++) {
- if (filter(arr[i])) {
- arr.splice(i, 1);
- i--;
- }
- }
- }
- PageZipper.prototype.depthFirstRecursion = function(root, callback) {
- for (var i=0; i<root.childNodes.length; i++) {
- //for now only include visible content
- if (root.childNodes[i].nodeType == 3 ||
- (root.childNodes[i].nodeType == 1 && pgzp().css.getStyle(root.childNodes[i], "display") != "none")) {
- pgzp().depthFirstRecursion(root.childNodes[i], callback);
- }
- }
- callback(root);
- }
- PageZipper.prototype.contains = function(ar, obj) {
- if(Array.indexOf){
- return ar.indexOf(obj) != -1;
- } else {
- //stupid IE!!!
- for(var i=0; i<ar.length; i++){
- if(ar[i]==obj){
- return true;
- }
- }
- return false;
- }
- }
- PageZipper.prototype.getContentType = function() {
- var metas = pgzp().doc.getElementsByTagName("head")[0].getElementsByTagName("meta");
- for (var i=0; i<metas.length; i++) {
- if (metas[i].getAttribute("http-equiv") && metas[i].getAttribute("http-equiv").toLowerCase() == "content-type" && metas[i].getAttribute("content"))
- return metas[i].getAttribute("content");
- }
- return null;
- }
- /* Is word an actual word, or is it part of something else
- * ie. isStandaloneWord('older', 'more older entries') => true
- * isStandaloneWord('older', 'update folder settings') => false
- */
- PageZipper.prototype.isStandaloneWord = function(word, text, humanReadable) {
- var delimiter = humanReadable ? "\\s" : "[^a-zA-Z]" ;
- return new RegExp("^(.*" + delimiter + "+)?" + word + "(" + delimiter + "+.*)?$", "i").test(text);
- }
- /* Given a string and a position (0 based), find the full # at that position.
- * ex. ('ab324', 3) returns 324
- * return -1 if no # is found
- */
- PageZipper.prototype.getNumberAtPos = function(str, pos) {
- var currNum = "" + str.charAt(pos);
- var currPos = pos - 1;
- //walk forward
- while(currPos >= 0 && pgzp().isNumber(str.charAt(currPos))) {
- currNum = str.charAt(currPos) + currNum;
- currPos--;
- }
- //walk backward
- currPos = pos + 1;
- while(currPos < str.length && pgzp().isNumber(str.charAt(currPos))) {
- currNum += str.charAt(currPos);
- currPos++;
- }
- return pgzp().isNumber(currNum) ? parseInt(currNum, 10) : -1;
- }
- /*------------------------- Load Bookmarklet ----------------------*/
- /* Get the local copies of all our important variables
- * Required because in FF extension 'window' points to the browser dom window - is global across all tabs
- * window.content is the tab scope */
- function pgzp() {
- return window.currPgzp;
- }
- /*------------------------- Bookmarklet ----------------------*/
- function _pgzpInitBookmarklet() {
- window.currPgzp = new PageZipper();
- pgzp().win = window;
- pgzp().doc = window.document;
- pgzp().loader_type = "bookmarklet";
- //pgzp().media_path = "http://127.0.0.1/pgzp/src/ffextension/skin/";
- pgzp().media_path = "http://www.printwhatyoulike.com/static/pagezipper/ui/";
- pgzp().loadPageZipper();
- }
- function _pgzpToggleBookmarklet() {
- if (pgzp().is_running) {
- pgzp().stopPageZipper();
- } else {
- pgzp().runPageZipper();
- }
- }
- //Start!
- _pgzpInitBookmarklet();
- _pgzpToggleBookmarklet();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement