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

var jsonData = new Array();  // JSONデータ
var jsonDataLength;          // JSONデータの個数, 対応するCookie名: c_jsonDataLength
var bgLength;                // セットの数, 対応するCookie名: c_bgLength
var bgName;                  // 名前
var bgSubName;               // サブタイトル
var bgProfImg;               // プロフィール画像のパス
var bgImg;                   // バックグラウンドイメージのパス
var bgUrl;                   // リンク先URL
var bgNote;　　　             // プロフィール

var rotArr = new Array();    // ランダムローテーション格納用配列, 対応するCookie名: c_rotArr;
var rotNum;                  // 現在のローテーションナンバー, 対応するCookie名: c_rotNum;

var loadingFlag = 0;         // ローディング監視フラグ
var loadingSource = "<img id='loading' src='/common/images/cpp/loading.gif' width='156' height='18' />";

var jq_refreshBtn;           // [別の作品を読み込む]ボタンのjQueryオブジェクト


/* =====================================================================
*    バックグラウンドイメージの適用処理
*
*    _Mode 0: ページ読み込み時
*          1: リフレッシュ時
*          2: JSONデータ読み込みエラー時
* =================================================================== */

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

function loadJSON() {
	// JSONデータの取得
	$.ajaxSetup({ cache: false });
	$.ajax({
		type: "GET",
		url: "/common/data/bgimages.json",
		dataType: "json",
		cache: false,
		success: function(data) {
			var jsonTemp = data;
			var dataLength = 0;  // データ長（文字数）
			
			for (i = 0; i < jsonTemp.length; i++) {
			    for (j = 0; j < jsonTemp[i].bi.length; j++) {
			    	var tempId = jsonTemp[i].id;
					var tempNa = jsonTemp[i].na;
					var tempSn = jsonTemp[i].sn;
					var tempPi = jsonTemp[i].pi;
					var tempBi = jsonTemp[i].bi[j];
					var tempU = jsonTemp[i].u;
					var tempN = jsonTemp[i].n;
					var tempPdf = jsonTemp[i].pdf;
			    	
			    	jsonData.push({
			    		"id": tempId,
			    		"na": tempNa,
			    		"sn": tempSn,
			    		"pi": tempPi,
			    		"bi": tempBi,
			    		"u": tempU,
			    		"n": tempN,
			    		"pdf": tempPdf
			    	});
			    	
			    	dataLength += String(tempId + tempNa + tempSn + tempPi + tempBi + tempU + tempN + tempPdf).length;
					delete tempId, tempNa, tempSn, tempPi, tempBi, tempU, tempN, tempPdf;
			    }
			}

			// 取得したJSONデータとCookieに保存されているデータ長が異なる場合リフレッシュ。
			if ($.cookie("c_jsonData") != dataLength) {
				$.cookie("c_jsonData", null);
				$.cookie("c_jsonData", dataLength, { expires: expiresDay, path: '/' });
		
				jsonDataLength = jsonData.length;
				$.cookie("c_jsonDataLength", jsonDataLength, { expires: expiresDay, path: '/' });
				
				randomRotation(jsonDataLength);
				$.cookie("c_rotArr", rotArr, { expires: expiresDay, path: '/' });
				
				rotNum = 0;
				$.cookie("c_rotNum", rotNum, { expires: expiresDay, path: '/' });
			}
			// 取得したJSONデータとCookieに保存されているデータが同じ場合はクッキーのデータを利用。
			else {
				jsonDataLength = $.cookie("c_jsonDataLength");
				rotArr = ($.cookie("c_rotArr")).split(",");
				rotNum = Number($.cookie("c_rotNum"));
			}
		
			applyRandomBG(rotArr[rotNum]);
		},
		error: function() {
			$.cookie("c_jsonData", null, { path: '/' });
			applyRandomBG(1, 2);
		}
	});
}


/* ---------------------------------------------------------------------
*    CPPエリアのリフレッシュ処理
* ------------------------------------------------------------------- */

function refreshBG() {
	if (loadingFlag == 0) { 
		$(".createrArea .refresh").append(loadingSource);
		
		if (rotArr[rotNum] != undefined || rotArr[rotNum] != null) {
			applyRandomBG(rotArr[rotNum], 1);
		} else {
			applyRandomBG(1, 2);
		}
	}
}


/* ---------------------------------------------------------------------
*    JSONデータの格納処理
* ------------------------------------------------------------------- */

function applyRandomBG(_Num, _Mode) {
	// ローディング監視フラグをローディング中に設定
	loadingFlag = 1;

	// 読み込み成功時
	if (_Mode != 2) {
		// JSONデータの個数分ローテーションした場合ローテーションナンバーを初期化
		if (rotNum == (jsonDataLength - 1)) {
		    rotNum = 0;
		    $.cookie("c_rotNum", 0, { expires: expiresDay, path: '/' });
	
		    // 新たなローテーション配列を作成
		    // ※最初の値が古い配列の最後の値と同値の場合配列を生成しなおす。
		    if ($.cookie("c_rotArr") != null) {
			    var oldRotArr = ($.cookie("c_rotArr")).split(",");
			    while (true) {
			    	randomRotation(jsonDataLength);
			    	if (rotArr[0] != oldRotArr[jsonDataLength - 1]) break;
			    }
			    $.cookie("c_rotArr", rotArr, { expires: expiresDay, path: '/' });
			} else {
			    randomRotation(jsonDataLength);
			}
		}
		// ローテーションナンバーを加算
		else {
		    rotNum = rotNum + 1;
		    $.cookie("c_rotNum", rotNum, { expires: expiresDay, path: '/' });
		}

		// 各変数にJSONデータの値を格納	
		bgName = jsonData[_Num].na;     // 名前
		bgSubName = jsonData[_Num].sn;  // サブタイトル
		bgProfImg = jsonData[_Num].pi;  // プロフィールイメージ
		
		// バックグラウンドイメージ（複数ある場合はランダム）
		bgImg = jsonData[_Num].bi;

		bgUrl = jsonData[_Num].u;       // プロフィールURL
		bgNote = jsonData[_Num].n;      // プロフィール
	}
	
	// 読み込み失敗時
	else {
		// 各変数にデフォルトの値を格納	
		bgName = "Dan Funderburgh";
		bgSubName = "ダン ファンダーボーグ";
		bgProfImg = [ "/common/images/cpp/tnImg04.jpg" ];
		bgImg = "/common/images/cpp/bg_wp041.jpg";
		bgUrl = "http://www.danfunderburgh.com/";
		bgNote = "ニューヨーク、ブルックリン在住の壁紙デザイナー、アーティスト。壁紙パターン、グラフィックプリント、インスタレーションと変化に富んだ作家活動は装飾芸術への愛情に溢れている。いくつかの作品はクーパー・ヒューイット・デザイン美術館、マイアミ近代美術館に所蔵されている。";
	}

	output(_Mode);
}


/* ---------------------------------------------------------------------
*    CPPエリアの書き出し処理
* ------------------------------------------------------------------- */

function output(_Mode) {
	// [別の作品を読み込む] ボタンを暗く
	jq_refreshBtn.animate({ opacity: 0.5 }, "fast");

	/* ---------------------------------------------------------------------
	*    プロフィールイメージ・名前・サブタイトルの書き出し
	* ------------------------------------------------------------------- */
	
	// プロフィールイメージ書き出し
	var bgProfImgSource = "<img src='" + bgProfImg + "' alt='" + bgName + "' width='140' height='80' />";
	var jq_bgProfImgBlock = $("#bgProfImgBlock");
	jq_bgProfImgBlock.css("display", "none");
	jq_bgProfImgBlock.html("");
	jq_bgProfImgBlock.append(bgProfImgSource);
	jq_bgProfImgBlock.fadeIn("slow");
	
	// 名前・サブタイトル書き出し
	var bgProfNameSource = "<strong>" + bgName + "</strong>";
	if (bgSubName != "") {
		if (bgUrl != "") {
			bgProfNameSource += " <a href='" + bgUrl + "' target='_blank' class='x-small'>"
			                 + bgSubName
			                 + "</a>";
		} else {
			bgProfNameSource += bgSubName;
		}
	}
	
	var jq_bgProfNameBlock = $("#bgProfNameBlock");
	jq_bgProfNameBlock.css("display", "none");
	jq_bgProfNameBlock.html("");
	jq_bgProfNameBlock.append(bgProfNameSource);
	jq_bgProfNameBlock.fadeIn("slow");

	// プロフィール書き出し
	var jq_bgProfNoteBlock = $("#bgProfNoteBlock");
	jq_bgProfNoteBlock.css("display", "none");
	jq_bgProfNoteBlock.html("");
	jq_bgProfNoteBlock.append(bgNote);
	jq_bgProfNoteBlock.fadeIn("slow", function() {
		$("#loading").remove();

		// ローディング監視フラグを戻す
		loadingFlag = 0;
		// [別の作品を読み込む] ボタンを明るく
		jq_refreshBtn.css("opacity", 1);
	});


	/* ---------------------------------------------------------------------
	*    バックグラウンドイメージの書き出し
	* ------------------------------------------------------------------- */

	var bgImgSource = "url(" + bgImg + ")";

	// 1: リフレッシュ時
	if (_Mode == 1) {
		// バックグラウンドイメージのキャッシュ用のダミーコンテナ追加
		var tempSource = "<div id='tempContainer'></div>";
		$(document.body).append(tempSource);
		var jq_tempContainer = $("#tempContainer"); 
		jq_tempContainer.append("<img src='" + bgImg + "' />");

		// キャッシュ完了時
		jq_tempContainer.onImagesLoad({
			selectorCallback: function() {
				// ダミーコンテナを削除
				jq_tempContainer.remove();

				// マスク追加
			    var maskSource = "<div id='bgmask'></div>";
			    $(document.body).append(maskSource);
			    var jq_bgmask = $("#bgmask");
			    var scrollTop = $(window).scrollTop();
			    jq_bgmask.css({ opacity: 0.5, top: scrollTop + "px" });

				// バックグラウンドイメージの適用
			    $(document.body).css("background-image", bgImgSource);
			    jq_bgmask.animate({ opacity: 0 }, "slow", function() {
			        jq_bgmask.remove();
			    });
			}
		});
	}

	// ページ読み込み時
	else {
		// バックグラウンドイメージの適用
		$(document.body).css("background-image", bgImgSource);
	}
}


$(document).ready( function() {
	jq_refreshBtn = $(".createrArea .refresh a");
	jq_refreshBtn.click(function () {
		refreshBG();
		return false;
	});

	$(".createrArea .refresh").append(loadingSource);
	loadJSON();
});


/* =====================================================================
*
*    ランダムローテーション生成メソッド
*
* =================================================================== */

function randomRotation(_Number) {
	// メイン配列
	var mainArray = new Array();
	
	// テンポラリ配列
	var temp1Array = new Array();
	var temp2Array = new Array();
	
	
	// 初期配列の配列数保存用変数
	var max_no_main;
	
	// ランダム数値保存用変数
	var random_no;
	
	// メインの配列に、必要な値を入れる。
	for (i=0; i < _Number; i++) {
		mainArray[i] = i;
	}
	
	for (i = 0 ; i < _Number ; i++) { 
		// メイン配列の要素がいくつまであるかをチェック
		max_no_main = mainArray.length;
		// ランダムの値を得る
		var random_no = Math.floor(Math.random() * max_no_main);
		
		rotArr[i] = mainArray[random_no];
		
		// ※ランダムで選ばれた要素を中心に配列の前と後ろに分割する
		// 前半（0からrandom_no-1まで）
		if (random_no == 0) {
			temp1Array = new Array();
		}
		else {
			// ランダムで0番でなければ
			temp1Array = mainArray.slice(0, random_no);
		}
		
		// 後半（random_no+1から最後まで）
		temp2Array = mainArray.slice(random_no+1);
		
		// 前後半の配列を結合し、メインとする
		mainArray = temp1Array.concat(temp2Array);
	}
	
	delete mainArray;
	delete temp1Array;
	delete temp2Array;
	delete max_no_main;
	delete random_no;
}
