// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

///////////////////////
// particular functions
function toggleUserMenu(_ev, _user_id) {
	var ev = new Eventor(_ev);

	var _exist = document.getElementById("user_menu_" + _user_id);
	if(_exist) {
		// _exist.parentNode.removeChild(_exist);
		var _xy = $(ev._node()).cumulativeOffset();

		_exist.style.left = (_xy[0]) + "px";
		_exist.style.top = (_xy[1] + 50) + "px";
		_exist.style.display = "block";
	}
	else {
		var panel = document.createElement("div");
		panel.id = "user_menu_" + _user_id;
		panel.className = "user_menu fragile do_hide"
		document.getElementsByTagName("body")[0].appendChild(panel);
	
		var _xy = $(ev._node()).cumulativeOffset();

		panel.style.left = (_xy[0]) + "px";
		panel.style.top = (_xy[1] + 50) + "px";

		panel.innerHTML = zFetch("/users/" + _user_id + "/menu").responseText;
	}
};

function rememberMe(_bool) {
	if(_bool) setCookie("remember_me", "yes", 14);
	else delCookie("remember_me");
};

function findAndScrollTo(_element_clue, fix_y) {
	if(!fix_y) var fix_y = 0;
	var target = (typeof _element_clue == "string") ?  document.getElementById(_element_clue) : _element_clue;
	var _p = PositionedOffset(target);
	var _new_y = _p[1] + fix_y;

	var sT = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
	if(sT > _new_y) window.scrollTo(0, _new_y);
};

function DestroyUserDescription(_ev, msg) {
	var board = document.getElementById("user_description");
	if(board) board.parentNode.removeChild(board);
};

function RenderUserDescription(_ev, msg) {
	var ev = new Eventor(_ev);

	var board = document.getElementById("user_description");
	if(!board) {
		var board = document.createElement("div");
		board.id = "user_description";
		board.className = "fragile do_destroy"
		document.getElementsByTagName("body")[0].appendChild(board);
	}

	if(board.innerHTML != msg) {

		var _xy = $(ev._node()).cumulativeOffset();

		board.style.left = (_xy[0]) + "px";
		board.style.top = (_xy[1] + 50) + "px";

		board.innerHTML = msg;
	}
};

function checkDm(dm_id) {
	new zAjax().send({
		url: "http://twmeet.jp/dms/" + dm_id + "/check",
		sync: false,
		method: "GET",
		success: function(xhr) {
			eval(xhr.responseText);
		}
	})
};

function sendDm(trigger) {
	var container = document.getElementById("selected");

	var screen_names = [];
	for(var i=0;i<container.childNodes.length; i++) {
		if(container.childNodes[i].nodeType != 1 || !/li/i.test(container.childNodes[i].tagName)) continue;
		try {
			screen_names.push(container.childNodes[i].id);
		} catch(e) {
			//
		}
	}
	$('dm_receivers').value = screen_names.join(",");

	thisSubmit(trigger);
};

function editCard(url) {
	var editor = $('card_editor');
	if(editor) {
		var editing_card_id = editor.getAttribute('rel');
		url = url + "?editing_card_id=" + editing_card_id;
	}

	zGet(url);
};

function fitToBottom() {
	var cH = $('container').clientHeight;
	var wH = (Browser.safari && !document.evaluate) ? document.innerHeight : (Browser.opera) ? document.body.clientHeight : document.documentElement.clientHeight;
	if(cH < wH) $('body').style.height = $('body').clientHeight + (wH - cH) + "px"
};

function expandChat(url) {
	zGet(url + "&offset=" + $$("li.chat").length);
};

function expandView(common_tail, height) {
	var _f = (Browser.firefox) ? 19 : 19;
	var _x = (Number(height) * _f);
	var body_id = "body_" + common_tail;
	var assets_id = "assets_" + common_tail;

	if($(body_id).clientHeight  > 50) {
		$(body_id).style.height = "38px";
		$(body_id).style.overflow = 'hidden';
		$('viewToggler_' + common_tail).src = "/images/plus.gif";

		$(assets_id).style.height = "85px";
	} else {
		$(body_id).style.height = _x + "px";
		$(body_id).style.overflow = 'visible';
		$('viewToggler_' + common_tail).src = "/images/minus.gif";

		$(assets_id).style.height = 85 + (_x - 38) + "px";
	}
};

function doSubmit(element) {
	$('card_description_height').value = $('card_description').scrollHeight;
	thisSubmit(element);
};

function downloadZip() {
	var selected = collectSelectedItems();

	if(!selected || selected.is_empty()) {
		alert("Select first.");
		return;
	}

	// zPost("/assets/zip", { asset_ids: selected });
	location.href = "/assets/zip?asset_ids=" + selected.join(",");
};

function hideAllPinpoints() {
	for(var i=0;i<Pinpoint.activated_images.length;i++) Pinpoint.activated_images[i].hide_all_pinpoints();
};
function showBack(_back_id) {
	var item = document.getElementById(_back_id);

	fxEngine.setItem(item);
	fxEngine.regCallback(null);
	fxEngine.blindX();
	// fxEngine.blindY();
};

function hideBack(_back_id, _ev) {

	var ev = new Eventor(_ev);
	if(/^a$/i.test(ev._node().tagName)) return;

	var item = document.getElementById(_back_id);

	fxEngine.setItem(item);
	fxEngine.regCallback(function() {
		this.item.style.display = "none";
	});
	fxEngine.blindX();
	// fxEngine.blindY();
};

function refreshAlbum() {
	var album_id = ExtractIdFromUrl("album")
	if(album_id) zGet("/albums/" + album_id);
	else zGet("/albums");
};

function moveAssets(source_album_id, target_album) {
	var selected = collectSelectedItems();

	if(!selected || selected.is_empty()) {
		alert("Select first.");
		return;
	}

	if(!target_album) {
		var _url = "/albums/takein";
	} else if(target_album == "waste_bucket") {
		var _url = "/waste"
	} else if(target_album == "my_computer") {
		// zPost("/assets/zip", { asset_ids: selected });
		location.href = "/assets/zip?asset_ids=" + selected.join(",");
		deselectAllItems();
		return true;
	} else {
		var _url = "/albums/" + target_album + "/takein"
	}

	zPost(_url, { asset_ids: selected, source_album_id: source_album_id });
};

function toggleUploader() {
	if(invisibleDom($('new_asset_form_wrapper'))) showUploader();
	else hideUploader();
};

function showUploader() {
	if(swfobject.hasFlashPlayerVersion("9.0.0")) {
		$('new_asset_form_wrapper').style.display = "block"
		if(/span/i.test($("buttaUploader").tagName)) {
			swfobject.embedSWF('/utilities/buttaUploader/buttaUploader.swf', 'buttaUploader', '380', '310', '9.0.0', '',
				{target_url: FULL_URL + "/assets", client_identifier: CLIENT_IDENTIFIER, auth_token: AUTH_TOKEN, album_id: ALBUM_ID},
				{wmode:'transparent', id:'buttaUploader', allowScriptAccess: 'always'}
			);
		}
	}
	else {
		if(confirm("Do you wanna move to the adobe site to install flash player?")) {
			location.href="http://www.adobe.com/go/getflashplayer";
		}
	}
}

function hideUploader() {
	// swfobject.removeSWF('buttaUploader');

	// var _dummy = document.createElement("span");
	// _dummy.id = "buttaUploader";
	// var _closer = $('buttaUploaderCloser');
	// _closer.parentNode.insertBefore(_dummy, _closer);

	$('new_asset_form_wrapper').style.display = "none";
}

function viewAlbum(album_id) {
	if(album_id) location.href = "/albums/" + album_id;
	else location.href = "/";
}

function addClass(node, class_name) {
	if(new RegExp(class_name, "gi").test(node.className)) return;
	if(node) node.className += (node.className ? " " : "") + class_name
};

function removeClass(node, class_name) {
	if(node) node.className = node.className.replace(new RegExp("(\s)?" + class_name, "gi"), '')
};

function addOrRemoveClass(condition, node, class_name) {
	if(condition) addClass(node, class_name)
	else removeClass(node, class_name)
};

function __checkItem(cb) {
	cb.checked = true;
	var parentLi = $(cb).up("li.asset")
	addClass(parentLi, "selected");
};

function __uncheckItem(cb) {
	cb.checked = false;
	var parentLi = $(cb).up("li.asset")
	removeClass(parentLi, "selected");
};

function toggleItem(_ev, _id) {
	var ev = new Eventor(_ev);
	if((/input/i.test(ev._node().tagName) && /check/i.test(ev._node().type)) || (/^(a|img)$/i.test(ev._node().tagName))) return true;
	var cb = $(_id);
	if(!cb) return false;
	if(cb.checked) __uncheckItem(cb);
	else __checkItem(cb);
};

function mouseOver(_element_clue) {
	var target = (typeof _element_clue == "string") ?  document.getElementById(_element_clue) : _element_clue;
	if(target) addClass(target, "hover");
};

function mouseOut(_element_clue) {
	var target = (typeof _element_clue == "string") ?  document.getElementById(_element_clue) : _element_clue;
	if(target) removeClass(target, "hover");
};

function selectAllItems(_type) {
	var _selected_items = 0;
	$$('input.checkbox_asset').each(function(cb) {
    if(_type) {
      if(new RegExp(_type, "i").test(cb.className)) {
				__checkItem(cb);
				_selected_items++;
			} else {
				__uncheckItem(cb);
			}
    } else {
			__checkItem(cb)
			_selected_items++;
    }
	});

	cast(_selected_items + " items are selected.");
};

function deselectAllItems() {
	var _deselected_items = 0;
	$$('input.checkbox_asset').each(function(cb) {
		if(cb.checked) _deselected_items++;
		__uncheckItem(cb);
	});

	cast(_deselected_items + " items are deselected.");
};

function markSelectedItems() {
	$$('input.checkbox_asset').each(function(cb) {
		if(cb.checked) __checkItem(cb);
	});
};

function reverseAllSelectedItems() {
	var _selected_items = 0;
	var _deselected_items = 0;
	$$('input.checkbox_asset').each(function(cb) {
		if(cb.checked) {
			__uncheckItem(cb);
			_deselected_items++;
		} else {
			__checkItem(cb);
			_selected_items++;
		}
	});

	cast(_selected_items + " items are selected and " + _deselected_items + " items are deselected.");
};

function collectSelectedItems() {
  var selected = [];
	$$('input.checkbox_asset').each(function(cb) {
    if(cb.checked) selected.push(/_([0-9]+)$/.exec(cb.id).last());
  });

	return selected;
};

//////////////////////////////////////////////
// Google translate

GAvailable = true; // google reachable?
function detectLang(text) {
	google.language.detect(text, function(result) {
		if (!result.error) {
			for (l in google.language.Languages) {
				if (google.language.Languages[l] == result.language) {
				// Log(result.language);
				break;
				}
			}
		}
	});
};

function translate(node_id, mother_language) {
	cast("Loading...");
	var node = document.getElementById(node_id);
	var text= node.innerHTML;
	if(!mother_language) var mother_language = "en";
	google.language.detect(text, function(result) {
		if(!result.error && result.language) {
			google.language.translate(text, result.language, mother_language, function(result) {
				if(result.translation) {
					node.innerHTML = result.translation.replace(/<a[^>]*class=.translate.[^>]*rel=.([^\s]+).[^>]*>.*<\/a>/i, function(_m, _1) {
						return "<span class='translate'>" + _1 + "</span>";
					});
					cancelCast();
				}
			});
		}
	});
};




///////////////////////////////////////////
// notification
function eraseFlash() {
  var _flash_board = document.getElementById("explanation");
	if(_flash_board) _flash_board.innerHTML = "";
};

function castError(msg) {
	casting(msg, true);
};

function cast(msg) {
	casting(msg);
};

function casting(msg, error) {
	var st = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
	var wW = (Browser.safari && !document.evaluate) ? document.innerWidth : (Browser.opera) ? document.body.clientWidth : document.documentElement.clientWidth;
	var _board = document.getElementById("notify_board");

	if(_board) {
		_board.innerHTML = "";
		if(/(Loading|ロード中|로딩중)\.\.\./i.test(msg)) _board.appendChild(LoadingImage);
		else _board.innerHTML = "<div><span id='notify_message'>" + msg + "</span><span class='closeNotifyBoard' onclick='cancelCast();'> x </span></div>";

		_board.style.visibility = "visible";
		_board.style.display = "block";
		_board.style.top = st + "px"
		_board.style.left = ((wW - parseInt(_board.offsetWidth)) / 2) + "px"
	}
};

function cancelCast() {
  var _board = document.getElementById("notify_board");
	if(_board) {
    _board.style.display = "none";
    _board.style.visibility = "hidden";
    _board.innerHTML = "";
  }
};

var safeExit = function() {
	this.setSafetyLock();
	this.bypassWhenSubmit();
};
safeExit.prototype.setSafetyLock = function() {
	window.onbeforeunload = function() { return "Unsaved changes will be lost."; }
};
safeExit.prototype.bypassWhenSubmit = function() {
	var forms = document.getElementsByTagName("form");
	for(var i=0; i<forms.length; i++) if(typeof forms[i].onsubmit != "function") forms[i].onsubmit = this.forceUnlockTheLock;
};
safeExit.prototype.forceUnlockTheLock = function() {
	window.onbeforeunload = function() { true; }
	this.submit();
};


//
// form
//
var LoadingImage = document.createElement("img");
LoadingImage.src = "/images/load_bar.gif";
LoadingImage.id = "loading_image";
LoadingImage.alt = "now_loading";

function resetForm(form_id) {
	if(form_id) {
		document.getElementById(form_id).reset();
	} else {
		var forms = document.getElementsByTagName("form");
		for(var i=0; i<forms.length; i++) forms[i].reset();
	}

	reactivateCompleteButton();
};

function reactivateCompleteButton() {
	try {
		if(LoadingImage.parentNode) LoadingImage.parentNode.innerHTML = LoadingImage.rel;
	} catch(e) {
		// what can I do?
		// IE8 doesn't work with this.
	}
};

function enterToSubmit(_ev) {
	var ev = new Eventor(_ev);
	if(!/input/i.test(ev._node().tagName) && !/check/i.test(ev._node().tagName)) return;
	if(ev._keycode() == 13 && !ev._event().shiftKey) thisSubmit(ev._node());
}

function thisSubmit(node) {
	var innerElement = node.innerHTML || node.value
	if(/loading_(layer|image)/.test(innerElement)) return;

	// find form
	var __form = node;
	while(__form) {
		if(__form.nodeType == 1 && /form/i.test(__form.tagName)) break;
		else __form = __form.parentNode;
	}

	var __trigger = null;

	function findTrigger(node) {
		if(__trigger) return __trigger;
		if(node.childNodes.length <= 0) return;
		for(var i=0;i<node.childNodes.length;i++) {
			if(node.childNodes[i].nodeType!=1) continue;
			if(/trigger/.test(node.childNodes[i].className)) __trigger = node.childNodes[i];
			else findTrigger(node.childNodes[i]);
		}
	}
	findTrigger(__form);

	// loading image
	if(!__trigger) return;
	LoadingImage.rel = __trigger.innerHTML;
	__trigger.innerHTML = "";
	__trigger.appendChild(LoadingImage);

	// detect language
	if(GAvailable && /language_detection_requires=/.test(__form.action)) {
		google.language.detect(document.getElementById(/language_detection_requires=([^\s]+)/.exec(__form.action).last()).value, Bind(null, function(result) {
			if (!result.error) {
				for (l in google.language.Languages) {
					if (google.language.Languages[l] == result.language) {
					var _input = document.createElement("input")
					_input.name = "language", _input.value = result.language, _input.type = "hidden";
					__form.insertBefore(_input, __form.firstChild);
					// submit form
					if(typeof __form_candidate.onsubmit == "function") __form_candidate.onsubmit();
					else __form_candidate.submit();
					break;
					}
				}
			}
		}), __form);
	} else {
		// submit form
		if(typeof __form.onsubmit == "function") __form.onsubmit();
		else __form.submit();
	}
};

function changeLocale(_locale) {
	setCookie("twtmt_locale", _locale, 14);
	location.reload();
};


// layer select
//
function initLayerSelect() {
	// BeWare: clear will clear all.
	OnEvent.clear("select_actions");
	var select = null;
	while(select = document.getElementsByTagName("select")[0]) new CrossSelect(select);
};

function initCountMe() {
	var _ta = __A(document.getElementsByTagName("textarea"));
	var _t = null;
	while(_t = _ta.pop()) {
		if(/countMe/.test(_t.className)) {
			var _max = /maxLength_([0-9]+)$/i.exec(_t.className).last();
			_t.rel = _max;
			var _pos = CumulativeOffset(_t);
			var _b = document.createElement("div");
			_b.id = _t.id + "_counter";
			_b.className = "counter";
			_b.innerHTML = _max;

			_t.parentNode.insertBefore(_b, _t);
			OnEvent.add(_t, "keydown", function() {
				var _b_id = this.id + "_counter";
				var _c = Number(this.rel) - this.value.length;
				_b = document.getElementById(_b_id);
				if(_c < 0) addClass(_b, "over");
				else removeClass(_b, "over");
				_b.innerHTML = _c;
			});
		}
	}
};

function initSmartFocus() {
	var _is = __A(document.getElementsByTagName("input"));
	var _i = null;
	while(_i = _is.pop()) {
		if(/smart_focus/.test(_i.className)) {
			_i.focus();
			break;
		}
	}
};

// volatile inputs
//
function initVolatileInputs() {
	var _candidates = __A(document.getElementsByTagName("input")).concat(__A(document.getElementsByTagName("textarea")))
	for(var i=0;i<_candidates.length;i++) {
		var _i = _candidates[i];
		if(!/volatile/.test(_i.className)) continue;
		if(typeof _i.onfocus == "function") continue;
		if(/volatile_value/.test(_i.className)) _i.onfocus = function() { this.value = this.onfocus = ""; }
		else if(/volatile_background/.test(_i.className)) _i.onfocus = function() { this.style.backgroundImage = "none"; this.onfocus = ""; }
	}
};
// volatile with ajax
function initVolatileInputsWithinAjax() {
	var inputs = document.getElementsByTagName("input");
	for(var i=0;i<inputs.length;i++) {
		if(!/volatile/.test(inputs[i].className)) continue;
		if(typeof inputs[i].onfocus == "function") continue;
		if(/volatile_value/.test(inputs[i].className)) inputs[i].onfocus = function() { this.value = this.onfocus = ""; }
		else if(/volatile_background/.test(inputs[i].className)) inputs[i].onfocus = function() { this.style.backgroundImage = "none"; this.onfocus = ""; }
	}
};

function initFragileLayer() {
	OnEvent.clear("__fragileLayer");
	OnEvent.add(window.document, "mousedown", BindEvent(this, function(_e) {
		var node = _e.target || _e.srcElement;

		// if(/html/i.test(node.tagName)) return;

		var __ev_refer = node;
		var __evade_case = false;
		do {
			if(/z(_select|Pin_canvas)/i.test(__ev_refer.className)) {
				__evade_case = true;
				break;
			}
		} while(__ev_refer = __ev_refer.parentNode)

		// close layer
		if((!__evade_case && !$(node).up(".fragile")) || /fragileBreaker/i.test(node.className)) {
			$$(".fragile").each(function(_f) {
				var _method = String(/do_[_a-z]+/i.exec(_f.className));
				switch(_method) {
					case "do_nullify":
						if(_f.innerHTML) _f.innerHTML = "";
						break;
					case "do_destroy":
						if(_f) _f.parentNode.removeChild(_f);
						break;
					case "do_hide":
						if(_f.style.display != "none") _f.style.display = "none"
						break;
					case "do_both":
						if(_f.innerHTML) _f.innerHTML = "";
						_f.style.display = "none";
						_f.style.visibility = "hidden";
						break;
					default:
						//
				}
			})
		}

	}), "__fragileLayer");
};


var roller = new function() {
	this.workerID = null;
};
roller.roll = function(_cb, _sec) {
	try {
		var _interval = (_sec) ? _sec * 1000 : 2000;
		this.workerID = this.timer().setInterval(_cb, _interval);
	} catch(e) {
		this.stop();
	}
};
roller.stop = function() {
	this.timer().clearInterval(this.workerID);
};
roller.timer = function() {
	return window;
};

function zFetch(path, data) {
	return new zAjax().send({
		url: FULL_URL + path,
		sync: true,
		method: "GET",
		success: function(xhr) {
			// eval(xhr.responseText);
		}
	})
};

function zPost(path, data) {
	new zAjax().send({
		url: FULL_URL + path,
		data: data,
		sync: false,
		method: "POST",
		success: function(xhr) {
			eval(xhr.responseText);
		}
	})
};

function zGet(path, data) {
	new zAjax().send({
		url: FULL_URL + path,
		sync: false,
		method: "GET",
		success: function(xhr) {
			eval(xhr.responseText);
		}
	})
};

function addOption(select_id, new_option) {
	var _select = document.getElementById(select_id + "_z_select");
	var _opt_container = document.getElementById(select_id + "_opt_container");
	var _field = document.getElementById(select_id);
	var _select_display = document.getElementById(select_id + "_select_display");

	if(!_select || !_opt_container || !_field || !_select_display) return;

	if(_select.clientWidth > _opt_container.style.width) _opt_container.style.width = _select.clientWidth;

	var _value = new_option.value;
	var _title = new_option.title || _value;

	var option = document.createElement("div");
	option.className = "option";
	option.setAttribute('longdesc', _value);
	option.innerHTML = _title.space_to_nbsp();
	option.onmouseover = function() {
		this.style.backgroundColor = "#ff8";
		this.style.textDecoration = "underline";
	};
	option.onmouseout = function() {
		this.style.backgroundColor = "";
		this.style.textDecoration = "none";
	};
	option.onclick = BindEvent(this, function(ev) {
		var refer = ev.target || ev.srcElement;
		if(!/div/i.test(refer.tagName) || !/option/.test(refer.className)) refer = $(refer).up(".option")
		_field.value = refer.getAttribute("longdesc");
		if(!/static_title/i.test(_select.className)) _select_display.innerHTML = refer.innerHTML;
		if(_field.cb) _field.cb();
	});

	if(new_option.selected) {
		_field.value = option.getAttribute("longdesc");
		if(!/static_title/i.test(_select.className)) _select_display.innerHTML = option.innerHTML;
		if(_field.cb) _field.cb();
	}

	_opt_container.appendChild(option);
};

function removeOption(select_id, value) {
	var _opt_container = document.getElementById(select_id + "_opt_container");

	if(!_opt_container) return;

	var target = null;
	for(var i=0;i<_opt_container.childNodes.length;i++) {
		if(_opt_container.childNodes[i].nodeType != 1) continue;
		var _candidate = _opt_container.childNodes[i];
		if(/option/i.test(_candidate.className) && _candidate.getAttribute("longdesc") == value) {
			target = _candidate;
			break;
		}
	}

	if(target) target.parentNode.removeChild(target);
}

function replaceOption(select_id, new_option) {
	var _opt_container = document.getElementById(select_id + "_opt_container");
	var _field = document.getElementById(select_id);
	var _select_display = document.getElementById(select_id + "_select_display");


	if(!_opt_container || !_field || !_select_display) return;

	var _value = new_option.value;
	var _title = new_option.title || _value;

	var target = null;
	for(var i=0;i<_opt_container.childNodes.length;i++) {
		if(_opt_container.childNodes[i].nodeType != 1) continue;
		var _candidate = _opt_container.childNodes[i];
		if(/option/i.test(_candidate.className) && _candidate.getAttribute("longdesc") == _value) {
			target = _candidate;
			break;
		}
	}

	if(_field.value == target.getAttribute('longdesc')) {
		_select_display.innerHTML = _title.space_to_nbsp();
	}

	if(target) {
		target.setAttribute('longdesc', _value);
		target.innerHTML = _title.space_to_nbsp();
	}
}

function switchChild(child, node_id_1, node_id_2) {
	var node_1 = document.getElementById(node_id_1);
	var node_2 = document.getElementById(node_id_2);

	if(child.parentNode == node_1) var source = node_1, target = node_2
	else var source = node_2, target = node_1;

	var clone = child.cloneNode(true);
	target.appendChild(clone);
	source.removeChild(child);

	// twtmt multi_mention specified...
	if(/multi_mention/i.test(location.href)) {
		var _ta = document.getElementById('mention_body');
		var _p = new RegExp("(^|\\s)@" + clone.id + "(?=(\\s|$))", 'ig');
		_ta.value = _ta.value.replace(_p, '').trim();

		if(!/candidates/i.test(clone.parentNode.id)) {
			_ta.value = _ta.value + " @" + clone.id
		}

		var _b_id = _ta.id + "_counter";
		var _b = document.getElementById(_b_id);
		var _c = Number(_ta.rel) - _ta.value.length;
		if(_c < 0) addClass(_b, "over");
		else removeClass(_b, "over");
		_b.innerHTML = _c;
	}
};

function update_text_field(options) {
	var container = document.getElementById("related_tags");
	var selected_keywords = [];
	for(var i=0; i<container.childNodes.length; i++) {
		var child = container.childNodes[i];
		if(child.nodeType != 1) continue;
		selected_keywords.push(child.innerHTML.strip_tags().trim());
	}

	var inputer = document.getElementById("post_tag_text")
	if(!inputer) var inputer = document.getElementById("chat_tag_text")
	if(inputer) inputer.value = selected_keywords.join(",");

	if(options && options.close) close_keyword_manager();
};

function initMailTo(node) {
	if(!/mai[l]to/.test(node.className)) return;
	var _adr = /(.*)AT(.*)/.exec(node.getAttribute('rel'));
	var adr = _adr[1] + "@" + {'gmc': 'gmai' + 'l.com'}[_adr[2]];
	node.innerHTML = "<a hr" + "ef=mai" + "lto:" + adr + ">" + adr + "</a>";
};
