/*
 * jCoverflip - Present your featured content elegantly.
 * Version: 1.0.2
 * Copyright 2010 New Signature
 *
 * This program is free software: you can redistribute it and/or modify it under the terms of the
 * GNU General Public License as published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with this program.
 * If not, see <http://www.gnu.org/licenses/>.
 *
 * You can contact New Signature by electronic mail at labs@newsignature.com
 * or- by U.S. Postal Service at 1100 H St. NW, Suite 940, Washington, DC 20005.
 */
(function($){var undefined;var nofn=function(){};var proxy=function(context,fn){return function(){if($.isFunction(fn)){return fn.apply(context,arguments)}else{return context[fn].apply(context,arguments)}}};animationqueue={};animationqueue.AnimationQueue=function(){this.sets=[];this.isRunning=false;this.current=0;this.totalTime=0;this.elapsedTime=0;this.startTime=1;this.poll=null};animationqueue.AnimationQueue.prototype={queue:function(animationSet){this.sets.push(animationSet)},start:function(time,callback){this.totalTime=time;this.elapsedTime=0;this.isRunning=true;callback=$.isFunction(callback)?callback:nofn;var timeShare=1;var firstTimeShare=1;if(this.sets.length>0){timeShare=this.sets.length;firstTimeShare=this.sets[0].totalTime>0?Math.max(0,Math.min(1,1-(this.sets[0].elapsedTime/this.sets[0].totalTime))):1}var startTime=(new Date()).getTime();if(this.sets.length>0){this.sets[0].start(firstTimeShare/timeShare*this.totalTime)}(function(self,totalTime,timeShare){function poll(){self.elapsedTime=(new Date()).getTime()-startTime;if(self.sets.length&&!self.sets[0].isRunning){self.sets.shift();if(self.sets.length){self.sets[0].start(totalTime/timeShare)}}if(self.elapsedTime>=self.totalTime&&self.sets.length==0){callback(self.elapsedTime);self.stop()}}self.poll=setInterval(poll,16)})(this,this.totalTime,timeShare)},stop:function(){if(this.isRunning){this.isRunning=false;var i=this.sets.length;while(i--){this.sets[i].stop()}clearInterval(this.poll)}},remove:function(animationSet){var i=this.sets.length;while(i--){if(this.sets[i]==animationSet){var newSets=this.sets.slice(0,i);this.animationSet=newSets.push(this.sets.slice(i+1))}}},get:function(){return this.sets.slice(0)}};animationqueue.AnimationSet=function(){this.steps=[];this.isStepsSorted=true;this.currentStep=-1;this.animations=[];this.isRunning=false;this.totalTime=0;this.elapsedTime=0;this.poll=null;this.data={}};animationqueue.AnimationSet.prototype={add:function(anim){if(anim instanceof animationqueue.AnimationStep){this.steps.push(anim);this.isStepsSorted=false;++this.currentStep}else{if(anim instanceof animationqueue.Animation){this.animations.push(anim)}}},start:function(time){this.elapsedTime=this.totalTime==0?0:this.elapsedTime/this.totalTime*time;this.totalTime=time;if(!this.isStepsSorted){this.steps.sort(function(a,b){return b.moment-a.moment});this.isStepsSorted=true}this.isRunning=true;this.startTime=(new Date()).getTime()-this.elapsedTime;var i=this.animations.length;while(i--){this.animations[i].start(this.totalTime)}var self=this;var animationsIndex=this.animations.length-1;function poll(timeSince){self.elapsedTime=(new Date()).getTime()-self.startTime;while(self.currentStep>=0&&self.steps[self.currentStep].getTime(self.totalTime)<=self.elapsedTime){self.steps[self.currentStep].doIt();--self.currentStep}if(self.elapsedTime>=self.totalTime&&self.currentStep<0){while(animationsIndex>=0&&!self.animations[animationsIndex].isRunning){--animationsIndex}if(animationsIndex<0){self.reset(self.elapsedTime)}}}this.poll=setInterval(poll,16)},stop:function(){if(this.isRunning){this.isRunning=false;if(this.poll){clearInterval(this.poll)}var i=this.animations.length;while(i--){this.animations[i].stop()}}},setData:function(key,data){this.data[key]=data},getData:function(key){return this.data[key]},reset:function(){this.stop();this.elapsedTime=0;this.currentStep=this.steps.length-1}};animationqueue.AnimationStep=function($element,cssParams,moment){this.$element=$element;this.cssParams=cssParams;this.moment=Math.min(1,Math.max(0,moment))};animationqueue.AnimationStep.prototype={getTime:function(totalTime){return this.moment*totalTime},doIt:function(){this.$element.css(this.cssParams)}};animationqueue.Animation=function($element,animateParams){this.$element=$element;this.animateParams=animateParams;this.isRunning=false};animationqueue.Animation.prototype={start:function(time){this.$element.stop();if(time===0){this.$element.css(this.animateParams);self.isRunning=false}else{this.isRunning=true;this.$element.animate(this.animateParams,time,proxy(this,function(){this.isRunning=false}))}},stop:function(){this.$element.stop();this.isRunning=false}};$.jcoverflip={animationElement:function(element,animate,steps){return{element:element,animate:animate,steps:steps}},getItemFromElement:function(element){element=$(element);var item=element.hasClass("ui-jcoverflip--item")?element:element.parents(".ui-jcoverflip--item");if(item.size()==0){return null}else{return{element:item,index:item.data("jcoverflip__index")}}}};$.widget("ui.jcoverflip",{_init:function(){this.animationQueue=new animationqueue.AnimationQueue();this.isInit=false;this.goToPoll={id:null};this.goToQueue=[];var items=this.items();this.element.addClass("ui-jcoverflip");items.addClass("ui-jcoverflip--item");var i=items.size();while(i--){var el=items.eq(i);el.data("jcoverflip__index",i)}this._goTo(this.options.current,0,true);this.options.controls.create(this.element,this.length())},_clickItem:function(event){if(this.options.disabled==true){return}var item=$.jcoverflip.getItemFromElement(event.target);if(item!==null&&item.index!=this.current()){this.current(item.index,event);event.preventDefault();return false}return true},_nextAndPrevParameters:function(by,wrapAround,callback,originalEvent){if(typeof by=="object"){originalEvent=by}else{if(typeof wrapAround=="object"){originalEvent=wrapAround}else{if(typeof callback=="object"){originalEvent=callback}else{if(typeof originalEvent=="object"){originalEvent=originalEvent}else{originalEvent={}}}}}if($.isFunction(by)){callback=by}else{if($.isFunction(wrapAround)){callback=wrapAround}else{if($.isFunction(callback)){callback=callback}else{callback=nofn}}}if(typeof(by)=="boolean"){wrapAround=by}else{if(typeof(wrapAround)=="boolean"){wrapAround=wrapAround}else{wrapAround=true}}by=isNaN(parseInt(by))?1:parseInt(by);return{by:by,wrapAround:wrapAround,callback:callback,originalEvent:originalEvent}},next:function(by,wrapAround,callback,originalEvent){if(this.options.disabled==true){return}var params=this._nextAndPrevParameters(by,wrapAround,callback,originalEvent);return this._nextAux(params.by,params.wrapAround,params.callback,params.originalEvent,"next")},_nextAux:function(by,wrapAround,callback,originalEvent,eventType){by=by===undefined&&isNaN(by)?1:parseInt(by);wrapAround=wrapAround!==false;var current=this.current();var oldCurrent=current;var length=this.length();if(wrapAround){current=(current+by)%length;current=current<0?current+length:current}else{current=Math.min(length-1,Math.max(0,current+by))}if(current!=this.current()){this.current(current,originalEvent)}if(eventType&&oldCurrent!=current){var event=$.Event(originalEvent);event.type=this.widgetEventPrefix+eventType;callback.call(this.element,event,{from:oldCurrent,to:current});this._trigger(eventType,originalEvent,{from:oldCurrent,to:current})}return current},previous:function(by,wrapAround,callback,originalEvent){if(this.options.disabled==true){return}var params=this._nextAndPrevParameters(by,wrapAround,callback,originalEvent);return this._nextAux(-1*params.by,params.wrapAround,params.callback,params.originalEvent,"previous")},first:function(callback,originalEvent){if(this.options.disabled==true){return}if(typeof callback=="object"){originalEvent=callback}else{if(typeof originalEvent=="object"){originalEvent=originalEvent}else{originalEvent={}}}callback=$.isFunction(callback)?callback:nofn;var from=this.current();var to=this.current(0,originalEvent);if(from!=to){var event=$.Event(originalEvent);event.type=this.widgetEventPrefix+"first";callback.call(this.element,event,{from:from,to:to});this._trigger("first",originalEvent,{from:from,to:to})}},last:function(callback,originalEvent){if(this.options.disabled==true){return}if(typeof callback=="object"){originalEvent=callback}else{if(typeof originalEvent=="object"){originalEvent=originalEvent}else{originalEvent={}}}callback=$.isFunction(callback)?callback:nofn;var from=this.current();var to=this.current(this.length()-1,originalEvent);if(from!=to){var event=$.Event(originalEvent);event.type=this.widgetEventPrefix+"last";callback.call(this.element,event,{from:from,to:to});this._trigger("last",originalEvent,{from:from,to:to})}},current:function(newCurrent,originalEvent){if(newCurrent!==undefined&&!isNaN(newCurrent)&&!this.options.disabled&&newCurrent!=this.options.current){this._goTo(newCurrent,undefined,false,originalEvent)}return this.options.current},destroy:function(){if(this.options.disabled==true){return}this._trigger("destroy",{});this.element.removeClass("ui-jcoverflip");var items=this.items();var titleEl;var i=items.length;while(i--){titleEl=items.eq(i).data("jcoverflip__titleElement");this.options.titles.destroy(titleEl)}items.removeClass("ui-jcoverflip--item").find("*").add(items.get()).each(function(){this.removeAttribute("style")});this.options.controls.destroy(this.element);$.widget.prototype.destroy.apply(this,arguments)},enable:function(){$.widget.prototype.enable.apply(this,arguments);this._trigger("enable",{})},disable:function(){$.widget.prototype.disable.apply(this,arguments);this._trigger("disable",{})},option:function(name,value){if(typeof value=="undefined"){return $.widget.prototype.option.apply(this,arguments)}if(name=="current"){return this.current(value)}if(name in {items:"",titles:"",controls:""}){return this.options.items}if(name in {beforeCss:"",afterCss:"",currentCss:""}){this.options[name]=value;this._goTo(this.current(),0,true)}if(name=="time"&&isNaN(parseInt(value))&&parseInt(value)<0){return this.options.time}return $.widget.prototype.option.apply(this,arguments)},_goTo:function(index,time,force,originalEvent){if(this.options.disabled==true){return}force=!!force;originalEvent=originalEvent==undefined?{}:originalEvent;time=time===undefined?this.options.time:parseInt(time);var oldCurrent=this.options.current;var current=Math.floor(Math.max(0,Math.min(index,this.length()-1)));this.options.current=current;this.animationQueue.stop();var animationSets=this.animationQueue.get();var i=animationSets.length;while(i--){var to=animationSets[i].getData("to");var goingToTheRight=animationSets[i].getData("goingToTheRight");var rightOfCurrent=to>current;if(rightOfCurrent!=goingToTheRight){this.animationQueue.remove(animationSets[i])}}animationSets=this.animationQueue.get();var stepsToCurrent=animationSets.length>0?animationSets.pop().getData("to"):oldCurrent;var goingToTheRight=stepsToCurrent<current;stepsToCurrent+=goingToTheRight?1:-1;if(force){stepsToCurrent=current}var items=this.items();while((goingToTheRight&&stepsToCurrent<=current)||(!goingToTheRight&&stepsToCurrent>=current)||(force&&stepsToCurrent==current)){var animationSet=new animationqueue.AnimationSet();this.animationQueue.queue(animationSet);animationSet.setData("goingToTheRight",goingToTheRight);animationSet.setData("to",stepsToCurrent);var i=items.length;while(i--){var el=items.eq(i);if(i<stepsToCurrent){var css=this.options.beforeCss(el,this.element,stepsToCurrent-i-1)}else{if(i>stepsToCurrent){var css=this.options.afterCss(el,this.element,i-stepsToCurrent-1)}else{var css=this.options.currentCss(el,this.element,i-stepsToCurrent-1)}}var j=css.length;while(j--){var cssI=css[j];animationSet.add(new animationqueue.Animation(cssI.element,cssI.animate));for(var step in cssI.steps){animationSet.add(new animationqueue.AnimationStep(cssI.element,cssI.steps[step],parseFloat(step)))}}}stepsToCurrent+=goingToTheRight?1:-1}var titleElement=items.eq(current).data("jcoverflip__titleElement");if(titleElement){this.options.titleAnimateIn(titleElement,time,goingToTheRight)}if(current!=oldCurrent){var titleElement=items.eq(oldCurrent).data("jcoverflip__titleElement");if(titleElement){this.options.titleAnimateOut(titleElement,time,goingToTheRight)}}if(!force){this._trigger("start",originalEvent,{to:current,from:oldCurrent});this.animationQueue.start(time,proxy(this,function(timeElapsed){this._trigger("stop",originalEvent,{to:current,from:oldCurrent,time:timeElapsed})}));this._trigger("change",originalEvent,{to:current,from:oldCurrent})}else{this.animationQueue.start(time,nofn)}function stepFactory(el,css){return function(){el.css(css)}}},items:function(reload){if(this.itemsCache===undefined||!!reload){if(this.options.items){this.itemsCache=this.element.find(this.options.items)}else{this.itemsCache=this.element.children()}}return this.itemsCache},length:function(){var items=this.items();return items.length}});$.ui.jcoverflip.defaults={items:"",beforeCss:function(el,container,offset){return[$.jcoverflip.animationElement(el,{left:(container.width()/2-210-110*offset)+"px",bottom:"20px"},{}),$.jcoverflip.animationElement(el.find("img"),{opacity:0.5,width:"100px"},{})]},afterCss:function(el,container,offset){return[$.jcoverflip.animationElement(el,{left:(container.width()/2+110+110*offset)+"px",bottom:"20px"},{}),$.jcoverflip.animationElement(el.find("img"),{opacity:0.5,width:"100px"},{})]},currentCss:function(el,container){return[$.jcoverflip.animationElement(el,{left:(container.width()/2-100)+"px",bottom:0},{}),$.jcoverflip.animationElement(el.find("img"),{opacity:1,width:"200px"},{})]},time:500,titles:{create:function(el){var titleText="";var title=$([]);var titleEl=el.find(".title:first");if(titleEl.size()==1){title=titleEl.clone(true);titleEl.css("display","none");title.data("jcoverflip__origin","cloned");title.data("jcoverflip__source",titleEl)}else{if(el.attr("title")){titleText=el.attr("title")}else{if(el.attr("alt")){titleText=el.attr("alt")}else{titleEl=el.find("[title], [alt]").eq(0);if(titleEl.size()==1){titleText=titleEl.attr("title")||titleEl.attr("alt")||""}}}}if(title.size()){title.css({opacity:0,display:"block"})}else{title=$('<span class="title">'+titleText+"</span>");title.data("jcoverflip__origin","attribute")}return title},destroy:function(el){if(el.data("jcoverflip__origin")=="cloned"){el.data("jcoverflip__source").css("display","")}el.remove()}},titleAnimateIn:function(titleElement,time,offset){if(titleElement.css("display")=="none"){titleElement.css({opacity:0,display:"block"})}titleElement.stop().animate({opacity:1},time)},titleAnimateOut:function(titleElement,time,offset){titleElement.stop().animate({opacity:0},time,function(){$(this).css("display","none")})},controls:{create:nofn,destroy:nofn},current:0};$.ui.jcoverflip.getter=["length","current"]})(jQuery);