// JavaScript Document

const ajax_Error_01 = 'Some functionality may not be avaliable in your browser!';
const ajax_Error_02 = 'Fatal Error: AJAX Object is not defined!';
const ajax_Error_03 = 'Ready State is not reconised...';

var ajax = false;

function ajax_Init() {
	
	// Initliaze AJAX Object...
	
	try {
		
		// For IE7+, Firefox, Chrome, Opera, Safari
		ajax = new XMLHttpRequest();
		
	} catch( e ) {
		
		try {
			
			// For IE6, IE5
			ajax = new ActiveXObject("Msxml2.XMLHTTP");
			
		} catch( e ) {
			
			try {
				
				// For IE6, IE5
				ajax = new ActiveXObject("Microsoft.XMLHTTP");
				
			} catch( e ) {
				
				alert(ajax_Error_01);
				return false;
				
			}
			
		}
		
	}
	
	return true;
	
}

function ajax_getFormData( objForm ) {
	
	if( !ajax ) {
		alert(ajax_Error_02);
		return false;
	}
	
	var str = "";
	var element = "";
	var field_title = "";
	var field_value = "";
	var field_name = "";
	
	for( var i = 0; i < objForm.elements.length; i++ ) {
		
		element = objForm.elements[i];
		field_title = element.title;
		field_value = element.value;
		field_name  = element.name;
		
		switch( element.type ) {
			
			case "text":
			case "hidden":
			case "password":
			case "textarea":
			default:
				
				if( encodeURI(field_title) == 'required' && encodeURI(field_value).length < 1 ) {
					alert('"' + field_name + '" is a required field, please complete...');
					element.focus();
					return false;
				}
				
				str += field_name + "=" + encodeURI(field_value) + "&";
				
				break;
			
			case "checkbox":
			case "radio":
				
				if( element.checked ) str += field_name + "=" + encodeURI(field_value) + "&";
				
				break;
			
			case "select":
				
				str += fn + "=" +  element.options[element.selectedIndex].value + "&";
				
				break;
				
		}
		
	}
	
	str = str.substr(0, (str.length - 1));
	
	return str;
	
}

function ajax_getRequest( id, file ) {
	
	if( !ajax ) {
		alert(ajax_Error_02);
		return false;
	}
	
	var ajax_elementId = document.getElementById(id);
	ajax.onreadystatechange = ajax_handleResponse;
	ajax.open('GET', file, false);
	ajax.send(null);
	
}

function ajax_sendRequest( id, form, file ) {
	
	if( !ajax ) {
		alert(ajax_Error_02);
		return false;
	}
	
	var ajax_elementId = document.getElementById(id);	
	if( str = ajax_getFormData(form) ) {
		ajax.onreadystatechange = ajax_handleResponse;
		ajax.open('POST', file + '?' + str + '&' + Math.random(), false);
		ajax.send(null);
	}
	
	return true;
	
}

function ajax_handleResponse() {
	
	if( !ajax ) {
		alert(ajax_Error_02);
		return false;
	}
	
	// Define Variables...
	var response = null;
	var ajax_readyState = null;
	var ajax_status = null;
	var ajax_responseText = null;
	
	ajax_readyState = ajax.readyState;
	switch( ajax_readyState ) {
		
		default:
			
			alert(ajax_Error_03);
			
			break;
			
		case 1: // Not Ready...
			
			response = 'Not Ready';
			
			break;
		
		case 2: // Ready...
			
			response = 'Ready';
			
			break;
			
		case 3: // Processing...
			
			response = 'Processing, Please Wait...';
			
			break;
		
		case 4: // Done..
			
			ajax_status = ajax.status;
			switch( ajax_status ) {
				
				default:
					break;
					
				case 200: // OK
				case 301: // Moved Permanently...
				case 302: // Found...
				case 303: // See Other...
				case 304: // Not Modified (Use Cached Copy)...
				case 307: // Temporary Redirect...
					
					response = ajax_responseText = ajax.responseText;
					
					break;
					
				case 401: // Not Authorised...
					
					response = 'HTTP/401 Not Authorised';
					
					break;
					
				case 403: // Forbidden...
					
					response = 'HTTP/403 Forbidden';
					
					break;
					
				case 404: // Not Found...
					
					response = 'HTTP/404 Not Found';
					
					break;
					
				case 500: // Internal Server Error...
					
					response = 'HTTP/500 Internal Server Error';
					
					break;
					
				case 503: // Service Unavaliable...
					
					response = 'HTTP/503 Service Unavaliable';
					
					break;
				
			}
			
			break;
		
	}
	
	ajax_elementId.innerHTML = response;
	
	return true;
	
}

function ajax_loadXML( xml ) {
	
	var xmlDoc = false;
	
	try {
		
		parser = new DOMParser();
		xmlDoc = parser.parseFromString(xml, 'text/xml');
		
	} catch( e ) {
		
		try {
			
			xmlDoc = ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.async = 'false';
			xmlDoc.loadXML(xml);
			
		} catch( e ) {
			
			alert('XML Parser Not Avaliable...');
			return false;
			
		}
		
	}
	
	return xmlDoc;
	
}

function ajax_parseXML( xml, tag ) {
	
	if( !xmlDoc ) {
		alert('xmlDoc not defined!');
		return false;
	}
	
	var xml_output = new Array();
	var xml_rawData = xmlDoc.getElementsByTagName(tag)[0];
	var i, j, record, object;
	
	for( i = 0; i < xml_rawData.childNodes.length; i++ ) {
		
		if( xml_rawData.childNodes[i].nodeType == 1 ) {
			
			record = xml_rawData.childNodes[i];
			object = xml_output[xml_output.length] = new Object();
			
			for( j = 0; j < record.childNodes.length; j++ ) {
				
				if( record.childNodes[j].nodeType == 1 ) {
					object[record.childNodes[j].tagName] = 
						record.childNodes[j].firstChild.nodeValue;
				} // IF 2
				
			} // FOR 2
			
		} // IF 1
		
	} // FOR 1
	
	return xml_output;
	
}

window.onload = ajax_Init();
