var http_request = false;
var request_queue = new Array();

function stateChange() {
	if (http_request.readyState == 4) {
		if (http_request.status == 200) {
			result = http_request.responseText;
			http_request = false;

			var o = request_queue.shift();
			o.on_success(result,o.tag);

			if (request_queue.length > 0)
				doRequest();
		} else {
			alert('There was a problem with the request.');
		}
	}
}

function createNewHttpRequest() {
	var http_request = false;
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
			// set type accordingly to anticipated content type
			http_request.overrideMimeType('text/plain');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}

	if (!http_request) {
		alert('Cannot create XMLHTTP instance');
		return false;
	} else {
		return http_request;
	}
}

function doRequest() {
	var req = request_queue[0];	
	http_request = createNewHttpRequest();
	http_request.onreadystatechange = stateChange;

	if (req.rtype == 'get') {
		http_request.open('GET', req.url + req.parameters, true);
		http_request.send(null);
	} else if (req.rtype == 'post') {
		http_request.open('POST', req.url, true);
		http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		http_request.send(req.parameters);
	}
}

function queueGeneric(rtype, url, parameters, on_success, tag, rclass) {
	var req = new Object;
	req.rtype = rtype;
	req.on_success = on_success;
	req.url = url;
	req.tag = tag;
	req.parameters = parameters;
	req.rclass = rclass;

	if (rclass != undefined)
		for (var i = request_queue.length - 1; i >= 0; i--)
			if (request_queue[i].rclass == rclass)
				request_queue.splice(i, 1);

	request_queue.push(req);
	if (request_queue.length == 1)
		doRequest();
}

function queueRequest(url, parameters, on_success, tag, rclass) {
	queueGeneric('get', url, parameters, on_success, tag, rclass);
}

function queuePost(url, parameters, on_success, tag, rclass) {
	queueGeneric('post', url, parameters, on_success, tag, rclass);
}

function unescape_html(html) {
	return String(html).replace(/&brvbar;/g,'|').replace(/&gt;/g,'>').replace(/&lt;/g,'<').replace(/&quot;/g,'"').replace(/&#039;/g,'\'').replace(/&amp;/g,'&');
}

function escape_html(html) {
	return String(html).replace(/&/g,'&amp;').replace(/\|/g,'&brvbar;').replace(/>/g,'&gt;').replace(/</g,'&lt;').replace(/"/g,'&quot;').replace(/'/g,'&#039;');
}

function nl2br(text) {
	return String(text).replace(/\r\n/g,'<br />').replace(/\n/g,'<br />').replace(/\r/g,'<br />');
}

function removeAllOptions(element) {
	while (element.firstChild)
		element.removeChild(element.firstChild);
}

function addOption(selectbox, value, text, cn) {
	var optn = document.createElement("option");
	optn.innerText = text; //ie hack
	optn.text = text; //everything else
	optn.value = value;
	if (cn != undefined)
		optn.className = cn;

	selectbox.appendChild(optn);
}

function displayOptions(result,tag) {
	res = result.split("|");
	elem = document.getElementById(tag);

	removeAllOptions(elem);
	for (var i=0; i<res.length; i+=2)
		addOption(elem, unescape_html(res[i]), unescape_html(res[i+1]));
}

function displayVarietalOptions(result,tag) {
	var res = result.split("|");
	var j = 1;
	var elem;

	while (elem = document.getElementById(tag + j)) {
		removeAllOptions(elem);
		for (var i=0; i<res.length; i+=3)
			addOption(elem, unescape_html(res[i]), unescape_html(res[i+1]), unescape_html(res[i+2]));
		j++;
	}
}

function dummy(result,tag) {
	alert(result+'|'+tag);
}

function getCC() {
	var elem = document.getElementById('Country');
	return elem.options[elem.selectedIndex].value
}

function activateTab(tabnum) {
	for (var i=1; i <= 6; i++) {
		var elem = document.getElementById('tab'+i);
		if (elem)
			elem.style.display = 'none';
	}
	document.getElementById('tab'+tabnum).style.display = 'block';
}

function toggle(id) {
	toggleElement(document.getElementById(id));
}

function toggleRows(id, suffixes) {
	var elem;
	for (var i = 0; i < suffixes.length; i++)
		if (elem = document.getElementById(id + '_' + suffixes[i]))
			toggleElement(elem);
}

function toggleElement(elem) {
	if (elem.style.display == 'none')
		elem.style.display = '';
	else
		elem.style.display = 'none';
}

function chainToggle(elementNames) {
	var index = document.getElementById(elementNames[0]).toggleIndex;
	if (index == undefined)
		index = 0;

	for (var i = 0; i < elementNames.length; i++)
		document.getElementById(elementNames[i]).style.display = 'none';

	if (++index >= elementNames.length)
		index = 0;

	document.getElementById(elementNames[index]).style.display = '';

	document.getElementById(elementNames[0]).toggleIndex = index;
}

function toggleLargeImgPlus(id) {
	var elem = document.getElementById(id);
	var imgname = elem.src.split('/');
	imgname = imgname[imgname.length - 1];

	if (imgname == 'largeplus.png')
		elem.src = '/images/largeminus.png';
	else
		elem.src = '/images/largeplus.png';
}

function toggleImgPlus(id) {
	var elem = document.getElementById(id);
	var imgname = elem.src.split('/');
	imgname = imgname[imgname.length - 1];

	if (imgname == 'plus.png')
		elem.src = '/images/minus.png';
	else
		elem.src = '/images/plus.png';
}

function getKey(e) {
	if (window.event)
		return window.event.keyCode;
	else if (e)
		return e.which;
	else
		return null;
}

function isEnter(e) {
	return (getKey(e) == 13);
}

function searchOnKeyPress(e,pid) {
	var ep = isEnter(e);
	if (ep)
		document.getElementById(pid + 'Button').onclick();
	return !ep;
}

function getElementInnerText(elem) {
	var ctext;
	if (false && elem.innerText !== undefined) {
		ctext = elem.innerText;
	} else {
//fixme, unsafe
		ctext = elem.innerHTML.replace(/<br>/g,'\n').replace(/<BR>/g,'\n');
/*
		var range = document.createRange();
		range.selectNodeContents(elem);
		ctext = range.toString();
*/
	}
	return ctext;
}

function replaceChildNodesWithText(elem, text) {
	while (elem.childNodes[0] !== undefined)
		elem.removeChild(elem.childNodes[0]);
	
	var lines = String(text).split('\r\n');
	if (lines[0] == text)
		lines = String(text).split('\n');
	if (lines[0] == text)
		lines = String(text).split('\r');

	var i = 0;
	for (var i = 0; i < lines.length - 1; i++) {
		elem.appendChild(document.createTextNode(lines[i]));
		elem.appendChild(document.createElement('br'));
	}
	elem.appendChild(document.createTextNode(lines[i]));
}

function createNumericInput(value, nstyle) {
	if (nstyle)
		return "<input type='text' class='numeric' style='" + nstyle + "' value='" + escape_html(value) + "' />";
	else
		return "<input type='text' class='numeric' value='" + escape_html(value) + "' />";
}

function getNumericValue(elem) {
	var iv = parseInt(elem.getElementsByTagName("input")[0].value, 10);

	if (isNaN(iv) || iv < 0)
		return false;

	return iv;
}

function destroyNumericInput(elem) {
	var iv = getNumericValue(elem);
	replaceChildNodesWithText(elem, iv);
	return iv;
}

function createCurrencyInput(value, nstyle) {
	if (nstyle)
		return "<input type='text' class='numeric' style='" + nstyle + "' value='" + escape_html(value) + "' />";
	else
		return "<input type='text' class='numeric' value='" + escape_html(value) + "' />";
}

function getCurrencyValue(elem) {
	var iv = parseFloat(elem.getElementsByTagName("input")[0].value, 10);

	if (isNaN(iv) || iv < 0)
		return false;

	return iv.toFixed(2);
}

function destroyCurrencyInput(elem) {
	var iv = getCurrencyValue(elem);
	replaceChildNodesWithText(elem, iv);
	return iv;
}


function createShortTextInput(value) {
	return "<input class='text fw' type='text' value='" + escape_html(value) + "' />";
}

function getShortTextValue(elem) {
	var lt = elem.getElementsByTagName("input")[0];
	return lt.value;
}

function destroyShortTextInput(elem) {
	var iv = getShortTextValue(elem);
	replaceChildNodesWithText(elem, iv);
	return iv;
}

function createYearRangeInput(value) {
	var years = value.split(' - ');
	return createNumericInput(years[0], 'width: 4em') + ' - ' + createNumericInput(years[1], 'width: 4em');
}

function getYearRangeValue(elem) {
	var ivt1 = elem.getElementsByTagName("input")[0].value;
	var ivt2 = elem.getElementsByTagName("input")[1].value;	

	if (ivt1 == '' && ivt2 == '')
		return ' - ';

	var iv1 = parseInt(ivt1, 10);
	var iv2 = parseInt(ivt2, 10);

	if (isNaN(iv1) || iv1 < 1900 || iv1 > 2100 || isNaN(iv2) || iv2 < 1900 || iv2 > 2100 || iv2 < iv1)
		return false;

	return iv1 + ' - ' + iv2;
}

function destroyYearRangeInput(elem) {
	var iv = getYearRangeValue(elem);
	replaceChildNodesWithText(elem, iv);
	return iv;
}


function createLongTextInput(value) {
	return "<textarea class='text' style='width:100%' rows='6'>" + escape_html(value) + "</textarea>";
}

function getLongTextValue(elem) {
	var lt = elem.getElementsByTagName("textarea")[0];
	return lt.value;
}

function destroyLongTextInput(elem) {
	var iv = getLongTextValue(elem);
	replaceChildNodesWithText(elem, iv);
	//elem.innerHTML = nl2br(escape_html(iv));
	return iv;
}

function createComboBoxInput(value, values, nstyle) {
	var ih;
	var i;

	for (i = 0; i < values.length; i++) {
		if (values[i]) {
			if (value == values[i])
				ih += '<option value="' + values[i] + '" selected="selected">' + values[i] + '</option>';
			else
				ih += '<option value="' + values[i] + '">' + values[i] + '</option>';
		}
	}

	if (nstyle)	
		return "<select class='combobox' style='" + nstyle + "'>" + ih + "</select>";
	else
		return "<select class='combobox'>" + ih + "</select>";
}

function getComboBoxValue(elem) {
	var cb = elem.getElementsByTagName("select")[0];
	return cb.options[cb.selectedIndex].value;
}

function destroyComboBoxInput(elem) {
	var iv = getComboBoxValue(elem);
	replaceChildNodesWithText(elem, iv);
	return iv;
}

function createPriceInput(value, values) {
	var c = value.split(' ');
	return createCurrencyInput(c[0], 'width: 6em') + ' ' + createComboBoxInput(c[1], values, 'width: 5em');
}

function getPriceValue(elem) {
	var pf = getCurrencyValue(elem);
	var cb = getComboBoxValue(elem);

	if (pf == false || cb == false)
		return '';

	return pf + ' ' + cb;
}

function destroyPriceInput(elem) {
	var iv = getPriceValue(elem);
	replaceChildNodesWithText(elem, iv);
	return iv;
}

function editRowsCallback(result,tag) {
	//dummy(result,tag);

	if (result == 'success') {
		if (editing[tag]) {
			editing[tag] = false;


			for (var i = 0; i < editfields.length; i++) {
				var cfield = document.getElementById('a' + tag + '_' + editfields[i][0]);
				var cftype = editfields[i][1];

				if (!cfield)
					continue;

				if (cftype == 'Numeric')
					destroyNumericInput(cfield);
				else if (cftype == 'ShortText')
					destroyShortTextInput(cfield);
				else if (cftype == 'LongText')
					destroyLongTextInput(cfield);
				else if (cftype == 'ComboBox')
					destroyComboBoxInput(cfield);
				else if (cftype == 'YearRange')
					destroyYearRangeInput(cfield);
				else if (cftype == 'Price')
					destroyPriceInput(cfield);
			}

			var elem = document.getElementById('a' + tag + '_info');
			if (elem.style.display != 'none') {
				toggle('a' + tag + '_info');
				toggleLargeImgPlus('a' + tag + '_plus');
				toggle('a' + tag + '_cr');
			}
		}
	} else if (result) {
		alert(result);
	} else {
		alert('Unknown error');
	}
}

function editRows(id, rv, sessionid, editing, fields, rowtype) {
	var rvnum;
	if (rowtype == 'tasting')
		rvnum = 3;
	else if (rowtype == 'cellar')
		rvnum = 2;

	var rownum = id.substring(1);

	if (!editing[rownum]) {
		var oldvalues = new Array();
		for (var i = 0; i < fields.length; i++) {
			var cfield = document.getElementById(id + '_' + fields[i][0]);
			if (cfield)
				oldvalues[i] = getElementInnerText(cfield);
		}

		editing[rownum] = oldvalues;

		for (var i = 0; i < fields.length; i++) {
			var cfield = document.getElementById(id + '_' + fields[i][0]);

			if (!cfield)
				continue;

			var ctext = getElementInnerText(cfield);

			if (fields[i][1] == 'Numeric')
				cfield.innerHTML = createNumericInput(ctext, 'width: 3em;');
			else if (fields[i][1] == 'ShortText')
				cfield.innerHTML = createShortTextInput(cctext);
			else if (fields[i][1] == 'LongText')
				cfield.innerHTML = createLongTextInput(ctext, 'width: 97%');
			else if (fields[i][1] == 'ComboBox')
				cfield.innerHTML = createComboBoxInput(ctext, fields[i][3]);
			else if (fields[i][1] == 'YearRange')
				cfield.innerHTML = createYearRangeInput(ctext);
			else if (fields[i][1] == 'Price')
				cfield.innerHTML = createPriceInput(ctext, fields[i][3]);
		}


		var elem = document.getElementById(id + '_info');
		if (elem.style.display == 'none') {
			toggle(id + '_info');
			if (rowtype == 'tasting')
				toggle(id + '_cr');
			toggleLargeImgPlus(id + '_plus');
		}
	} else {
		var validfields = true;

		for (var i = 0; i < fields.length; i++) {
			var cfield = document.getElementById(id + '_' + fields[i][0]);
			if (!cfield)
				continue;
			if (fields[i][1] == 'Numeric')
				validfields = validfields && (getNumericValue(cfield) !== false);
			else if (fields[i][1] == 'ShortText')
				validfields = validfields && (getShortTextValue(cfield) !== false);
			else if (fields[i][1] == 'LongText')
				validfields = validfields && (getLongTextValue(cfield) !== false);
			else if (fields[i][1] == 'ComboBox')
				validfields = validfields && (getComboBoxValue(cfield) !== false);
			else if (fields[i][1] == 'YearRange')
				validfields = validfields && (getYearRangeValue(cfield) !== false);
			else if (fields[i][1] == 'Price')
				validfields = validfields && (getPriceValue(cfield) !== false);

			if (!validfields) {
				alert(fields[i][2]);
				break;
			}
		}

		if (!validfields)
			return;

		var mvalues = new Array();
		for (var i = 0; i < fields.length; i++) {
			var cfield = document.getElementById(id + '_' + fields[i][0]);
			if (!cfield)
				continue;
			if (fields[i][1] == 'Numeric')
				mvalues[i] = getNumericValue(cfield);
			else if (fields[i][1] == 'ShortText')
				mvalues[i] = getShortTextValue(cfield);
			else if (fields[i][1] == 'LongText')
				mvalues[i] = getLongTextValue(cfield);
			else if (fields[i][1] == 'ComboBox')
				mvalues[i] = getComboBoxValue(cfield);
			else if (fields[i][1] == 'YearRange')
				mvalues[i] = getYearRangeValue(cfield);
			else if (fields[i][1] == 'Price')
				mvalues[i] = getPriceValue(cfield);
		}

		var postquery = 'action=' + rowtype + 'update&sid='+sessionid +'&wine='+rv[rownum*rvnum]+'&year='+rv[rownum*rvnum+1];
		if (rowtype == 'tasting')
			postquery += '&rownum='+rv[rownum*rvnum+2];
		else if (rowtype == 'cellar')
			postquery += '&currentstorage='+encodeURI(editing[rownum][0]);

		for (var i = 0; i < fields.length; i++)
			if (mvalues[i] !== undefined && (mvalues[i] != editing[rownum][i] || (fields[i][0] == 'storage' && rowtype == 'cellar')))
				postquery += '&' + fields[i][0] + '=' + encodeURI(String(mvalues[i]));

		//alert(postquery);
			
		queuePost('mcb.php',postquery,editRowsCallback,rownum);
	}
}

function deleteRowsCallback(result,tag) {
	//dummy(result,tag);

	if (result == 'success') {
		var elem;
		
		if (elem = document.getElementById(tag[1]))
			elem.parentNode.removeChild(elem);

		if (elem = document.getElementById(tag[1] + '_sr'))
			elem.parentNode.removeChild(elem);

		if (elem = document.getElementById(tag[1] + '_info'))
			elem.parentNode.removeChild(elem);

		editing[tag[0]] = false;
	} else if (result) {
		alert(result);
	} else {
		alert('Unknown error');
	}
}

function deleteRows(id, rv, sessionid, editing, rowtype, prompttext) {
	if (confirm(prompttext)) {
		var rvnum;
		if (rowtype == 'tasting')
			rvnum = 3;
		else if (rowtype == 'cellar')
			rvnum = 2;

		var rownum = id.substring(1);

		var postquery = 'action=' + rowtype + 'delete&sid=' + sessionid + '&wine=' + rv[rownum*rvnum] + '&year=' + rv[rownum*rvnum+1];

		if (rowtype == 'tasting')
			postquery += '&rownum=' + rv[rownum*rvnum+2];		
		else if (rowtype == 'cellar') {
			if (editing[rownum])
				postquery += '&currentstorage=' + encodeURI(editing[rownum][0]);
			else
				postquery += '&currentstorage=' + encodeURI(getElementInnerText(document.getElementById(id + '_storage')));
		}

		//alert(postquery);

		queuePost('mcb.php',postquery,deleteRowsCallback,new Array(rownum, id));
	}
}

function deleteGenericRows(id, sessionid, actionname, values, prompttext) {
	if (confirm(prompttext)) {
		var rownum = id.substring(1);
		var postquery = 'action=' + actionname + '&sid=' + sessionid + values;

		//alert(postquery);

		queuePost('mcb.php',postquery,deleteRowsCallback,new Array(rownum, id));
	}
}
