
var granularity = 50;
var timeframe = 1000;

var meta;
var subs;
var leftmost;
var move_cnt = 0;
var t;
var t2;
var a;
var v;
var reversed;

function findElementsByClassName(className)
{
  if(document.getElementsByClassName == undefined)
  {
    var result = new Array() ;

    var elements = document.getElementsByTagName('*') ;
    for(var i = 0 ; i < elements.length ; i ++)
      if(elements[i].className == className)
        result.push(elements[i]) ;

    return result ;
  }
  else
    return document.getElementsByClassName(className) ;
}

function d_rearrange()
{
	subs = new Array();
	leftmost = 0;
	
	meta = findElementsByClassName("metacontainer")[0];  // We will use only first metacontainer. Others will be ignored
	for(var i = 0 ; i < meta.childNodes.length ; i ++)
		if(meta.childNodes[i].className == "subcontainer")
			subs.push(meta.childNodes[i]);
			
	for(i = 0 ; i < subs.length ; i ++)
	{
		subs[i].style.position = "absolute";
		subs[i].desired = new Object();
		subs[i].starting = new Object();
		subs[i].starting.width = subs[i].offsetWidth;

		if(i)
		{
			subs[i].style.top = 0;
			subs[i].style.left = subs[i - 1].offsetLeft + subs[i - 1].offsetWidth;
		}
		
		subs[i].style.visibility = "visible";
	}
}			

function d_scroll(item)
{
	if(typeof(item) == "string")
	{
		switch(item)
		{
			case "left":
				if(leftmost)
					item = leftmost;
				break;
				
			case "right":
				if(leftmost < subs.length - 1)
					item = leftmost + 2;
				break;
				
			default:
				return;
		}
		
		if(typeof(item) == "string") return;
	}

	if(move_cnt) 
	{
		// Remember user's request and do d_scroll after current d_scroll finishes.
		t2 = setTimeout("d_scroll("+item+")",move_cnt * (1000 / granularity) + 1);
		return;
	}
	
	item --;

	if(leftmost == item)
		return;

	subs[item].desired.left = 0;
	
	for(var i = item ; i < subs.length ; i ++)
		if(i > item)
			subs[i].desired.left = subs[i - 1].desired.left + subs[i - 1].offsetWidth;

	for(i = item ; i >= 0 ; i --)
		if(i < item)
			subs[i].desired.left = subs[i + 1].desired.left - subs[i].offsetWidth;

	for(i = 0 ; i < subs.length ; i ++)
		subs[i].starting.left = subs[i].offsetLeft;

	move_cnt = granularity;
	leftmost = item ;

	a = 2 * (subs[0].desired.left - subs[0].starting.left) / granularity / granularity;
	v = 0;
	reversed = false;

	move();	

	return(false);
}		

function move()
{

	if(!reversed && move_cnt <= granularity/2)
	{
		a = -a;
		reversed = true ;
	}
		
	v = v + a;


// Move each element a little closer to it's desired position
	if(Math.abs(subs[0].offsetLeft - subs[0].desired.left) > Math.abs(v))
		for(i = 0 ; i < subs.length ; i ++)
			subs[i].style.left = Math.round(subs[i].offsetLeft + v);
	else
		for(i = 0 ; i < subs.length ; i ++)
			subs[i].style.left = subs[i].desired.left;

	v = v + a ;			

	move_cnt -- ;
	if(move_cnt) t = setTimeout("move()",1000 / granularity);
}