/**
 * AviaSlider - A jQuery image slider
 * (c) Copyright Christian "Kriesi" Budschedl
 * http://www.kriesi.at
 * http://www.twitter.com/kriesi/
 * For sale on ThemeForest.net
 */

/* this prevents dom flickering, needs to be outside of dom.ready event: */
document.documentElement.className += 'js_active';
/*end dom flickering =) */


(function($)
{
$.fn.aviaSlider= function(variables) 
{
var defaults = 
{
slides: 'li',// wich element inside the container should serve as slide
animationSpeed: 900,// animation duration
autorotation: true,// autorotation true or false?
autorotationSpeed:3,// duration between autorotation switch in Seconds
appendControlls: '',// element to apply controlls to
slideControlls: 'items',// controlls, yes or no?
blockSize: {height: 'full', width:'full'},
betweenBlockDelay:60,
display: 'topleft',
switchMovement: false,
showText: true,
transition: 'fade',//slide, fade or drop
backgroundOpacity:0.8,// opacity for background
transitionOrder: ['diagonaltop', 'diagonalbottom','topleft', 'bottomright', 'random']
};

var options = $.extend(defaults, variables);

return this.each(function()
{
var slideWrapper = $(this),//wrapper element
slides = slideWrapper.find(options.slides),//single slide container
slideImages= slides.find('img'),//slide image within container
slideCount =slides.length,//number of slides
slideWidth =slides.width(),//width of slidecontainer
slideHeight= slides.height(),//height of slidecontainer
blockNumber = 0,//how many blocks do we need
currentSlideNumber = 0,//which slide is currently shown
reverseSwitch = false,//var to set the starting point of the transition
currentTransition = 0,//var to set which transition to display when rotating with 'all'
current_class = 'active_item',//currently active controller item
controlls = '',//string that will contain controll items to append
skipSwitch = true,//var to check if performing transition is allowed
interval ='',
blockSelection ='',
blockSelectionJQ ='',
blockOrder = [];

//check if either width or height should be full container width
if (options.blockSize.height == 'full') { options.blockSize.height = slideHeight; }
if (options.blockSize.width == 'full') { options.blockSize.width = slideWidth; }

//slider methods that controll the whole behaviour of the slideshow
slideWrapper.methods = {

//initialize slider and create the block with the size set in the default/options object
init: function()
{
var posX = 0,
posY = 0,
generateBlocks = true,
bgOffset = '';

// make sure to display the first image in the list at the top
slides.filter(':first').css({'z-index':'5',display:'block'});

// start generating the blocks and add them until the whole image area
// is filled. Depending on the options that can be only one div or quite many ;)
while(generateBlocks)
{
blockNumber ++;
bgOffset = "-"+posX +"px -"+posY+"px";

$('<div class="kBlock"></div>').appendTo(slideWrapper).css({
zIndex:20, 
position:'absolute',
display:'none',
left:posX,
top:posY,
height:options.blockSize.height,
width:options.blockSize.width,
backgroundPosition:bgOffset
});


posX += options.blockSize.width;

if(posX >= slideWidth)
{
posX = 0;
posY += options.blockSize.height;
}

if(posY >= slideHeight)
{
//end adding Blocks
generateBlocks = false;
}
}

//setup directions
blockSelection = slideWrapper.find('.kBlock');
blockOrder['topleft'] = blockSelection;
blockOrder['bottomright'] = $(blockSelection.get().reverse());
blockOrder['diagonaltop'] = slideWrapper.methods.kcubit(blockSelection);
blockOrder['diagonalbottom'] = slideWrapper.methods.kcubit(blockOrder['bottomright']);
blockOrder['random'] = slideWrapper.methods.fyrandomize(blockSelection);


//save image in case of flash replacements, will be available in the the next script version
slides.each(function()
{
$.data(this, "data", { img: $(this).find('img').attr('src')});
});

if(slideCount <= 1)
{
slideWrapper.aviaSlider_preloadhelper({delay:200});
}
else
{
slideWrapper.aviaSlider_preloadhelper({callback:slideWrapper.methods.preloadingDone});
slideWrapper.methods.appendControlls().addDescription();
}
},

//appends the click controlls after an element, if that was set in the options array
appendControlls: function()
{
if (options.slideControlls == 'items')
{
var elementToAppend = options.appendControlls || slideWrapper[0];
controlls = $('<div></div>').addClass('slidecontrolls').insertAfter(elementToAppend);

slides.each(function(i)
{
var controller = $('<a href="#" class="ie6fix '+current_class+'"></a>').appendTo(controlls);
controller.bind('click', {currentSlideNumber: i}, slideWrapper.methods.switchSlide);
current_class = "";
});

//コントローラー非表示 edit by Manabu Kushimoto
controlls.width(controlls.width()).css('float','none').hide();
}
return this;

},

// adds the image description from an alttag 
addDescription: function()
{
if(options.showText)
{
slides.each(function()
{
var currentSlide = $(this),
description = currentSlide.find('img').attr('alt'),
splitdesc = description.split('::');



if(splitdesc[0] != "" )
{
if(splitdesc[1] != undefined )
{
description = "<strong>"+splitdesc[0] +"</strong>"+splitdesc[1]; 
}
else
{
description = splitdesc[0];
}
}

//アンカーがある場合の処理無効化 - editer:Manabu Kushimoto
/*
if(description != "")
{
$('<div></div>').addClass('feature_excerpt')
.html(description)
.css({display:'block', 'opacity':options.backgroundOpacity})
.appendTo(currentSlide.find('a')); 
}
*/

});
}
},

preloadingDone: function()
{
skipSwitch = false;

if($.browser.msie)
{
slides.css({'backgroundColor':'#000000','backgroundImage':'none'});
}
else
{
slides.css({'backgroundColor':'transparent', 'backgroundImage':'none'});
}

if(options.autorotation) 
{
slideWrapper.methods.autorotate();
slideImages.bind("click", function(){ /*clearInterval(interval);*/ });
}
},

autorotate: function(){
interval = setInterval(function(){ 
currentSlideNumber ++;
if(currentSlideNumber == slideCount) currentSlideNumber = 0;

slideWrapper.methods.switchSlide();
},

(parseInt(options.autorotationSpeed) * 1000) + (options.betweenBlockDelay * blockNumber) + options.animationSpeed

)},

switchSlide: function(passed)
{ 
var noAction = false;

if(passed != undefined && !skipSwitch)
{
if(currentSlideNumber != passed.data.currentSlideNumber)
{
currentSlideNumber = passed.data.currentSlideNumber;
}
else
{
noAction = true;
}
}

if(passed != undefined) clearInterval(interval);

if(!skipSwitch && noAction == false)
{
skipSwitch = true;
var currentSlide = slides.filter(':visible'),
nextSlide = slides.filter(':eq('+currentSlideNumber+')'),
nextURL = $.data(nextSlide[0], "data").img,
nextImageBG = 'url('+nextURL+')';
if(options.slideControlls)
{
controlls.find('.active_item').removeClass('active_item');
controlls.find('a:eq('+currentSlideNumber+')').addClass('active_item');
}

blockSelectionJQ = blockOrder[options.display];

//workarround to make more than one flash movies with the same classname possible
slides.find('>a>img').css({opacity:1,visibility:'visible'});

//switchmovement
if(options.switchMovement && (options.display == "topleft" || options.display == "diagonaltop"))
{
if(reverseSwitch == false)
{
blockSelectionJQ = blockOrder[options.display];
reverseSwitch = true;
}
else
{
if(options.display == "topleft") blockSelectionJQ = blockOrder['bottomright'];
if(options.display == "diagonaltop") blockSelectionJQ = blockOrder['diagonalbottom'];
reverseSwitch = false;
}
}

if(options.display == 'random')
{
blockSelectionJQ = slideWrapper.methods.fyrandomize(blockSelection);
}

if(options.display == 'all')
{
blockSelectionJQ = blockOrder[options.transitionOrder[currentTransition]];
currentTransition ++;
if(currentTransition >=  options.transitionOrder.length) currentTransition = 0;
}


//fire transition
blockSelectionJQ.css({backgroundImage: nextImageBG}).each(function(i)
{

var currentBlock = $(this);
setTimeout(function()
{
var transitionObject = new Array();
if(options.transition == 'drop')
{
transitionObject['css'] = {height:1, width:options.blockSize.width, display:'block',opacity:0};
transitionObject['anim'] = {height:options.blockSize.height,width:options.blockSize.width,opacity:1};
}
else if(options.transition == 'fade')
{
transitionObject['css'] = {display:'block',opacity:0};
transitionObject['anim'] = {opacity:1};
}
else
{
transitionObject['css'] = {height:1, width:1, display:'block',opacity:0};
transitionObject['anim'] = {height:options.blockSize.height,width:options.blockSize.width,opacity:1};
}

currentBlock
.css(transitionObject['css'])
.animate(transitionObject['anim'],options.animationSpeed, function()
{ 
if(i+1 == blockNumber)
{
slideWrapper.methods.changeImage(currentSlide, nextSlide);
}
});
}, i*options.betweenBlockDelay);
});

} // end if(!skipSwitch && noAction == false)

return false;
},

changeImage: function(currentSlide, nextSlide)
{
currentSlide.css({zIndex:0, display:'none'});
nextSlide.css({zIndex:3, display:'block'});
blockSelectionJQ.fadeOut(options.animationSpeed*1/3, function(){ skipSwitch = false; });
},

// array sorting
fyrandomize: function(object) 
{
var length = object.length,
objectSorted = $(object);

if ( length == 0 ) return false;

while ( --length ) 
{
var newObject = Math.floor( Math.random() * ( length + 1 ) ),
temp1 = objectSorted[length],
temp2 = objectSorted[newObject];
objectSorted[length] = temp2;
objectSorted[newObject] = temp1;
}
return objectSorted;
},

kcubit: function(object)
{
var length = object.length, 
objectSorted = $(object),
currentIndex = 0,//index of the object that should get the object in "i" applied
rows = Math.ceil(slideHeight / options.blockSize.height),
columns = Math.ceil(slideWidth / options.blockSize.width),
oneColumn = blockNumber/columns,
oneRow = blockNumber/rows,
modX = 0,
modY = 0,
i = 0,
rowend = 0,
endreached = false,
onlyOne = false; 

if ( length == 0 ) return false;
for (i = 0; i<length; i++ ) 
{
objectSorted[i] = object[currentIndex];

if((currentIndex % oneRow == 0 && blockNumber - i > oneRow)|| (modY + 1) % oneColumn == 0)
{
currentIndex -= (((oneRow - 1) * modY) - 1); modY = 0; modX ++; onlyOne = false;

if (rowend > 0)
{
modY = rowend; currentIndex += (oneRow -1) * modY;
}
}
else
{
currentIndex += oneRow -1; modY ++;
}

if((modX % (oneRow-1) == 0 && modX != 0 && rowend == 0) || (endreached == true && onlyOne == false) )
{
modX = 0.1; rowend ++; endreached = true; onlyOne = true;
}
}

return objectSorted;
}
};

slideWrapper.methods.init();
});
};
})(jQuery);



(function($)
{
$.fn.aviaSlider_preloadhelper = function(variables, callback) 
{
var defaults = 
{
fadeInSpeed: 800,
maxLoops: 10,
callback: ''
};

var options = $.extend(defaults, variables);

return this.each(function()
{
var container = $(this),
images= $('img', this).css({opacity:0, visibility:'hidden', display:'block'}),
parent = images.parent(),
imageCount = images.length,
interval = '',
allImages = images ;


var methods = 
{
checkImage: function()
{
images.each(function(i)
{
if(this.complete == true) images = images.not(this);
});

if(images.length && options.maxLoops >= 0)
{
options.maxLoops--;
setTimeout(methods.checkImage, 500);
}
else
{
methods.showImages();
}
},

showImages: function()
{
allImages.each(function(i)
{
var currentImage = $(this);
currentImage.css('visibility','visible').animate({opacity:1}, options.fadeInSpeed, function()
{
if(allImages.length == i+1) methods.callback(i);
});
});
},

callback: function()
{

if (variables instanceof Function) { callback = variables; }
if (callback  instanceof Function) { callback.call(this);  }
if (options.callback != '') { (options.callback)(); }
}
};

methods.checkImage();

});
};
})(jQuery);


