var DELIMITER = "-----delimiter-----";
var LINE_DELIMITER = "-----line.delimiter-----";

var CONTENT_BASE	= "http://www.opendunga.net/";

var richTextInputField;

(function($)
{

	initRichTextInputField()
	
	initHoverComponent(null);
	initTooltipComponent(null);
	
	initMemberPopup();
	
	initTimestampInputField();
	
	initMultiSelector();
	initTextComboBoxInputFielld();
	initPublicizeCheckField();
	
	initAjaxForm();
	
	
	initTagComponent();
	initTagForm();
	
	initAttachmentForm();
	
	initTypeCombinedMultiInputField();
	
	showGlobalMessage();
	
	
})(jQuery);

function initTimestampInputField()
{
	jQuery(".TimestampInputField").each(
			function() {
				var $dateInput = jQuery(this);
				$dateInput.click(
					function() {
						var left = $dateInput.position().left;
						var top = $dateInput.position().top + $dateInput.height() + 10;
						var $datePicker = jQuery("<div class=\"DateTimePicker\"></div>").appendTo(jQuery("BODY"));
						resetDatePicker($dateInput, $datePicker);
						$datePicker.css({top:top+"px", left:left+"px"});
						
						$datePicker.fadeIn(300);
					}
				);
			}
		);
}

function initRichTextInputField()
{
	jQuery(".RichTextInputField").each(function()
	{
		var inputValue = jQuery(this).val();
		
		jQuery(this).val(inputValue.replace(/<<(\d+)>>/ig,
			function(str, p1, p2) {
				var id = arguments[1];
				var iconSuffix = (id % 5) + 1;
				return "<img src=\"" + CONTENT_BASE + "./style/img/attachment" + iconSuffix + ".png\" attachmentID=\"" + id + "\" />";
	    	}
		));
	});
	
	
	jQuery('.RichTextInputField').htmlarea({
		toolbar:[
			["forecolor", "bold", "italic", "underline", "strikethrough", "|",
			"subscript", "superscript", "|",
			"increasefontsize", "decreasefontsize", "|",
			"orderedlist", "unorderedlist", "|",
			"indent", "outdent", "|",
			"justifyleft", "justifycenter", "justifyright", "|",
			"link", "unlink", "horizontalrule", "|",
			"h1", "h2", "h3", "|",
			"cut", "copy", "paste", "|",
			"html"]
    	],
    	css : CONTENT_BASE + "./style/main.css",
    	loaded: function() {
			richTextInputField = {jhtmlareaobject : this};
		}
	});
}

var memberPopupOpenTimer;
var memberPopupCloseTimer;
var $memberPopupOpener;
var popupMemberID;
function initMemberPopup()
{
	jQuery(".MemberDispNameAnchor").mouseover(function() {
		$memberPopupOpener = jQuery(this);
		popupMemberID = jQuery(this).attr("memberID");
		clearTimeout(memberPopupOpenTimer);
		memberPopupOpenTimer = setTimeout("createMemberPopup()", 600);
	});
	
	jQuery(".MemberDispNameAnchor").mouseout(function() {
		memberPopupCloseTimer = setTimeout("hideMemberPopup()", 500);
	});

}

function createMemberPopup()
{
	clearTimeout(memberPopupOpenTimer);
	
	var memberID = popupMemberID;
	
	var $popupComponent = jQuery("BODY").children("#PopupComponent");
	$popupComponent.css("position", "absolute");
	var $popupContent = $popupComponent.find("#PopupContent");
	if ($popupComponent.length == 0) {
		$popupComponent = jQuery("<div id=\"PopupComponent\"></div>").appendTo(jQuery("BODY"));
		$popupContent = jQuery("<div id=\"PopupContent\"></div>").appendTo($popupComponent);
	}
	$popupContent.html("");
	
	jQuery.get(
		"./member/members/detail/" + memberID,
		function(data)
		{
			$popupComponent.width(400);
			$popupComponent.height(400);
			var $memberPopupContent = jQuery(data).appendTo($popupContent);
			
			var posLeft = $memberPopupOpener.offset().left + 40;
			var posTop = $memberPopupOpener.offset().top + $memberPopupOpener.height() + 10;
			if (posLeft + 400 > jQuery("BODY").innerWidth()) {
				posLeft = $memberPopupOpener.offset().left + $memberPopupOpener.width() - 400;
			}
			
			$popupComponent.css("left", posLeft);
			$popupComponent.css("top", posTop);
			$popupComponent.fadeIn(200);
			
			$memberPopupContent.mousemove(function() {
				clearTimeout(memberPopupCloseTimer);
			});
			$memberPopupContent.mouseout(function() {
				memberPopupCloseTimer = setTimeout("hideMemberPopup()", 500);
			});
		}
	);
}
function hideMemberPopup()
{
	clearTimeout(memberPopupCloseTimer);
	
	var $popupComponent = jQuery("BODY").children("#PopupComponent");
	var $popupContent = $popupComponent.find("#PopupContent");
	
	$popupComponent.fadeOut(200, function(){$popupComponent.hide()});
}

function initHoverComponent($target)
{
	var $hoverComponent;
	if ($target == null) {
		$hoverComponent = jQuery(".HoverComponent");
	} else {
		$hoverComponent = $target.find(".HoverComponent");
	}
	
	$hoverComponent.each(function()
	{
		var $hoverComponent = jQuery(this);
		$hoverComponent.parent().hover(
			function()
			{
				$hoverComponent.css("visibility", "visible");
			},
			function()
			{
				$hoverComponent.css("visibility", "hidden");
			}
		);
	});
}

function initTooltipComponent($target)
{
	var $tooltipComponent;
	if ($target == null) {
		$tooltipComponent = jQuery(".TooltipComponent");
	} else {
		$tooltipComponent = $target.find(".TooltipComponent");
	}
	
	$tooltipComponent.each(function()
	{
		var $component = jQuery(this);
		var $parentComponent = $component.parent();
		$parentComponent.hover(
			function()
			{
				var posLeft = $parentComponent.offset().left + $parentComponent.width()/2;
				var posTop = $parentComponent.offset().top + $parentComponent.height() + 10;
				
				$component.css("left", posLeft);
				$component.css("top", posTop);
				$component.show();
			},
			function()
			{
				$component.hide();
			}
		);
	});
}



function initTagComponent()
{
	jQuery(".TagComponent .TagAdd").each(function()
	{
		jQuery(this).click(function()
		{
			jQuery(this).children(".TagAddField").show();
			jQuery(this).children(".TagAddField").children(":text").focus();
		});
	});
}

function initPublicizeCheckField()
{
	jQuery(".DataPublicizeCheckField").each(function()
	{
		jQuery(this).click(function()
		{
			if (jQuery(this).attr("checked")) {
				alert("現在編集中のデータを外部ページへ公開します。\n　・メンバーのプライバシーに繋がる情報が含まれていないか\n" +
						"　・外部公開するに相応しい文章か\nの再確認よろしくです。");
			}
		});
	});
}


function initMultiSelector()
{
	jQuery(".MultiSelector").each(function()
	{
		var $selector = jQuery(this);
		setSelectionValue();
		
		if (jQuery(this).attr("selectionDisabled") != 'true') {
			jQuery(this).children("DIV").click(
				function()
				{
					if ($selector.attr("multipleSelect") != "true") {
						jQuery(this).prevAll().attr("selected", "false");
						jQuery(this).prevAll().removeClass("selected");
						
						jQuery(this).nextAll().attr("selected", "false");
						jQuery(this).nextAll().removeClass("selected");
					}
					
					if (jQuery(this).attr("selected") == 'true') {
						jQuery(this).attr("selected", 'false');
					} else {
						jQuery(this).attr("selected", 'true');
					}
						
					jQuery(this).toggleClass("selected");
					
					setSelectionValue();
				}
			);
		} else {
			jQuery("DIV", this).each(function()
			{
				jQuery(this).css({'cursor' : "auto"});
			});	
		}
		
		function setSelectionValue()
		{
			var value = "";
			$selector.children("DIV").each(function()
			{
				if (jQuery(this).attr("selected") == 'true') {
					value += jQuery(this).attr("key");
					value += ",";
				}
			});
			$selector.children(":hidden").val(value);
		}

	});
}

var hideSelectorTimer;
var isHideSelector = false;
var $comboBoxSelector;
function initTextComboBoxInputFielld()
{
	jQuery(".ComboboxInput").each(function()
	{
		var $inputField = jQuery(this);
		var $selector = jQuery(this).nextAll(".ComboboxSelector:first");
		
		jQuery(this).focus(function()
		{
			isHideSelector = false;
			var top = jQuery(this).offset().top + jQuery(this).height() + 4;
			var left = jQuery(this).offset().left;
			var width = jQuery(this).width();
			$selector.css("top", top);
			$selector.css("left", left);
			$selector.find("SELECT").width(width);
			$selector.show(200);
			
		});
		
		jQuery(this).blur(function()
		{
			isHideSelector = true;
			$comboBoxSelector = $selector;
			hideSelectorTime = setTimeout("hideComboBoxSelector()", 500);
		});
		
		$selector.find("SELECT").blur(function()
		{
			isHideSelector = true;
			$comboBoxSelector = $selector;
			hideSelectorTime = setTimeout("hideComboBoxSelector()", 500);
		});
				
		$selector.find("SELECT").focus(function()
		{
			isHideSelector = false;
		});
		
		$selector.find("SELECT").change(function()
		{
			$inputField.val(jQuery(this).find('OPTION:selected').val());
			isHideSelector = true;
			$comboBoxSelector = $selector;
			hideComboBoxSelector();
		});
		
	});
}

function hideComboBoxSelector()
{
	clearTimeout(hideSelectorTime);
	if (isHideSelector) {
		$comboBoxSelector.hide(200);
	}
}


function initTypeCombinedMultiInputField()
{
	jQuery(".TypeCombinedInput").each(function()
	{
		var $newItemArea = jQuery(this).children(".TypeCombinedNewItem");
		var $itemList = jQuery(this).children(".TypeCombinedItemList");
		var $field = jQuery(this).children(":hidden");
		
		$field.val("");
		refreshTypeCombinedMultiInputField();

		$newItemArea.find(".InputValueField").keydown(function(e){
			if(e.keyCode=='13'){
				$newItemArea.find(".AddButton").click();
				return false;
			}
		});
		$newItemArea.find(".DescriptionField").keydown(function(e){
			if(e.keyCode=='13'){
				$newItemArea.find(".AddButton").click();
				return false;
			}
		});
				

		$newItemArea.find(".AddButton").click(function()
		{
			
			
			var typeValue = $newItemArea.children(".TypeField").children("option:selected").val();
			var typeDispName = $newItemArea.children(".TypeField").children("option:selected").text();
			var description = $newItemArea.children(".DescriptionField").val();
			var inputValue = $newItemArea.children(".InputValueField").val();
		
			if (inputValue != "") {
				var newHTML = "";
				newHTML += "<div class=\"Item\">";
				newHTML += "<div class=\"ItemContent\">";
				newHTML += typeDispName;
				newHTML += " ";
				newHTML += inputValue;
				newHTML += " (";
				newHTML += description;
				newHTML += ")";
				newHTML += "</div>";
				newHTML += "<div class=\"HoverAction HoverComponent\"><span class=\"Delete Anchor\">削除</span></div>";
				newHTML += "</div>";
				
				var $newItem = jQuery(newHTML).appendTo($itemList);
				$newItem.attr("type", typeValue);
				$newItem.attr("description", description);
				$newItem.attr("input_value", inputValue);
				
				initHoverComponent($newItem);
				
				refreshTypeCombinedMultiInputField();
				
				$newItem.find(".Delete").click(function()
				{
					itemDeleteEvent($newItem);
				});

				
				$newItemArea.children(":text").val("");
			}
			
		});
		
		$itemList.children(".Item").each(function()
		{
			var $item = jQuery(this);
			$item.find(".Delete").click(function()
			{
				itemDeleteEvent($item);
			});
		});
		
		function itemDeleteEvent($item)
		{
			$item.remove();
			refreshTypeCombinedMultiInputField();
		}
			
		
		function refreshTypeCombinedMultiInputField()
		{
			var fieldValue = "";
			
			$itemList.children(".Item").each(function()
			{
				fieldValue += jQuery(this).attr("type");
				fieldValue += DELIMITER;
				fieldValue += jQuery(this).attr("description");
				fieldValue += DELIMITER;
				fieldValue += jQuery(this).attr("input_value");
				fieldValue += LINE_DELIMITER;
			});
			
			$field.val(fieldValue);
		}
	});
}

function initAjaxForm()
{
	jQuery(".AjaxForm").each(function() {
		var $targetForm = jQuery(this);

		var options = {
				url:		"" + $targetForm.attr("action"),
				beforeSubmit: beforeAjaxFormSubmit,
				success:	showAjaxPostResponse
			};
		if ($targetForm.children("#AjaxFormField").size() > 0) {
		} else {
			jQuery("<input id=\"AjaxFormField\" type=\"hidden\" name=\"ajax.form\" value=\"true\" />").appendTo($targetForm);
		}

		$targetForm.ajaxForm(options);
		
	});
}

function beforeAjaxFormSubmit(arr, $form, options)
{ 
	showModalDialog(jQuery("<div style=\"width:200px;height:200px;background-color:white;\"><img src=\"" + CONTENT_BASE + "./style/img/loading.gif\" /></div>"));
}

function showAjaxPostResponse(responseText, statusText, xhr, $targetForm)
{
	closeModalDialog();
	try {
		var formResponse = eval("(" + responseText + ")");
		if (formResponse.succeeded) {
			location.href = formResponse.href;
		} else {
			alert(formResponse.message);
		}
	} catch (e) {
		alert("予期せぬエラーが発生しました");
	}
}


function initTagForm()
{
	var $targetForm = jQuery(".TagForm");
	var options = {
			url:		"" + $targetForm.attr("action"),
			success:	showAjaxTagPostResponse
		};
	if ($targetForm.children("#AjaxFormField").size() > 0) {
	} else {
		jQuery("<input id=\"AjaxFormField\" type=\"hidden\" name=\"ajax.form\" value=\"true\" />").appendTo($targetForm);
	}

	$targetForm.ajaxForm(options);
}

function showAjaxTagPostResponse(responseText, statusText, xhr, $targetForm)
{
	var formResponse = eval("(" + responseText + ")");
	if (formResponse.succeeded) {
		var $newTagItem = jQuery(formResponse.html).appendTo($targetForm.children(".TagList"));
		
		initHoverComponent($newTagItem);
		
		$targetForm.find("#TagText").val("");
		
	} else {
		alert(formResponse.message);
	}
}

function deleteTag(tagID, $tagItem)
{
	var uri = "./member/tag/delete/" + tagID;
	
	jQuery.get(uri, function(data) {
		var formResponse = eval("(" + data + ")");
		if (formResponse.succeeded) {
			$tagItem.remove();
		} else {
			alert(formResponse.message);
		}
	});
}




function initAttachmentForm()
{
	var $targetForm = jQuery(".AttachmentForm");
	var options = {
			url:		"" + $targetForm.attr("action"),
			beforeSubmit: startMonitorUploadSession,
			success:	showAjaxAttachmentPostResponse
		};
	if ($targetForm.children("#AjaxFormField").size() > 0) {
	} else {
		jQuery("<input id=\"AjaxFormField\" type=\"hidden\" name=\"ajax.form\" value=\"true\" />").appendTo($targetForm);
	}

	$targetForm.ajaxForm(options);
}


var uploadSessionMonitoringTimer;
var uploadSessionMonitoringCloseTimer;
var uploadSessionID;
var $currentUploadForm;

function startMonitorUploadSession(arr, $targetForm, options)
{
	$currentUploadForm = $targetForm;
	setTimeout("monitorUploadSession()", 100);
}

function monitorUploadSession()
{
	uploadSessionID = "";
	
	jQuery.ajax({ 
		url: "./member/attachment/session_id",
        cache: false,
        success: function (data, dataType) {
			var params = data.split("<>");
			if (params[0] == "ok") {
				uploadSessionID = params[1];
				startMonitoring();
				
			} else if (params[0] == "error") {
				alert(params[1]);
			}
        },
		error : function (XMLHttpRequest, textStatus, errorThrown) {
		}
	});
}

function startMonitoring()
{
	var $progressComponent = $currentUploadForm.children(".AttachmentProgressComponent");
	var $progressBar = $progressComponent.children(".AttachmentProgress");
	
	$progressComponent.show();
	$progressBar.width(0);
	$progressBar.show();
	
	if (uploadSessionID != "") {
		uploadSessionMonitoringTimer = setTimeout("updateMonitoring()", 500);
	}
}

function updateMonitoring()
{
	var $progressComponent = $currentUploadForm.children(".AttachmentProgressComponent");
	var $progressBar = $progressComponent.children(".AttachmentProgress");
	
	jQuery.get(
		"./member/attachment/session/" + uploadSessionID,
		function(data) {
			var params = data.split("<>");
			if (params[0] == "ok") {
				var progress = params[1];
				progress++;
				progress--;
				
				$progressBar.animate({ width : $progressComponent.width() * progress / 100 + "px" }, 500);
				
				if (progress == 100) {
					clearTimeout(uploadSessionMonitoringTimer);
				} else {
					uploadSessionMonitoringTimer = setTimeout("updateMonitoring()", 500);
				}
			} else if (params[0] == "error") {
				alert(params[1]);
				clearTimeout(uploadSessionMonitoringTimer);
			}
		}
	);
}

function endMonitoring()
{
	var $progressComponent = $currentUploadForm.children(".AttachmentProgressComponent");
	var $progressBar = $progressComponent.children(".AttachmentProgress");

	$progressBar.animate({ width : $progressComponent.width() + "px" }, 100);
	
	uploadSessionMonitoringCloseTimer = setTimeout("closeMonitoringProgress()", 2000);
}

function closeMonitoringProgress()
{
	clearTimeout(uploadSessionMonitoringCloseTimer);
	
	var $progressComponent = $currentUploadForm.children(".AttachmentProgressComponent");
	var $progressBar = $progressComponent.children(".AttachmentProgress");
	
	$progressComponent.fadeOut(1000);
	
	
}


function showAjaxAttachmentPostResponse(responseText, statusText, xhr, $targetForm)
{
	endMonitoring();
	
	responseText = responseText.replaceAll("<pre>", "");
	responseText = responseText.replaceAll("</pre>", "");
	responseText = responseText.replaceAll("<PRE>", "");
	responseText = responseText.replaceAll("</PRE>", "");
	responseText = responseText.replaceAll("&lt;", "<");
	responseText = responseText.replaceAll("&gt;", ">");
	if (responseText.indexOf("<pre") >= 0) {
		responseText = responseText.substring(responseText.indexOf(">", responseText.indexOf("<pre")+4)+1);
	}
	
	var formResponse = eval("(" + responseText + ")");
	if (formResponse.succeeded) {
		jQuery(formResponse.html).appendTo($targetForm.siblings(".AttachmentList"));
		
		if (formResponse.message == 'linked') {
		} else {
			
			jQuery("FORM").each(function (){
				var $mainForm = jQuery(this);
				var formClass = $mainForm.attr("class");
				if (formClass.indexOf("AttachmentForm") == -1) {
					if ($mainForm.children("#AttachmentField").size() > 0) {
					} else {
						jQuery("<input id=\"AttachmentField\" type=\"hidden\" name=\"attachment_ids\" value=\"\" />").appendTo($mainForm);
					}
					
					var attachmentIDs = $mainForm.children("#AttachmentField").val();
					
					$mainForm.children("#AttachmentField").val(attachmentIDs + formResponse.targetID + ",");
				}
			});
		}
		
	} else {
		alert(formResponse.message);
	}
}


function deleteAttachment(attachmentID, $attachmentItem)
{
	jQuery.ajax({ 
		url: "./member/attachment/delete/" + attachmentID + "/",
        cache: false,
        success: function (data, dataType) {
			var formResponse = eval("(" + data + ")");
			if (formResponse.succeeded) {
				$attachmentItem.remove();
			}
        },
		error : function (XMLHttpRequest, textStatus, errorThrown) {
		}
	});
}

function insertAttachment(attachmentID)
{
	richTextInputField.jhtmlareaobject.pasteHTML("<img src=\"" + CONTENT_BASE + "./style/img/attachment2.png\" attachmentID=\"" + attachmentID + "\" />");
}

function showGlobalMessage()
{
	var message = jQuery("#GlobalMessage").html();
	if (message) {
		if (message.length > 0) {
			alert(message);
		}
	}
	
}

function showModalDialog($content)
{
	var $modal = jQuery("BODY").children("#ModalComponent");
	var $modalContent = $modal.find("#ModalContent");
	if ($modal.length == 0) {
		$modal = jQuery("<div id=\"ModalComponent\"></div>").appendTo(jQuery("BODY"));
		jQuery("<div id=\"ModalBackground\"></div>").appendTo($modal);
		$modalContent = jQuery("<div id=\"ModalContent\"></div>").appendTo($modal);
	}
	
	var $content = $content.appendTo($modalContent);
	$modalContent.width(200);
	$modalContent.height(200);

	adjustCenter($modalContent);
	
	var bodyHeight = Math.max(jQuery("BODY").height(), jQuery(window).height());
	$modal.height(bodyHeight);
	
	$modal.show();
	
	adjustCenter($modalContent);
}

function closeModalDialog()
{
	var $modal = jQuery("BODY").children("#ModalComponent");
	var $modalContent = $modal.find("#ModalContent");
	$modal.hide();
	$modalContent.html("");
}

function adjustCenter(target) {
	var margin_top = (jQuery(window).height()-jQuery(target).height())/2+jQuery(window).scrollTop();
	var margin_left = (jQuery(window).width()-jQuery(target).width())/2;
	jQuery(target).css({top:margin_top+"px", left:margin_left+"px"});
}



function resetDatePicker($dateInput, $datePicker)
{
	var selectedYear = 0;
	var selectedMonth = 0;
	var selectedDay = 0;

	var selectedParams = $dateInput.val().split("/");
	if (selectedParams.length == 3) {
		selectedYear = parseInt(selectedParams[0], 10);
		selectedMonth = parseInt(selectedParams[1], 10) - 1;
		selectedDay = parseInt(selectedParams[2], 10);
	}
	
	var year = $datePicker.attr("year");
	var month = $datePicker.attr("month") - 1;
	var day = $datePicker.attr("day");
	var type = $datePicker.attr("type");
	
	if (year == null && selectedYear == 0) {
		var date = new Date();
		year = date.getFullYear();
		month = date.getMonth();
		day = date.getDate();
		type = "day";
	} else if (year == null) {
		year = selectedYear;
		month = selectedMonth;
		day = selectedDay;
		type = "day";
	}
	
	
	year = parseInt(year, 10);
	month = parseInt(month, 10);
	day = parseInt(day, 10);
	
	
	var monthStartDate = new Date(year, month, 1);
	var monthStartDateWeekday = monthStartDate.getDay();
	
	var monthEndDate = new Date(year, month, 1);
	monthEndDate.setMonth(month + 1);
	monthEndDate.setTime(monthEndDate.getTime() - 1);
	
	var startDay = 1;
	if (monthStartDateWeekday == 0) {
		startDay = 1;
	} else if (monthStartDateWeekday == 1) {
		startDay = 0;
	} else if (monthStartDateWeekday == 2) {
		startDay = -1;
	} else if (monthStartDateWeekday == 3) {
		startDay = -2;
	} else if (monthStartDateWeekday == 4) {
		startDay = -3;
	} else if (monthStartDateWeekday == 5) {
		startDay = -4;
	} else if (monthStartDateWeekday == 6) {
		startDay = -5;
	}
	
	var endDay = monthEndDate.getDate();
	
	var html = "";
	html += "<div class=\"DatePicker\">";
	html += "<div class=\"DatePickerTitleComponent\">";
	html += "<div class=\"DatePickerTitleLeft\"><img src=\"./style/img/void.png\" class=\"LeftArrow\"></div>";
	if (type == "day") {
		html += "<div class=\"DatePickerTitle\">" + year + "年" + (month+1)+ "月</div>";
	} else if (type == "month") {
		html += "<div class=\"DatePickerTitle\">" + year + "年</div>";
	} else if (type == "year") {
		var y1 = year - 7;
		var y2 = year + 7;
		html += "<div class=\"DatePickerTitle\">" + y1 + "年 - " + y2 + "年</div>";
	}
	html += "<div class=\"DatePickerTitleRight\"><img src=\"./style/img/void.png\" class=\"RightArrow\"></div>";
	html += "<div style=\"clear:both;\"></div>";
	html += "</div>";
	
	html += "<div class=\"DatePickerComponent\">";
	
	if (type == "day") {
		html += "<div class=\"DatePickerHeader\">";
		html += "<div class=\"DatePickerHeaderColumn\">Sun</div>";
		html += "<div class=\"DatePickerHeaderColumn\">Mon</div>";
		html += "<div class=\"DatePickerHeaderColumn\">Tue</div>";
		html += "<div class=\"DatePickerHeaderColumn\">Wed</div>";
		html += "<div class=\"DatePickerHeaderColumn\">Thu</div>";
		html += "<div class=\"DatePickerHeaderColumn\">Fri</div>";
		html += "<div class=\"DatePickerHeaderColumn\">Sat</div>";
		html += "<div style=\"clear:both;\"></div>";
		html += "</div>";
		
		html += "<div class=\"DatePickerMainComponent\">";
		var d = startDay;
		for (var line = 0; line<6; line++) {
			html += "<div class=\"DatePickerDayLine\">";
			for (var column = 0; column<7; column++) {
				if (1 <= d && d <= endDay) {
					if (year == selectedYear && month == selectedMonth && d == selectedDay) {
						html += "<div class=\"DatePickerDayColumn Valid Selected\">" + d + "</div>";
					} else {
						html += "<div class=\"DatePickerDayColumn Valid\">" + d + "</div>";
					}
				} else {
					html += "<div class=\"DatePickerDayColumn\">&nbsp;</div>";
				}
				d++;
			}
			html += "<div style=\"clear:both;\"></div>";
			html += "</div>";
		}
		html += "</div>";
	} else if (type == "month") {
		html += "<div class=\"DatePickerMainComponent\">";
		
		html += "<div class=\"DatePickerMonthLine\">";
		html += "<div class=\"DatePickerMonthColumn\">1月</div>";
		html += "<div class=\"DatePickerMonthColumn\">2月</div>";
		html += "<div class=\"DatePickerMonthColumn\">3月</div>";
		html += "<div class=\"DatePickerMonthColumn\">4月</div>";
		html += "<div style=\"clear:both;\"></div>";
		html += "</div>";
		html += "<div class=\"DatePickerMonthLine\">";
		html += "<div class=\"DatePickerMonthColumn\">5月</div>";
		html += "<div class=\"DatePickerMonthColumn\">6月</div>";
		html += "<div class=\"DatePickerMonthColumn\">7月</div>";
		html += "<div class=\"DatePickerMonthColumn\">8月</div>";
		html += "<div style=\"clear:both;\"></div>";
		html += "</div>";
		html += "<div class=\"DatePickerMonthLine\">";
		html += "<div class=\"DatePickerMonthColumn\">9月</div>";
		html += "<div class=\"DatePickerMonthColumn\">10月</div>";
		html += "<div class=\"DatePickerMonthColumn\">11月</div>";
		html += "<div class=\"DatePickerMonthColumn\">12月</div>";
		html += "<div style=\"clear:both;\"></div>";
		html += "</div>";
		
		html += "</div>";
		
	} else if (type == "year") {
		html += "<div class=\"DatePickerMainComponent\">";

		var y = year - 7;
		for (var line = 0; line < 5; line++) {
			html += "<div class=\"DatePickerYearLine\">";
			for (var column = 0; column < 3; column++) {
				html += "<div class=\"DatePickerYearColumn\">" + y + "年</div>";
				y++;
			}
			html += "<div style=\"clear:both;\"></div>";
			html += "</div>";
		}
		
		html += "</div>";
		
	}
	html += "</div>";
	html += "</div>";
	
	html += "<div class=\"TimePicker\">";
	html += "<div class=\"TimePickerTitle\">";
	html += "<button class=\"TimePickerAm\">AM</button>";
	html += "<button class=\"TimePickerPm\">PM</button>";
	html += "</div>";
	html += "<div class=\"TimePickerComponent\">";
	html += "<div class=\"TimePickerMinuteHand\">";
	html += "<div class=\"TimePickerHourHand\"></div>";
	html += "</div>";
	html += "</div>";
	html += "<div class=\"TimePickerBottom\">";
	html += "<span class=\"TimePickerHour\">0</span>";
	html += ":";
	html += "<span class=\"TimePickerMinute\">0</span>";
	html += "</div>";
	html += "</div>";
	
	
	var groupHtml = "";
	groupHtml += "<div class=\"GroupComponent\">";
	groupHtml += "<div class=\"GroupComponentHeader\">";
	groupHtml += "<div class=\"GroupComponentHeaderLeft\"></div>";
	groupHtml += "<div class=\"GroupComponentHeaderTitle DateTimePickerClose Anchor\">閉じる</div>";
	groupHtml += "<div class=\"GroupComponentHeaderRight\"></div>";
	groupHtml += "</div>";
	groupHtml += "<div class=\"GroupComponentCenter\">";
	groupHtml += "<div class=\"GroupComponentContent\">";
	groupHtml += html;
	groupHtml += "</div>";
	groupHtml += "</div>";
	groupHtml += "<div class=\"GroupComponentFooter\">";
	groupHtml += "<div class=\"GroupComponentFooterLeft\"></div>";
	groupHtml += "<div class=\"GroupComponentFooterCenter\"></div>";
	groupHtml += "<div class=\"GroupComponentFooterRight\"></div>";
	groupHtml += "</div>";
	groupHtml += "</div>";
	
	
	$datePicker.html(groupHtml);
	
	
	$datePicker.find(".DateTimePickerClose").click(
		function() {
			closeDatePicker();
		}
	);
	
	$datePicker.find(".DatePickerTitleLeft").click(
		function() {
			if (type == "day") {
				moveMonth(-1);
			} else if (type == "month") {
				moveYear(-1);
			} else if (type == "year") {
				moveYear(-3);
			}
		}
	);
	
	$datePicker.find(".DatePickerTitleRight").click(
		function() {
			if (type == "day") {
				moveMonth(+1);
			} else if (type == "month") {
				moveYear(+1);
			} else if (type == "year") {
				moveYear(+3);
			}
		}
	);
	
	$datePicker.find(".DatePickerTitle").click(
		function() {
			if (type == "day") {
				changeType("month");
			} else if (type = "month") {
				changeType("year");
			}
			
		}
	);

	$datePicker.find(".DatePickerDayColumn.Valid").click(
		function() {
			day = parseInt(jQuery(this).html());
			var value = "";
			value += year + "/";
			if (month + 1 < 10) {
				value += "0" + (month + 1) + "/";
			} else {
				value += (month + 1) + "/";
			}
			if (day < 10) {
				value += "0" + day + "";
			} else {
				value += day + "";
			}
			
			updateInputField_Date(value);
		}
	);
	
	$datePicker.find(".DatePickerMonthColumn").click(
		function() {
			month = parseInt(jQuery(this).html().replace("月", "")) - 1;
			
			$datePicker.attr("year", year);
			$datePicker.attr("month", month + 1);
			$datePicker.attr("day", day);
			$datePicker.attr("type", "day");
			
			resetDatePicker($dateInput, $datePicker);
		}
	);
	
	$datePicker.find(".DatePickerYearColumn").click(
		function() {
			year = parseInt(jQuery(this).html().replace("年", ""));
			
			$datePicker.attr("year", year);
			$datePicker.attr("month", month + 1);
			$datePicker.attr("day", day);
			$datePicker.attr("type", "month");
			
			resetDatePicker($dateInput, $datePicker);
		}
	);	
	
	
	function moveMonth(amount)
	{
		var date = new Date(year, month, day);
		date.setMonth(month + amount);
		date.setTime(date.getTime() + 1);
		
		var y = date.getFullYear();
		
		$datePicker.attr("year", "" + y);
		$datePicker.attr("month", "" + (date.getMonth() + 1));
		$datePicker.attr("day", "" + date.getDate());
		$datePicker.attr("type", type);
		
		resetDatePicker($dateInput, $datePicker);
	}
	
	function moveYear(amount)
	{
		var date = new Date(year, month, day);
		date.setFullYear(year + amount);
		date.setTime(date.getTime() + 1);
		
		var y = date.getFullYear();
		
		$datePicker.attr("year", "" + y);
		$datePicker.attr("month", "" + (date.getMonth() + 1));
		$datePicker.attr("day", "" + date.getDate());
		$datePicker.attr("type", type);
		
		resetDatePicker($dateInput, $datePicker);
	}
	
	
	function changeType(newType)
	{
		$datePicker.attr("year", year);
		$datePicker.attr("month", month + 1);
		$datePicker.attr("day", day);
		$datePicker.attr("type", newType);
		
		resetDatePicker($dateInput, $datePicker);
	}
	
	
	
	
	var $timePickerMinuteLabel =  $datePicker.find(".TimePickerMinute");
	var $timePickerHourLabel =  $datePicker.find(".TimePickerHour");
	var $timePickerMinuteHand = $datePicker.find(".TimePickerMinuteHand");
	var $timePickerHourHand = $datePicker.find(".TimePickerHourHand");
	
	reloadTime_AmPm();
	reloadTime_Hour();
	reloadTime_Minute();
	
	$datePicker.find(".TimePickerComponent").mousemove(
		function(e) {
			var result = getClockValue(jQuery(this), e);
			if (result) {
				if (result.isHour) {
					reloadTime_Minute();
				} else {
					reloadTime_Hour();
				}
			} else {
				reloadTime_Hour();
				reloadTime_Minute();
			}
			
		}
	);
	$datePicker.find(".TimePickerComponent").mouseout(
		function(e) {
			reloadTime_Hour();
			reloadTime_Minute();
		}
	);
	$datePicker.find(".TimePickerComponent").click(
		function(e) {
			var result = getClockValue(jQuery(this), e);
			if (result.isHour) {
				updateInputField_Hour(result.value);
			} else {
				updateInputField_Minute(result.value);
			}
			
		}
	);
	
	
	$datePicker.find(".TimePickerAm").click(
		function() {
			updateAm();
		}
	);
	
	$datePicker.find(".TimePickerPm").click(
		function() {
			updatePm();
		}
	);
	
	function reloadTime_AmPm()
	{
		var regex = new RegExp("(\\S*)(\\s+)(\\S*):(\\S*):(\\S*)");
		var regexResult = $dateInput.val().match(regex);
		if (regexResult) {
			if (regexResult[3] < 12) {
				updateAm();
			} else {
				updatePm();
			}
		} else {
			updateAm();
		}
		
	}
	
	function reloadTime_Hour()
	{
		var regex = new RegExp("(\\S*)(\\s+)(\\S*):(\\S*):(\\S*)");
		var regexResult = $dateInput.val().match(regex);
		if (regexResult) {
			var hour = parseInt(regexResult[3], 10);
			if (isAm() == false && hour < 12) {
				hour += 12;
			}
			
			$timePickerHourLabel.html(hour);
			var hourClassNum = hour%12;
			for (var i=0; i<12; i++) {
				if (i == hourClassNum) {
					$timePickerHourHand.addClass("Hour" + i);
				} else {
					$timePickerHourHand.removeClass("Hour" + i);
				}
			}
			$timePickerHourHand.attr("value", hour);
		}
	}
	function reloadTime_Minute()
	{
		var regex = new RegExp("(\\S*)(\\s+)(\\S*):(\\S*):(\\S*)");
		var regexResult = $dateInput.val().match(regex);
		if (regexResult) {
			var minute = parseInt(regexResult[4], 10);
			minute = minute - (minute%10);
			
			$timePickerMinuteLabel.html(minute);
			var minuteClassNum = minute%60;
			for (var i=0; i<12; i++) {
				if (i*5 == minuteClassNum) {
					$timePickerMinuteHand.addClass("Minute" + i*5);
				} else {
					$timePickerMinuteHand.removeClass("Minute" + i*5);
				}
			}
			$timePickerMinuteHand.attr("value", minute);
		}
	}
	
	function updateAm()
	{
		$datePicker.find(".TimePickerAm").removeClass("TimePickerButton");
		$datePicker.find(".TimePickerAm").addClass("TimePickerButtonSelected");
		$datePicker.find(".TimePickerAm").attr("selected", "true");
		
		$datePicker.find(".TimePickerPm").addClass("TimePickerButton");
		$datePicker.find(".TimePickerPm").removeClass("TimePickerButtonSelected");
		$datePicker.find(".TimePickerPm").removeAttr("selected");
	}
	function updatePm()
	{
		$datePicker.find(".TimePickerAm").addClass("TimePickerButton");
		$datePicker.find(".TimePickerAm").removeClass("TimePickerButtonSelected");
		$datePicker.find(".TimePickerAm").removeAttr("selected");
		
		$datePicker.find(".TimePickerPm").removeClass("TimePickerButton");
		$datePicker.find(".TimePickerPm").addClass("TimePickerButtonSelected");
		$datePicker.find(".TimePickerPm").attr("selected", "true");
	}
	
	function isAm()
	{
		return $datePicker.find(".TimePickerAm").attr("selected") == "true";
	}
	
	
	var clockWidth = -1;
	var clockHeight = -1;
	var clockOffsetLeft = -1;
	var clockOffsetTop = -1;
	
	function getClockValue($target, e)
	{
		if (clockWidth == -1) {
			clockWidth = $target.width();
		}
		if (clockHeight == -1) {
			clockHeight = $target.height();
		}
		
		if (clockOffsetLeft == -1) {
			clockOffsetLeft = $target.offset().left;
		}
		if (clockOffsetTop == -1) {
			clockOffsetTop = $target.offset().top;
		}
		
		var posX = e.pageX - clockOffsetLeft;
		var posY = e.pageY - clockOffsetTop;
		var centerX = clockWidth/2;
		var centerY = clockHeight/2;
		
		var coordX = posX-centerX;
		var coordY = posY-centerY;

		

		var distance = Math.sqrt(coordX*coordX + coordY*coordY);
		
		var radian = Math.atan(coordY/coordX);
		var degree = radian * 180 / Math.PI;
		
		if (coordX >= 0 && coordY < 0) {
			degree += 90;
		} else if (coordX >= 0 && coordY >= 0) {
			degree += 90;
		} else if (coordX < 0 && coordY >= 0) {
			degree += 270;
		} else {
			degree += 270;
		}
		
		var result;
		if (distance < clockWidth / 4) {
			var n = (degree-15);
			if (n < 0) {
				n += 360;
			}
			var hour = parseInt(n / 30, 10) + 1;
			if (isAm() == false) {
				hour += 12;
			}
			
			var currentValue = $timePickerHourHand.attr("value");
			
			if (currentValue != hour) {
				if (hour < 10) {
					$timePickerHourLabel.html("0" + hour);
				} else {
					$timePickerHourLabel.html("" + hour);
				}
				var hourClassNum = hour%12;
				for (var i=0; i<12; i++) {
					if (i == hourClassNum) {
						$timePickerHourHand.addClass("Hour" + i);
					} else {
						$timePickerHourHand.removeClass("Hour" + i);
					}
				}
				$timePickerHourHand.attr("value", hour);
			}
			
			result = {isHour:true, value:hour};
			
		} else if (distance <= clockWidth / 2) {
			var n = (degree+3);
			if (n >= 360) {
				n -= 360;
			}
			var minute = parseInt(n / (6*5), 10) * 5;
			if (minute >= 60) {
				minute = 0;
			}
			
			var currentValue = $timePickerMinuteHand.attr("value");

			if (currentValue != minute) {
				if (minute < 10) {
					$timePickerMinuteLabel.html("0" + minute);
				} else {
					$timePickerMinuteLabel.html("" + minute);
				}
				var minuteClassNum = minute%60;
				for (var i=0; i<12; i++) {
					if (i*5 == minuteClassNum) {
						$timePickerMinuteHand.addClass("Minute" + i*5);
					} else {
						$timePickerMinuteHand.removeClass("Minute" + i*5);
					}
				}
				$timePickerMinuteHand.attr("value", minute);
			}
			
			result = {isHour:false, value:minute};

		}
		
		return result;
	};
	
	
	function updateInputField_Date(value)
	{
		var currentValue = $dateInput.val();
		var newValue = "";
		var regex = new RegExp("(\\S*)(\\s+)(\\S*)");
		var regexResult = currentValue.match(regex);
		 
		if (regexResult) {
			newValue = value + " " + regexResult[3];
		} else {
			newValue = value + " 00:00:00";
		}
		
		$dateInput.val(newValue);
	};
	
	
	
	function updateInputField_Hour(value)
	{
		if (value < 10) {
			value = "0" + value;
		}
		
		var currentValue = $dateInput.val();
		var newValue = "";
		var regex = new RegExp("(\\S*)(\\s+)(\\S*):(\\S*):(\\S*)");
		var regexResult = currentValue.match(regex);
		
		if (regexResult) {
			newValue = regexResult[1] + " " + value + ":" + regexResult[4] + ":" + regexResult[5];
		} else {
			newValue = "1970/01/01 " + value + ":00:00";
		}
		
		$dateInput.val(newValue);
	};

	function updateInputField_Minute(value)
	{
		if (value < 10) {
			value = "0" + value;
		}
		
		var currentValue = $dateInput.val();
		var newValue = "";
		var regex = new RegExp("(\\S*)(\\s+)(\\S*):(\\S*):(\\S*)");
		var regexResult = currentValue.match(regex);
		
		if (regexResult) {
			newValue = regexResult[1] + " " + regexResult[3] + ":" + value + ":" + regexResult[5];
		} else {
			newValue = "1970/01/01 " +  "00:" + value + ":00";
		}
		
		$dateInput.val(newValue);
	};
	function closeDatePicker()
	{
		$datePicker.fadeOut(100);
		$datePicker.remove();
	}
	
}

function registerEvaluation(targetTableID, targetID, evaluationCode)
{
	var uri = "./member/eval/register/"+targetTableID+"/"+targetID+"/"+evaluationCode;
	
	jQuery.get(uri, function(data) {
		var formResponse = eval("(" + data + ")");
		if (formResponse.succeeded) {
			jQuery("[evaluationCode="+evaluationCode+"]").find(".EvaluationCount").html("×" + formResponse.html);
		} else {
			alert(formResponse.message);
		}
	});

}


function attendActivity(tokenID)
{
	jQuery.post("./member/activity/attend/" + tokenID, pageReloadAfterAjax());
}

function disattendActivity(tokenID)
{
	jQuery.post("./member/activity/disattend/" + tokenID, pageReloadAfterAjax());
}

function pageReloadAfterAjax()
{
	window.setTimeout("pageReload()", 300);
}

function pageReload()
{
	location.reload();
}


String.prototype.replaceAll = function (org, dest){  
	return this.split(org).join(dest);  
}
