/*
jQuery(window).keypress(function(event) {
	if (!(event.which == 116 && event.ctrlKey)) {
		return true;
	}
	event.preventDefault();
	clexpand("yt");
	return false;
});
*/

jQuery(function() {
	init_tags();
});

function init_tags() {
	var tags = document.getElementById("tags");
	if (tags) {
		if (window.addEventListener) {
			tags.addEventListener("keypress", onkeydown_tag, false);
		} else {
			tags.attachEvent("onkeydown", onkeydown_tag, true);
		}
	}
}



function clexpand(basename) {
	var i = document.getElementById(basename+"-arrow");
	var d = document.getElementById(basename+"-body");
	if (!d || !i) {
		return;
	}
	if (d.style.display=="none") {
		d.style.display = 'block';
		i.src = staticRoot + "/img/arrow-open.gif";
	} else {
		d.style.display = 'none';
		i.src = staticRoot + "/img/arrow-collapsed.gif";
	}
}

var prev_tags_array = new Object();

function add_tag(name) {
	var v = document.frm.tags.value + " " + name;
	document.frm.tags.value = v.trim();
}

function remove_tag(name) {
	var v = document.frm.tags.value.replace( new RegExp("( |^)"+name+"( |$)"), " ").trim();
	document.frm.tags.value = v;
}

function replace_tag(o, n) {
	var v = document.frm.tags.value.trim();
	v = v.replace( new RegExp("( |^)"+o+"( |$)"), "$1"+n+"$2");
	v = v.replace( / +/, " " );
	v = v.replace( new RegExp("^ */") , "");
	v = v.replace("**","*");
	document.frm.tags.value=v;
}

function current_tags() {
	var ret = new Object();
	var tags = document.frm.tags.value.split(" ");
	for (var t in tags) {
		ret[tags[t]] = 1;
	}
	return ret;
}

var yahoo_loaded = false;

function onkeydown_tag(evt) {
	evt = (evt) ? evt : event;
	var charCode = ( evt.keyCode || evt.charCode || evt.which || 0 );
	if (9==charCode) {
		var sc = should_complete();

		if (!sc || sc.length==0) {
			return true;
		}

		if (evt.preventDefault) evt.preventDefault();
		if (evt.stopPropagation) evt.stopPropagation();

		if (sc) {
			var cs = completions(sc);
			if (cs.length==1) {
				replace_tag( sc, cs[0]+" " );
				move_to_end_word( document.getElementById("tags"), 1 );
			} else if (cs.length>1) {
				replace_tag( sc, longest_completion(sc) );
				move_to_end_word( document.getElementById("tags"), 0 );
			}
		}
		return false;
	}
	if (13==charCode) {
		if (do_post()) {
			document.frm.submit();
		}
	}
	if (!yahoo_loaded) {
		load_yahoo();
	}
	return true;
}

function longest_completion(w) {
	var cs = completions(w);

	if (cs.length<2) return cs;

	var longest = 0;
	for (var i=0;i<cs.length;i++) {
		if (cs[i].length>longest) longest = cs[i].length;
	}

	var ret = "";
	for (var i=0;i<longest;i++) {
		var c = cs[0].charAt(i);
		for (var j=0;j<cs.length;j++) {
			if (cs[j].charAt(i)==null || cs[j].charAt(i)!=c) {return ret};
		}
		ret += c;
	}
	return ret;
}


function onchange_tag() {
	var tags = current_tags();
	if (tags==prev_tags_array) {return false;}

	new_tags_array = new Object();
	for (var t in tags) {
		new_tags_array[t] = 1;
		if (!prev_tags_array[t]) {
			var d = document.getElementById("yt--"+t);
			if (d) {
				d.className="suggest-selected";
			}
		}
	}

	for (var t in prev_tags_array) {
		if (new_tags_array[t] == undefined) {
			var d = document.getElementById("yt--"+t);
			if (d) {
				d.className="suggest";
			}
		}
	}
	prev_tags_array = tags;
	show_completions();
}

function have_tag(tag) {
	var tags = document.frm.tags.value.split(" ");
	for (t in tags) {
		if (tags[t]==tag) return true;
	}
	return false;
}

function yt_toggle(tag) {
	var anchor = document.getElementById("yt--"+tag);
	if (have_tag(tag)) {
		anchor.className = "suggest";
		remove_tag(tag);
	} else {
		anchor.className = "suggest-selected";
		add_tag(tag);
	}
	prev_tags_array = current_tags();
	document.frm.tags.focus();
}


function get_caret_pos(inp) {
	if(inp.selectionEnd != null) {
		return inp.selectionEnd;
	}
	// IE specific code
	var range = document.selection.createRange();
	var isCollapsed = range.compareEndPoints("StartToEnd", range) == 0;
	if (!isCollapsed) {
		range.collapse(false);
	}
	var b = range.getBookmark();
	return b.charCodeAt(2) - 2;
}

function set_caret_pos (o, pos) {
	if (o.selectionStart) {
		o.setSelectionRange(pos,pos);
	}
}

function move_to_end_word (o, extra_offset) {
	var p = get_caret_pos(o);
	for (var i = p; (i+extra_offset) <= o.value.length && o.value.charAt(i)!=" "; i++) {
		// do nothing
	}
	set_caret_pos(o, i+extra_offset);
}

function should_complete() {
	var t = document.getElementById("tags");

	var p = get_caret_pos(t);

	// Don't autocomplete if it's the first char
	if (p==0) return false;
	var c = t.value[p-1];

	// Char to left of cursor must be non-whitespace
	if (/[A-Za-z0-9_-]/.test(c) == null) return false;

	// Char to right of cursor shouldn't be non-whitespace
	if (t.value[p] != null && t.value[p] != " ") return false;

	// Move backwards to find out what the partial word acually is
	var i;
	var word = "";
	for (i=p-1;i>=0 && t.value.charAt(i)!=" ";i--) {
		word += t.value.charAt(i);
	}
	return word.split("").reverse().join("");
}

function completions(w) {
	var ret = [];
	w = w.replace("*", "\\*");
	try {
		var re = new RegExp("^"+w);
	} catch(err) {
		return ret;
	}
	var candidates = document.getElementById("yt-body").getElementsByTagName("a");
	for (var i=0;i<candidates.length;i++) {
		var c = candidates[i].innerHTML;
		if (c!=null && re.test(c)) {
		   	ret.push(c);
		}
	}

	var id = document.getElementById("yahoo-body");
	if (id) {
		candidates = id.getElementsByTagName("a");
		for (var i=0;i<candidates.length;i++) {
			var c = candidates[i].innerHTML;
			if (c!=null && re.test(c)) {
				ret.push(c);
			}
		}
	}

	return ret;
}

function show_completions() {
	var visible=false;
	var word = should_complete();

	var ih = "";
	if (word) {
		var comps = completions(word);

		for (i=0;i<comps.length;i++) {
			if (document.addEventListener) {
				ih += "<a class='suggest' href=\"javascript:replace_tag( should_complete(), '"+comps[i]+"'); document.getElementById('tags').focus()\">" + comps[i] + "</a> ";
			} else {
				ih += "<span>" + comps[i] + "<span> ";
			}
		}
		if (ih!="") {
			visible=true;
		}
		ih += "<div class='vague'>Press tab key to autocomplete</div>";
	}
	document.getElementById("suggestions-cell").innerHTML = ih;
	document.getElementById("suggestions-row").style.visibility = visible ? "visible" : "hidden";
}


function load_yahoo() {
	if (yahoo_loaded) {
		return;
	}

	yahoo_loaded = true;
	var data = jQuery("#yahooform").serialize();
	jQuery.getJSON("http://search.yahooapis.com/ContentAnalysisService/V1/termExtraction?"+data+"&callback=?", function(res) {
		showTags(res)
	});
}

function showTags(res) {
	if (res && res.ResultSet && res.ResultSet.Result) {
		var m = res.ResultSet.Result;
		var s = "";
		target = jQuery("#yahoo-body");
		target.empty();
		target.append("<div>Suggested tags</div>");
		for (i=0; i<m.length; i++) {
			var t = m[i].toLowerCase().replace(/\s+/g, "_").replace(/[^a-z0-9_-]/g, "");
			var id = "yt--"+t;
			if (jQuery("#"+id).length == 0) {
				target.append("<a id='"+id+"' class='suggest' href='javascript:yt_toggle(\""+t+"\")'>" + t+"</a> ");
			}
		}
	}
}

