var expiresDay = 10;         // Cookieの保存日数

var jsonData = new Object(); // JSONデータ, 対応するCookie名: c_jsonData

var loadingFlag = 0;         // ローディング監視フラグ
var loadingRingSource = "url(/common/images/cpp/loading_ring.gif)";

var ratingCheck = [];

var jq_cppPrevWorkElem;      // 前回開いたワークエリアのjQueryオブジェクト
var jq_prevToggleElem;       // 前回クリックしたボタンのjQueryオブジェクト
var jq_prevBtnAreaElem;      // 前回クリックしたボタンの含まれているエリアのjQueryオブジェクト


/* ---------------------------------------------------------------------
*    JSONデータの読み込み処理
* ------------------------------------------------------------------- */

function loadJSON() {
	// JSONデータの取得
	$.ajax({
		type: "GET",
		url: "/common/data/bgimages.json",
		dataType: "json",
		cache: false,
		success: function(data) {
			jsonData = data;
			output();
		}
	});
}


/* ---------------------------------------------------------------------
*   CPPの書き出し処理
* ------------------------------------------------------------------- */

function output(_Mode) {
	/* -----------------------------------------------------------------
	*   Rating Check用のJSONオブジェクトを作成
	* --------------------------------------------------------------- */
	ratingCheck = eval(ratingCheckString);

	
	for (i = 0; i < jsonData.length; i++) {
		/* -------------------------------------------------------------
		*   Open / Close ボタンへのクリックイベント追加
		* ----------------------------------------------------------- */

		var toggleElem = "#cppToggle" + String(i);
		$(toggleElem).bind("click", { workNum: String(i) }, loadWorkImg);


		/* -------------------------------------------------------------
		*   Vote Up ボタンへのクリックイベント追加
		* ----------------------------------------------------------- */

		$("#" + jsonData[i].cid + "RateBtn a").bind("click", { _Num: i }, function(event) {
			if (loadingFlag == 0) {
				loadingFlag = 1;

			    $.ajax({
			    	type: "POST",
			    	data: "action=vote_up&cid=" + jsonData[event.data._Num].cid,
			    	url: "votes.php",
			    	success: function(msg) {
			    		$("#" + jsonData[event.data._Num].cid + "RateBtn a").animate({
			    			opacity: 0,
			    			top: "20px"
			    		}, "fast", function() {
			    			$("#" + jsonData[event.data._Num].cid + "RateBtn a").remove();
			    			$("#" + jsonData[event.data._Num].cid + "RateBtn").html("<p class=\"def mid\">" + msg + "<span class=\"altText\">Good!</span></p>");
			    			$("#" + jsonData[event.data._Num].cid + "RateBtn p").css({ opacity: 0, top: "-20px" }).animate({
			    				opacity: 1,
			    				top: "0px"
			    			}, "fast");
			    			
			    			
			    			/* -----------------------------------------
							*   Rating Check用のJSONオブジェクトを作成
							* --------------------------------------- */
	
			    			eval("ratingCheck[0]." + jsonData[event.data._Num].cid + " = 1");
			    			
			    			var ratingCheckString = "[{";
							for (j = 0; j < jsonData.length; j++) {
								if (eval("ratingCheck[0]." + jsonData[j].cid) != "1") {
									ratingCheckString += jsonData[j].cid + ' : 0';
								} else {
									ratingCheckString += jsonData[j].cid + ' : 1';
								}

								if (j != jsonData.length - 1) {
									ratingCheckString += ", ";
								}
							}
							ratingCheckString += "}]";
							
			    			$.cookie("c_ratingCheckString", ratingCheckString, { expires: 365, path: '/' });
			    						    			
			    			
			    			loadingFlag = 0;
			    		});
			    	},
			    	error: function() {
			    		loadingFlag = 0;
					}
				});
			}

			return false;
		});
	}

	loadingFlag = 0;
}


/* ---------------------------------------------------------------------
*   作品の読み込み・イベント処理
* ------------------------------------------------------------------- */

var nowTargetArray = new Array();  // 現在選択されている作品ナンバー格納用配列

function loadWorkImg(event) {
	if (loadingFlag == 0) {
		loadingFlag = 1;
	
		var toggleElem = "#cppToggle" + event.data.workNum;  // open / close ボタン
		var jq_toggleElem = $(toggleElem);

		var btnAreaElem = "#c" + event.data.workNum + " .btn";
		var jq_btnAreaElem = $(btnAreaElem);
		jq_btnAreaElem.css("background-image", loadingRingSource);


		/* -------------------------------------------------------------
		*   クリエーターごとにスライドショーエリアを生成
		* ----------------------------------------------------------- */

		var cppWorkElem = "#cppWork" + event.data.workNum;                       // 各クリエーターのスライドショーエリア
		var jq_cppWorkElem = $(cppWorkElem);
		
		var cppWorkWrapperElem = "#cppWork" + event.data.workNum + " .wrapper";  // ラッパー
		
		var siLength = jsonData[event.data.workNum].si.length;  // 各クリエーターの作品の個数
		var maxh;  // 各クリエーターの作品中、高さの最大値

		// 画像キャッシュ監視用にダミーコンテナを生成
		var tempSource = "<div id='tempContainer'></div>";
		$(document.body).append(tempSource);

		// 作品の個数をカウントし、ラッパー内に作品を配置
		for (i = 0; i < siLength; i++) {
			var cppWorkContElem = "#cppWork" + event.data.workNum + "-" + String(i);  // 各作品の格納コンテナ
	
			var imgSource = jsonData[event.data.workNum].si[i];

			// ダミーコンテナに作品を配置
			$("#tempContainer").append("<img src='" + imgSource.src + "' alt='' width='" + imgSource.w + "' height='" + imgSource.h + "' />");

			// 作品の読み込み処理
			var workSource = "<div id='cppWork" + event.data.workNum + "-" + i + "' class='workContainer'>"
						   + "<img src='" + imgSource.src + "' alt='' width='" + imgSource.w + "' height='" + imgSource.h + "' />"
						   + "</div>";
			$(cppWorkWrapperElem).append(workSource);

			// 作品が1個以上のときは、最大となる高さを算出する
			if (i > 0) {
				var prevh = jsonData[event.data.workNum].si[i-1].h;
				if (imgSource.h - prevh < 0) {
					maxh = prevh;
				} else {
					maxh = imgSource.h;
				}

			}
			else {
				maxh = imgSource.h;
			}
		}
	
		// 各作品の格納用コンテナの高さを最大値に揃える
		for (i = 0; i < siLength; i++) {
			var cppWorkContElem = "#cppWork" + event.data.workNum + "-" + String(i);
			
			jq_cppWorkElem.css("height", maxh + "px");
			$(cppWorkContElem).css("height", maxh + "px");
		}

		// 作品が1個以上の時は切り替え用のボタンを生成
		if (siLength > 1) {
			for (i = 0; i < siLength; i++) {
				var digitSource = "<div id='cppDigit" + event.data.workNum + "-" + String(i) + "' class='workDigit small'>"
								+ String(i + 1);
								+ "</div>";
				jq_cppWorkElem.append(digitSource);
				
				var cppDigitElem = "#cppDigit" + event.data.workNum + "-" + String(i);
				$(cppDigitElem).css("left", 33 * i + "px");

				if (i == 0) {
					$(cppDigitElem).addClass("activeDigit");
					nowTargetArray[event.data.workNum] = cppDigitElem;
				} else {
					$(cppDigitElem).bind("click", { nextTarget: cppDigitElem, moveObj: cppWorkWrapperElem, posX: String(-680 * i), workNum: event.data.workNum }, slideWork);
				}
			}
		}		

		// ダミーコンテナへデータの読み込みが完了しキャッシュされたら、
		// スライドショーエリアをオープン。以降はアコーディオンのエフェクト処理のみとする。
		$("#tempContainer").onImagesLoad({
			selectorCallback: function() {
				// ダミーコンテナの削除
				$("#tempContainer").remove();

				// 前回開いたスライドショーエリアを閉じる
				if (jq_cppPrevWorkElem != undefined) {
					closePrevious();
				}

				$(cppWorkWrapperElem).css("width", 680 * (siLength + 1));
				jq_cppWorkElem.slideDown("slow", function() {
					jq_toggleElem.unbind("click", loadWorkImg);
					jq_toggleElem.bind("click", { workNum: event.data.workNum }, workToggle);	

					// 前回開いたスライドショーエリアとして保存
					jq_cppPrevWorkElem = jq_cppWorkElem;
					jq_prevToggleElem = jq_toggleElem;
					jq_prevBtnAreaElem = jq_btnAreaElem;
					
					jq_toggleElem.toggleClass("close");

					loadingFlag = 0;
					jq_btnAreaElem.css("background-image", "none");;
					jq_toggleElem.animate({ opacity: 1 }, "slow");
				});
			}
		});
	}

	return false;
}


// アコーディオンエフェクトの処理
function workToggle(event) {
	if (loadingFlag == 0) {
		loadingFlag = 1;

		var btnAreaElem = "#c" + event.data.workNum + " .btn";
		var jq_btnAreaElem = $(btnAreaElem);

		var toggleElem = "#cppToggle" + event.data.workNum;  // open / close ボタン
		var jq_toggleElem = $(toggleElem);
		if (jq_toggleElem.attr("class") == "altText") {
			jq_btnAreaElem.css("background-image", loadingRingSource);
		}
		jq_toggleElem.css("opacity", 0.3);

		var cppWorkElem = "#cppWork" + event.data.workNum;
		var jq_cppWorkElem = $(cppWorkElem);
		

		// 開く
		if (jq_toggleElem.attr("class").indexOf("close") < 0) {
			// 前回開いたスライドショーエリアを閉じる
			closePrevious();

			jq_cppWorkElem.slideDown("slow", function() {
				jq_toggleElem.addClass("close");
		
				// 前回開いたスライドショーエリアとして保存
				jq_cppPrevWorkElem = jq_cppWorkElem;
				jq_prevToggleElem = jq_toggleElem;
				jq_prevBtnAreaElem = jq_btnAreaElem;

				loadingFlag = 0;
				jq_btnAreaElem.css("background-image", "none");
				jq_toggleElem.animate({ opacity: 1 }, "slow");
			});
		}

		// 閉じる
		else {
			jq_cppWorkElem.slideUp("slow", function() {
				jq_toggleElem.removeClass("close");

				loadingFlag = 0;
				jq_btnAreaElem.css("background-image", "none");
				jq_toggleElem.animate({ opacity: 1 }, "slow");
			});
		}
	}
	
	return false;
}


// 前回開いたスライドショーエリアを閉じる
function closePrevious() {
	if (jq_prevToggleElem.attr("class").indexOf("close") >= 0) {
		jq_cppPrevWorkElem.slideUp("slow", function() {
			jq_prevToggleElem.css("opacity", 0.3);
			jq_prevToggleElem.removeClass("close");
			jq_prevBtnAreaElem.css("background-image", "none");
			jq_prevToggleElem.animate({ opacity: 1 }, "slow");
		});
	}
}

// スライドショーエリアのスライド処理
function slideWork(event) {
	if (loadingFlag == 0) {
		loadingFlag = 1;

		$(event.data.moveObj).animate({ left: event.data.posX + "px" }, "slow", function() {
			$(event.data.nextTarget).unbind().addClass("activeDigit");
			
			var nextPosX = nowTargetArray[event.data.workNum].split("-")[1];
			
			$(nowTargetArray[event.data.workNum]).bind("click", { nextTarget: nowTargetArray[event.data.workNum], moveObj: event.data.moveObj, posX: String(-680 * nextPosX), workNum: event.data.workNum }, slideWork).removeClass("activeDigit");
			nowTargetArray[event.data.workNum] = event.data.nextTarget;
			
			loadingFlag = 0;
		});
	}

	return false;
}


$(document).ready( function() {
	loadJSON();
});