function PhotoBox(type) {
	var iType = !type ? 1 : type;
	var objMainImage;
	var objImageList;
	var objOldIndex = null;
	var objImages = new Array();
	var dataImages = new Array();
	var dataMovies = new Array();
	var fadeEvent = {fadeIn:null, fadeOut:null};
	var timer = {fade:null, slide:null};
	var objPlayBtn = null;
	var objStopBtn = null;
	var dataUrls;

	var defaultThumbSrc = '/ko/images/common/player/default/default_image_64x48.gif';
	var defaultScreenSrc = '/ko/images/common/player/default/default_image_294x222.gif';

	var movie = new Object();
	movie.controller = {
		pause:{src:'/ko/images/common/player/control/control_pause.group2.gif'},
		play:{src:'/ko/images/common/player/control/control_play.group2.gif'},
		stop:{src:'/ko/images/common/player/control/control_stop.group2.gif'}
	}

	// resource.
	var slideThumbnail = {width:62, height:46, length:4};
	var mainImage = {width:294, height:222};
	var slidePage = 1;
	var totalSlidePage = 1;
	var opacity = {value:0, unit:20, inter:50};
	var slideshow = {term:3000, autoplay:true};

	var gLanguageResources = new Array();
	gLanguageResources['play slide'] = "슬라이드 쇼 보기";
	gLanguageResources['stop slide'] = "슬라이드 쇼 멈추기";
	gLanguageResources['prevList'] = "이전 이미지 목록 보기";
	gLanguageResources['nextList'] = "다음 이미지 목록 보기";

	this.initialize = function (id) {

		switch (iType) {
		case 1:
			createStructureType1(id);

			totalSlidePage = Math.ceil(dataImages.length / slideThumbnail.length);
			//totalSlidePage = Math.ceil(dataImages.length);
			loadSlide();
			if (objImages.length > 0)
				objImages[0].onclick();

			break;
		case 2:
			createStructureType2(id);
			break;
		case 3:
			createStructureType3(id);
			break;
		case 4:
			mainImage.width = 404;
			mainImage.height = 300;
			slideThumbnail.width = 93;
			slideThumbnail.height = 70;
			slideThumbnail.length = 6;
			createStructureType4(id);

			totalSlidePage = Math.ceil(dataImages.length / slideThumbnail.length);
			//totalSlidePage = Math.ceil(dataImages.length);
			loadSlide();
			if (objImages.length > 0)
				objImages[0].onclick();

			if (slideshow.autoplay)
				window.addEvent('onload', playSlide);

			break;
		}
	}

	this.addImage = function (path, width, height, url) {
		var tempImage = new Image();
		tempImage.src = path;
		dataImages.push({object:tempImage, width:width, height:height, getUrl:url});
	}

	this.addMovie = function (movie, image) {
		var tempImage = new Image();
		tempImage.src = image.path;
		dataMovies.push({movie:movie, object:tempImage, width:image.width, height:image.height});
	}

	var createStructureType1 = function (id) {
		var objPhotoBox = Object.createHTMLElement('div', {className:'player1'});
		var objImageArea = createMainImage();

		var objSlideArea = createSlideList();
		var objButtons = createButtons();

		// assemble.
		objPhotoBox.appendChild(objImageArea);
		objPhotoBox.appendChild(objSlideArea);
		objSlideArea.appendChild(objImageList);
		objSlideArea.appendChild(objButtons);

		var objPhotoBoxArea = document.getElementById(id);
		objPhotoBoxArea.insertBefore(objPhotoBox, Object.getFirstChild(objPhotoBoxArea));
	}

	var createStructureType3 = function (id) {
		var objPhotoBox = Object.createHTMLElement('div', {className:'player3'});
		var objMovieArea = createMainMovie();

		var objControlArea = createMovieControl();

		// assemble.
		objPhotoBox.appendChild(objMovieArea);
		objPhotoBox.appendChild(objControlArea);

		var objPhotoBoxArea = document.getElementById(id);
		objPhotoBoxArea.insertBefore(objPhotoBox, Object.getFirstChild(objPhotoBoxArea));
	}

	var createStructureType4 = function (id) {
		var objRoot = Object.createHTMLElement('div', {className:'gallery1'});
		var objPhotoBox = Object.createHTMLElement('div', {className:'photobox'});
		var objImageArea = createMainImage();

		objPlayBtn = Object.createHTMLElement('a', {href:'#', className:'button playbtn', onclick:playSlide});
		objPlayBtn.appendChild(document.createTextNode(gLanguageResources['play slide']));
		objStopBtn = Object.createHTMLElement('a', {href:'#', className:'button stopbtn selected', onclick:stopSlide});
		objStopBtn.appendChild(document.createTextNode(gLanguageResources['stop slide']));

		var objButtons1 = Object.createHTMLElement('p', {className:'buttons'});
		objButtons1.appendChild(objPlayBtn);
		objButtons1.appendChild(document.createTextNode(' '));
		objButtons1.appendChild(objStopBtn);

		var objSlideArea = createSlideList();
		var objButtons2 = createButtons();

		// assemble.
		objRoot.appendChild(objPhotoBox);
		objPhotoBox.appendChild(objImageArea);
		objPhotoBox.appendChild(objButtons1);
		objRoot.appendChild(objSlideArea);
		objSlideArea.appendChild(objImageList);
		objSlideArea.appendChild(objButtons2);

		var objPhotoBoxArea = document.getElementById(id);
		objPhotoBoxArea.parentNode.appendChild(objRoot);
	}

	var createMainImage = function () {
		var objImageArea = Object.createHTMLElement('table', {className:'mainImage', width:mainImage.width, height:mainImage.height});
		var objTBODY = document.createElement('tbody');
		var objTR = document.createElement('tr');
		var objTD = document.createElement('td');
		objMainImage = Object.createHTMLElement('img', {src:defaultScreenSrc, width:mainImage.width, height:mainImage.height, alt:''});

		objImageArea.appendChild(objTBODY);
		objTBODY.appendChild(objTR);
		objTR.appendChild(objTD);

		if (dataUrls) {
			var objA = Object.createHTMLElement('a', {href:dataUrls.getUrl, className:'button popup2btn'});
			objTD.appendChild(objA);
			objA.appendChild(objMainImage);
		} else {
			objTD.appendChild(objMainImage);
		}

		return objImageArea;
	}

	var createMainMovie = function () {
		var objMovieArea = Object.createHTMLElement('table', {className:'mainMovie', width:mainImage.width, height:mainImage.height});
		var objTBODY = document.createElement('tbody');
		var objTR = document.createElement('tr');
		var objTD = document.createElement('td');
		objMainImage = Object.createHTMLElement('img', {src:defaultScreenSrc, width:mainImage.width, height:mainImage.height, alt:'', id:'player3'});

		objMovieArea.appendChild(objTBODY);
		objTBODY.appendChild(objTR);
		objTR.appendChild(objTD);
		objTD.appendChild(objMainImage);

		return objMovieArea;
	}

	var createMovieControl = function () {
		var objUL = Object.createHTMLElement('ul', {className:'control'});

		for (var i=0; i<3; i++) {
			var objImage = new Image();

			switch (i) {
			case 0:
				var objLI = Object.createHTMLElement('li', {className:'item1 firstItem'});
				objImage.src = movie.controller.play.src;
				objImage.onclick = playMovie;
				break;
			case 1:
				var objLI = Object.createHTMLElement('li', {className:'item2'});
				objImage.src = movie.controller.pause.src;
				objImage.onclick = pauseMovie;
				break;
			case 2:
				var objLI = Object.createHTMLElement('li', {className:'item3 lastItem'});
				objImage.src = movie.controller.stop.src;
				objImage.onclick = stopMovie;
				break;
			}

			objUL.appendChild(objLI);
			objLI.appendChild(objImage);
		}

		return objUL;
	}

	var createSlideList = function () {
		var objSlideArea = Object.createHTMLElement('div', {className:'imageSlide'});
		objImageList = Object.createHTMLElement('ul');

		for (var i=0; i<slideThumbnail.length; i++) {
			var objImage = Object.createHTMLElement('img', {src:defaultThumbSrc, width:slideThumbnail.width, height:slideThumbnail.height, alt:'', onclick:viewImage});
			objImages.push(objImage);

			var objLI = document.createElement('li');
			var objTABLE = document.createElement('table');
			var objTBODY = document.createElement('tbody');
			var objTR = document.createElement('tr');
			var objTD = document.createElement('td');
			objImageList.appendChild(objLI);
			objLI.appendChild(objTABLE);
			objTABLE.appendChild(objTBODY);
			objTBODY.appendChild(objTR);
			objTR.appendChild(objTD);
			objTD.appendChild(objImage);
		}

		objSlideArea.appendChild(objImageList);
		return objSlideArea;
	}

	var createButtons = function () {
		var objPrevBtn = Object.createHTMLElement('a', {href:'#', className:'button prevbtn', onclick:prev});
		objPrevBtn.appendChild(document.createTextNode(gLanguageResources['prevList']));
		var objNextBtn = Object.createHTMLElement('a', {href:'#', className:'button nextbtn', onclick:next});
		objNextBtn.appendChild(document.createTextNode(gLanguageResources['nextList']));

		var objButtons = Object.createHTMLElement('div', {className:'buttons'});
		objButtons.appendChild(objPrevBtn);
		objButtons.appendChild(document.createTextNode(' '));
		objButtons.appendChild(objNextBtn);

		return objButtons;
	}

	var pauseMovie = function () {

	}

	var playMovie = function () {

	}

	var stopMovie = function () {

	}

	var playSlide = function () {
		if (!objPlayBtn || objPlayBtn.className.indexOf('selected') != -1)
			return false;

		setTimeout(
			function () {
				autoPlay();
				timer.slide = setInterval(autoPlay, slideshow.term);
			}, 1000
		);

		objPlayBtn.className = objPlayBtn.className + ' selected';
		objStopBtn.className = objStopBtn.className.replace(' selected', '');
	}

	var stopSlide = function () {
		if (objStopBtn.className.indexOf('selected') != -1)
			return false;

		clearInterval(timer.slide);
		objPlayBtn.className = objPlayBtn.className.replace(' selected', '');
		objStopBtn.className = objStopBtn.className + ' selected';
	}

	var viewImage = function () {
		var currentLI = Object.getParentNode(this, 'li');
		if (currentLI.className == 'empty' || currentLI == 'selected')
			return false;

		var index = getImageIndex(this);

		var tempSize = Object.calcOptimizedImageSize(dataImages[index].width, dataImages[index].height, mainImage.width, mainImage.height, 'reduce');

		objMainImage.src = dataImages[index].object.src;
		objMainImage.width = tempSize.width;
		objMainImage.height = tempSize.height;

		resetSelected(index);
	}

	var prev = function () {
		--slidePage;

		if (slidePage < 1) {
			slidePage = 1;
			return false;
		} else {
			loadSlide();
		}

		return false;
	}

	var next = function () {
		++slidePage;

		var endPage = Math.ceil((totalSlidePage - slideThumbnail.length + 1));
		//var endPage = Math.ceil((totalSlidePage - slideThumbnail.length + 1));

		if (slidePage > totalSlidePage) {
		//if (slidePage > endPage) {
			//slidePage = totalSlidePage - (slidePage - slideThumbnail.length+ 1);
			slidePage = totalSlidePage;
			return false;
		} else {
			loadSlide();
		}

		return false;
	}

	var autoPlay = function () {
		fadeOut(function () {
			objOldIndex++;
			if (objOldIndex >= dataImages.length) objOldIndex = 0;

			var tempSize = Object.calcOptimizedImageSize(dataImages[objOldIndex].width, dataImages[objOldIndex].height, mainImage.width, mainImage.height, 'reduce');
			objMainImage.src = dataImages[objOldIndex].object.src;
			objMainImage.width = tempSize.width;
			objMainImage.height = tempSize.height;
			slidePage = Math.ceil((objOldIndex + 1) / slideThumbnail.length);
			//slidePage = Math.ceil(objOldIndex + 1);
			loadSlide();
			resetSelected(objOldIndex);
			fadeIn();
		});
	}

	var fadeIn = function (func) {
		if (!!func)
			fadeEvent.fadeIn = func;
		timer.fade = setInterval(increaseOpacity, opacity.inter);
	}

	var fadeOut = function (func){
		if (!!func)
			fadeEvent.fadeOut = func;
		timer.fade = setInterval(decreaseOpacity, opacity.inter);
	}

	var increaseOpacity = function () {
		opacity.value = opacity.value + opacity.unit;
		if (opacity.value > 100)
			opacity.value = 100;
		Object.setOpacity(objMainImage, opacity.value);

		if (opacity.value == 100) {
			clearInterval(timer.fade);
			if (!!fadeEvent.fadeIn) fadeEvent.fadeIn();
		}
	}

	var decreaseOpacity = function () {
		opacity.value = opacity.value - opacity.unit;
		if (opacity.value <= 0)
			opacity.value = 0;
		Object.setOpacity(objMainImage, opacity.value);

		if (opacity.value == 0) {
			clearInterval(timer.fade);
			if (!!fadeEvent.fadeOut) fadeEvent.fadeOut();
		}
	}

	var loadSlide = function () {
		var start = (slidePage - 1) * slideThumbnail.length;
		//var start = (slidePage - 1);
		var end = start + slideThumbnail.length;
		var count = 0;

		for (var i=start; i<end; i++) {
			if (!!dataImages[i]) {
				var tempSize = Object.calcOptimizedImageSize(dataImages[i].width, dataImages[i].height, slideThumbnail.width, slideThumbnail.height, 'reduce');
				objImages[count].src = dataImages[i].object.src;
				objImages[count].width = tempSize.width;
				objImages[count].height = tempSize.height;
			} else {
				objImages[count].src = defaultThumbSrc;
				objImages[count].width = slideThumbnail.width;
				objImages[count].height = slideThumbnail.height;
			}

			count++;
		}

		resetSelected(objOldIndex);
	}

	var resetSelected = function (index) {
		var currentLI;
		var reindex = normalizeIndex(index);

		for (var i=0; i<objImages.length; i++) {
			currentLI = Object.getParentNode(objImages[i], 'li');

			if (i == reindex) {
				currentLI.className = 'selected';
				objOldIndex = index;
			} else if (objImages[i].src.match(defaultThumbSrc)) {
				currentLI.className = 'empty';
			} else {
				currentLI.className = '';
			}
		}
	}

	var normalizeIndex = function (index) {
		if (index == null)
			return -1;
		else
			return index - (slidePage - 1) * slideThumbnail.length;
			//return index - (slidePage - 1);
	}

	var getImageIndex = function (obj) {
		for (var i=0; i<objImageList.childNodes.length; i++) {
			if (objImageList.childNodes[i].getElementsByTagName('img')[0] == obj)
				return i + (slidePage - 1) * slideThumbnail.length;
				//return i + (slidePage - 1);
		}

		return null;
	}

	this.addUrl = function (url) {
		dataUrls = {getUrl:url};
	}
}
