/* http://keith-wood.name/flightBoard.html
   Flight Board for jQuery v1.0.1.
   Written by Keith Wood (kbwood{at}iinet.com.au) October 2009.
   Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and 
   MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. 
   Please attribute the author if you use it. */
(function($){function FlightBoard(){this._defaults={lettersImage:'img/flightBoardLarge.png',lettersSize:[25,34],lettersSeq:' ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',messages:['SEE THE FLIGHT BOARD','CHANGE MESSAGES'],maxLength:20,flips:[3,5],sequential:false,speed:500,repeat:true,pause:2000,selection:'forward',shading:true,opacity:0.5,shadingImages:['img/flightBoardHigh.png','img/flightBoardShad.png'],beforeFlip:null,afterFlip:null};this._uuid=new Date().getTime()};var p='flightBoard';$.extend(FlightBoard.prototype,{markerClassName:'hasFlightBoard',setDefaults:function(a){extendRemove(this._defaults,a||{})},_attachFlightBoard:function(a,b){a=$(a);if(a.hasClass(this.markerClassName)){return}$.data(a[0],p,$.extend({_current:0,_next:0,_anims:[]},this._defaults,b||{}));a.addClass(this.markerClassName);this._changeFlightBoard(a[0])},_currentFlightBoard:function(a){var b=$.data(a,p);return($(a).hasClass(this.markerClassName)?b.messages[b._current]:null)},_nextFlightBoard:function(a){var b=$.data(a,p);return($(a).hasClass(this.markerClassName)?b.messages[b._next]:null)},_stopFlightBoard:function(a,b){var c=$.data(a,p);if(c._timer){clearTimeout(c._timer);c._timer=null}for(var i=0;i<c._anims.length;i++){c._anims[i].stop().remove()}if(!b){this._changeFlightBoard(a,'repeat',false,true)}},_startFlightBoard:function(a){this._changeFlightBoard(a,'repeat',true,true)},_changeFlightBoard:function(a,b,c,d){if(typeof b=='string'){var e={};e[b]=c;b=e}this._stopFlightBoard(a,true);var f=$.data(a,p);extendRemove(f,b||{});var g=(d?Math.min(f._current,f.messages.length-1):0);$.extend(f,{_current:g,_next:g,_anims:[]});$.data(a,p,f);if(!a.id){a.id='fb'+this._uuid++}$('#'+a.id+'_css').remove();$('<style type="text/css" id="'+a.id+'_css">#'+a.id+' span { display: block; float: left; width: '+f.lettersSize[0]+'px; height: '+f.lettersSize[1]+'px; background: url('+f.lettersImage+') center no-repeat; }</style>').appendTo('head');var h='';var j=(f.messages[f._current]||'');for(var i=0;i<f.maxLength;i++){h+='<span style="background-position: -'+(Math.max(0,f.lettersSeq.indexOf(j.charAt(i)||' '))*f.lettersSize[0])+'px 0px;"></span>'}$(a).html(h);this._prepareFlip(a)},_destroyFlightBoard:function(a){a=$(a);if(!a.hasClass(this.markerClassName)){return}this._stopFlightBoard(a[0]);a.removeClass(this.markerClassName).empty();$('#'+a.id+'_css').remove();$.removeData(a[0],p)},_prepareFlip:function(a){a=$(a);var b=$.data(a[0],p);b._current=b._next;b._next=(b.selection=='random'?randInt(b.messages.length-1):(b.selection=='backward'?b._next+b.messages.length-1:b._next+1))%b.messages.length;b._next=(b.selection=='random'&&b._next==b._current?b.messages.length-1:b._next);if(b.repeat&&!b._timer){b._timer=setTimeout(function(){$.flightboard._flipFlightBoard(a[0])},b.pause)}},_flipFlightBoard:function(a,b){this._stopFlightBoard(a,true);var c=$.data(a,p);if(b!=null){if(b>=0&&b<=c.messages.length){c._next=b}}c._count=c.maxLength;if(c.beforeFlip){c.beforeFlip.apply(a,[c.messages[c._current],c.messages[c._next]])}c._anims=[];var d=c.messages[c._current];var b=c.messages[c._next];var e=$(a).offset();var f=($.isArray(c.flips)?c.flips:[c.flips,c.flips]);var g=this._charTemplate(c);for(var i=0;i<c.maxLength;i++){var h=g.clone().css({left:e.left+i*c.lettersSize[0],top:e.top}).appendTo('body');c._anims.push(h);var k=randInt(f[1]-f[0]+1)+f[0];var l='';if(c.sequential){var m=c.lettersSeq.indexOf(d.charAt(i)||' ');var n=c.lettersSeq.indexOf(b.charAt(i)||' ');l=(m<n?c.lettersSeq.substring(m,n+1):c.lettersSeq.substring(m)+c.lettersSeq.substring(0,n+1))}else{l=d.charAt(i)||' ';for(var j=1;j<k;j++){l+=c.lettersSeq.charAt(randInt(c.lettersSeq.length))}l+=b.charAt(i)||' '}var o=(!isNaN(c.speed)?c.speed:$.fx.speeds[c.speed]||$.fx.speeds._default);o=o*0.9+randInt(o*0.2);this._flipChar(a,h,c,$('span:eq('+i+')',a),l,o)}},_charTemplate:function(a){var b=a.lettersImage;var c=a.lettersSize[0];var d=a.lettersSize[1];var e=a.lettersSeq.length*c;var f='<div style="position: absolute; left: 0px; top: 0px; width: '+c+'px; height: '+d+'px;">'+'<div class="fbnt" style="position: absolute; width: '+c+'px; height: '+(d/2)+'px; overflow: hidden;">'+'<img src="'+b+'" style="position: relative; left: 0px; width: '+e+'px; height: '+d+'px; vertical-align: top;"></div>'+'<div class="fbob" style="position: absolute; top: '+(d/2)+'px; width: '+c+'px; height: '+(d/2)+'px; overflow: hidden;">'+'<img src="'+b+'" style="position: relative; left: 0px; top: -'+(d/2)+'px; width: '+e+'px; height: '+d+'px; vertical-align: top;"></div>'+'<div class="fbot" style="position: absolute; top: 0px; width: '+c+'px; height: '+(d/2)+'px; overflow: hidden;">'+'<img src="'+b+'" style="position: relative; left: 0px; width: '+e+'px; height: '+d+'px; vertical-align: top;"></div>'+'<div class="fbnb" style="position: absolute; top: '+(d/2)+'px; width: '+c+'px; height: 0px; overflow: hidden;"><img src="'+b+'" style="position: relative; left: 0px; top: 0px; width: '+e+'px; height: 0px; vertical-align: top;"></div>';if(a.shading){f+=($.browser.msie?'<img src="'+a.shadingImages[1]+'"':'<div')+' class="fbsh" style="position: absolute; width: '+c+'px; background-color: black; opacity: '+a.opacity+'; filter: alpha(opacity='+(a.opacity*100)+');"'+($.browser.msie?'/>':'></div>')+($.browser.msie?'<img src="'+a.shadingImages[0]+'"':'<div')+' class="fbhi" style="position: absolute; top: '+(d/2)+'px; width: '+c+'px; height: 0px; background-color: white; opacity: '+a.opacity+'; filter: alpha(opacity='+(a.opacity*100)+');"'+($.browser.msie?'/>':'></div>')}return $(f+'</div>')},_finishedChar:function(a){var b=$.data(a,p);b._count--;if(b._count==0){var c=[b.messages[b._current],b.messages[b._next]];this._prepareFlip(a);if(b.afterFlip){b.afterFlip.apply(a,c)}}},_flipChar:function(a,b,c,d,e,f){if(e.length<2){b.remove();$.removeData(b[0],p);$.flightboard._finishedChar(a);return}var g=c.lettersSize[0];var h=c.lettersSeq.indexOf(e.charAt(0));var i=c.lettersSeq.indexOf(e.charAt(1));var j=b[0].firstChild;$(j.firstChild).css('left',-i*g);j=j.nextSibling;$(j.firstChild).css('left',-h*g);j=j.nextSibling;$(j.firstChild).css('left',-h*g);j=j.nextSibling;$(j).css('height',0);$(j.firstChild).css('left',-i*g);$.data(b[0],p,{span:d,offset:-i*g});b.animate({fbHeight:1},f,function(){$.flightboard._flipChar(a,b,c,d,e.substring(1),f)})},_getStepProps:function(a){var b=[];var c=$(a).height();var d=a.children||a.childNodes;var e=($.browser.mozilla?0:1);b[0]={elem:d[2],first:true,props:{top:{start:0,diff:c,units:'px',min:-999999},height:{start:c/2+e,diff:-c,units:'px',min:0}}};b[1]={elem:d[2].firstChild,first:true,props:{height:{start:c,diff:-2*c,units:'px',min:0}}};b[2]={elem:d[3],first:false,props:{height:{start:-c/2,diff:c,units:'px',min:0}}};b[3]={elem:d[3].firstChild,first:false,props:{top:{start:c/2,diff:-c,units:'px',min:-999999},height:{start:-c,diff:2*c,units:'px',min:0}}};if(d.length>4){var f=parseFloat($(d[4]).css('opacity'));b[4]={elem:d[4],first:true,props:{top:{start:0,diff:c,units:'px',min:-999999},height:{start:c/2+e,diff:-c,units:'px',min:0},opacity:{start:0,diff:2*f,units:'',min:0}}};b[5]={elem:d[5],first:false,props:{height:{start:-c/2,diff:c,units:'px',min:0},opacity:{start:2*f,diff:-2*f,units:'',min:0}}}}return b}});function randInt(a){return Math.floor(Math.random()*a)}$.fx.step['fbHeight']=function(a){if(!a.stepProps){a.stepProps=$.flightboard._getStepProps(a.elem);a.first=true}for(var i=0;i<a.stepProps.length;i++){var b=a.stepProps[i];if(a.first==b.first){for(var c in b.props){var d=b.props[c];b.elem.style[c]=Math.max(a.pos*d.diff+d.start,d.min)+d.units;if($.browser.msie&&c=='opacity'){b.elem.style.filter='alpha(opacity='+(Math.max(a.pos*d.diff+d.start,d.min)*100)+')'}}}}if(a.first&&a.pos>=0.5){a.first=false}if(a.state==1){var e=$.data(a.elem,p);if(e){e.span.css('background-position',e.offset+'px 0px')}}};function extendRemove(a,b){$.extend(a,b);for(var c in b){if(b[c]==null){a[c]=null}}return a}$.fn.flightboard=function(a){var b=Array.prototype.slice.call(arguments,1);if(a=='current'||a=='next'){return $.flightboard['_'+a+'FlightBoard'].apply($.flightboard,[this[0]].concat(b))}return this.each(function(){if(typeof a=='string'){$.flightboard['_'+a+'FlightBoard'].apply($.flightboard,[this].concat(b))}else{$.flightboard._attachFlightBoard(this,a)}})};$.flightboard=new FlightBoard()})(jQuery);
