﻿jQuery(function($){

function enablePosting(){
	$("#review-post").removeAttr("disabled");
}

function showMessage(message){
	alert(message);
}

function insertReview(){
	function clearForm(){
		//$("#r_title").val("");
		$("#r_comment").val("");
		$("input:radio.grade[value='5']").click().change();
		//$("div.review-table").hide();
	}
	
	function isValid(val, max){
		return val!=="" && val.length<=max;
	}
	
	var trimmer = /^[\s　]+|[\s　]+$/g;
	
	//var title = $("#r_title").val().replace(trimmer, "");
	var nickname = $("#r_nickname").val().replace(trimmer, "");
	var comment = $("#r_comment").val().replace(trimmer, "");
	
	var errors = [];
//	if(!isValid(title, 30)){
//		errors.push("タイトルを30文字以内で入力してください。");
//	}
	if(!isValid(nickname, 16)){
		errors.push("ニックネームを16文字以内で入力してください。");
	}
	if(!isValid(comment, 300)){
		errors.push("コメントを300文字以内で入力してください。");
	}
	if(errors.length>0){
		showMessage(errors.join("\n"));
		enablePosting();
		return;
	}
	
	if(!confirm("レビューを投稿しますか？")){
		enablePosting();
		return;
	}
	
	var grade = $("input:radio.grade:checked").val();
	
	$.ajax({
		type: "POST",
		url: reviewUrl,
		data: {
			method: "set",
			id: itemId,
			//title: title,
			nickname: nickname,
			grade: grade,
			comment: comment,
			key: key
		},
		cache: false,
		dataType: "xml",
		success: function(xml){
			if($("completed", xml).text()==="true"){
				$("input.review, textarea.review").val("");
				showMessage("投稿を受け付けました。\n反映までお時間をいただく場合がございます。\nあしからずご了承ください。");
				clearForm();
				showReviews();
			}else{
				showMessage("レビューの投稿に失敗しました。");
			}
		},
		error: function(){
			showMessage("レビューの投稿に失敗しました。");
		}
	});
}

function deleteReview(id){
	if(!confirm("レビューを削除しますか？")) return;
	
	$.ajax({
		type: "POST",
		url: reviewUrl,
		data: { method: "del", iid: itemId, rid: id, key: key },
		cache: false,
		dataType: "xml",
		success: function(xml){
			if($("completed", xml).text()==="true"){
				showMessage("削除を受け付けました。\n反映までお時間をいただく場合がございます。\nあしからずご了承ください。");
				showReviews();
			}else{
				showMessage("レビューの削除に失敗しました。");
			}
		},
		error: function(){
			showMessage("レビューの削除に失敗しました。");
		}
	});
}

var isLoading = false;

function showReviews(){
	function buildReviews(xml){
		var visibleItemsCount = 3;
		
		var $base = $("#review-base");
		var $prom = $("#review-promotion");
		var $root = $("reviewroot", xml);
		
		var $reviews = $root.children("reviews").children();
		if($reviews.length == 0){
			$base.empty().text("レビューはありません").append("<br/>");
			$prom.empty().text("");
			return;
		}
		
		var $headerTemplate = $("#review-header-template").children();
		var $promotionTemplate = $("#review-promotion-template").children();
		
		var $header = $headerTemplate.clone();
		$(".grade", $header).addClass("g"+$root.children("average").text().replace(".",""));
		$(".last", $header).text($reviews.length < visibleItemsCount ? $reviews.length : visibleItemsCount);
		$(".total", $header).text($reviews.length);
		$base.append($header);
		
		$header = $promotionTemplate.clone();
		$(".grade", $header).addClass("g"+$root.children("average").text().replace(".",""));
		$(".total", $header).text($reviews.length);
		$prom.append($header);
		
		var $itemTemplate = $("#review-item-template div.review-item");
		var count = 0;
		$reviews.each(function(){
			count++;
			var $t = $(this);
			
			var $item = $itemTemplate.clone();
			$(".review-grade", $item).addClass("g"+$t.find("grade").text()+"0");
			//$(".review-title", $item).text($t.find("title").text());
			$(".review-date", $item).text($t.find("date").text());
			$(".review-nickname", $item).text($t.find("nickname").text()+" さん");
			$.each($t.find("comment").text().split("\n"), function(){
				$(".review-comment", $item)
					.append(document.createTextNode(this)).append("<br/>");
			});
			
			if($t.attr("deletable")==="true"){
				$(".review-delete a", $item).click(function(){
					deleteReview($t.attr("id"));
					return false;
				});
			}else{
				$(".review-delete", $item).remove();
			}
			
			if(count > visibleItemsCount)
				$item.hide();
			
			$base.append($item);
		});
		
		if(count > visibleItemsCount)
			$("<a href=\"#\">すべてのレビューを表示</a>")
				.click(function(){
					$("#review-base .review-item").show();
					$(this).remove();
					return false;
				})
				.appendTo($base);
	
        jQuery('a[href*=#recommender]').click(function() {
            if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
                var $target = jQuery(this.hash);
                $target = $target.length && $target || jQuery('[name=' + this.hash.slice(1) +']');
                if ($target.length) {
	                var targetOffset = $target.offset().top;
	                jQuery('html,body').animate({ scrollTop: targetOffset }, 500);
	                return false;
                }
            }
        });
    
    }
	
	if(isLoading) return;
	isLoading = true;
	
	$("#review-base").empty()
		.append('<span id="review-loading">レビュー取得中…</span>');
	
	$.ajax({
		type: "POST",
		url: reviewUrl,
		data: { method: "get", id: itemId, key: key },
		cache: false,
		dataType: "xml",
		success: function(xml){
			buildReviews(xml);
		},
		error: function(){
			$("#review-base").empty().text("レビューを取得できませんでした。");
		},
		complete: function(){
			$("#review-loading").remove();
			enablePosting();
			isLoading = false;
		}
	});
}

var reviewUrl = $("#reviewurl").val();
var itemId = $("#itemid").val();
var key = $("#reviewkey").val();

$("#review-open").click(function(){
	$("div.review-table").toggle();
	return false;
});
$("#review-close").click(function(){
	$("div.review-table").hide();
	return false;
});
$("#review-post").click(function(){
	$(this).attr("disabled", "disabled");
	insertReview();
	return false;
});

showReviews();

});
