
function Carousel(){this._init(Carousel.arguments);}
Carousel.prototype={_init:function(argv){this.vertical=false;this.loop=true;this.visibleItems=5;this.anim=new glow.anim.Animation(0.5);glow.lang.apply(this,argv[1]);this.holder=glow.dom.get(argv[0]);this.holder.addClass("visionAppsCarousel");this.items=(this.itemFilter)?this.holder.get(this.itemFilter):this.holder.children();var firstItem=this.items.slice(0,0+1);var width=firstItem.width()+parseInt(firstItem.css("margin-left"))+parseInt(firstItem.css("margin-right"));var height=firstItem.height()+parseInt(firstItem.css("margin-top"))+parseInt(firstItem.css("margin-bottom"));this.axis=(this.vertical)?"top":"left";this.mult=(!this.vertical)?width:height;this.currentVisibleItems=[];this.everyOtherFrame=0;if(this.anim){this.distanceToMove=0;glow.events.addListener(this.anim,"frame",function(){if(this.everyOtherFrame==0){this.everyOtherFrame=0;var dist=Math.ceil(this.distanceToMove*this.anim.value);this._moveItems(dist);this.distanceToMove=this.distanceToMove-dist;}else{this.everyOtherFrame++;}},this);glow.events.addListener(this.anim,"stop",function(){this._moveItems(this.distanceToMove);this.distanceToMove=0;},this);}
this._setDefaultPositions();this._moveItems(0);},_atEndPoint:function(dist){if(this.loop)return false;var curFirstItemPos=this.items[0].cache[this.axis]+dist;var maxFirstItemPos=0;if(curFirstItemPos>maxFirstItemPos){return"prev";}
var curLastItemPos=this.items[this.items.length-1].cache[this.axis]+dist;var maxLastItemPos=(this.visibleItems*this.mult)-this.mult;if(curLastItemPos<maxLastItemPos){return"next";}
return false;},_checkWrap:function(item){if(!this.loop)return false;if(item.cache[this.axis]<=(this.mult*-1)){item.cache[this.axis]=item.cache[this.axis]+(this.mult*this.items.length);return;}
if(item.cache[this.axis]>=(this.mult*(this.items.length-1))){item.cache[this.axis]=item.cache[this.axis]-(this.mult*this.items.length);return;}},_distanceFrom:function(item,pos){var itemPosition=this.items[item].cache[this.axis];var distance=itemPosition-(pos*this.mult);return distance;},_fireEndPointEvents:function(dist){var ep=this._atEndPoint(dist);if(!ep){glow.events.fire(this,'canDoPrevious');glow.events.fire(this,'canDoNext');}else if(ep=="next"){glow.events.fire(this,'cantDoNext');}else if(ep=="prev"){glow.events.fire(this,'cantDoPrevious');}},_getVisibleItems:function(){var that=this;var sorted=this.currentVisibleItems.sort(function(a,b){var a=that.items[a].cache[that.axis];var b=that.items[b].cache[that.axis];return a-b;});return sorted;},_getNonVisibleItems:function(amount,dir){if(amount>0){var curItems=this._getVisibleItems();var start=(dir>0)?curItems[curItems.length-1]:curItems[0];var items=[];for(var i=1;i<=amount;i++){var sum=(dir>0)?start+i:start-i;var ind;if(this.loop){var mod=this.items.length;var res=sum%mod;ind=(res<0)?mod+res:res;}else{if(sum>=0&&sum<this.items.length){ind=sum;}else{ind=null;}}
if(ind!=undefined)items.push(ind);}
return items;}
return[];},_moveItems:function(dist){if(this._atEndPoint(dist))return;var that=this;var currentVisibleItems=[];var min=0;var max=this.mult*this.visibleItems;this.items.each(function(i){that._updateAxis(this,this.cache[that.axis]+dist);that._checkWrap(this);if(this.cache[that.axis]>=min&&this.cache[that.axis]<max){currentVisibleItems.push(i);}
var item=glow.dom.get(this);item.css(that.axis,this.cache[that.axis]+"px");});this.currentVisibleItems=currentVisibleItems;},_setDefaultPositions:function(){var that=this;this.items.each(function(i){this.cache={};glow.dom.get(this).css("position","absolute");that._updateAxis(this,that.mult*i);});},_updateAxis:function(item,val){item.cache[this.axis]=val;},move:function(items,opts){var opts=opts||{anim:true};var distance=(opts["usePixels"])?items:items*this.mult;if(this.anim&&opts["anim"]){this.anim.stop()
this.distanceToMove=distance;this.anim.start();}else{this._moveItems(distance);}
this._fireEndPointEvents(distance);},moveTo:function(item,pos,opts){var opts=opts||{anim:true};var distance=this._distanceFrom(item,pos)*-1;if(this._atEndPoint(distance)){var newPos=(item<pos)?pos-1:pos+1;this.moveTo(item,newPos,opts);return}else{this.move(distance,{usePixels:true,anim:opts["anim"]});}},resetPositions:function(){this._setDefaultPositions();this._moveItems(0);},getItems:function(){return this.items;},getVisibleItemsIndexes:function(){return this._getVisibleItems();},getNextVisibleItemsIndexes:function(amount){var amount=(amount)?amount:this.visibleItems;return this._getNonVisibleItems(amount,1);},getPrevVisibleItemsIndexes:function(amount){var amount=(amount)?amount:this.visibleItems;return this._getNonVisibleItems(amount,-1);},addClass:function(item,className){if(item=="*"){this.items.addClass(className);}else{this.items.slice(item,item+1).addClass(className);}},removeClass:function(item,className){if(item=="*"){this.items.removeClass(className);}else{this.items.slice(item,item+1).removeClass(className);}},addItem:function(item,position){},removeItem:function(position){}}