/* http://keith-wood.name/imageCube.html
   Image Cube for jQuery v1.2.0.
   Written by Keith Wood (kbwood{at}iinet.com.au) June 2008.
   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 ImageCube(){this._defaults={direction:'random',randomSelection:['up','down','left','right'],speed:2000,easing:'linear',repeat:true,pause:2000,selection:'forward',shading:true,opacity:0.8,imagePath:'',full3D:true,segments:20,reduction:30,expansion:10,lineHeight:[0.0,1.25],letterSpacing:[-0.4,0.0],beforeRotate:null,afterRotate:null}};var R=0;var S=1;var T=2;var U=3;var V='imageCube';$.extend(ImageCube.prototype,{markerClassName:'hasImageCube',setDefaults:function(a){extendRemove(this._defaults,a||{})},_attachImageCube:function(b,c){b=$(b);if(b.hasClass(this.markerClassName)){return}var d=$.extend({_position:b.css('position')},this._defaults,c||{});$.data(b[0],V,d);b.addClass(this.markerClassName).css({position:'relative'}).children().each(function(){var a=$(this);$.data(this,V,{width:a.css('width'),height:a.css('height'),position:a.css('position'),lineHeight:a.css('lineHeight'),letterSpacing:a.css('letterSpacing')});a.css({width:b.css('width'),height:b.css('height'),position:'absolute',lineHeight:d.lineHeight[1],letterSpacing:d.letterSpacing[1]})}).not(':first').hide();this._prepareRotation(b[0])},_prepareRotation:function(b){b=$(b);b.children('.imageCubeShading,.imageCubeFrom,.imageCubeTo').remove();var c=$.data(b[0],V);c.current=b.children(':visible')[0];var d=function(a){return(!a.length?a:a.filter(':eq('+Math.floor(Math.random()*a.length)+')'))};c.next=(c.selection=='random'?d(b.children(':hidden')):(c.selection=='backward'?$(c.current).prev():$(c.current).next()));c.next=(c.next.length?c.next:(c.selection=='random'?c.current:(c.selection=='backward'?b.children(':last'):b.children(':first'))))[0];if(c.repeat&&!c._timer){c._timer=setTimeout(function(){$.imagecube._rotateImageCube(b[0])},c.pause)}$.data(b[0],V,c)},_rotateImageCube:function(a,b){a=$(a);this._stopImageCube(a[0],true);var c=$.data(a[0],V);var d=[c.current,c.next];if(c.beforeRotate){c.beforeRotate.apply(a[0],d)}var e={};e[V]=1.0;a.attr(V,0.0).animate(e,c.speed,c.easing,function(){if(c.afterRotate){c.afterRotate.apply(a[0],d)}if(b){b.apply(a[0])}})},_currentImageCube:function(a){return($(a).hasClass(this.markerClassName)?$.data(a,V).current:null)},_nextImageCube:function(a){return($(a).hasClass(this.markerClassName)?$.data(a,V).next:null)},_stopImageCube:function(a,b){var c=$.data(a,V);if(c._timer){clearTimeout(c._timer);c._timer=null}if(!b){c.repeat=false}$.data(a,V,c)},_startImageCube:function(a){this._changeImageCube(a,{repeat:true})},_changeImageCube:function(a,b,c){if(typeof b=='string'){var d={};d[b]=c;b=d}var e=$.data(a,V);extendRemove(e||{},b||{});$.data(a,V,e);this._prepareRotation(a)},_destroyImageCube:function(a){a=$(a);if(!a.hasClass(this.markerClassName)){return}this._stopImageCube(a[0]);var b=$.data(a[0],V);a.stop().css({position:b._position}).removeClass(this.markerClassName).children('.imageCubeShading,.imageCubeFrom,.imageCubeTo').remove();a.children().each(function(){$(this).css($.data(this,V)).show();$.removeData(this,V)});$.removeData(a[0],V)},_prepareAnimation:function(d){var e=$.data(d,V);var d=$(d);var f={left:0,top:0};d.parents().each(function(){var a=$(this);if(a.css('position')=='fixed'){f.left-=a.offset().left;f.top-=a.offset().top;return false}});var g={width:d.width(),height:d.height()};var h=(e.direction!='random'?e.direction:e.randomSelection[Math.floor(Math.random()*e.randomSelection.length)]);h=Math.max(0,$.inArray(h,['up','down','left','right']));e._curDirection=h;var j=(h==R||h==S);var k=(h==T||h==U);var l=(h==R||h==T);var m=(l?0:e.opacity);var n=$(e.current);var o=$(e.next);var q=[];var r=function(p){var b=[0,0,0,0];if(!$.browser.msie||p.css('border')){for(var i=0;i<4;i++){b[i]=p.css('border'+['Left','Right','Top','Bottom'][i]+'Width');var a=parseFloat(b[i]);b[i]=(!isNaN(a)?a:Math.max(0,$.inArray(b[i],['thin','medium','thick'])*2+1))}}return b};q[0]=r(n);q[1]=r(o);var s=[];s[0]=[parseFloat(n.css('padding-left')),parseFloat(n.css('padding-right')),parseFloat(n.css('padding-top')),parseFloat(n.css('padding-bottom'))];s[1]=[parseFloat(o.css('padding-left')),parseFloat(o.css('padding-right')),parseFloat(o.css('padding-top')),parseFloat(o.css('padding-bottom'))];var t=[];t[0]=[($.boxModel?q[0][0]+q[0][1]+s[0][0]+s[0][1]:0),($.boxModel?q[0][2]+q[0][3]+s[0][2]+s[0][3]:0)];t[1]=[($.boxModel?q[1][0]+q[1][1]+s[1][0]+s[1][1]:0),($.boxModel?q[1][2]+q[1][3]+s[1][2]+s[1][3]:0)];var u=[];u[0]={elem:n,left:{start:f.left,end:f.left+(h==U?g.width:0),units:'px'},width:{start:g.width-t[0][0],end:(j?g.width-t[0][0]:0),units:'px'},top:{start:f.top,end:f.top+(h==S?g.height:0),units:'px'},height:{start:g.height-t[0][1],end:(j?0:g.height-t[0][1]),units:'px'},paddingLeft:{start:s[0][0],end:(k?0:s[0][0]),units:'px'},paddingRight:{start:s[0][1],end:(k?0:s[0][1]),units:'px'},paddingTop:{start:s[0][2],end:(j?0:s[0][2]),units:'px'},paddingBottom:{start:s[0][3],end:(j?0:s[0][3]),units:'px'},borderLeftWidth:{start:q[0][0],end:(k?0:q[0][0]),units:'px'},borderRightWidth:{start:q[0][1],end:(k?0:q[0][1]),units:'px'},borderTopWidth:{start:q[0][2],end:(j?0:q[0][2]),units:'px'},borderBottomWidth:{start:q[0][3],end:(j?0:q[0][3]),units:'px'},lineHeight:{start:e.lineHeight[1],end:(j?e.lineHeight[0]:e.lineHeight[1]),units:'em'},letterSpacing:{start:e.letterSpacing[1],end:(j?e.letterSpacing[1]:e.letterSpacing[0]),units:'em'}};u[1]={elem:o,left:{start:f.left+(h==T?g.width:0),end:f.left,units:'px'},width:{start:(j?g.width-t[1][0]:0),end:g.width-t[1][0],units:'px'},top:{start:f.top+(h==R?g.height:0),end:f.top,units:'px'},height:{start:(j?($.browser.msie?1:0):g.height-t[1][1]),end:g.height-t[1][1],units:'px'},paddingLeft:{start:(k?0:s[1][0]),end:s[1][0],units:'px'},paddingRight:{start:(k?0:s[1][1]),end:s[1][1],units:'px'},paddingTop:{start:(j?0:s[1][2]),end:s[1][2],units:'px'},paddingBottom:{start:(j?0:s[1][3]),end:s[1][3],units:'px'},borderLeftWidth:{start:(k?0:q[1][0]),end:q[1][0],units:'px'},borderRightWidth:{start:(k?0:q[1][1]),end:q[1][1],units:'px'},borderTopWidth:{start:(j?0:q[1][2]),end:q[1][2],units:'px'},borderBottomWidth:{start:(j?0:q[1][3]),end:q[1][3],units:'px'},lineHeight:{start:(j?e.lineHeight[0]:e.lineHeight[1]),end:e.lineHeight[1],units:'em'},letterSpacing:{start:(j?e.letterSpacing[1]:e.letterSpacing[0]),end:e.letterSpacing[1],units:'em'}};if(e.shading){var v=function(a,b,c){return{left:{start:a.left.start,end:a.left.end,units:'px'},width:{start:a.width.start,end:a.width.end,units:'px'},top:{start:a.top.start,end:a.top.end,units:'px'},height:{start:a.height.start,end:a.height.end,units:'px'},paddingLeft:{start:a.paddingLeft.start+a.borderLeftWidth.start,end:a.paddingLeft.end+a.borderLeftWidth.end,units:'px'},paddingRight:{start:a.paddingRight.start+a.borderRightWidth.start,end:a.paddingRight.end+a.borderRightWidth.end,units:'px'},paddingTop:{start:a.paddingTop.start+a.borderTopWidth.start,end:a.paddingTop.end+a.borderTopWidth.end,units:'px'},paddingBottom:{start:a.paddingBottom.start+a.borderBottomWidth.start,end:a.paddingBottom.end+a.borderBottomWidth.end,units:'px'},opacity:{start:b,end:c,units:''}}};u[2]=v(u[l?0:1],m,e.opacity-m);u[3]=v(u[l?1:0],e.opacity-m,m);u[2].elem=$(($.browser.msie?'<img src="'+e.imagePath+'imageCubeHigh.png"':'<div')+' class="imageCubeShading" style="background-color: white; opacity: '+m+'; z-index: 10; position: absolute;"'+($.browser.msie?'/>':'></div>'));u[3].elem=$(($.browser.msie?'<img src="'+e.imagePath+'imageCubeShad.png"':'<div')+' class="imageCubeShading" style="background-color: black; opacity: '+(e.opacity-m)+'; z-index: 10; position: absolute;"'+($.browser.msie?'/>':'></div>'))}if(e.full3D){for(var i=0;i<e.segments;i++){d.append(n.clone().addClass('imageCubeFrom').css({position:'absolute',overflow:'hidden'}));if(e.shading){d.append(u[l?2:3].elem.clone())}}for(var i=0;i<e.segments;i++){d.append(o.clone().addClass('imageCubeTo').css({display:'none',position:'absolute',width:0,overflow:'hidden'}));if(e.shading){d.append(u[l?3:2].elem.clone())}}n.hide();o.css({width:g.width-t[1][0],height:g.height-t[1][1]})}else{var w=function(a){return{left:a.left.start+'px',width:a.width.start+'px',top:a.top.start+'px',height:a.height.start+'px',lineHeight:a.lineHeight.start+'em',padding:a.paddingTop.start+'px '+a.paddingRight.start+'px '+a.paddingBottom.start+'px '+a.paddingLeft.start+'px',borderLeftWidth:a.borderLeftWidth.start+'px',borderRightWidth:a.borderRightWidth.start+'px',borderTopWidth:a.borderTopWidth.start+'px',borderBottomWidth:a.borderBottomWidth.start+'px',letterSpacing:a.letterSpacing.start+'em',overflow:'hidden'}};n.css(w(u[0]));o.css(w(u[1])).show();if(e.shading){d.append(u[2].elem).append(u[3].elem)}}for(var i=0;i<u.length;i++){for(var x in u[i]){var y=u[i][x];y.diff=y.end-y.start}}return u},_drawFull3D:function(D,E,F){var G=$.data(D,V);if(!G.full3D){return false}var D=$(D);var H=G._curDirection;var I=(H==R||H==S);var J=(H==R||H==T);var K=D.width();var L=D.height();if(K==0||L==0){return true}var M=(1-E)*(I?L:K);var N=G.segments;var O=G.expansion*(1-Math.abs(2*M-(I?L:K))/(I?L:K));var P=G.reduction-(G.reduction*M/(I?L:K));var Q=function(e,f,g,j,k,l,m,n,o,p,q,r){var s=[j-f,l-n];var w=Math.max(s[0],s[1]);var t=[o-g,m-k];var h=Math.max(t[0],t[1]);var u=(I?(s[0]-s[1])/(N-1)/2:w/N);var v=(I?h/N:(t[0]-t[1])/(N-1)/2);var x=q.paddingLeft[r]+q.paddingRight[r]+q.borderLeftWidth[r]+q.borderRightWidth[r];var y=q.paddingTop[r]+q.paddingBottom[r]+q.borderTopWidth[r]+q.borderBottomWidth[r];var z=Math.round(f);var A=Math.round(g);var B=z;var C=A;D.children(e).each(function(i){var a=Math.round(f+(i+1)*u);var b=Math.round(g+(i+1)*v);var c=s[0]-(I?2*i*u:0);var d=t[0]-(I?0:2*i*v);$(this).css({display:'block',left:(I?B:f),top:(I?g:C),width:Math.max(0,c-x),height:Math.max(0,d-y),letterSpacing:(I?c/w*(G.letterSpacing[1]-G.letterSpacing[0])+G.letterSpacing[0]:E*q.letterSpacing.diff+q.letterSpacing.start)+q.letterSpacing.units,lineHeight:(!I?d/h*(G.lineHeight[1]-G.lineHeight[0])+G.lineHeight[0]:E*q.lineHeight.diff+q.lineHeight.start)+q.lineHeight.units,clip:'rect('+(!I?'auto':(C-A)+'px')+','+(I?'auto':(a-z)+'px')+','+(!I?'auto':(b-A)+'px')+','+(I?'auto':(B-z)+'px')+')'});if(G.shading){$(this).next().css({left:B,top:C,width:(I?s[0]-2*i*u:a-B),height:(I?b-C:t[0]-2*i*v),opacity:p})}B=a;C=b})};Q('.imageCubeFrom',[P,-O,0,K-M][H],[0,L-M,P,-O][H],[K-P,K+O,M,K][H],[0,L-M,-O,P][H],[K+O,K-P,M,K][H],[M,L,L+O,L-P][H],[-O,P,0,K-M][H],[M,L,L-P,L+O][H],(!G.shading?0:(J?E:1-E)*F[2].opacity.diff+F[2].opacity.start),F[0],'start');Q('.imageCubeTo',[-O,G.reduction-P,M,0][H],[M,0,-O,G.reduction-P][H],[K+O,K-(G.reduction-P),K,K-M][H],[M,0,G.reduction-P,-O][H],[K-(G.reduction-P),K+O,K,K-M][H],[L,L-M,L-(G.reduction-P),L+O][H],[G.reduction-P,-O,M,0][H],[L,L-M,L+O,L-(G.reduction-P)][H],(!G.shading?0:(J?E:1-E)*F[3].opacity.diff+F[3].opacity.start),F[1],'end');return true}});function extendRemove(a,b){$.extend(a,b);for(var c in b){if(b[c]==null){a[c]=null}}return a}$.fn.imagecube=function(a){var b=Array.prototype.slice.call(arguments,1);if(a=='current'||a=='next'){return $.imagecube['_'+a+'ImageCube'].apply($.imagecube,[this[0]].concat(b))}return this.each(function(){if(typeof a=='string'){$.imagecube['_'+a+'ImageCube'].apply($.imagecube,[this].concat(b))}else{$.imagecube._attachImageCube(this,a)}})};$.fx.step[V]=function(a){if(a.state==0||!a.stepProps){a.start=0.0;a.end=1.0;a.stepProps=$.imagecube._prepareAnimation(a.elem);a.saveCSS={borderLeftWidth:a.stepProps[0].elem.css('borderLeftWidth'),borderRightWidth:a.stepProps[0].elem.css('borderRightWidth'),borderTopWidth:a.stepProps[0].elem.css('borderTopWidth'),borderBottomWidth:a.stepProps[0].elem.css('borderBottomWidth'),padding:a.stepProps[0].elem.css('padding')}}if(!$.imagecube._drawFull3D(a.elem,a.pos,a.stepProps)){for(var i=0;i<a.stepProps.length;i++){var b={};for(var c in a.stepProps[i]){var d=a.stepProps[i][c];if(c!='elem'){b[c]=(a.pos*d.diff+d.start)+d.units}}a.stepProps[i].elem.css(b)}}if(a.state==1){a.stepProps[0].elem.hide().css(a.saveCSS);a.stepProps[1].elem.show();$.imagecube._prepareRotation(a.elem)}};$.imagecube=new ImageCube()})(jQuery);
