var isTagEdited = false;


function open_tagform( url ) {
	var info = $('tag_info');
	var form = $('tag_form');
	
	form.innerHTML = "タグ情報読み込み中..";
	
	info.hide();
	form.show();
	
	new Ajax.Updater( form, url, {
		onLoading: function() {
			
		},
		onComplete: function() {
			isTagEdited = false;
		},
		onFailure: function() {
			form.hide();
			info.show();
			alert('タグ情報の読み込みに失敗しました');
		}
	});
	
	return void(0);
}



function close_tagform( url ) {
	var comment = $('tag_comment');
	if ( comment.style.display == "none") {
		return;
	}
	
	var info = $("tag_info");
	var form = $("tag_form");
	
	if ( isTagEdited ) {
		form.innerHTML = "タグ情報読み込み中..";
		
		new Ajax.Updater( info, url, {
			onLoading: function() {
				
			},
			onComplete: function() {
				form.hide();
				info.show();
			},
			onFailure: function() {
				form.hide();
				info.show();
				alert('タグ情報の読み込みに失敗しました');
			}
		});
	} else {
		form.hide();
		info.show();
	}
	
	return void(0);
}


function click_tagname( name ) {
	var form = $('tag_register');
	if ( form.name.disabled == false ) {
		form.name.value = decodeURIComponent( name.split("+").join(" ") );
	}
}


function alert_tagform( message ) {
	$('tag_comment').hide();
	
	new Insertion.After('tag_header', '<div id="tag_alert" style="padding:5px 0px; color:#ffffff; background-color:#cc0000; border-bottom:1px solid #999999; font-size:10px;">' + message + '</div>');
	setTimeout( function() {
		$('tag_alert').remove();
		$('tag_comment').show();
		
		var form = $('tag_register');
		form.name.disabled = false;
		form.ok.disabled = false;
	}, 2000 );
}


function info_tagform( message ) {
	$('tag_comment').hide();
	
	new Insertion.After('tag_header', '<div id="tag_notice" style="padding:5px 0px; color:#ffffff; background-color:#009900; border-bottom:1px solid #999999; font-size:10px;">' + message + '</div>');
	setTimeout( function() {
		$('tag_notice').remove();
		$('tag_comment').show();
		
		var form = $('tag_register');
		form.name.value = "";
		form.name.disabled = false;
		form.ok.disabled = false;
	}, 2000 );
}



function refresh_tagform( id ) {
	var list = $('tag_list');
	list.innerHTML = "<div style=\"padding:10px; font-size:12px;\">タグ情報読み込み中..</div>";
	
	setTimeout( function() {
		new Ajax.Updater( list, "/lib/tag_refresh.php?id=" + id, {
			onLoading: function() {
				
			},
			onComplete: function() {
				
			},
			onFailure: function() {
				alert('タグ情報の読み込みに失敗しました');
			}
		});
	}, 1000 );
	
	return void(0);
}





function confirm_register( url, id ) {
	var form = $('tag_register');
	var name = form.name.value;
	
	if ( name.length == 0 ) {
		return;
	}
	if ( name.indexOf(" ") >= 0 ) {
		if ( window.confirm('半角スペース区切りで複数のタグを同時に登録することはできません。\nタグ「' + name + '」として登録されますがよろしいですか？') ) {
			register_tag( url, id, 0 );
		}
	} else {
		register_tag( url, id, 0 );
	}
}



function register_tag( url, id, confirm ) {
	new Insertion.After('tag_header', '<div id="tag_access" style="padding:5px 0px; color:#000000; background-color:#cccccc; border-bottom:1px solid #999999; font-size:10px;">タグを登録中..</div>');
	$('tag_comment').hide();
	
	var req = createXMLHttpRequest();
	
	if ( req ) {
		var form = $('tag_register');
		var param = "id=" + id + "&name=" + encodeURIComponent( form.name.value ) + "&confirm=" + confirm;
		
		form.name.disabled = true;
		form.ok.disabled = true;
		
		req.onreadystatechange = function() {
			switch ( req.readyState ) {
				case 1: // Open
				case 2: // Send
				case 3: //Receiving
					break;
				case 4: //Loaded
					$('tag_access').remove();
					
					if ( req.status == 200 ) {
						var res = getParamHash( req.responseText );
						
						if ( res.status == "ok") {
							isTagEdited = true;
							info_tagform("タグ「" + res.name.replace("+", " ") + "」を登録しました");
							refresh_tagform( id );
						} else if ( res.status == "newtag") {
							// 新規タグ
							if ( window.confirm('タグ「' + res.name.replace("+", " ") + '」は一度も登録されたことがありません。\n新規タグを登録するには20ポイントが必要ですが、登録してもよろしいですか？') ) {
								register_tag( url, id, 1 );
							} else {
								$('tag_comment').show();
								
								form.name.disabled = false;
								form.ok.disabled = false;
							}
						} else {
							alert_tagform( res.status );
						}
					} else {
						alert_tagform("システムエラー");
					}
			}
		}
		
		req.open("POST", url, true );
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send( param );
	}
}






function confirm_delete( url, id, pid, uid, name ) {
	if ( window.confirm('他人の作品に登録されたタグを削除するには5ポイント必要ですが、削除してもよろしいですか？') ) {
		countdown_delete( url, id, pid, uid, name );
	}
}


function countdown_delete( url, id, pid, uid, name, waittime ) {
	var comment = $('tag_comment');
	if ( comment.style.display == "none") {
		return;
	}
	comment.hide();
	
	new Insertion.After('tag_header', '<div id="tag_countdown" style="padding:5px 0px; color:#000000; background-color:#cccccc; border-bottom:1px solid #999999; font-size:10px;">あと3秒で削除します</div>');
	var countdown = $('tag_countdown');
	
	var form = $('tag_register');
	form.name.disabled = true;
	form.ok.disabled = true;
	
	var wt = waittime;
	var ct = function() { return ( new Date() ).getTime(); }
	var et = ct() + wt;
	
	var refresh_timer = new PeriodicalExecuter( function() {
		var rt = et - ct();
		
		if ( rt > 0 ) {
			countdown.innerHTML = "あと" + Math.ceil( rt / 1000 ) + "秒で削除します";
		} else {
			this.stop();
			delete_tag( url, id, pid, uid, name );
			$('tag_countdown').remove();
		}
	}, 0.2 );
}




function confirm_delete( url, id, pid, uid, name ) {
	if ( window.confirm('他人の作品に登録されたタグを削除するには5ポイント必要ですが、削除してもよろしいですか？') ) {
		countdown_delete( url, id, pid, uid, name );
	}
}


function delete_tag( url, id, pid, uid, name ) {
	new Insertion.After('tag_header', '<div id="tag_access" style="padding:5px 0px; color:#000000; background-color:#cccccc; border-bottom:1px solid #999999; font-size:10px;">タグを削除中..</div>');
	
	var req = createXMLHttpRequest();
	
	if ( req ) {
		var param = "id=" + id + "&pid=" + pid + "&uid=" + uid + "&name=" + name;
		
		req.onreadystatechange = function() {
			switch ( req.readyState ) {
				case 1: // Open
				case 2: // Send
				case 3: //Receiving
					break;
				case 4: //Loaded]
					$('tag_access').remove();
					
					if ( req.status == 200 ) {
						var res = getParamHash( req.responseText );
						
						if ( res.status == "ok") {
							isTagEdited = true;
							info_tagform("タグ「" + res.name + "」を削除しました");
							refresh_tagform( pid );
						} else {
							alert_tagform("システムエラー : " + res.status );
						}
					} else {
						alert_tagform("システムエラー");
					}
			}
		}
		
		req.open("POST", url, true );
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send( param );
	}
}





function createXMLHttpRequest() {
	var req;
	
	if ( window.XMLHttpRequest && !window.ActiveXObject ) {
		try {
			req = new XMLHttpRequest();
		} catch ( e ) {
			req = null;
		}
	} else if ( window.ActiveXObject ) {
		try {
			req = new ActiveXObject("Msxml2.XMLHTTP");
		} catch ( e ) {
			try {
				req = new ActiveXObject("Microsoft.XMLHTTP");
			} catch ( e ) {
				req = null;
			}
		}
	}
	
	return req;
}



function getParamHash( str ) {
	var hash = {};
	
	if ( typeof( str ) == 'undefined') {
		return hash;
	}
	
	str = str.split('&');
	for ( var i = 0; i < str.length; i++ ) {
		var item = str[i].split("=");
		
		if ( item[0] != '') {
			hash[ item[0] ] = typeof( item[1] ) == 'undefined' ? true : decodeURIComponent( item[1] );
		}
	}
	
	return hash;
}
