|
@@ -0,0 +1,774 @@
|
|
|
+/*
|
|
|
+== Page scroll to id ==
|
|
|
+Version: 1.5.8
|
|
|
+Plugin URI: http://manos.malihu.gr/page-scroll-to-id/
|
|
|
+Author: malihu
|
|
|
+Author URI: http://manos.malihu.gr
|
|
|
+License: MIT License (MIT)
|
|
|
+*/
|
|
|
+
|
|
|
+/*
|
|
|
+Copyright 2013 malihu (email: manos@malihu.gr)
|
|
|
+
|
|
|
+Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
+of this software and associated documentation files (the "Software"), to deal
|
|
|
+in the Software without restriction, including without limitation the rights
|
|
|
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
+copies of the Software, and to permit persons to whom the Software is
|
|
|
+furnished to do so, subject to the following conditions:
|
|
|
+
|
|
|
+The above copyright notice and this permission notice shall be included in
|
|
|
+all copies or substantial portions of the Software.
|
|
|
+
|
|
|
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
+THE SOFTWARE.
|
|
|
+*/
|
|
|
+
|
|
|
+;(function($,window,document,undefined){
|
|
|
+
|
|
|
+ /* plugin namespace, prefix, default selector(s) */
|
|
|
+
|
|
|
+ var pluginNS="mPageScroll2id",
|
|
|
+ pluginPfx="mPS2id",
|
|
|
+ defaultSelector=".m_PageScroll2id,a[rel~='m_PageScroll2id'],.page-scroll-to-id,a[rel~='page-scroll-to-id'],._ps2id",
|
|
|
+
|
|
|
+ /* default options */
|
|
|
+
|
|
|
+ defaults={
|
|
|
+ /* scroll animation speed in milliseconds: Integer */
|
|
|
+ scrollSpeed:1000,
|
|
|
+ /* auto-adjust animation speed (according to target element position and window scroll): Boolean */
|
|
|
+ autoScrollSpeed:true,
|
|
|
+ /* scroll animation easing when page is idle: String */
|
|
|
+ scrollEasing:"easeInOutQuint",
|
|
|
+ /* scroll animation easing while page is scrolling: String */
|
|
|
+ scrollingEasing:"easeOutQuint",
|
|
|
+ /* end of page "smooth scrolling" (auto-adjust the scroll-to position when bottom elements are too short): Boolean */
|
|
|
+ pageEndSmoothScroll:true,
|
|
|
+ /*
|
|
|
+ page layout defines scrolling direction: String
|
|
|
+ values: "vertical", "horizontal", "auto"
|
|
|
+ */
|
|
|
+ layout:"vertical",
|
|
|
+ /* extra space in pixels for the target element position: Integer */
|
|
|
+ offset:0,
|
|
|
+ /* highlight the main/default selectors or insert a different set: Boolean, String */
|
|
|
+ highlightSelector:false,
|
|
|
+ /* class of the clicked element: String */
|
|
|
+ clickedClass:pluginPfx+"-clicked",
|
|
|
+ /* class of the current target element: String */
|
|
|
+ targetClass:pluginPfx+"-target",
|
|
|
+ /* class of the highlighted element: String */
|
|
|
+ highlightClass:pluginPfx+"-highlight",
|
|
|
+ /* force a single highlighted element each time: Boolean */
|
|
|
+ forceSingleHighlight:false,
|
|
|
+ /* keep element highlighted until next (one element always stays highlighted): boolean */
|
|
|
+ keepHighlightUntilNext:false,
|
|
|
+ /* highlight elements according to their target and next target position (useful when targets have zero dimensions). Non "auto" layouts only: boolean */
|
|
|
+ highlightByNextTarget:false,
|
|
|
+ /* disable plugin below [x,y] screen size: boolean, integer, array ([x,y]) */
|
|
|
+ disablePluginBelow:false,
|
|
|
+ /* enable/disable click events for all selectors */
|
|
|
+ clickEvents:true,
|
|
|
+ /* append hash to URL/address bar */
|
|
|
+ appendHash:false,
|
|
|
+ /* user callback functions: fn */
|
|
|
+ onStart:function(){},
|
|
|
+ onComplete:function(){},
|
|
|
+ /* enable/disable the default selector: Boolean */
|
|
|
+ defaultSelector:false,
|
|
|
+ /* highlight elements now and in the future */
|
|
|
+ live:true,
|
|
|
+ /* set specific live selector(s): String */
|
|
|
+ liveSelector:false
|
|
|
+ },
|
|
|
+
|
|
|
+ /* vars, constants */
|
|
|
+
|
|
|
+ selector,opt,_init,_trigger,_clicked,_target,_to,_axis,_offset,_dataOffset,_totalInstances=0,_liveTimer,_speed,
|
|
|
+
|
|
|
+ /*
|
|
|
+ ---------------
|
|
|
+ methods
|
|
|
+ ---------------
|
|
|
+ */
|
|
|
+
|
|
|
+ methods={
|
|
|
+
|
|
|
+ /* plugin initialization method */
|
|
|
+
|
|
|
+ init:function(options){
|
|
|
+
|
|
|
+ /* extend options, store each option in jquery data */
|
|
|
+
|
|
|
+ var options=$.extend(true,{},defaults,options);
|
|
|
+
|
|
|
+ $(document).data(pluginPfx,options);
|
|
|
+ opt=$(document).data(pluginPfx);
|
|
|
+
|
|
|
+ /* check/set jquery (deprecated) selector property if not defined */
|
|
|
+ if(!this.selector){
|
|
|
+ var selectorClass="__"+pluginPfx;
|
|
|
+ this.each(function(){
|
|
|
+ var el=$(this);
|
|
|
+ if(!el.hasClass(selectorClass)){
|
|
|
+ el.addClass(selectorClass);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this.selector="."+selectorClass;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* live selector */
|
|
|
+
|
|
|
+ if(opt.liveSelector) this.selector+=","+opt.liveSelector;
|
|
|
+
|
|
|
+ /* set selector */
|
|
|
+
|
|
|
+ selector=(!selector) ? this.selector : selector+","+this.selector;
|
|
|
+
|
|
|
+ if(opt.defaultSelector){
|
|
|
+ if(typeof $(selector)!=="object" || $(selector).length===0){
|
|
|
+ selector=defaultSelector;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* plugin events */
|
|
|
+
|
|
|
+ if(opt.clickEvents){
|
|
|
+ $(document)
|
|
|
+
|
|
|
+ .undelegate("."+pluginPfx)
|
|
|
+
|
|
|
+ .delegate(selector,"click."+pluginPfx,function(e){
|
|
|
+ if(functions._isDisabled.call(null)){
|
|
|
+ functions._removeClasses.call(null);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var $this=$(this),
|
|
|
+ href=$this.attr("href"),
|
|
|
+ hrefProp=$this.prop("href");
|
|
|
+ if(href && href.indexOf("#/")!==-1){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ functions._reset.call(null);
|
|
|
+ _dataOffset=$this.data("ps2id-offset") || 0;
|
|
|
+ if(functions._isValid.call(null,href,hrefProp) && functions._findTarget.call(null,href)){
|
|
|
+ e.preventDefault();
|
|
|
+ _trigger="selector";
|
|
|
+ _clicked=$this;
|
|
|
+ functions._setClasses.call(null,true);
|
|
|
+ functions._scrollTo.call(null);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ $(window)
|
|
|
+
|
|
|
+ .unbind("."+pluginPfx)
|
|
|
+
|
|
|
+ .bind("scroll."+pluginPfx+" resize."+pluginPfx,function(){
|
|
|
+ if(functions._isDisabled.call(null)){
|
|
|
+ functions._removeClasses.call(null);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var targets=$("._"+pluginPfx+"-t");
|
|
|
+ targets.each(function(i){
|
|
|
+ var t=$(this),id=t.attr("id"),
|
|
|
+ h=functions._findHighlight.call(null,id);
|
|
|
+ functions._setClasses.call(null,false,t,h);
|
|
|
+ if(i==targets.length-1){functions._extendClasses.call(null);}
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ /* plugin has initialized */
|
|
|
+
|
|
|
+ _init=true;
|
|
|
+
|
|
|
+ /* setup selectors, target elements, basic plugin classes etc. */
|
|
|
+
|
|
|
+ functions._setup.call(null);
|
|
|
+
|
|
|
+ /*
|
|
|
+ monitor for elements matching the current highlight selector and call plugin setup when found (now and in the future)
|
|
|
+ to manually enable/disable: $(document).data("mPS2id").live=boolean
|
|
|
+ */
|
|
|
+
|
|
|
+ functions._live.call(null);
|
|
|
+ },
|
|
|
+
|
|
|
+ /* scrollTo method */
|
|
|
+
|
|
|
+ scrollTo:function(id,options){
|
|
|
+ if(functions._isDisabled.call(null)){
|
|
|
+ functions._removeClasses.call(null);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(id && typeof id!=="undefined"){
|
|
|
+ functions._isInit.call(null);
|
|
|
+ var defaults={
|
|
|
+ layout:opt.layout,
|
|
|
+ offset:opt.offset,
|
|
|
+ clicked:false
|
|
|
+ },
|
|
|
+ options=$.extend(true,{},defaults,options);
|
|
|
+ functions._reset.call(null);
|
|
|
+ _axis=options.layout;
|
|
|
+ _offset=options.offset;
|
|
|
+ id=(id.indexOf("#")!==-1) ? id : "#"+id;
|
|
|
+ if(functions._isValid.call(null,id) && functions._findTarget.call(null,id)){
|
|
|
+ _trigger="scrollTo";
|
|
|
+ _clicked=options.clicked;
|
|
|
+ if(_clicked){
|
|
|
+ functions._setClasses.call(null,true);
|
|
|
+ }
|
|
|
+ functions._scrollTo.call(null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /* destroy method */
|
|
|
+
|
|
|
+ destroy:function(){
|
|
|
+ $(window).unbind("."+pluginPfx);
|
|
|
+ $(document).undelegate("."+pluginPfx).removeData(pluginPfx);
|
|
|
+ $("._"+pluginPfx+"-t").removeData(pluginPfx);
|
|
|
+ functions._removeClasses.call(null,true);
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /*
|
|
|
+ ---------------
|
|
|
+ functions
|
|
|
+ ---------------
|
|
|
+ */
|
|
|
+
|
|
|
+ functions={
|
|
|
+
|
|
|
+ /* checks if screen size ([x,y]) is below the value(s) set in disablePluginBelow option */
|
|
|
+
|
|
|
+ _isDisabled:function(){
|
|
|
+ var e=window,a="inner",
|
|
|
+ val=opt.disablePluginBelow instanceof Array ? [opt.disablePluginBelow[0] || 0,opt.disablePluginBelow[1] || 0] : [opt.disablePluginBelow || 0,0];
|
|
|
+ if(!("innerWidth" in window )){
|
|
|
+ a="client";
|
|
|
+ e=document.documentElement || document.body;
|
|
|
+ }
|
|
|
+ return e[a+"Width"]<=val[0] || e[a+"Height"]<=val[1];
|
|
|
+ },
|
|
|
+
|
|
|
+ /* checks if href attribute is valid */
|
|
|
+
|
|
|
+ _isValid:function(href,hrefProp){
|
|
|
+ if(!href){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ hrefProp=(!hrefProp) ? href : hrefProp;
|
|
|
+ var str=(hrefProp.indexOf("#/")!==-1) ? hrefProp.split("#/")[0] : hrefProp.split("#")[0],
|
|
|
+ loc=window.location.toString().split("#")[0];
|
|
|
+ return href!=="#" && href.indexOf("#")!==-1 && (str==="" || decodeURIComponent(str)===decodeURIComponent(loc));
|
|
|
+ },
|
|
|
+
|
|
|
+ /* setup selectors, target elements, basic plugin classes etc. */
|
|
|
+
|
|
|
+ _setup:function(){
|
|
|
+ var el=functions._highlightSelector(),i=1,tp=0;
|
|
|
+ return $(el).each(function(){
|
|
|
+ var $this=$(this),href=$this.attr("href"),hrefProp=$this.prop("href");
|
|
|
+ if(functions._isValid.call(null,href,hrefProp)){
|
|
|
+ var id=(href.indexOf("#/")!==-1) ? href.split("#/")[1] : href.split("#")[1],t=$("#"+id);
|
|
|
+ if(t.length>0){
|
|
|
+ if(opt.highlightByNextTarget){
|
|
|
+ if(t!==tp){
|
|
|
+ if(!tp){t.data(pluginPfx,{tn:"0"});}else{tp.data(pluginPfx,{tn:t});}
|
|
|
+ tp=t;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(!t.hasClass("_"+pluginPfx+"-t")){
|
|
|
+ t.addClass("_"+pluginPfx+"-t");
|
|
|
+ }
|
|
|
+ t.data(pluginPfx,{i:i});
|
|
|
+ if(!$this.hasClass("_"+pluginPfx+"-h")){
|
|
|
+ $this.addClass("_"+pluginPfx+"-h");
|
|
|
+ }
|
|
|
+ var h=functions._findHighlight.call(null,id);
|
|
|
+ functions._setClasses.call(null,false,t,h);
|
|
|
+ _totalInstances=i;
|
|
|
+ i++
|
|
|
+ if(i==$(el).length){functions._extendClasses.call(null);}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ /* returns the highlight selector */
|
|
|
+
|
|
|
+ _highlightSelector:function(){
|
|
|
+ return (opt.highlightSelector && opt.highlightSelector!=="") ? opt.highlightSelector : selector;
|
|
|
+ },
|
|
|
+
|
|
|
+ /* finds the target element */
|
|
|
+
|
|
|
+ _findTarget:function(str){
|
|
|
+ var val=(str.indexOf("#/")!==-1) ? str.split("#/")[1] : str.split("#")[1],
|
|
|
+ el=$("#"+val);
|
|
|
+ if(el.length<1 || el.css("position")==="fixed"){
|
|
|
+ if(val==="top"){
|
|
|
+ el=$("body");
|
|
|
+ }else{
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ _target=el;
|
|
|
+ if(!_axis){
|
|
|
+ _axis=opt.layout;
|
|
|
+ }
|
|
|
+ _offset=functions._setOffset.call(null);
|
|
|
+ _to=[(el.offset().top-_offset[0]).toString(),(el.offset().left-_offset[1]).toString()];
|
|
|
+ _to[0]=(_to[0]<0) ? 0 : _to[0];
|
|
|
+ _to[1]=(_to[1]<0) ? 0 : _to[1];
|
|
|
+ return _to;
|
|
|
+ },
|
|
|
+
|
|
|
+ /* sets the offset value (pixels, objects etc.) */
|
|
|
+
|
|
|
+ _setOffset:function(){
|
|
|
+ if(!_offset){
|
|
|
+ _offset=(opt.offset) ? opt.offset : 0;
|
|
|
+ }
|
|
|
+ if(_dataOffset){
|
|
|
+ _offset=_dataOffset;
|
|
|
+ }
|
|
|
+ var val,obj,y,x;
|
|
|
+ switch(typeof _offset){
|
|
|
+ case "object":
|
|
|
+ case "string":
|
|
|
+ val=[(_offset["y"]) ? _offset["y"] : _offset,(_offset["x"]) ? _offset["x"] : _offset];
|
|
|
+ obj=[(val[0] instanceof jQuery) ? val[0] : $(val[0]),(val[1] instanceof jQuery) ? val[1] : $(val[1])];
|
|
|
+ if(obj[0].length>0){ // js/jquery object
|
|
|
+ y=obj[0].height();
|
|
|
+ if(obj[0].css("position")==="fixed"){ // include position for fixed elements
|
|
|
+ y+=obj[0][0].offsetTop;
|
|
|
+ }
|
|
|
+ }else if(!isNaN(parseFloat(val[0])) && isFinite(val[0])){ // numeric string
|
|
|
+ y=parseInt(val[0]);
|
|
|
+ }else{
|
|
|
+ y=0; // non-existing value
|
|
|
+ }
|
|
|
+ if(obj[1].length>0){ // js/jquery object
|
|
|
+ x=obj[1].width();
|
|
|
+ if(obj[1].css("position")==="fixed"){ // include position for fixed elements
|
|
|
+ x+=obj[1][0].offsetLeft;
|
|
|
+ }
|
|
|
+ }else if(!isNaN(parseFloat(val[1])) && isFinite(val[1])){ // numeric string
|
|
|
+ x=parseInt(val[1]);
|
|
|
+ }else{
|
|
|
+ x=0; // non-existing value
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "function":
|
|
|
+ val=_offset.call(null); // function (single value or array)
|
|
|
+ if(val instanceof Array){
|
|
|
+ y=val[0];
|
|
|
+ x=val[1];
|
|
|
+ }else{
|
|
|
+ y=x=val;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ y=x=parseInt(_offset); // number
|
|
|
+ }
|
|
|
+ return [y,x];
|
|
|
+ },
|
|
|
+
|
|
|
+ /* finds the element that should be highlighted */
|
|
|
+
|
|
|
+ _findHighlight:function(id){
|
|
|
+ var wLoc=window.location,loc=wLoc.toString().split("#")[0],locPath=wLoc.pathname;
|
|
|
+ return $("._"+pluginPfx+"-h[href='#"+id+"'],._"+pluginPfx+"-h[href='"+loc+"#"+id+"'],._"+pluginPfx+"-h[href='"+locPath+"#"+id+"'],._"+pluginPfx+"-h[href='#/"+id+"'],._"+pluginPfx+"-h[href='"+loc+"#/"+id+"'],._"+pluginPfx+"-h[href='"+locPath+"#/"+id+"']");
|
|
|
+ },
|
|
|
+
|
|
|
+ /* sets plugin classes */
|
|
|
+
|
|
|
+ _setClasses:function(c,t,h){
|
|
|
+ var cc=opt.clickedClass,tc=opt.targetClass,hc=opt.highlightClass;
|
|
|
+ if(c && cc && cc!==""){
|
|
|
+ $("."+cc).removeClass(cc);
|
|
|
+ _clicked.addClass(cc);
|
|
|
+ }else if(t && tc && tc!=="" && h && hc && hc!==""){
|
|
|
+ if(functions._currentTarget.call(null,t)){
|
|
|
+ t.addClass(tc);
|
|
|
+ h.addClass(hc);
|
|
|
+ }else{
|
|
|
+ if(!opt.keepHighlightUntilNext || $("."+hc).length>1){
|
|
|
+ t.removeClass(tc);
|
|
|
+ h.removeClass(hc);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /* extends plugin classes */
|
|
|
+
|
|
|
+ _extendClasses:function(){
|
|
|
+ var tc=opt.targetClass,hc=opt.highlightClass,
|
|
|
+ $tc=$("."+tc),$hc=$("."+hc),ftc=tc+"-first",ltc=tc+"-last",fhc=hc+"-first",lhc=hc+"-last";
|
|
|
+ $("._"+pluginPfx+"-t").removeClass(ftc+" "+ltc);
|
|
|
+ $("._"+pluginPfx+"-h").removeClass(fhc+" "+lhc);
|
|
|
+ if(!opt.forceSingleHighlight){
|
|
|
+ $tc.slice(0,1).addClass(ftc).end().slice(-1).addClass(ltc);
|
|
|
+ $hc.slice(0,1).addClass(fhc).end().slice(-1).addClass(lhc);
|
|
|
+ }else{
|
|
|
+ if(opt.keepHighlightUntilNext && $tc.length>1){
|
|
|
+ $tc.slice(0,1).removeClass(tc); $hc.slice(0,1).removeClass(hc);
|
|
|
+ }else{
|
|
|
+ $tc.slice(1).removeClass(tc); $hc.slice(1).removeClass(hc);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /* removes plugin classes */
|
|
|
+
|
|
|
+ _removeClasses:function(destroy){
|
|
|
+ $("."+opt.clickedClass).removeClass(opt.clickedClass);
|
|
|
+ $("."+opt.targetClass).removeClass(opt.targetClass+" "+opt.targetClass+"-first "+opt.targetClass+"-last");
|
|
|
+ $("."+opt.highlightClass).removeClass(opt.highlightClass+" "+opt.highlightClass+"-first "+opt.highlightClass+"-last");
|
|
|
+ if(destroy){
|
|
|
+ $("._"+pluginPfx+"-t").removeClass("_"+pluginPfx+"-t");
|
|
|
+ $("._"+pluginPfx+"-h").removeClass("_"+pluginPfx+"-h");
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /* checks if target element is in viewport */
|
|
|
+
|
|
|
+ _currentTarget:function(t){
|
|
|
+ var o=opt["target_"+t.data(pluginPfx).i],
|
|
|
+ dataTarget=t.data("ps2id-target"),
|
|
|
+ rect=dataTarget && $(dataTarget)[0] ? $(dataTarget)[0].getBoundingClientRect() : t[0].getBoundingClientRect();
|
|
|
+ if(typeof o!=="undefined"){
|
|
|
+ var y=t.offset().top,x=t.offset().left,
|
|
|
+ from=(o.from) ? o.from+y : y,to=(o.to) ? o.to+y : y,
|
|
|
+ fromX=(o.fromX) ? o.fromX+x : x,toX=(o.toX) ? o.toX+x : x;
|
|
|
+ return(
|
|
|
+ rect.top >= to && rect.top <= from &&
|
|
|
+ rect.left >= toX && rect.left <= fromX
|
|
|
+ );
|
|
|
+ }else{
|
|
|
+ var wh=$(window).height(),ww=$(window).width(),
|
|
|
+ th=dataTarget ? $(dataTarget).height() : t.height(),tw=dataTarget ? $(dataTarget).width() : t.width(),
|
|
|
+ base=1+(th/wh),
|
|
|
+ top=base,bottom=(th<wh) ? base*(wh/th) : base,
|
|
|
+ baseX=1+(tw/ww),
|
|
|
+ left=baseX,right=(tw<ww) ? baseX*(ww/tw) : baseX,
|
|
|
+ val=[rect.top <= wh/top,rect.bottom >= wh/bottom,rect.left <= ww/left,rect.right >= ww/right];
|
|
|
+ if(opt.highlightByNextTarget){
|
|
|
+ var tn=t.data(pluginPfx).tn;
|
|
|
+ if(tn){
|
|
|
+ var rectn=tn[0].getBoundingClientRect();
|
|
|
+ if(opt.layout==="vertical"){
|
|
|
+ val=[rect.top <= wh/2,rectn.top > wh/2,1,1];
|
|
|
+ }else if(opt.layout==="horizontal"){
|
|
|
+ val=[1,1,rect.left <= ww/2,rectn.left > ww/2];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return(val[0] && val[1] && val[2] && val[3]);
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /* scrolls the page */
|
|
|
+
|
|
|
+ _scrollTo:function(){
|
|
|
+ _speed=functions._scrollSpeed.call(null);
|
|
|
+ _to=(opt.pageEndSmoothScroll) ? functions._pageEndSmoothScroll.call(null) : _to;
|
|
|
+ var _scrollable=$("html,body"),
|
|
|
+ speed=(opt.autoScrollSpeed) ? functions._autoScrollSpeed.call(null) : _speed,
|
|
|
+ easing=(_scrollable.is(":animated")) ? opt.scrollingEasing : opt.scrollEasing,
|
|
|
+ _t=$(window).scrollTop(),_l=$(window).scrollLeft();
|
|
|
+ switch(_axis){
|
|
|
+ case "horizontal":
|
|
|
+ if(_l!=_to[1]){
|
|
|
+ functions._callbacks.call(null,"onStart");
|
|
|
+ _scrollable.stop().animate({scrollLeft:_to[1]},speed,easing).promise().then(function(){
|
|
|
+ functions._callbacks.call(null,"onComplete");
|
|
|
+ });
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "auto":
|
|
|
+ if(_t!=_to[0] || _l!=_to[1]){
|
|
|
+ functions._callbacks.call(null,"onStart");
|
|
|
+ if(navigator.userAgent.match(/(iPod|iPhone|iPad|Android)/)){ // mobile fix
|
|
|
+ var left;
|
|
|
+ _scrollable.stop().animate({pageYOffset:_to[0],pageXOffset:_to[1]},{
|
|
|
+ duration:speed,
|
|
|
+ easing:easing,
|
|
|
+ step:function(now,fx){
|
|
|
+ if(fx.prop=='pageXOffset'){
|
|
|
+ left=now;
|
|
|
+ }else if(fx.prop=='pageYOffset'){
|
|
|
+ window.scrollTo(left,now);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }).promise().then(function(){
|
|
|
+ functions._callbacks.call(null,"onComplete");
|
|
|
+ });
|
|
|
+ }else{
|
|
|
+ _scrollable.stop().animate({scrollTop:_to[0],scrollLeft:_to[1]},speed,easing).promise().then(function(){
|
|
|
+ functions._callbacks.call(null,"onComplete");
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ if(_t!=_to[0]){
|
|
|
+ functions._callbacks.call(null,"onStart");
|
|
|
+ _scrollable.stop().animate({scrollTop:_to[0]},speed,easing).promise().then(function(){
|
|
|
+ functions._callbacks.call(null,"onComplete");
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /* sets end of page "smooth scrolling" position */
|
|
|
+
|
|
|
+ _pageEndSmoothScroll:function(){
|
|
|
+ var _dh=$(document).height(),_dw=$(document).width(),
|
|
|
+ _wh=$(window).height(),_ww=$(window).width();
|
|
|
+ return [((_dh-_to[0])<_wh) ? _dh-_wh : _to[0],((_dw-_to[1])<_ww) ? _dw-_ww : _to[1]];
|
|
|
+ },
|
|
|
+
|
|
|
+ /* sets animation speed (link-specific speed via ps2id-speed-VALUE class on link or link's parent) */
|
|
|
+
|
|
|
+ _scrollSpeed:function(){
|
|
|
+ var speed=opt.scrollSpeed;
|
|
|
+ if(_clicked && _clicked.length){
|
|
|
+ _clicked.add(_clicked.parent()).each(function(){
|
|
|
+ var $this=$(this);
|
|
|
+ if($this.attr("class")){
|
|
|
+ var clickedClasses=$this.attr("class").split(" ");
|
|
|
+ for(var index in clickedClasses){
|
|
|
+ if(String(clickedClasses[index]).match(/^ps2id-speed-\d+$/)){
|
|
|
+ speed=clickedClasses[index].split("ps2id-speed-")[1];
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return parseInt(speed);
|
|
|
+ },
|
|
|
+
|
|
|
+ /* sets the auto-adjusted animation speed */
|
|
|
+
|
|
|
+ _autoScrollSpeed:function(){
|
|
|
+ var _t=$(window).scrollTop(),_l=$(window).scrollLeft(),
|
|
|
+ _h=$(document).height(),_w=$(document).width(),
|
|
|
+ val=[
|
|
|
+ _speed+((_speed*(Math.floor((Math.abs(_to[0]-_t)/_h)*100)))/100),
|
|
|
+ _speed+((_speed*(Math.floor((Math.abs(_to[1]-_l)/_w)*100)))/100)
|
|
|
+ ];
|
|
|
+ return Math.max.apply(Math,val);
|
|
|
+ },
|
|
|
+
|
|
|
+ /* user callback functions */
|
|
|
+
|
|
|
+ _callbacks:function(c){
|
|
|
+ if(!opt){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this[pluginPfx]={
|
|
|
+ trigger:_trigger,clicked:_clicked,target:_target,scrollTo:{y:_to[0],x:_to[1]}
|
|
|
+ };
|
|
|
+ switch(c){
|
|
|
+ case "onStart":
|
|
|
+ //append hash to URL/address bar
|
|
|
+ if(opt.appendHash && window.history && window.history.pushState && _clicked && _clicked.length){
|
|
|
+ var h="#"+_clicked.attr("href").split("#")[1];
|
|
|
+ if(h!==window.location.hash) history.pushState("","",h);
|
|
|
+ }
|
|
|
+ opt.onStart.call(null,this[pluginPfx]);
|
|
|
+ break;
|
|
|
+ case "onComplete":
|
|
|
+ opt.onComplete.call(null,this[pluginPfx]);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /* resets/clears vars and constants */
|
|
|
+
|
|
|
+ _reset:function(){
|
|
|
+ _axis=_offset=_dataOffset=false;
|
|
|
+ },
|
|
|
+
|
|
|
+ /* checks if plugin has initialized */
|
|
|
+
|
|
|
+ _isInit:function(){
|
|
|
+ if(!_init){
|
|
|
+ methods.init.apply(this);
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /* live fn */
|
|
|
+
|
|
|
+ _live:function(){
|
|
|
+ _liveTimer=setTimeout(function(){
|
|
|
+ if(opt.live){
|
|
|
+ if($(functions._highlightSelector()).length!==_totalInstances){
|
|
|
+ functions._setup.call(null);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ if(_liveTimer){clearTimeout(_liveTimer);}
|
|
|
+ }
|
|
|
+ functions._live.call(null);
|
|
|
+ },1000);
|
|
|
+ },
|
|
|
+
|
|
|
+ /* extends jquery with custom easings (as jquery ui) */
|
|
|
+
|
|
|
+ _easing:function(){
|
|
|
+ $.easing.easeInQuad=$.easing.easeInQuad || function(x){
|
|
|
+ return x*x;
|
|
|
+ };
|
|
|
+ $.easing.easeOutQuad=$.easing.easeOutQuad || function(x){
|
|
|
+ return 1-(1-x)*(1-x);
|
|
|
+ };
|
|
|
+ $.easing.easeInOutQuad=$.easing.easeInOutQuad || function(x){
|
|
|
+ return x<0.5 ? 2*x*x : 1-Math.pow(-2*x+2,2)/2;
|
|
|
+ };
|
|
|
+ $.easing.easeInCubic=$.easing.easeInCubic || function(x){
|
|
|
+ return x*x*x;
|
|
|
+ };
|
|
|
+ $.easing.easeOutCubic=$.easing.easeOutCubic || function(x){
|
|
|
+ return 1-Math.pow(1-x,3);
|
|
|
+ };
|
|
|
+ $.easing.easeInOutCubic=$.easing.easeInOutCubic || function(x){
|
|
|
+ return x<0.5 ? 4*x*x*x : 1-Math.pow(-2*x+2,3)/2;
|
|
|
+ };
|
|
|
+ $.easing.easeInQuart=$.easing.easeInQuart || function(x){
|
|
|
+ return x*x*x*x;
|
|
|
+ };
|
|
|
+ $.easing.easeOutQuart=$.easing.easeOutQuart || function(x){
|
|
|
+ return 1-Math.pow(1-x,4);
|
|
|
+ };
|
|
|
+ $.easing.easeInOutQuart=$.easing.easeInOutQuart || function(x){
|
|
|
+ return x<0.5 ? 8*x*x*x*x : 1-Math.pow(-2*x+2,4)/2;
|
|
|
+ };
|
|
|
+ $.easing.easeInQuint=$.easing.easeInQuint || function(x){
|
|
|
+ return x*x*x*x*x;
|
|
|
+ };
|
|
|
+ $.easing.easeOutQuint=$.easing.easeOutQuint || function(x){
|
|
|
+ return 1-Math.pow(1-x,5);
|
|
|
+ };
|
|
|
+ $.easing.easeInOutQuint=$.easing.easeInOutQuint || function(x){
|
|
|
+ return x<0.5 ? 16*x*x*x*x*x : 1-Math.pow(-2*x+2,5)/2;
|
|
|
+ };
|
|
|
+ $.easing.easeInExpo=$.easing.easeInExpo || function(x){
|
|
|
+ return x===0 ? 0 : Math.pow(2,10*x-10);
|
|
|
+ };
|
|
|
+ $.easing.easeOutExpo=$.easing.easeOutExpo || function(x){
|
|
|
+ return x===1 ? 1 : 1-Math.pow(2,-10*x);
|
|
|
+ };
|
|
|
+ $.easing.easeInOutExpo=$.easing.easeInOutExpo || function(x){
|
|
|
+ return x===0 ? 0 : x===1 ? 1 : x<0.5 ? Math.pow(2,20*x-10)/2 : (2-Math.pow(2,-20*x+10))/2;
|
|
|
+ };
|
|
|
+ $.easing.easeInSine=$.easing.easeInSine || function(x){
|
|
|
+ return 1-Math.cos(x*Math.PI/2);
|
|
|
+ };
|
|
|
+ $.easing.easeOutSine=$.easing.easeOutSine || function(x){
|
|
|
+ return Math.sin(x*Math.PI/2);
|
|
|
+ };
|
|
|
+ $.easing.easeInOutSine=$.easing.easeInOutSine || function(x){
|
|
|
+ return -(Math.cos(Math.PI*x)-1)/2;
|
|
|
+ };
|
|
|
+ $.easing.easeInCirc=$.easing.easeInCirc || function(x){
|
|
|
+ return 1-Math.sqrt(1-Math.pow(x,2));
|
|
|
+ };
|
|
|
+ $.easing.easeOutCirc=$.easing.easeOutCirc || function(x){
|
|
|
+ return Math.sqrt(1-Math.pow(x-1,2));
|
|
|
+ };
|
|
|
+ $.easing.easeInOutCirc=$.easing.easeInOutCirc || function(x){
|
|
|
+ return x<0.5 ? (1-Math.sqrt(1-Math.pow(2*x,2)))/2 : (Math.sqrt(1-Math.pow(-2*x+2,2))+1)/2;
|
|
|
+ };
|
|
|
+ $.easing.easeInElastic=$.easing.easeInElastic || function(x){
|
|
|
+ return x===0 ? 0 : x===1 ? 1 : -Math.pow(2,10*x-10)*Math.sin((x*10-10.75)*((2*Math.PI)/3));
|
|
|
+ };
|
|
|
+ $.easing.easeOutElastic=$.easing.easeOutElastic || function(x){
|
|
|
+ return x===0 ? 0 : x===1 ? 1 : Math.pow(2,-10*x)*Math.sin((x*10-0.75)*((2*Math.PI)/3))+1;
|
|
|
+ };
|
|
|
+ $.easing.easeInOutElastic=$.easing.easeInOutElastic || function(x){
|
|
|
+ return x===0 ? 0 : x===1 ? 1 : x<0.5 ? -(Math.pow(2,20*x-10)*Math.sin((20*x-11.125)*((2*Math.PI)/4.5)))/2 : Math.pow(2,-20*x+10)*Math.sin((20*x-11.125)*((2*Math.PI)/4.5))/2+1;
|
|
|
+ };
|
|
|
+ $.easing.easeInBack=$.easing.easeInBack || function(x){
|
|
|
+ return (1.70158+1)*x*x*x-1.70158*x*x;
|
|
|
+ };
|
|
|
+ $.easing.easeOutBack=$.easing.easeOutBack || function(x){
|
|
|
+ return 1+(1.70158+1)*Math.pow(x-1,3)+1.70158*Math.pow(x-1,2);
|
|
|
+ };
|
|
|
+ $.easing.easeInOutBack=$.easing.easeInOutBack || function(x){
|
|
|
+ return x<0.5 ? (Math.pow(2*x,2)*(((1.70158*1.525)+1)*2*x-(1.70158*1.525)))/2 : (Math.pow(2*x-2,2)*(((1.70158*1.525)+1)*(x*2-2)+(1.70158*1.525))+2)/2;
|
|
|
+ };
|
|
|
+ $.easing.easeInBounce=$.easing.easeInBounce || function(x){
|
|
|
+ return 1-__bounceOut(1-x);
|
|
|
+ };
|
|
|
+ $.easing.easeOutBounce=$.easing.easeOutBounce || __bounceOut;
|
|
|
+ $.easing.easeInOutBounce=$.easing.easeInOutBounce || function(x){
|
|
|
+ return x<0.5 ? (1-__bounceOut(1-2*x))/2 : (1+__bounceOut(2*x-1))/2;
|
|
|
+ };
|
|
|
+ function __bounceOut(x){
|
|
|
+ var n1=7.5625,d1=2.75;
|
|
|
+ if(x<1/d1){
|
|
|
+ return n1*x*x;
|
|
|
+ }else if(x<2/d1){
|
|
|
+ return n1*(x-=(1.5/d1))*x+.75;
|
|
|
+ }else if(x<2.5/d1){
|
|
|
+ return n1*(x-=(2.25/d1))*x+.9375;
|
|
|
+ }else{
|
|
|
+ return n1*(x-=(2.625/d1))*x+.984375;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ ---------------
|
|
|
+ plugin setup
|
|
|
+ ---------------
|
|
|
+ */
|
|
|
+
|
|
|
+ /* extend jquery with custom easings */
|
|
|
+
|
|
|
+ functions._easing.call();
|
|
|
+
|
|
|
+ /* plugin constructor functions */
|
|
|
+
|
|
|
+ $.fn[pluginNS]=function(method){
|
|
|
+ if(methods[method]){
|
|
|
+ return methods[method].apply(this,Array.prototype.slice.call(arguments,1));
|
|
|
+ }else if(typeof method==="object" || !method){
|
|
|
+ return methods.init.apply(this,arguments);
|
|
|
+ }else{
|
|
|
+ $.error("Method "+method+" does not exist");
|
|
|
+ }
|
|
|
+ };
|
|
|
+ $[pluginNS]=function(method){
|
|
|
+ if(methods[method]){
|
|
|
+ return methods[method].apply(this,Array.prototype.slice.call(arguments,1));
|
|
|
+ }else if(typeof method==="object" || !method){
|
|
|
+ return methods.init.apply(this,arguments);
|
|
|
+ }else{
|
|
|
+ $.error("Method "+method+" does not exist");
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ /*
|
|
|
+ allow setting plugin default options.
|
|
|
+ example: $.plugin_name.defaults.option_name="option_value";
|
|
|
+ */
|
|
|
+
|
|
|
+ $[pluginNS].defaults=defaults;
|
|
|
+
|
|
|
+})(jQuery,window,document);
|