/**
 *	carousel.js
 *	Controls a coursel-like widget.
 *	Copyright (c)  Schell Scivally Enterprise. All rights reserved.
 *
 *	@author	Schell Scivally
 *	@since	Tue Oct 20 19:23:54 PDT 2009
 */
function rectString2Array(string)
{
    var left = string.indexOf("(");
    var right= string.lastIndexOf("px)");
    string = string.substring(left+1, right);
    // some browsers return a string delimited by commas
    // others don't
    var d = 0;
    var delimiters = ["px, ", "px,", "px "];
    var delimiter = delimiters[d];
    while(string.indexOf(delimiter) === -1)
        delimiter = delimiters[d++];
    var array = string.split(delimiter);
    for (var i = array.length - 1; i >= 0; i--)
    {
        array[i] = array[i].toInt();
    }
    return array;
}

window.addEvent('domready', function(e){
	// add events for pressing our buttons
	var cWin	= $('carousel_window');
	var left 	= $('left_carousel_button');
	var right	= $('right_carousel_button');
	var floor	= $('carousel_floor');
	var items	= $$('div[class=carousel_item]');
	var itemMargin	= items[0].getStyle('margin-right').toInt();
	var itemW	= items[0].offsetWidth + itemMargin;
	var itemsPer	= Math.ceil(cWin.offsetWidth/itemW);
	var nScrolls	= Math.floor(itemW * items.length /cWin.offsetWidth);
	var cScroll 	= 0;
	var oPos	= floor.getStyle('left').toInt();
	var executing	= false;
	
	// disables one of the buttons
	function disable(el)
	{
		el.setStyle('cursor', 'default');
		el.set('tween', {duration:250});
		el.tween('opacity', '.5');
	}
	// enabled one of the buttons
	function enable(el)
	{
		el.setStyle('cursor', 'pointer');
		el.set('tween', {duration:250});
		el.tween('opacity', '1');
	}
	// scrolls the carousel
	function scroll(direction) 
	{
		// short if we're tweening already
		if(executing)
			return;
			
		if(direction != 1)
			direciton = -1;
			
		var morph = new Fx.Morph(floor, {
			duration:1000,
			onComplete:function(e){
				// figure out button states
				if(cScroll == 0)
					disable(left);
				else 
					enable(left);

				if(cScroll == nScrolls)
					disable(right);
				else 
					enable(right);
				executing = false;

			},
			transition:Fx.Transitions.Back.easeInOut
		});

                var clipS   = floor.getStyle('clip');
                var cClip = new Array();
                if(clipS == undefined)
                {
                    var dims = ['clipTop', 'clipRight', 'clipBottom', 'clipLeft'];
                    for(var i = 0; i < 4; i++)
                    {
                        var namedVal = floor.getStyle(dims[i]);
                        var index = namedVal == undefined ? 0 : namedVal.toInt();
                        cClip.push(index);
                    }
                }
                else
                {
                    cClip   = rectString2Array(floor.getStyle('clip'));
                }
		var cLeft   = floor.getStyle('left').toInt();
		var nLeft   = cLeft - (itemsPer * itemW * direction);
		var ncLeft  = cClip[3] + (itemsPer * itemW * direction);
		var nClip   = [0, ncLeft + cWin.offsetWidth, cWin.offsetHeight, ncLeft];

                morph.start({
			'left':nLeft,
			'clip':[cClip, nClip]
		});
		
		// set execution
		executing = true;
		
		cScroll += direction;
		
		disable(left);
		disable(right);
	}
	
	right.addEvent('click', function(e){
		if(cScroll >= nScrolls)
			return;
		scroll(1);
	});
	left.addEvent('click', function(e){
		if(cScroll <= 0)
			return;
		scroll(-1);
	});
	
	disable(left);
	if(items.length > itemsPer)
		enable(right);
	else
		disable(right);
});