//===========================================================================================================================
//
// recommend.js
//
// 最終更新履歴	2007/10/22
// 作成者	二宮
//
// 2007/10/22	CaptureChildのイメージ読み込み部分を非同期に変更
// 2007/10/21	CaptureChildのsetImageメソッドにおいて、IE6以下のみ動作を変更
// 2007/10/01	ページリンクのサムネールに読み込む画像パスの変更
//
//===========================================================================================================================

var flash;
var maxPages		= 12;
var maxParagraphs	= 16;
var commonTitle		= "";
var templateType 	= 0;	//ページ表示時、一番上の段落のレイアウトを変更したい場合は、この初期化値を変更してください。
var sendFile		= "";
var getFile		= "";

var cId			= "";	//コラムID（グローバル化：無ければ空）
var pageId		= 0;	//ページID
var sectionId		= 0;	//段落ID

var enableFlag		= true;	//編集許可

var THUMBNAIL_IMAGE	= "/elements/image/sample-img_100-100.gif";	//サムネール
var SPACE_IMAGE		= "/elements/image/spacer.gif";			//スペース
var NO_IMAGE		= "/elements/image/noimage.gif";		//画像なし

var _eventSpd		= 100;

//=======================================================================================================================

window.onload = function() {
	//デフォルトのイメージを設定する（変数getFileを基に読み込む画像を変更する）
	Paragraph.setDefaultImage(getFile ? SPACE_IMAGE : NO_IMAGE);
	
	initPageLink();
	flash = new Flash("column", maxPages, maxParagraphs);
	flash.setVisible(false);
	flash.onCreated = function(page) {
		page.onCreated	= pageOnCreated;
		page.onSave	= pageOnSave;	//『保存』
		page.createParagraph(templateType ? templateType : Paragraph.TEMPLATE_LEFT);
		page.setEnable(enableFlag);
		
		update();
		
		var pageNum = flash.totalPages == 1 && flash.getPage(1).totalParagraphs == 1 ? 1 : flash.currentPage + 1;
		$('chapterChild_' + pageNum).active();
		
		if (!getFile && this.getVisible() == false) {
			this.setVisible(true);
		}
	}
	flash.createPage(1, commonTitle);
	flash.onCreated	= flashOnCreated;	//ページ作成時のイベントハンドラ
	flash.onLoaded = function() {
		setTimeout(function() {
			update();		//データを読み込んだらすぐに反映される様にしておく
			Paragraph.setDefaultImage(NO_IMAGE);
			$('chapterChild_1').active();
			flash.setVisible(true);
		}, _eventSpd);
	}
}

//=======================================================================================================================
/**
 * ページ作成時に実行されるイベントハンドラ
 *
 * @param page:Page 作成したページオブジェクト
 */
function flashOnCreated(page)
{
	page.onCreated	= pageOnCreated;
	page.onSave	= pageOnSave;	//『保存』
	page.createParagraph(templateType ? templateType : Paragraph.TEMPLATE_LEFT);
	page.setEnable(enableFlag);
	
	update();
	
	var pageNum = flash.totalPages == 1 && flash.getPage(1).totalParagraphs == 1 ? 1 : flash.currentPage + 1;
	$('chapterChild_' + pageNum).active();
	
	if (flash.existPage(flash.maxPages)
		&& $('createPageBtn'))
	{
		$('createPageBtn').disabled = "disabled";
	}
	
	flash.send({
		mode		: "pageadd",
		cid		: cId,
		pageid		: pageId,
		layoutflg	: templateType
	}, sendFile);
}

//=======================================================================================================================
/**
 * 段落作成時に実行されるイベントハンドラ
 * 各イベントハンドラに関数を代入している
 *
 * @param paragraph:Paragraph 作成した段落オブジェクト
 */
function pageOnCreated(paragraph) {
	paragraph.setImageResizeArea(90, 40, 610);
	
	var listenerObject = {
		onEdit	: paragraphOnEdit,
		onSave	: paragraphOnSave,
		onResize: paragraphOnImageResize
	}
	paragraph.addListener(listenerObject);
}

//=======================================================================================================================
/**
 * タイトルの『保存』を押された際に実行するイベントハンドラ
 */
function pageOnSave() {
	update();
	
	//ページタイトルを更新
	flash.send({
		mode		: "pagetitle",
		cid		: cId,
		pageid		: pageId,
		pagetitle	: this.getTitle()
	}, sendFile);
}

//=======================================================================================================================
/**
 * 段落のイメージ編集ボタンを押した際実行されるイベントハンドラ
 */
function paragraphOnEdit() {
	showPopEditor('uploader');
	
	//セクションID
	sectionId = this.parentNode.getParagraphNum(this);
	
	var imgData = this.getImageData();
	var defaultImage = Paragraph.getDefaultImage();
	var defaultFileName = defaultImage.src.substring(
		defaultImage.src.lastIndexOf('/') + 1);
	
	document.pict.src = imgData.src.indexOf(defaultFileName) != -1
		? THUMBNAIL_IMAGE : imgData.src;
}

//=======================================================================================================================
/**
 * 段落を保存した際に実行するイベントハンドラ
 */
function paragraphOnSave() {
	update();
	sectionId = this.parentNode.getParagraphNum(this);
	
	//段落本文更新
	flash.send({
		mode		: "section",
		cid		: cId,
		pageid		: pageId,
		secid		: sectionId,
		section		: this.getContent(),
		layoutflg	: this.getTemplateType()
	}, sendFile);
}

//=======================================================================================================================
/**
 * イメージリサイズに実行されるイベントハンドラ
 */
function paragraphOnImageResize()
{
	var paragraph = this.parentNode.parentNode;
	
	//セクションID
	sectionId = paragraph.parentNode.getParagraphNum(paragraph);
	
	//リサイズ後にデータを送信
	var imgDatas = paragraph.getImageData();
	
	flash.send({
		mode		: "resizeimage",
		cid		: cId,
		pageid		: pageId,
		secid		: sectionId,
		imgwidth	: imgDatas.width,
		imgheight	: imgDatas.height
	}, sendFile);
}

//=======================================================================================================================

function onLoaded(xhr) {
	flash.load(xhr.responseXML);
}

//=======================================================================================================================
/**
 * ページリンクの初期化
 */
function initPageLink() {
	for(var i = 0; i < maxPages; i++)
	{
		var num = i + 1;
		var chapterChild = new ChapterChild('chapterChild_' + num);
		chapterChild.style.display = "none";
		$("chapter").appendChild(chapterChild);
	}
}

//=======================================================================================================================
/**
 * レイアウト選択時のアクション
 */
var moveId = "";
function selectTemplateType()
{
	var oj = document.selectTemplate.RadioGroup1;
	for(var i = 0; i < oj.length; i++) {
		if (oj[i].checked) {
			templateType = oj[i].value;
			switch(moveId) {
				case 'page':
					flash.createPage(flash.currentPage + 1, commonTitle);
					location.href = location.pathname + location.search + "#columnTop";
					break;
					
				case 'paragraph':
					createParagraph(oj[i].value);
					break;
					
				default:
					$("page_1_paragraph_1").setTemplateType(oj[i].value);
					break;
			}
			
			showPopEditor('template-select');
			break;
		}
	}
}

//=======================================================================================================================
/**
 * イメージをアップロードする
 */
function imageUpload() {
//	if (document.main_form.imgFile.value)
	if (document.main_form.imgFile.value.search(/.jpg|.jpeg|.gif|.png|.flv|.3g2|.3gp|.aac|.aiff|.amr|.asf|.avi|.mov|.mp4|.m4a|.mj2|.mp2|.mp3|.mp4|.mpg|.mpeg|.psp|.rm|.swf|.vob|.wav/i) != -1)
	{
		document.main_form.action = sendFile;	//送り先
		document.main_form.target = "hif";
		
		if (document.main_form.mode != undefined) {
			document.main_form.mode.value = "addimage";
		}
		
		//手帳ID
		document.main_form.cId = new Element(document.main_form.id + "_cId", "input");
		document.main_form.cId.type = "hidden";
		document.main_form.cId.name = "cid";
		document.main_form.cId.value = cId;
		document.main_form.appendChild(document.main_form.cId);
		
		//ページID
		document.main_form.pageId = new Element(document.main_form.id + "_pageId", "input");
		document.main_form.pageId.type = "hidden";
		document.main_form.pageId.name = "pageid";
		document.main_form.pageId.value = pageId;
		document.main_form.appendChild(document.main_form.pageId);
		
		//段落ID
		document.main_form.secId = new Element(document.main_form.id + "_secId", "input");
		document.main_form.secId.type = "hidden";
		document.main_form.secId.name = "secid";
		document.main_form.secId.value = sectionId;
		document.main_form.appendChild(document.main_form.secId);
		
		//テンプレートタイプ
		document.main_form.layoutflg = new Element(document.main_form.id + "_layoutflg", "input");
		document.main_form.layoutflg.type = "hidden";
		document.main_form.layoutflg.name = "layoutflg";
		document.main_form.layoutflg.value = $(flash.getPage(flash.currentPage).id + "_paragraph_" + sectionId).getTemplateType();
		document.main_form.appendChild(document.main_form.layoutflg);
		
		document.main_form.submit();
		showPopEditor("uploader");
		
		//データ送信後の後処理
		if (document.main_form.move != undefined) {
			document.main_form.mode.value = "";
		}
		document.main_form.action = "";
		document.main_form.target = "";
		
		document.main_form.removeChild(document.main_form.cId);
		document.main_form.removeChild(document.main_form.pageId);
		document.main_form.removeChild(document.main_form.secId);
	}
}

//=======================================================================================================================
/**
 * イメージを削除する
 */
function deleteImage() {
	var defaultImage = Paragraph.getDefaultImage();
	if (document.pict.src != defaultImage.src) {
		document.pict.src = THUMBNAIL_IMAGE;
		$("page_" + pageId + "_paragraph_" + sectionId).loadImage(defaultImage.src,
			defaultImage.width, defaultImage.height);
		
		flash.send({
			mode	: "delimage",
			cid	: cId,
			pageid	: pageId,
			secid	: sectionId
		}, sendFile);
		
		showPopEditor("uploader");
		update();
	}
}

//=======================================================================================================================
/**
 * 段落を作成する
 *
 * @param templateType:Number テンプレートタイプ（０＝画像左側、１＝画像右側、２＝画像なし）
 */
function createParagraph(templateType) {
	var tmp = flash.getPage(flash.currentPage);
	tmp.createParagraph(templateType);
	
	//段落数の保存
	sectionId = flash.getPage(flash.currentPage).totalParagraphs;
	
	if (tmp.maxParagraphs <= tmp.totalParagraphs
		&& $('createParagraphBtn'))
	{
		$('createParagraphBtn').disabled = "disabled";
	}
}

//=======================================================================================================================
/**
 * ページを削除する
 */
function deletePage()
{
	flash.send({
		mode	: "pagedel",
		cid	: cId,
		pageid	: pageId
	}, sendFile);
	
	if (!flash.existPage(flash.currentPage + 1))
	{
		if (flash.currentPage == 1) {
			flash.deletePage(flash.currentPage);
			flash.createPage(flash.currentPage, commonTitle);
		} else {
			var chapterChild = $('chapterChild_' + (flash.currentPage - 1));
			if (chapterChild) {
				chapterChild.active();
			}
			flash.deletePage(flash.currentPage + 1);
		}
		
		update();
	} else {
		flash.deletePage(flash.currentPage);
		update();
		
		var chapterChild = $('chapterChild_' + flash.currentPage);
		if (chapterChild) {
			chapterChild.active();
		}
	}
	
	if ($('createPageBtn')
		  && $('createPageBtn').disabled)
	{
		$('createPageBtn').disabled = "";
	}
}

//=======================================================================================================================
/**
 * 現在アクティブになっているページを次に移動させる
 */
function gotoNextPage() {
	var beforeId	= flash.currentPage;
	var afterId	= flash.currentPage + 1;
	
	if (flash.gotoNextPage(flash.currentPage)) {
		update();
		
		var chapterChild = $('chapterChild_' + (flash.currentPage + 1));
		chapterChild.active();
		
		flash.send({
			mode		: "pagemove",
			cid		: cId,
			beforeid	: beforeId,
			afterid		: afterId
		}, sendFile);
	}
}

//=======================================================================================================================
/**
 * 現在アクティブになっているページを前に移動させる
 */
function gotoPrevPage() {
	var beforeId	= flash.currentPage;
	var afterId	= flash.currentPage - 1;
	
	if (flash.gotoPrevPage(flash.currentPage)) {
		update();
		
		var chapterChild = $('chapterChild_' + (flash.currentPage - 1));
		chapterChild.active();
		
		flash.send({
			mode		: "pagemove",
			cid		: cId,
			beforeid	: beforeId,
			afterid		: afterId
		}, sendFile);
	}
}

//=======================================================================================================================
/**
 * 内容の更新
 */
function update() {
	var defaultImage = Paragraph.getDefaultImage();
	for(var i = 0; i < maxPages; i++)
	{
		var num		 = i + 1;
		var chapterChild = $('chapterChild_' + num);
		var page         = flash.getPage(num);
		if (page) {
			var paragraph = page.getParagraph(1);
			var content = page.getTitle();
			content = (11 < content.length) ? content.substring(0, 11) + "..." : !content ? "無題" : content;
			chapterChild.setContent(replaceTag(content));	//タイトル部分にはタグを使用できないようにする
			chapterChild.style.display = "";
			
			var defaultSrc = defaultImage.src.substring(defaultImage.src.lastIndexOf('/') + 1);
			for(var j = 0; j < page.totalParagraphs; j++)
			{
				var p = page.getParagraph(j + 1);
				var src = p.getImageData().src;
				var isMovie = p.reference.indexOf('.flv') != -1;
				
				if (src.indexOf(defaultSrc) == -1 && !isMovie)
				{
					chapterChild.setImage(src);
					break;
				}
				//動画での場合の処理
				else if (isMovie)
				{
					capture = p.reference.substring(0, p.reference.indexOf(".flv")) + "_page.jpg";
					setFLVCaptureImage(chapterChild.id, capture);
					break;
				}
				//最後までサムネールで使用できる画像が無い場合
				else if ((j + 1) == page.totalParagraphs)
				{
					chapterChild.setImage(paragraph.getImageData().src);
				}
			}
		} else {
			chapterChild.style.display = "none";
		}
	}
}

//=======================================================================================================================
/**
 * 指定したエレメントにイメージを読み込ませる
 * iframeに書き出されたurlを基に画像パスを変更する
 */
var _tmpImage = [];	//大きさ割り出し用イメージ
var _timerSpd = 200;
var _timerId  = [];
function setImage() {
	var url = hif.document.body.innerHTML;
	
	if (flash != undefined && url) {
		var search = url.substring(url.indexOf('?') + 1);
		var datas  = search.split('&');
		var pageId = datas[0].split('=')[1];
		var secId  = datas[1].split('=')[1];
		var element = $(flash.getPage(pageId).id + "_paragraph_" + secId);
		
		if (element)
		{
			if (url.indexOf('.flv') != -1) {
				element.loadMovie(url);
				update();
			} else {
				var id = element.id;
				
				_tmpImage[id] = new Image();
				_tmpImage[id].onload = function() {
					clearTimeout(_timerId[id]);
					element.loadImage(this.src, this.width, this.height);
					update();
				}
				_timerId[id] = setTimeout("checkParagraphImage('" + id + "')", _timerSpd);
				_tmpImage[id].src = url;
			}
		}
	}
}

//=======================================================================================================================
/**
 * 選択されたイメージをチェックする
 */
var _tmpFLVImage = [];
var _timerId2    = [];
function setFLVCaptureImage(cId, src) {
	_tmpFLVImage[cId] = new Image();
	_tmpFLVImage[cId].onload = function() {
		clearTimeout(_timerId2[cId]);
		$(cId).setImage(this.src);
	}
	
	_timerId2[cId] = setTimeout("_checkFLVCaptureImage('" + cId + "')", _timerSpd);
	_tmpFLVImage[cId].src = src;
}

function _checkFLVCaptureImage(cId) {
	clearTimeout(_timerId2[cId]);
	_tmpFLVImage[cId].src = Paragraph.FLV_UPLOAD_IMAGE;
}

//=======================================================================================================================
/**
 * チャプターの子要素
 *
 * @param id:String id名
 */
function ChapterChild(id)
{
	var element		= new Element(id, 'li');
	element.className	= ChapterChild.CLASSNAME;
	
	element._num		= ++ChapterChild.totalNum;
	element._content	= new Element(id + "_content", 'p');
	element._url		= "";
	
	element.add(element._content);
	
	element._content._a = new Element(id + "_content_a", 'a');
	element._content._a.href = "javascript: void(0)";
	element._content._a.onclick = function() {
		element.active();
		location.href = location.pathname + location.search + "#columnTop";
	}
	element._content.add(element._content._a);
	
	element._image		= new Element(id + "_image", 'p');
	element._image.className = "image";
	element.add(element._image);
	
	element._image._a = new Element(id + "_content_a", 'a');
	element._image._a.href = "javascript: void(0)";
	element._image._a.onclick = function() {
		element.active();
		location.href = location.pathname + location.search + "#columnTop";
	}
	element._image.add(element._image._a);
	
	element._image._a._img = new Image();
	//element._image._a._img.src = "";
	element._image._a._img.alt = "";
	element._image._a.add(element._image._a._img);
	
	element._pageNum	= new Element(id + "_pageNum", 'p');
	element._pageNum.className = "page-number";
	element._pageNum.innerHTML = "page" + (element._num);
	element.add(element._pageNum);
	
	//非同期通信用===========================================================================================================
	
	/**
	 * イメージが存在しているか非同期通信して調べる
	 *
	 * @param data		:Array
	 * @param method	:String
	 * @param fileName	:String
	 * @param async		:Boolean
	 * @param id		:String
	 */
	element.existImageFile = function(data, method, fileName, async, id)
	{
		//XMLHttpRequestオブジェクト生成
		var xhr = createXHR();
		
		//open メソッド
		xhr.open(method, fileName, async);
		
		//受信時に起動するイベント
		xhr.onreadystatechange = function()
		{
			// readyState = 4 で受信完了, (HTTP)status = 200 OK
			if (xhr.readyState == 4 && xhr.status == 200) {
				element.onLoaded(xhr, id);
			}
		}
		//
		
		// HTTP header
		xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded; charset=UTF-8");
		
		// 送信データ
		var senddata = "";
		for (var key in data) {
			if (senddata != "") {
				senddata += "&";
			}
			senddata += key + "=" + encodeURIComponent(data[key]);
		}
		
		// send メソッド
		xhr.send(senddata);
	}
	
	//メソッド===============================================================================================================
	
	/**
	 * 内容を表示する
	 *
	 * @param content:String 内容
	 */
	element.setContent = function(content) {
		this._content._a.innerHTML = content;
	}
	
	/**
	 * ページを選択する
	 */
	element.active = function() {
		ChapterChild.currentChild.className = "";
		this.className = "highlight";
		ChapterChild.currentChild = this;
		
		flash.changeDisplayPage(this._num);
		
		//段落作成ボタン
		var page = flash.getPage(this._num);
		var createParagraphBtn = $('createParagraphBtn');
		if (createParagraphBtn) {
			if (page.totalParagraphs < page.maxParagraphs
				&& createParagraphBtn.disabled)
			{
				createParagraphBtn.disabled = "";
			}
			else if (page.totalParagraphs == page.maxParagraphs
				&& !createParagraphBtn.disabled)
			{
				createParagraphBtn.disabled = "disabled";
			}
		}
		
		//現在のページと段落数の保存
		pageId = flash.currentPage;
		sectionId = flash.getPage(flash.currentPage).totalParagraphs;
	}
	
	/**
	 * サムネールのイメージを指定する
	 *
	 * @param url:String 画像パス
	 */
	element.setImage = function(url)
	{
		this._url = url;
		
		var sendData = [];
		sendData['mode'] = "view";
		sendData['imagename'] = url;
		this.existImageFile(sendData, "post", "/cl/asynchronous/getColumn.php", true);
	}
	
	/**
	 * イメージの読み込み
	 *
	 * @param url:String 画像パス
	 */
	function _setImage(url)
	{
		var img = element._image._a._img;
		img.src = url;
		img.width = ChapterChild.WIDTH;
		img.height = ChapterChild.HEIGHT;
	}
	
	/**
	 * 非同期通信により、サーバーから返信があれば実行されるイベントハンドラ
	 */
	element.onLoaded = function(xhr, id)
	{
		var src = "";
		switch(xhr.responseText)
		{
			case "0":	//_pageイメージがなく、元イメージがある場合
				src = this._url;
				break;
			
			case "1":	//_pageイメージがある場合
				var delimiter = this._url.lastIndexOf('.');
				var capture = this._url.substring(0, delimiter) + "_page" + this._url.substring(delimiter);
				src = capture;
				break;
		}
		
		_setImage(src);
	}
	
	//=======================================================================================================================
	
	return element;
}

//=======================================================================================================================
/**
 * 選択されたイメージをチェックする
 * 一定回数読み込みに失敗すると、設定してあるデフォルトの画像を読み込む
 *
 * @param id:String id名
 */

var _checkMax = 10;
var _checkNum = [];

function checkParagraphImage(id) {
	clearTimeout(_timerId);
	
	if (_checkNum[id] == undefined) {
		_checkNum[id] = 0;
	}
	
	if (_checkMax < _checkNum[id]) {
		var defaultImage = Paragraph.getDefaultImage();
		_tmpImage[id].src = defaultImage.src;
		delete _checkNum[id];
		delete _timerId[id];
	} else {
		_timerId[id] = setTimeout("checkParagraphImage('" + $(id).id + "')", _timerSpd);
		_checkNum[id]++;
	}
}

ChapterChild.CLASSNAME = "ChapterChild";
ChapterChild.WIDTH = 87;
ChapterChild.HEIGHT = 65;
ChapterChild.currentChild = "";
ChapterChild.totalNum = 0;