/**************************************************************
* Accordion
* params : object, tit, titVisible, cnt, cntHeight, speed, easing, callback
***************************************************************/
function Accordion(params) {
	var objTitle = SA.classNames(params.tit, '', params.object),
		titLength = objTitle.length,
		objContent = SA.classNames(params.cnt, '', params.object),
		objEasing = params.easing ? params.easing : '';

	var initialize = function() {
		for (var i=0; i<titLength; i++) {
			objTitle[i].onclick = function(i) { return function(e) { findIndex(i); return false; } }(i);

			objContent[i].style.overflow = 'hidden';
			if (i != 0) {
				SA.setStyle(objContent[i], {
					display: 'none',
					height: 0
				});
			} else {
				SA.addClass(objTitle[i], params.titVisible);
				SA.setStyle(objContent[i], {
					display: 'block',
					height: params.cntHeight
				});
			}
		}
	};

	var findIndex = function(num) {
		for (var i=0; i<titLength; i++) {
			if (i == num) {
				if (!SA.hasClassName(objTitle[i], params.titVisible)) {
					SA.addClass(objTitle[i], params.titVisible);
					SA.setStyle(objContent[i], { display: 'block' });
					SA.animate(objContent[i], {
						effects: { height: params.cntHeight },
						speed: params.speed,
						easing: objEasing
					});
				}
			} else {
				if (SA.hasClassName(objTitle[i], params.titVisible)) {
					SA.removeClass(objTitle[i], params.titVisible);
					SA.animate(objContent[i], {
						effects: { height: 0 },
						easing: objEasing,
						speed: params.speed,
						callback: function(i) {
							return function(e) {
								if (params.callback) params.callback.apply(objTitle[num], [num, i, objTitle, objContent]);

								SA.setStyle(objContent[i], { display: 'none' });
							};
						}(i)
					});
				}
			}
		}
	};

	initialize();
}

/**************************************************************
* Rolling
***************************************************************/
function Rolling(params) {
	var objList = SA.classNames(params.list, '', params.object),
		objPrev = SA.classNames(params.prev, '', params.object)[0],
		objNext = SA.classNames(params.next, '', params.object)[0],
		objParent = objList[0].parentNode,
		listLength = objList.length,
		wrapSize = 0,
		objInterval;

	var initialize = function() {
		objParent.parentNode.style.overflow = 'hidden';

		for (var i=0; i<listLength; i++) { wrapSize += SA.offset(objList[i]).width; }

		objParent.style.width = wrapSize + 'px';

		objPrev.onclick = prevEvent;
		objNext.onclick = nextEvent;

		if (params.status == 'auto') objInterval = setInterval(eventDirection, params.time);

		params.object.onmouseover = function() { clearInterval(objInterval); };
		SA.addEvent(params.object, 'mouseleave', function() {
			objInterval = setInterval(eventDirection, params.time);
		});
	};

	var prevEvent = function() {
		objList = SA.classNames(params.list, '', params.object);

		objParent.style.left = - SA.offset(objList[listLength - 1]).width + 'px';
		var lastNode = objParent.removeChild(objList[listLength - 1]);
		objParent.insertBefore(lastNode, objList[0]);

		SA.animate(objParent, { effects: { left: 0 } });
		eventDirection = prevEvent;

		return false;
	};

	var nextEvent = function() {
		objList = SA.classNames(params.list, '', params.object);

		SA.animate(objParent, {
			effects: { left: - SA.offset(objList[0]).width },
			callback: function() {
				var firstNode = objParent.removeChild(objList[0]);
				objParent.appendChild(firstNode);
				objParent.style.left = 0;
			}
		});
		eventDirection = nextEvent;

		return false;
	};

	var eventDirection = nextEvent;

	initialize();
}
