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

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

var CastLoadingImage = document.createElement("img");
CastLoadingImage.src = "/images/load_bar.gif";
CastLoadingImage.className = "load_bar";
CastLoadingImage.alt = "now_loading";

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

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

var casting = function(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(CastLoadingImage);
		else _board.innerHTML = "<div><span id='notify_message'>" + msg + "</span><span class='closeNotifyBoard' onclick='cancelCast();'> x </span></div>";

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

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

var changePageInfos = function(_title, _meta_keywords, _meta_description) {
	changeTitle(_title);
	changeMetaContent('title', _title);
	changeMetaContent('keywords', _meta_keywords);
	changeMetaContent('description', _meta_description);
}

var changeTitle = function(_title) {
	document.title = _title;
};

var changeMetaContent = function(_meta_name, _content) {
	var _meta = null;
	var _metas = document.getElementsByTagName("meta");
	for(var i=0; i<_metas.length; i++) {
		if(new RegExp(_meta_name, "i").test(_metas[i].getAttribute("name"))) {
			_meta = _metas[i];
			break;
		}
	}

	if(_meta) _meta.setAttribute("content", _content);
};

var addClass = function(node, class_name) {
	if(node) node.className += (node.className ? " " : "") + class_name
};

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

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

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

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


var selectAllItem = function(_type) {
	$$('input.item_checkbox').each(function(cb) {
    if(_type) {
      if(new RegExp(_type, "i").test(cb.className)) __checkItem(cb);
      else __uncheckItem(cb);
    } else {
			__checkItem(cb)
    }
	});
};

var deselectAllItem = function() {
	$$('input.item_checkbox').each(function(cb) {
		__uncheckItem(cb);
	});
};

var reverseAllSelection = function() {
	$$('input.item_checkbox').each(function(cb) {
		if(cb.checked) __uncheckItem(cb);
		else __checkItem(cb);
	});
};

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

	return selected;
};









// cabinet??
var changeJar = function(params) {
	var source_jar = params['source_jar'];
	var target_jar = params['target_jar'];
	if(!source_jar || !target_jar || source_jar == target_jar) return;

	var selected = collectSelectedItems();

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

	var url = FULL_URL;
	url += "/jars/" + source_jar + "/move_items";

	var _res = new zAjax().send({
		url: url,
		sync: false,
		method: "POST",
		data: "target_jar=" + target_jar + "&item_ids=" + selected,
		success: Bind(this, function(xhr) {
			eval(xhr.responseText);
			// var response = eval("(" + xhr.responseText + ")");
			// if(response.version) this.manifestVersion = response.version
		}),
		failure: function(xhr) {
			// Log(xhr);
			// fail;
		}
	})
};

var internalCopy = function(params) {
	var item_id = params['item_id'];
	var jar_id = params['jar_id'];
	if(!item_id || !jar_id) return;

	var url = FULL_URL;
	url += "/b/clone";

	var _res = new zAjax().send({
		url: url,
		sync: false,
		method: "POST",
		data: "jar_id=" + jar_id + "&item_id=" + item_id,
		success: Bind(this, function(xhr) {
			eval(xhr.responseText);
			// var response = eval("(" + xhr.responseText + ")");
			// if(response.version) this.manifestVersion = response.version
		}),
		failure: function(xhr) {
			// Log(xhr);
			// fail;
		}
	})
};

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

// fragile layer
//
var initFragileLayer = function() {
	OnEvent.add(window.document, "mousedown", function() {
		var _e = arguments[0];
		var node = _e.target || _e.srcElement;

		var __ev_refer = node;
		var __select_trigger = false;
		do {
			if(/z_select/i.test(__ev_refer.className)) {
				__select_trigger = true;
				break;
			}
		} while(__ev_refer = __ev_refer.parentNode)

		// close layer
		if(!__select_trigger && !$(node).up(".fragile") || /layerClose/.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;
					default:
						//
				}
			})
		}
	}.bindAsEventListener(this));
	OnEvent.add(window, "beforeunload", OnEvent.clear);
};

// volatile inputs
//
var initVolatileInputs = function() {
	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_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
var initVolatileInputsWithinAjax = function() {
	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 = ""; }
	}
};

var showShowCase = function(el) {
	var target = $(el.parentNode).down(".showcase")
	if(!target) return;

	if(el.checked) target.style.display = "block";
	else target.style.display = "none";
}

// move to select item
var addOption = function(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;

	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";
	};
	option.onmouseout = function() {
		this.style.backgroundColor = "";
	};
	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);
}

var removeOption = function(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);
}

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

	if(!_opt_container) 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(target) {
		target.setAttribute('longdesc', _value);
		target.innerHTML = _title.space_to_nbsp();
	}
}

// toggle button

var toggleTab = function(_e) {
  var elements = $$('.option');
	for(var i=0; i<elements.length; i++) if(elements[i].nodeType == 1) addClass(elements[i], "unselect");
	var node = _e.target || _e.srcElement;
	removeClass(node, "unselect")
};

var hitAndRun = function(_ev, _url) {
	var ev = new Eventor(_ev);

	var _target = "";
	if(ev._event().ctrlKey || ev._event().shiftKey) {
		_target = "_new";
		ev.break_event();
	}

	var _res = new zAjax().send({
		url: _url,
		sync: false,
		method: "POST",
		success: Bind(this, function(xhr) {
			if(_target) window.open(xhr.responseText);
			else location.href = xhr.responseText;
			// var _f = document.getElementById("superjar_opener");
			// if(_f) _f.parentNode.removeChild(_f);
			// _f = document.createElement("form");
			// _f.id = 'superjar_opener',_f.action = xhr.responseText, _f.method = 'GET', _f.target = _target
			// document.getElementsByTagName("body")[0].appendChild(_f);
			// try {
				// !_f.submit()
			// } catch(e) {
				// location.href = xhr.responseText;
			// }
		}),
		failure: function(xhr) {
			// fail;
		}
	})
};



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

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

	reactivateCompleteButton();
};

var reactivateCompleteButton = function() {
	if(LoadingImage.parentNode) LoadingImage.parentNode.innerHTML = LoadingImage.rel;
};

var enterToSubmit = function(_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());
}

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

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

	var __trigger = null;

	var findTrigger = function(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);

	// submit form
	if(typeof __form_candidate.onsubmit == "function") __form_candidate.onsubmit();
	else __form_candidate.submit();
};



var showPreview = function(item_id) {
	var _p = document.getElementById("preview_item_" + item_id)
	if(_p) _p.style.display = "block";
}
var hidePreview = function(item_id) {
	var _p = document.getElementById("preview_item_" + item_id)
	if(_p) _p.style.display = "none";
}




































var initSortableJars = function() {
	Sortable.create("jar_list", {
		handle: 'jar_handle',
		onUpdate: function() {
			var _res = new zAjax().send({
				url: '/jars/sort',
				sync: false,
				method: "POST",
				data: Sortable.serialize('jar_list'),
				success: function(xhr) {
					eval(xhr.responseText);
				},
				failure: function(xhr) {
					// fail;
				}
			})
		},
		only: 'jar',
		scroll: window
	})
}

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

var initActionHook = function() {
	OnEvent.add(window.document, "mouseup", BindEvent(this, function(_ev) {
		var ev = new Eventor(_ev);
		if(!/z_link/i.test(ev._node().className)) return;

		var _res = new zAjax().send({
			url: ev._node().href,
			sync: false,
			method: "get",
			success: Bind(this, function(xhr) {
				location.hash=/\/jars\/(.*)/.exec(ev._node().href).last();
				eval(xhr.responseText);
			}),
			failure: function(xhr) {
				// fail;
			}
		})
	}));
};

var initLoadJar = function() {
	if(!/\/jars#[0-9]+/.test(location.href)) return
	var jar_id = /^#([0-9]+)/.exec(location.hash).last();
	if(jar_id) {
		var url = "/jars/" + jar_id;
		var _res = new zAjax().send({
			url: url,
			sync: false,
			method: "get",
			success: Bind(this, function(xhr) {
				eval(xhr.responseText);
				// var response = eval("(" + xhr.responseText + ")");
				// if(response.version) this.manifestVersion = response.version
			}),
			failure: function(xhr) {
				// Log(xhr);
				// fail;
			}
		})
	}
};

var searchItem = function() {
	var _input = document.getElementById("search_words")
	var keywords = _input.value.split(/[\s,]+/);
	if(keywords.is_empty()) return;
	var _radio = document.getElementById("sc_all"); 
	var _sc = (_radio.checked == true) ? "all" : "my"

	var _res = new zAjax().send({
	url: "/search?q=" + keywords + "&sc=" + _sc,
		sync: false,
		method: "get",
		success: Bind(this, function(xhr) {
			location.hash="search?keywords=" + keywords;
			eval(xhr.responseText);
			// var response = eval("(" + xhr.responseText + ")");
			// if(response.version) this.manifestVersion = response.version
		}),
		failure: function(xhr) {
			// Log(xhr);
			// fail;
		}
	})

};

var changeLocale = function(_locale) {
	setCookie("sj_locale", _locale, 14);
	location.reload();
};

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();
				}
			});
		}
	});
};

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