// Set variables
registry = new Array();

// Create request
function ajax_request() {
	var req;

	// Create request
	try {
		req = new XMLHttpRequest();
	} catch (e) {
		try {
			req = new ActiveXObject('MSXML2.XMLHTTP');
		} catch (e) {
			try {
				req = new ActiveXObject('Microsoft.XMLHTTP');
			} catch(e) {
				alert('This web browser does not support remote HTTP requests (AJAX).  Please upgrade to a newer browser.');
			}
		}
	}
	
	//this.request = req;
	//this.parse_response = function() { 
	//	if (request.readyState == 4) {
	//		ajax_parse_response(this.request.responseText);
	//	}
	//}

	return req;
}

/////////////////////////////////////////
// Confirm / send AJAX request
/////////////////////////////////////////

// Confirm AJAX request
function ajax_confirm(message, function_alias, data) {
	var response = confirm(message);
	if (response === true) { ajax_send(function_alias, data); }
}

// Send remote request
function ajax_send(function_alias, data, hide_box, is_popup_panel) {
	if (!hide_box) { hide_box = 0; }
	if (!is_popup_panel) { is_popup_panel = 0; }

	// Get request
	var http = ajax_request();
	
	// Check form exists
	if (!document.forms[0]) { 
		alert("No HTML form exists on this web page.");
		return false;
	}

	// Check error count
	if (form_error_count > 0 && function_alias != 'validate_form_field') {
		alert("There are still errors within the form.  Please correct all shown errors before continuing.");
		return false;
	}

	// Show loading box
	var ajaxStatusBox;
	if (ajaxStatusBox = document.getElementById('ajaxStatusBox')) {

		// Get center of screen
		if (hide_box != 1) { 
			ajaxStatusBox.style.display = 'block';
			showDeadCenter(250, 150, 'ajaxStatusBox');
		}
	}
	
	// Get query string
	query = getQueryString();
 
	// Start data	
	if (data == '') { data = '_location=' + LOCATION; }
	else { data = data + '&_location=' + LOCATION; }
	if (is_popup_panel == 1) { data = data + '&is_popup_panel=1'; }

	// Get all form fields
	elements = document.forms[0].elements;
	for (x = 0; x < elements.length; x++) {
		var element = elements[x];

		if (element.type == 'checkbox' || element.type == 'radio') { 
			if (element.checked === true) { 
				data = data + '&' + element.name + '=' + ajax_format_value(element.value);
			}
				
		} else if (element.type == 'multiple-select') { 
		
			for (y = 0; y <= element.options.length; y++) {
				if (element.options[y].selected === true) {
					data = data + '&' + element.name + '=' + ajax_format_value(element.options[y].value);
				}
			}

		} else {
			data = data + '&' + element.name + '=' + ajax_format_value(element.value);
		}
	}

	// Send http request
	var url = SITE_URL + '/ajax/' + function_alias;
	http.open('POST', url, true);
	http.onreadystatechange = function() { 
		if (http.readyState == 4) { ajax_parse_response(http.responseText); }
	}
	http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	http.setRequestHeader("Content-length", data.length);
	http.setRequestHeader("Connection", "close");
	http.send(data);

}

/////////////////////////////////////////
// Format form value for AJAX
/////////////////////////////////////////

function ajax_format_value(value) { 

	// Format value
	value = escape(value);
	value = value.replace("+", "%2B");
	value = value.replace("/", "%2F");
	
	// Return
	return value;

}

/////////////////////////////////////////
// Parse response contents
/////////////////////////////////////////

function ajax_parse_response(response) {

	// Check response
	var onclick_args = '';

	// Check for no XML
	if (response.match(/DOCTYPE HTML PUBLIC/)) { 

		// Blur window
		var wrapper = document.getElementById('wrapper');
		wrapper.className = 'opac_body';

		// Open panel
		var panel;
		if (panel = document.getElementById('hidden_panel')) {
			var h = 350;

			// Set panel size
			panel.width = "400px";
			//panel.height = h + "px";

			// Display panel
			panel.style.display = 'block';
			panel.className = 'default_PopupPanel';
			panel.innerHTML = response;
			panel.innerHTML += '<a href="javascript:closePanel();">Close</a><br>';

			// Center panel
			showDeadCenter(400, 350, 'hidden_panel');
		}
	}

	// Parse XML response
	try {
		var xml = (new DOMParser()).parseFromString(response, "text/xml");
	} catch (e) {
		try {
			var xml = new ActiveXObject("Microsoft.XMLDOM");
			xml.loadXML(response);
		} catch (e) {
			alert("Unable to parse XML response from server.");
		}
	}
	
	// Go through XML
	var root = xml.documentElement;
	for (var t = 0; t < root.childNodes.length; t++) {
		var node = root.childNodes[t];
		var tag = node.tagName;
		var divid;

		// Alert
		if (tag == 'alert') { 
			alert(node.getElementsByTagName('message').item(0).firstChild.data);
			
		// Set display
		} else if (tag == 'set_display') { 
			if (divid = document.getElementById(node.getElementsByTagName("divid").item(0).firstChild.data)) {
				divid.style.display = node.getElementsByTagName("display").item(0).firstChild.data;
			}
		
		// Set z-index
		} else if (tag == 'set_zindex') { 
			if (divid = document.getElementById(node.getElementsByTagName("divid").item(0).firstChild.data)) {
				divid.style.zindex = node.getElementsByTagName("zindex").item(0).firstChild.data;
			}
		
		// Set text
		} else if (tag == 'set_text') {
			if (divid = document.getElementById(node.getElementsByTagName("divid").item(0).firstChild.data)) {
				divid.innerHTML = node.getElementsByTagName("text").item(0).firstChild.data;
			}

		// Set src
		} else if (tag == 'set_src') {
			if (divid = document.getElementById(node.getElementsByTagName("divid").item(0).firstChild.data)) {
				divid.src = node.getElementsByTagName("src").item(0).firstChild.data;
			}

		// Set href
		} else if (tag == 'set_href') {
			if (divid = document.getElementById(node.getElementsByTagName("divid").item(0).firstChild.data)) {
				divid.href = node.getElementsByTagName("href").item(0).firstChild.data;
			}

		// Append text
		} else if (tag == 'append_text') {
			if (divid = document.getElementById(node.getElementsByTagName("divid").item(0).firstChild.data)) {
				divid.innerHTML = divid.innerHTML + node.getElementsByTagName("text").item(0).firstChild.data;
			}
		
		// Set cookie
		} else if (tag == 'set_cookie') { 
		
			// Get info from XML
			var name = node.getElementsByTagName("cookie_name").item(0).firstChild.data;
			var value = node.getElementsByTagName("cookie_value").item(0).firstChild.data;

			// Set cookie
			document.cookie = name + "=" + value + "; path=/";
		
		// Delete cookie
		} else if (tag == 'delete_cookie') { 
			var name = node.getElementsByTagName("cookie_name").item(0).firstChild.data;
			document.cookie = name + "='';";
		
		// Set variable
		} else if (tag == 'set_variable') { 
			var name = node.getElementsByTagName("var_name").item(0).firstChild.data;
			var value = node.getElementsByTagName("var_value").item(0).firstChild.data;
			registry[name] = value;
			
		} else if (tag == 'eval_javascript') { 
			var code = node.getElementsByTagName("code").item(0).firstChild.data;
			eval(code);
			
		// Unset variable
		} else if (tag == 'unset_variable') { 
			var name = node.getElementsByTagName("var_name").item(0).firstChild.data;
			registry[name] = '';
		
		// Set value
		} else if (tag == 'set_value') { 
			var divid = node.getElementsByTagName("divid").item(0).firstChild.data;
			var value = node.getElementsByTagName("value").item(0).firstChild.data;
			value = value.replace(/NEWLINE/g, "\n");
			document.getElementById(divid).value = value;	
		
		// Clear select list
		} else if (tag == 'clear_select_list') { 
			var box;
			var divid = node.getElementsByTagName("divid").item(0).firstChild.data;
			if (box = document.getElementById(divid)) {
				for (x=0; x < box.options.length; x++) {
					if (!box.options[x]) { continue; }
					box.options[x] = null;
					x--;
				}
			}

		// Add select list option
		} else if (tag == 'add_select_option') {
			var box;
			var divid = node.getElementsByTagName("divid").item(0).firstChild.data;
			var option_key = node.getElementsByTagName("key").item(0).firstChild.data;
			var option_value = node.getElementsByTagName("value").item(0).firstChild.data;
			var option_selected = node.getElementsByTagName("selected").item(0).firstChild.data;

			if (box = document.getElementById(divid)) {
				var length = box.options.length;
				myOption = new Option(option_value, option_key);
				box.options[length] = myOption;
				if (option_selected == 1) { box.selectedIndex = length; }
			}
		
		// Set checked
		} else if (tag == 'set_checked') { 
		
			var divid = node.getElementsByTagName("divid").item(0).firstChild.data;
			var is_checked = node.getElementsByTagName("is_checked").item(0).firstChild.data;
			
			var div = document.getElementById(divid);
			if (is_checked == 1) { div.checked = true; }
			else { div.checked = false; }	
				
		// Validate form field
		} else if (tag == 'validate_form_field') { 
			var field_name = node.getElementsByTagName("field_name").item(0).firstChild.data;
			var validation_id = node.getElementsByTagName("validation_id").item(0).firstChild.data;
			var response = node.getElementsByTagName("response").item(0).firstChild.data;
			
			// Get variables
			var html = document.getElementById(validation_id);
			var box = document.forms[0][field_name];
		
			// Check result
			if (response == "OK") {
				if (box.style.background != '') { form_error_count--; }
				box.style.background = '';
				html.innerHTML = '';
			} else {
				if (box.style.background != '#CB9393') { form_error_count++; }
				box.style.background = '#CB9393';
				html.innerHTML = '<font color="#984747">' + response + '</font>';
			}

		// Open panel
		} else if (tag == 'open_panel') { 
		
			// Get variables
			var class_name = node.getElementsByTagName("class_name").item(0).firstChild.data;
			var contents = node.getElementsByTagName("contents").item(0).firstChild.data;
			var w = node.getElementsByTagName("width").item(0).firstChild.data;

			var wrapper = document.getElementById('wrapper');
			wrapper.className = 'opac_body';

			// Open panel
			var panel;
			if (panel = document.getElementById('hidden_panel')) { 
				var h = 350;

				// Set panel size
				panel.style.width = w + "px";
				//panel.height = h + "px";

				// Display panel
				panel.style.display = 'block';
				panel.className = class_name + '_PopupPanel';
				panel.innerHTML = contents;
				panel.innerHTML += '<a href="javascript:closePanel();"><img src="' + SITE_URL + '/icon/close.png" border="0"></a><br>';

				// Center panel
				showDeadCenter(w, h, 'hidden_panel');
			}
		
		// Close panel
		} else if (tag == 'close_panel') { 
			closePanel();
		
		// Set autosuggest items
		} else if (tag == 'set_autosuggest_items') { 

			// Clear existing items
			for (x = SuggestList.childNodes.length; x >= 0; x--) { 
				if (!SuggestList.childNodes[x]) { continue; }
				SuggestList.removeChild(SuggestList.childNodes[x]);
			}
			SuggestList.style.display = 'block';

			// Add items
			var itemNodes = node.getElementsByTagName("item");
			for (x=0; x < itemNodes.length; x++) { 

				// Set variables
				var id = itemNodes[x].getElementsByTagName("id").item(0).firstChild.data;
				var text = itemNodes[x].getElementsByTagName("text").item(0).firstChild.data;

				// Set item
				var item = document.createElement('li');
				item.id = id;
				item.innerHTML = text;
				item.className = 'item';

				// Add item
				item.onmouseover = AutoSuggest_MouseOver;
				item.onmouseout = AutoSuggest_MouseOut;
				item.onmousedown = AutoSuggest_MouseDown;
				SuggestList.appendChild(item);
			}
			SuggestList.style.display = 'block';

		// Add table row
		} else if (tag == 'add_table_row') { 
			
			// Get variables
			var table_id = node.getElementsByTagName("divid").item(0).firstChild.data;
			var offset = node.getElementsByTagName("offset").item(0).firstChild.data;

			// Get table
			var table = document.getElementById('tbl_' + table_id);
			var length = table.rows.length - offset;

			// Check for navigation row
			try {
				var temp_row = table.rows[(length - 1)];
				if (temp_row.id == 'tbl_navRow') { length--; }
			} catch (e) { }

			// Get class name
			var class_name = 'row1';
			try {
				var temp_row = table.rows[(length - 1)];
				if (temp_row.className == 'row1') { class_name = 'row2'; }
			} catch (e) { }
			
			// Add row
			var row = table.insertRow(length);
			row.className = class_name;
	
			// Set row events
			row.onmouseover = dataTable_rowOver;
			row.onmouseout = dataTable_rowOut;
			row.onclick = dataTable_rowClick;

			// Add cells
			var cellNodes = node.getElementsByTagName("set_table_cell");
			for (x = 0; x < cellNodes.length; x++) { 
				
				// Set variables
				var contents = '';
				var c = cellNodes[x].getElementsByTagName("cell_num").item(0).firstChild.data;
				try { 
					contents = cellNodes[x].getElementsByTagName("contents").item(0).firstChild.data;
				} catch (e) { } 
				
				// Get cell
				if (row.cells[c]) { cell = row.cells[c]; }
				else { cell = row.insertCell(c); }
				
				// Set align
				try {
					var align = cellNodes[x].getElementsByTagName("align").item(0).firstChild.data;
					cell.align = align;
					if (align != 'left') { cell.style.paddingLeft = 0; }
				} catch (e) { }
				
				// Set onclick
				try {
					var onclick_func = cellNodes[x].getElementsByTagName("onclick_func").item(0).firstChild.data;
					var onclick_args = cellNodes[x].getElementsByTagName("onclick_args").item(0).firstChild.data;

					onclick_args = onclick_args.replace("~row_num~", length);
					onclick_args = onclick_args.replace(/'/g, "");

					cell.onclick = new Function(onclick_func + "('" + onclick_args + "')");
				} catch (e) { }
				
				// Set contents
				cell.innerHTML = contents;
			}

		// Remove table row
		} else if (tag == 'remove_table_row') { 
			
			// Get variables
			var table_id = node.getElementsByTagName("divid").item(0).firstChild.data;
			var row_num = node.getElementsByTagName("row_num").item(0).firstChild.data;

			// Delete row
			var table = document.getElementById('tbl_' + table_id);
			if (table.rows[row_num]) {
				table.deleteRow(row_num);
			}

		// Get table row
		} else if (tag == 'get_table_row') { 
		
			// Get variables
			var table_id = node.getElementsByTagName("divid").item(0).firstChild.data;
			var row_num = node.getElementsByTagName("row_num").item(0).firstChild.data;

			// Get row
			var row;
			var table = document.getElementById('tbl_' + table_id);
			if (table.rows[row_num]) { row = table.rows[row_num]; }
			else { 

				// Get class name
				var class_name = 'row1';
				try {
					var temp_row = table.rows[(length - 1)];
					if (temp_row.className == 'row1') { class_name = 'row2'; }
				} catch (e) { }

				// Add row
				var length = table.rows.length;
				row = table.insertRow(length);

				// Set row events
				row.onmouseover = dataTable_rowOver;
				row.onmouseout = dataTable_rowOut;
				row.onclick = dataTable_rowClick;
			}
				
			// Add cells
			var cellNodes = node.getElementsByTagName("set_table_cell");
			for (x = 0; x < cellNodes.length; x++) {

				// Set variables
				var contents = '';
				var c = cellNodes[x].getElementsByTagName("cell_num").item(0).firstChild.data;
				try { 
					contents = cellNodes[x].getElementsByTagName("contents").item(0).firstChild.data;
				} catch (e) { }

				// Get cell
				if (row.cells[c]) { cell = row.cells[c]; }
				else { cell = row.insertCell(c); }

				// Set align
				try {
					var align = cellNodes[x].getElementsByTagName("align").item(0).firstChild.data;
					cell.align = align;
					if (align != 'left') { cell.style.paddingLeft = 0; }
				} catch (e) { }

				// Set contents
				cell.innerHTML = contents;
			}

		// Remove checked table rows	
		} else if (tag == 'remove_checked_table_rows') { 
		
			// Get info from XML
			var table_id = node.getElementsByTagName("divid").item(0).firstChild.data;
			var table = document.getElementById('tbl_' + table_id);
			var rows = table.rows;

			// Go through all rows
			for (x = 0; x <= rows.length; x++) {
				if (!rows[x]) { continue; }
				var row = rows[x];

				var elements = row.getElementsByTagName('input');
				for (e = 0; e <= elements.length; e++) {
					if (!elements[e]) { continue; }
					if (elements[e].type == 'checkbox' && elements[e].checked === true) {
						table.deleteRow(x);
						x--;
					}
				}
			}
		
		// Clear table rows
		} else if (tag == 'clear_table_rows') { 

			// Get info from XML
			var table_id = node.getElementsByTagName("divid").item(0).firstChild.data;
			var table = document.getElementById('tbl_' + table_id);
			var rows = table.rows;

			// Go through rows
			for (x = 0; x <= rows.length; x++) {
				if (!rows[x]) { continue; }
				var row = rows[x];

				if (row.className == 'row1' || row.className == 'row2' || row.className == 'activerow') { 
					table.deleteRow(x);
					x--;
				}
			}

		// Set table pagination links
		} else if (tag == 'set_table_pagination_links') {
			if (divid = document.getElementById('cell_navrow_' + node.getElementsByTagName("divid").item(0).firstChild.data)) {
				//divid.innerHTML = node.getElementsByTagName("html").item(0).firstChild.data;
			}
		}
	
	}

	// Hide loading
	var ajaxStatusBox;
	if (ajaxStatusBox = document.getElementById('ajaxStatusBox')) {
		ajaxStatusBox.style.display = 'none';
	}

}

function ajax_fill_table_row(row, row_num, node) { 



}
