function GalleryRotator () {
	// basic objects.
	var scrollbox = document.getElementById('productgallery');
	var scrolltype = 'none'; // horizontal, vertical, none. TODO: horizontal mode debug.
	
	// language resource.
	var textPrevAlt = 'View a previous product';
	var textNextAlt = 'View a next product';
	
	// private variables.
	var objCurrentGallery = null;
	var objCurrentGalleryItems = 1;
	var lastProduct = 1;
	
	// scroll animation variables.
	var scroll = {time:1, start:0, change:0, duration:25, timer:null};
	var originaltime = scroll.time;
	
	// for debug (only Safari 3.x or Firebug).
	debugmode = true;
	
	var GalleryRotator = function () {
		
	}
	
	this.initialize = function (id) {
		objCurrentGallery = document.getElementById(id);
		objCurrentGalleryItems = objCurrentGallery.getElementsByTagName('li');
		
		if (objCurrentGalleryItems.length > 1) {
			switch (scrolltype) {
				case 'vertical':
					var temp = scrollbox.offsetHeight * (objCurrentGalleryItems.length - 1);
					objCurrentGallery.style.marginTop = (temp - temp * 2) + 'px';
					objCurrentGallery.style.Height = (scrollbox.offsetHeight * objCurrentGalleryItems.length) + 'px';
					break;
				default:
				//case 'horizontal':
					var temp = scrollbox.offsetWidth * (objCurrentGalleryItems.length - 1);
					objCurrentGallery.style.marginRight = (temp - temp * 2) + 'px';
					objCurrentGallery.style.width = (scrollbox.offsetWidth * objCurrentGalleryItems.length) + 'px';
					break;
			}
		}
		
		scrollbox.scrollLeft = 0;
		
		if (document.getElementById('pagenum')) {
			var objPageNavi = document.getElementById('pagenum');
			objPageNavi.parentNode.removeChild(objPageNavi);
		}
		
		insertPageArea(1, 3, 1);
		lastProduct = 1;
	}
	
	var insertPageArea = function (start, end, selected) {
		var objGallerySection = document.getElementById('gallerysection');
		
		var objDIV = document.createElement('div');
		objDIV.id = 'pagenum';
		objGallerySection.appendChild(objDIV);
		
		var objUL = document.createElement('ul');
		objDIV.appendChild(objUL);
		
		// prev button.
		var objLIPrev = document.createElement('li');
		objLIPrev.id = 'prevbutton';
		objUL.appendChild(objLIPrev);
		
		var objLinkPrev = document.createElement('a');
		objLinkPrev.setAttribute('href', '#');
		if (start > 1)
			objLinkPrev.onclick = function () { return changePageNaviSection(this); }
		objLIPrev.appendChild(objLinkPrev);
		objLinkPrev.appendChild(document.createTextNode(textPrevAlt));
		
		for (var i=start; i<=end; ++i) {
			if (i > objCurrentGalleryItems.length)
				break;
			
			objLI = document.createElement('li');
			objUL.appendChild(objLI);
			createButton(objLI, i, selected, function () { return changeProduct(this) });
		}
		
		// next button.
		var objLINext = document.createElement('li');
		objLINext.id = 'nextbutton';
		objUL.appendChild(objLINext);
		
		var objLinkNext = document.createElement('a');
		objLinkNext.setAttribute('href', '#');
		if (end < objCurrentGalleryItems.length)
			objLinkNext.onclick = function () { return changeNextNaviSection(this); }
		objLINext.appendChild(objLinkNext);
		objLinkNext.appendChild(document.createTextNode(textNextAlt));
	}
	
	var createButton = function (container, text, selected, act) {
		var objLink = document.createElement('a');
		if (text == selected)
			objLink.className = 'current';
		//else
		//	objLink.className = 'notcurrent';
		objLink.setAttribute('href', '#');
		objLink.onclick = act;
		container.appendChild(objLink);
		objLink.appendChild(document.createTextNode(text));
	}
	
	var changeProduct = function (obj) {
		var num = obj.firstChild.nodeValue;
		
		if (num <= objCurrentGalleryItems.length && lastProduct != num) {
			// no action.
			debug(lastProduct);
			var objPageNavi = document.getElementById('pagenum');
			var objPagingList = objPageNavi.getElementsByTagName('li');
			
			switch (lastProduct % 3) {
				case 0:
					objPagingList[3].className = 'unselected';
					break;
				default:
					objPagingList[lastProduct % 3].className = 'unselected';
					break;
			}
			
			obj.parentNode.className = 'selected'
			lastProduct = num;
			
			prescroll(num);
		}
		
		return false;
	}
	
	var changePageNaviSection = function(obj) {
		var objCurrentStart = obj.parentNode.nextSibling.firstChild.firstChild.nodeValue;
		var start = parseInt(objCurrentStart) - 3;
		var end = parseInt(objCurrentStart) - 1;
		
		if (start < 1) {
			// do nothing.
			return false;
		} else {
			if (document.getElementById('pagenum')) {
				var objPageNavi = document.getElementById('pagenum');
				objPageNavi.parentNode.removeChild(objPageNavi);
			}
			
			prescroll(end);
			lastProduct = end;
			insertPageArea(start, end, end);
		}
		
		return false;
	}
	
	var changeNextNaviSection = function(obj) {
		var objCurrentEnd = obj.parentNode.previousSibling.firstChild.firstChild.nodeValue;
		var start = parseInt(objCurrentEnd) + 1;
		var end = parseInt(objCurrentEnd) + 3;
		
		if (start > objCurrentGalleryItems.length) {
			// do nothing.
			return false;
		} else {
			if (document.getElementById('pagenum')) {
				var objPageNavi = document.getElementById('pagenum');
				objPageNavi.parentNode.removeChild(objPageNavi);
			}
			
			prescroll(start);
			lastProduct = start;
			insertPageArea(start, end, start);
		}
		
		return false;
	}
	
	var prescroll = function (num) {	
		switch (scrolltype) {
			case 'vertical':
				var position = findElementPos(objCurrentGalleryItems[num - 1]); // target image.
				var offsetPos = findElementPos(objCurrentGalleryItems[0]); // first image.
				
				position[1] = position[1] - offsetPos[1];
				debug('scroll start: (' + scrollbox.scrollTop + ',' + position[1] + ')');
				scrollStart(scrollbox.scrollTop, position[1]);
				break;
			default:
			//case 'horizontal':
				var position = findElementPos(objCurrentGalleryItems[num - 1]); // target image.
				var offsetPos = findElementPos(objCurrentGalleryItems[0]); // first image.
				
				position[0] = position[0] - offsetPos[0];
				debug('scroll start: (' + scrollbox.scrollLeft + ',' + position[0] + ')');
				scrollStart(scrollbox.scrollLeft, position[0]);
				break;
		}
	}
	
	var scrollStart = function (start, end) {
		if (scroll.timer != null) {
			clearInterval(scroll.timer);
			scroll.timer = null;
		}
		
		scroll.start = start;
		scroll.change = end - start;
		
		switch (scrolltype) {
			case 'vertical':
				scroll.timer = setInterval(scrollVertical, 15);
				break;
			case 'horizontal':
				scroll.timer = setInterval(scrollHorizontal, 15);
				break;
			default:
				scrollbox.scrollLeft = end;
				break;
		}
	}
	
	var scrollVertical = function () {
		if (scroll.time > scroll.duration) {
			clearInterval(scroll.timer);
			scroll.time = originaltime;
			scroll.timer = null;
		}
		else {
			scrollbox.scrollTop = sineInOut(scroll.time, scroll.start, scroll.change, scroll.duration); 
			scroll.time++;
		}
	}
	 
	var scrollHorizontal = function () {
		if (scroll.time > scroll.duration) {
			clearInterval(scroll.timer);
			scroll.time = originaltime;
			scroll.timer = null;
		} else {
			scrollbox.scrollLeft = sineInOut(scroll.time, scroll.start, scroll.change, scroll.duration);
			scroll.time++;
		}
	}
	
	var findElementPos = function (elemFind) {
		var elemX = 0;
		var elemY = 0;
		do {
			elemX += elemFind.offsetLeft;
			elemY += elemFind.offsetTop;
		} while (elemFind = elemFind.offsetParent)
	 
		return Array(elemX, elemY);
	}
	
	var sineInOut = function (t, b, c, d) {
		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
	}
	
	// debug function.
	var debug = function (message) {
		if (window.console && debugmode == true) {
			console.log(message);
		}
	}
}

var objGalleryRotator = null;

window.onload = function () {
	try {
		objGalleryRotator = new GalleryRotator();
		objGalleryRotator.initialize('enterpriselist');
	} catch (e) {
		// do nothing.
	}
}