﻿//<![CDATA[
function slide_view(strMyName, arrOp)
{
	// 숫자만 입력되도록.
	this.FilterNumber = /^[-]?[\d]+$/i;

	// json 배열에 들어있는 데이터가 전부인지? 필요할때 Ajax 로 추가 데이터를 읽어올 것인지.
	this.blnUseAjax = false;
	this.blnExecutedAjax = false;

	this.css = "";
	this.mode = "url";
	this.arrJson = null; 		// 데이터를 담을 Json 배열
	this.length = 0;
	this.intViewCnt = 1; 		// 화면에 한번에 보일 컨텐츠 개수.
	this.intMoveCnt = 1; 		// 또 한번 Left / Right 이동시 몇칸씩 움직일 것인지.
	this.intCurrentIndex = 0;	// 화면에 나타내는 intViewCnt 개의 첫 Index
	this.intPage = 0;
	this.intPageSize = 10;
	this.intPageCount = 1;
	this.intPrevPage = 0;
	this.strImgCSS = "";
	this.strName = strMyName;
	this.intMinWidth = 400;
	this.intMinHeight = 300;
	this.blnViewDummy = true;
	this.autorun = true;
	this.viewtext = false;
	this.title_len = null;
	this.viewOriginalSize = false;
	this.intSelectedIndex = QueryString("idx");

	// 입력된 Json 개체에 담긴 정보대로 초기화
	for (var itm in arrOp) {
		eval("this." + itm + " = arrOp." + itm);
	}

	// 좌우 이동 버튼에 이벤트 할당
	var obj = this;
	var objPnl = $("div." + this.css);
	objPnl.find("a")
		.eq(0)
			.attr("href", "javascript:;")
			.bind("click", function() {
				return obj.prev();
			})
		.end()
		.eq(1)
			.attr("href", "javascript:;")
			.bind("click", function() {
				return obj.next();
			});
}

// 초기에 Json 개체와, 총 레코드의 개수를 저장하는 함수
slide_view.prototype.setData = function (newJson, newLength)
{
	this.arrJson = newJson;
	this.length = newLength;

	this.intCurrentIndex = 0;
}

// 초기 데이터를 받아옴 (Ajax)
slide_view.prototype.run = function ()
{
	if (this.blnExecutedAjax) return;
	this.blnExecutedAjax = true;

	var intMoveCnt = this.intMoveCnt;
	var strName = this.strName;

	// 개체 생성시 입력된 Json 개체가 없으면 (DB 에서 Ajax 로 불러와서 뿌려주는 경우)
	if (this.blnUseAjax) this.call_ajax(1);
	else if (this.autorun) this.move();	// 그렇지 않으면 바로 move move move~
}

slide_view.prototype.call_ajax = function(intPage) {
	if (intPage < 1 || (this.arrJson && (intPage > this.intPageCount))) {
		this.blnExecutedAjax = false;
		return;
	}

	// 이전 페이지 저장
	this.intPrevPage = this.intPage;
	this.intPage = intPage;
	var obj = this;

	$.post(
		"/board/ajax/getAttachList.asp"
		//, { bid: BD_INF.bid, idx: QueryString("idx") }
		, {	bid: BD_INF.bid, page: this.intPage, page_size: this.intPageSize }
		, function(strResponseText) {
			// alert(strResponseText);
			eval("var arrResult = " + strResponseText);
			if (arrResult.data.length > 0) {
				obj.setData(arrResult.data, arrResult.maxamount);
				obj.intPageCount = Math.ceil((arrResult.maxamount - 1) / obj.intPageSize) + 1;
				if (obj.data_onload) obj.data_onload();
				obj.move();
				obj.blnExecutedAjax = false;
			}
		}
	);
}

slide_view.prototype.prev = function() {
	this.checkSlideData(this.intMoveCnt * -1);
	return false;
}

slide_view.prototype.next = function() {
	this.checkSlideData(this.intMoveCnt);
	return false;
}

////
//	이전, 이후 버튼을 눌렀을 때, 출력해야할 데이터 범위를 결정
slide_view.prototype.checkSlideData = function (intMoveAmount)
{
	////
	//	 현재 보고 있는 index 가 현재 이용하고 있는 json 배열 개체의 length 의 
	//	1/2 에 달하고 ajax 사용으로 되어있다면, ajax 를 수행해 새로운 데이터를 읽어옴
	if (this.blnUseAjax) {
		if (this.blnExecutedAjax) return;
		this.blnExecutedAjax = true;

		this.call_ajax(this.intPage + intMoveAmount);
		return;
	}

	// 만약 다음 이동할 인덱스가 음수이거나 최대 레코드 개수 이상이면 그냥 돌아감
	if (	(this.intCurrentIndex + intMoveAmount) < 0 
		||  (this.intCurrentIndex + intMoveAmount) >= this.length) 
	{
		this.blnExecutedAjax = false;
		return;
	}

	// 이동해서 보여질 데이터의 최소 인덱스와 최대 인덱스를 구함
	var intMinBound = this.intCurrentIndex + intMoveAmount;
	var intMaxBound = intMinBound + (this.intViewCnt - 1);

	// 인덱스가 올바른 범위 이내면
	if ((intMinBound >= 0) && (intMaxBound < this.length))	{
		this.intCurrentIndex = intMinBound;
		this.move();
	}
}

slide_view.prototype.move = function (intIndex)
{
	var obj = this;
	var objPnl = $("div." + this.css);

	if (this.length > this.intViewCnt) 
		objPnl.find("a")
			.show()
			.css("visibility", "visible");

	var objList = objPnl.find("ul");

	var arrJson = this.arrJson;
	var intCurrentIndex = this.intCurrentIndex = intIndex != undefined ? intIndex : this.intCurrentIndex;
	var intLastIndex = (intCurrentIndex + this.intViewCnt > arrJson.length) ? arrJson.length : (intCurrentIndex + this.intViewCnt);
	var intMaxLength = this.length;

	this.arrImage = [];

	var strList = "";
	for (var i = intCurrentIndex; i < intLastIndex; i++) {
		if (arrJson[i].w == 0 && arrJson[i].h == 0) continue;

		this.arrImage[this.arrImage.length] = (i < intMaxLength) ? { 
			idx : arrJson[i].idx,
			img : (this.mode == "thumb" ? arrJson[i].thumb : arrJson[i].url),
			text: arrJson[i].title,
			w : arrJson[i].w,
			h : arrJson[i].h
		} : { thumb:undefined, text:undefined };
		strList += "<li style=\"display:none;\"></li>";
	}

	var intDelay = 0;

	if (objList.find("li").length == 0) 
		objList.html(strList);
	else 
		objList.find("li").hide();

	objList.find("li").attr("class", (this.arrImage.length > 1 && !this.blnViewDummy) ? "img_two" : "");

	setTimeout(this.strName + ".checkImageLoad(\"div." + this.css + " ul li\")", intDelay);
	this.blnExecutedAjax = false;
}

////
//	이미지 개체에 이미지를 로딩한 후, 이미지 크기를 얻어
//	그 비율을 계산해 정해진 사이즈로 리사이즈
slide_view.prototype.checkImageLoad = function (objLI) {
	var obj = this;
	// move 에서 배열에 저장된 img 개체들이 로딩이 되었는지 확인하고, 
	// 로딩이 되었으면 li 태그 내에 이미지 생성
	$(objLI).html("").each(function(i) {
		if (i >= obj.arrImage.length) {
			return false;
		}
		var intNewWidth, intNewHeight, strImage, intMarginTop, intMarginLeft;
		var oWidth = intNewWidth = intNewWidth = obj.arrImage[i].w;
		var oHeight = intNewHeight = intNewHeight = obj.arrImage[i].h;
		intMarginTop = 0;
		intMarginLeft = 0;

		// 이미지 크기가 현재 틀(li) 크기보다 크면, 축소 비율을 구해 그림을 리사이징.
		if (oWidth > obj.intMinWidth || oHeight > obj.intMinHeight) {
			var intRatio = getRatio(obj.intMinWidth, obj.intMinHeight, oWidth, oHeight);
			intNewHeight = oHeight * intRatio;
			intNewWidth = oWidth * intRatio;
		}
		// 이미지 높이가 LI 전체 높이보다 작을 경우 중앙 (Middle) 정렬
		var intMarginTop = Math.ceil((obj.intMinHeight - intNewHeight) / 2);
		var intMarginLeft = Math.ceil((obj.intMinWidth - intNewWidth) / 2);

		strImage = "<img src=\"" + obj.arrImage[i].img + "\" hspace=\"0\" vspace=\"0\" "
				+ "alt=\"\""
				+ "style=\"width:" + intNewWidth + "px;height:" + intNewHeight + "px;"
				+ "margin-top:" + intMarginTop + "px;" 
				+ "margin-left:" + intMarginLeft + "px;\" />";

		$(this)
			.html("<a id=\"a_" + obj.arrImage[i].idx + "\" href=\"javascript:;\""
					+ ((obj.viewOriginalSize) ? (" onclick=\"return ViewOriginalImage(this, '"
					+ obj.arrImage[i].img + "', '" + oWidth + "', '" + oHeight + "')\" ") : "") 
				+ "></a>");
		$(this).find("a").append(strImage);

		if (obj.arrImage[i].text && obj.viewtext) {
			var strText = obj.title_len ? CutString(obj.arrImage[i].text, obj.title_len) : obj.arrImage[i].text;
			$(this).append("<a href=\"javascript:;\" title=\"\">"
				+ strText + "</a>");
		}
	});

	// 실제 보여주게 된 img 개수
	//var intExposureCnt = this.arrImage.length - this.intCurrentIndex;
	if (this.arrJson.length > 0) {
		if ($(objLI + " img").length == this.arrImage.length) {
			// select 메소드가 구현되어 있으면, 로딩이 끝난 후 제일 첫번째 개체의 액션 실행
			if (this.select) {
				var intSelectedIndex = (this.arrJson.length + (this.intPage - this.intPrevPage < 0 ? -1 : 0)) % this.arrJson.length;
				$(objLI).find("a")
					.bind("click", this.select);

				if (QueryString("idx") != "" && $(objLI).find("#a_" + this.intSelectedIndex).length > 0) {
					$(objLI).find("#a_" + QueryString("idx")).click();
					this.intSelectedIndex = "";	// 메인에서 클릭해서 실행시 1회만 이렇게 선택되게 하기위해..
				}
				else
					$(objLI).find("a").filter(":eq(" + intSelectedIndex + ")").click();
			}

			$("div." + this.css).show();
			setTimeout("$(\"" + objLI + "\").fadeIn(300)", 300);
		}
//		else {
//			setTimeout(this.strName + ".checkImageLoad('" + objLI + "')", 300);
//		}
	}
}

////
//	수가 커졌다? intHeight 가 크다.
//	수가 작아졌다? intWidth 가 크다.
function getRatio(intMinWidth, intMinHeight, intWidth, intHeight) {
	var wRatio = (intMinWidth / intWidth);
	var hRatio = (intMinHeight / intHeight);
	return wRatio > hRatio ? hRatio : wRatio;
}

//]]>