var xmlTags = null;
var xmlTagsHTTP = null;
var bTagsLoading = true;
var aryTags = new Array();

var KEY_ENTER = 13;
var KEY_ESC = 27;
var KEY_DOWN = 40;
var KEY_UP = 38;
var KEY_LEFT = 37;
var KEY_RIGHT = 39;
var KEY_TAB = 9;

var bCancelNextKey = false;
var dvActiveSuggestion = null;
var sTagsCallbackID = '';

var txtSearch = null;

function tags_unload() {
	if (!!xmlTagsHTTP&& xmlTagsHTTP.readyState != 4) {
		xmlTagsHTTP.abort();
		xmlTagsHTTP = null;
	}
}

function tags_init_textbox(txtTags) {
	if (!!document.getElementById('txtTags')) {
		if (document.attachEvent) {
			txtTags.attachEvent('onkeydown', txtTags_keypress);
			txtTags.attachEvent('onkeyup', txtTags_keyup);
			txtTags.attachEvent('onfocus', txtTags_focus);
			txtTags.attachEvent('onblur', txtTags_blur);
		} else {
			txtTags.addEventListener('keypress', txtTags_keypress, true);
			txtTags.addEventListener('keyup', txtTags_keyup, true);
			txtTags.addEventListener('focus', txtTags_focus, true);
			txtTags.addEventListener('blur', txtTags_blur, false);
		}
	}
}

function tags_open() {
	xmlTagsHTTP = CreateXMLHTTP();
	if (!xmlTagsHTTP) {
		return;
	}
	
	xmlTagsHTTP.open('GET', '/feed_tags.aspx', true);
	xmlTagsHTTP.onreadystatechange = tags_XMLStateChange;
	xmlTagsHTTP.send(null);
}

function tags_XMLStateChange() {
	if (xmlTagsHTTP.readyState != 4) {
		return;
	}
	
	if (!xmlTagsHTTP.responseXML || !xmlTagsHTTP.responseXML.documentElement) { 
		return;
	}

	xmlTags = xmlTagsHTTP.responseXML.documentElement;

	var i = 0;
	var sTags = '';
	
	for (i = 0; i < xmlTags.childNodes.length; i++) {
		sTags += xmlTags.childNodes[i].nodeValue;
	}
		
	aryTags = sTags.split(',');

	tags_init_textbox(txtSearch);

	bTagsLoading = false;
}

function txtTags_selection_change(dvNewSelection) {
	if (dvNewSelection) {
		if (dvActiveSuggestion) {
			dvActiveSuggestion.className = '';
		}
		dvActiveSuggestion = dvNewSelection;
		dvActiveSuggestion.className = 'Active';
	}
}


function txtTags_selection_use(txtTags, dvSelection) {
	var iStartIndex = 0;
	var i = 0;
	

	for (i = 0; i < txtTags.value.length; i++) {
		if (txtTags.value.substr(i, 1) == ',') {
			iStartIndex = i + 1;
		}
	}

	if (iStartIndex == 0) {
		txtTags.value = dvSelection.getAttribute('tag');	
	} else {
		txtTags.value = txtTags.value.substr(0, iStartIndex) + ' ' + dvSelection.getAttribute('tag');	
	}

	suggestions_reset(document.getElementById(txtTags.getAttribute('suggestions-id')));
}

function txtTags_focus(e) {
	txtTags_keyup(e);
}

function txtTags_blur(e) {
	var txtTags = null;
	
	if (e.srcElement) {
		txtTags = e.srcElement;
	} else {
		txtTags = e.target;
	}

	sTagsCallbackID = txtTags.id;
	setTimeout(txtTags_blur_callback, 100);
}

function txtTags_blur_callback() {
	suggestions_reset(document.getElementById(document.getElementById(sTagsCallbackID).getAttribute('suggestions-id')));
}

function suggestions_reset(dvSuggestions) {
	dvSuggestions.style.display = 'none';
	dvActiveSuggestion = null;
	dvSuggestions.innerHTML = '';
}

function txtTags_keypress(e) {
	e = e||window.event;
	var key = e.keyCode || e.which;
	var txtTags = null;
	
	if (e.srcElement) {
		txtTags = e.srcElement;
	} else {
		txtTags = e.target;
	}

	if (!dvActiveSuggestion && key != KEY_DOWN && key != KEY_ESC) {
		if (key == KEY_ENTER) {
			suggestions_reset(document.getElementById(txtTags.getAttribute('suggestions-id')));
			bCancelNextKey = true;
		}
		return true;
	}

	switch (key) {
		case KEY_TAB:
		case KEY_ENTER:
			txtTags_selection_use(txtTags, dvActiveSuggestion);
			break;
		case KEY_DOWN:
			if (!dvActiveSuggestion) {
				txtTags_selection_change(document.getElementById(txtTags.getAttribute('suggestions-id')).firstChild);
			} else {
				txtTags_selection_change(dvActiveSuggestion.nextSibling);
			}
			dvActiveSuggestion.parentNode.scrollTop = dvActiveSuggestion.offsetTop;
			break;
		case KEY_UP:
			txtTags_selection_change(dvActiveSuggestion.previousSibling);
			dvActiveSuggestion.parentNode.scrollTop = dvActiveSuggestion.offsetTop;
			break;
		case KEY_ESC:
			suggestions_reset(document.getElementById(txtTags.getAttribute('suggestions-id')));
			break;
		default:
			return true;
			break;
	}
	bCancelNextKey = true;
	StopPropagation(e, true);
	return false;
}

function txtTags_keyup(e) {
	var txtTags = null;
	e = e||window.event;
	
	if (e.srcElement) {
		txtTags = e.srcElement;
	} else {
		txtTags = e.target;
	}

	var dvSuggestions = document.getElementById(txtTags.getAttribute('suggestions-id'));
	
	if (bTagsLoading || bCancelNextKey) {
		bCancelNextKey = false;
		if (txtTags.value.length == 0) {
			suggestions_reset(dvSuggestions);
		}
		return;
	}

	if (GetAttribute(txtTags, 'last-tags', '') == txtTags.value) {
		return;
	} else {
		txtTags.setAttribute('last-tags', txtTags.value);
	}
	
	var i = 0;
	var lTagMatchCount = 0;
	var sHTML = '';
	var iStartIndex = 0;
	var sMatch = '';

	for (i = 0; i < txtTags.value.length; i++) {
		if (txtTags.value.substr(i, 1) == ',') {
			iStartIndex = i + 1;
		}
	}
	
	sMatch = trim(txtTags.value.substr(iStartIndex, txtTags.value.length - iStartIndex));

	if (sMatch.length > 0) {
		for (i = 0; i < aryTags.length; i++) {
			if (aryTags[i].substr(0, sMatch.length) == sMatch) {
				sHTML += '<div onclick="txtTags_selection_use(document.getElementById(\'' + txtTags.id + '\'), this);" onmouseover="txtTags_selection_change(this);" tag="' + aryTags[i] + '">' + aryTags[i] + '</div>'
				lTagMatchCount++;
			}
		}
	}

	if (lTagMatchCount > 0) {
		dvSuggestions.innerHTML = sHTML;
		dvSuggestions.style.display = 'block';
	} else {
		suggestions_reset(dvSuggestions);
	}
	
	
}
