Ajax.Responders.register({
  onCreate: function() {
    document.body.style.cursor = 'wait';
  },
  onComplete: function() {
    document.body.style.cursor = 'default';
  }
});

function AjaxSubmit (f,h) {
	Form.disable(f);
	new Ajax.Request (
		f.action, 
		{
			method: f.method,
			parameters: Form.serialize(f),
			evalScripts: true,
			onSuccess: function (r) { 
				Form.enable(f);
				/* good debug alert */
				//alert (r.responseText);
				/* exit with alert if responseText begins with ! */
				if (r.responseText.substr(0,1) == '!') { 
					alert (r.responseText.substr(1,r.responseText.length));
				} else {
					eval(h)(r);
				}
			},
			onFailure: function (r) { Form.enable(f); alert ('Server-side failure. Please try again.'); },
			onException: function (r) { Form.enable(f); alert ('Client-side failure. Please try again.'); },
			on404: function (r) { Form.enable(f); alert ('Page not found. Report to webmaster.'); }
		}
	);
	return false;
}


// cross-browser compatible XMLHttpRequest
function newXMLHttpRequest () {
	var httpRequest = false;
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		httpRequest = new XMLHttpRequest();
		if (httpRequest.overrideMimeType) {
			//httpRequest.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	return httpRequest;
}

// populate elementId with fileName instantiating all JS code and linked JS
function loadInnerHTML (elementId, fileName, queryString) { // optional: queryString
	var el = document.getElementById(elementId);
	// just clearing the target container here - could be: clearInnerHTML(elementId); 
	el.innerHTML = '<div style="text-align:center;"><img src="/images/loading/spokes.gif" style="margin:64px" /></div>';
	var req = newXMLHttpRequest();
	if (req) { 
		req.onreadystatechange = function() { 
			alert (req.status);
			if (req.readyState == 4 && (req.status == 200 || req.status == 304)) { 
				var fileExtension = fileName.substring(fileName.lastIndexOf("."));
				if (fileExtension == '.js') {
					// this .js? sweet. eval the lot!
					eval (req.responseText);
				} else {
					// no .js extension? no problem! let's get our hands dirty
					el.innerHTML = req.responseText;
					var head = document.getElementsByTagName("head")[0];
					var re = /<script(\b[\s\S]*?)>([\s\S^<]*?)<\/script>/ig;
					var match;
					// loop through script tags
					while (match = re.exec(req.responseText)) {
						// generate new script element
						var script = document.createElement('script');
						script.type = 'text/javascript';
						script.defer = 'true';
						// check for src property in this script tag
						var isSrc = false;
						var reSrc = /<script[\s\S]*?src=\"([\s\S]*?)\"[\s\S]*?<\/script>/ig;
						var matchSrc;
						while (matchSrc = reSrc.exec(match[0])) {
							// set js file url as src property
							script.src = matchSrc[1];
							isSrc = true;
						}
						if (isSrc == false) {
							// OR write js code between script tags
							script.text=match[2];
						}
						// add to DOM
						head.appendChild(script);
					}
				}
			} 
		}; 
		req.open("POST", fileName, true); 
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send(queryString); 
		return false;
	}
} 

// simply clear elementId
function clearInnerHTML (elementId) { 
	var el = document.getElementById(elementId); 
	el.innerHTML = '';
}

function isFormEmpty (f) {
	for (i=0;i<f.elements.length;i++) if (f.elements[i].value.length > 0) return false;
	return true;
}

function buildJsArray (str) {
	var arr = new Array;
	var rawarr = new Array;
	
	/* strip first hat to prevent null element*/
	str = str.substring(1,str.length);
	
	/* build arr array from ^key~val format */
	rawarr = str.split("^");
	for (var i=0; i < rawarr.length; i++) {
		arr[i] = rawarr[i];
	}
	
	return arr;
}

/* form elements -> query string */
function form2QueryStr(docForm) {

	var strSubmitContent = '';
	var formElem;
	var strLastElemName = '';
	
	for (i = 0; i < docForm.elements.length; i++) {
		
		formElem = docForm.elements[i];
		switch (formElem.type) {
			// Text fields, hidden form elements
			case 'text':
			case 'hidden':
			case 'password':
			case 'textarea':
			case 'select-one':
				strSubmitContent += formElem.name + '=' + escape(formElem.value) + '&';
				break;
				
			// Radio buttons
			case 'radio':
				if (formElem.checked) {
					strSubmitContent += formElem.name + '=' + escape(formElem.value) + '&';
				}
				break;
				
			// Checkboxes
			case 'checkbox':
				if (formElem.checked) {
					// Continuing multiple, same-name checkboxes
					if (formElem.name == strLastElemName) {
						// Strip of end ampersand if there is one
						if (strSubmitContent.lastIndexOf('&') == strSubmitContent.length-1) {
							strSubmitContent = strSubmitContent.substr(0, strSubmitContent.length - 1);
						}
						// Append value as comma-delimited string
						strSubmitContent += ',' + escape(formElem.value);
					}
					else {
						strSubmitContent += formElem.name + '=' + escape(formElem.value);
					}
					strSubmitContent += '&';
					strLastElemName = formElem.name;
				}
				break;
				
		}
	}
	
	// Remove trailing separator
	strSubmitContent = strSubmitContent.substr(0, strSubmitContent.length - 1);
	// Preserve + symbols
	strSubmitContent = strSubmitContent.replace(/\+/g,'%2B');
	// Return formatted GET-style string
	return strSubmitContent;

}

function ajaxSubmit(thisForm, action, queryStr, isXML) {
	// locate submitButton
	document.body.style.cursor = "wait";
	if (queryStr == null) {
		for (i = 0; i < thisForm.elements.length; i++) {
			if (thisForm.elements[i].type == 'submit' || thisForm.elements[i].type == 'image') {
				// store value, disable submit button and switch cursor
				var submitButton = thisForm.elements[i];
				var submitButtonOriginalValue = submitButton.value;
				if (submitButton.style.width == '') submitButton.value = "One moment please";
				submitButton.disabled=1;
				break;
			}
		}
	}

	if (queryStr == null) {
		var formName = thisForm.name;
		var formAction = thisForm.action;
		var queryStr = form2QueryStr(thisForm); // define queryStr from all fields in formName
	} else {
		// populate formAction with defined action in this function call
		var formName = null;
		var formAction = action;
	}

	var httpRequest = false;
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		httpRequest = new XMLHttpRequest();
		if (httpRequest.overrideMimeType) {
			//httpRequest.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	// handle incompatibility
	if (!httpRequest) {
		alert('Unfortunately you browser doesn\'t support this feature.');
		return false;
	}
	httpRequest.onreadystatechange = function() {
		if (httpRequest.readyState == 4) {
			if (httpRequest.status == 200) {
				if (isXML) {
					eval('ajaxFormHandler(httpRequest.responseXML, formName, formAction, submitButton, submitButtonOriginalValue)');
				} else {
					eval('ajaxFormHandler(httpRequest.responseText, formName, formAction, submitButton, submitButtonOriginalValue)');
				}
			} else {
				alert('There was a problem with the request. (Code: ' + httpRequest.status + ')');
			}
		}
	};

	httpRequest.open('POST', formAction, true);
	httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	httpRequest.send(queryStr);
	return false;
}


function ajaxFormHandler (responseText, formName, formAction, submitButton, submitButtonOriginalValue) {
	if (responseText) {	
		// create an array of js functions
		funcArr = responseText.split("~JS_END~");
		for (var i = 0; i < funcArr.length; i++) {
			// skip loop if element is empty
			if (!funcArr[i]) continue;
			var varStr = new String();
			var argArray = new Array();
			// create an array of parameters for the function we're dealing with
			argArray = buildJsArray(funcArr[i]);
			// start looping at 1 cause 0 will be the function name, build parameter string
			for (var j = 1; j < argArray.length; j++) {
				varStr += '"'+argArray[j]+'",';
			}
			// chop off excess comma
			varStr = varStr.substring(0, (varStr.length - 1));
			clearHighlightedFields();
			// run function
			eval(argArray[0]+'('+varStr+')');
		}
		// enable, restore submit button value and default cursor
		if (submitButton != null) {
			submitButton.disabled=0;
			submitButton.value = submitButtonOriginalValue;
		}
		document.body.style.cursor = "default";
	} else {
		var formOriginalAction = document.forms[formName].action;
		document.forms[formName].action = document.forms[formName].action2.value;
		document.forms[formName].submit();
		document.forms[formName].action = formOriginalAction;
	}
}

function makeHttpRequest (url, callback_function, return_xml)
{
   var http_request = false;

   if (window.XMLHttpRequest) { // Mozilla, Safari,...
       http_request = new XMLHttpRequest();
       if (http_request.overrideMimeType) {
           http_request.overrideMimeType('text/xml');
       }
   } 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('Unfortunately you browser doesn\'t support this feature.');
       return false;
   }
   http_request.onreadystatechange = function() {
       if (http_request.readyState == 4) {
           if (http_request.status == 200) {
               if (return_xml) {
                   eval(callback_function + '(http_request.responseXML)');
               } else {
                   eval(callback_function + '(http_request.responseText)');
               }
           } else {
               alert('There was a problem with the request.(Code: ' + http_request.status + ')');
           }
       }
   }
   http_request.open('GET', url, true);
	http_request.setRequestHeader('Content-Type', 'text/html');
   http_request.send(null);
}

function validateForm (container, message, field) {
	if (field != null) {
		fields = field.split(",");
		for (i = 0; i < fields.length; i++) {
			document.getElementById(fields[i]).style.backgroundColor = '#ffa';
			document.getElementById(fields[i]).style.borderStyle = 'solid';
			document.getElementById(fields[i]).focus();
		}
	}
	document.getElementById(container).style.display = 'inline';
	document.getElementById(container).innerHTML = message;
}

function clearHighlightedFields(formName) {
	for (f = 0; f < document.forms.length; f++) {
		elems = document.forms[f];
		for (i = 0; i < elems.length; i++) {
			if (elems[i].type != "submit") elems[i].style.backgroundColor = '';
		}
	}
}


