function showAjaxWaitingScreen(div_id) {
	var e = $(div_id);
	if (e) {
		showAjaxWaitingScreenWithDim(div_id, e.up());
	}
}

function showAjaxWaitingScreenWithDim(div_id, dim_div) {
	var e = $(div_id);
	if (e) {
		// match overlay height to parent element (cause IE6 can't work with height:100% on absolutely positioned elements)
		e.setStyle({height: dim_div.getDimensions().height + 'px'});
		e.show();
	}
}
function hideAjaxWaitingScreen(div_id) {
	var e = $(div_id);
	if (e) e.hide();
}

function showDaveError(parentDiv, fmNode, insertBefore, form, filterErrDuplicates) {
	var errorNodes = fmNode.getElementsByTagName('Error');
	if (parentDiv) {
		// build error msg div
		var errorDiv = document.createElement("div");
		errorDiv.setAttribute("class", "errors");
		errorDiv.setAttribute("id", "errors");
		var msg = '';
		if (errorNodes && errorNodes.length > 0) {
			var errMsgs = $H();
			for (var i= 0; i<errorNodes.length; i++) {
				var lMsgs = errorNodes[i].getElementsByTagName('LongMessage');
				if (lMsgs && lMsgs.length > 0) {
					if(filterErrDuplicates) {
						errMsgs.set(lMsgs[0].firstChild.data, lMsgs[0].firstChild.data);						
					} else {
						msg += lMsgs[0].firstChild.data;
					}
				}
				// mark the error field
				addErrorClassToFieldset(errorNodes[i], form);
			}
			if(filterErrDuplicates) {
				var msgArr = errMsgs.values();
				if (msgArr.length > 1) {
					msg += '<ul>';
				}
				for (var i= 0; i<msgArr.length; i++) {
					if (msgArr.length > 1) {
						msg += '<li>';
					}
					msg+=msgArr[i];
					if (msgArr.length > 1) {
						msg += '</li>';
					}
				}				
				if (msgArr.length > 1) {
					msg += '</ul>';
				}
			}
		} else {
			msg += "A technical error occured. Please try again later.";
		}

		Element.update(errorDiv, msg);

		// put new error msg div in html doc
		var formerErrorDiv = findErrorDiv(parentDiv);
		if (formerErrorDiv) {
			parentDiv.replaceChild(errorDiv, formerErrorDiv); 
		} else {
			if (insertBefore && parentDiv.firstChild) {
				parentDiv.insertBefore(errorDiv, parentDiv.firstChild); 
			} else {
				parentDiv.appendChild(errorDiv);
			}
		}
	}
}

function clearDAVEErrors(parentDiv) {
	if (parentDiv) {
		parentDiv.getElementsBySelector('div.errors').each(function(item){
			item.remove();
		});
		parentDiv.getElementsBySelector('fieldset.error').each(function(item){
			item.removeClassName('error');
		});
	}
}

//helper --------------------------------------------------------------------------------------------------------------------------
function addErrorClassToFieldset(errorNode, form) {
	var fieldname = errorNode.getAttribute('FieldName');
	if (fieldname) {
		var fieldset = form.elements['fs_'+fieldname];
		if (fieldset) {
			if (!Element.hasClassName(fieldset,'error')) {
				Element.addClassName(fieldset,'error');
			}
		} else {
			//maybe it is a date or time dropdown form control
			var altFieldname = null;
			if (endsWith(fieldname, '_day')) {
				altFieldname = fieldname.substring(0, fieldname.length - '_day'.length);
			} else if (endsWith(fieldname, '_month')) {
				altFieldname = fieldname.substring(0, fieldname.length - '_month'.length);
			} else if (endsWith(fieldname, '_year')) {
				altFieldname = fieldname.substring(0, fieldname.length - '_year'.length);
			} else if (endsWith(fieldname, '_hour')) {
				altFieldname = fieldname.substring(0, fieldname.length - '_hour'.length);
			} else if (endsWith(fieldname, '_minute')) {
				altFieldname = fieldname.substring(0, fieldname.length - '_minute'.length);
			}
			if (altFieldname) {
				var fieldset = form.elements['fs_'+altFieldname];
				if (fieldset) {
					if (!Element.hasClassName(fieldset,'error')) {
						Element.addClassName(fieldset,'error');
					}
				} 
			}
		}
	}
}

function findErrorDiv(parentDiv) {
	var children = parentDiv.childNodes;
	if (children && children.length > 0) {
		for (var i= 0; i < children.length; i++) {
			if (children[i].getAttribute('id')=='errors') return children[i]; 
		}
	}
	return;
}

function endsWith(word, sub) {
	if (word && sub) {
		return word.lastIndexOf(sub)==(word.length-sub.length);
	}
	return false;
}

function displayContentByAjaxError(containerDivId) {
	var errorContainer = $('error_' + containerDivId);
	var initialContainer = $('initial_' + containerDivId);
	if (errorContainer && initialContainer) {
		initialContainer.hide();
		errorContainer.show();
	}
}

function getContentByAjax(url, method, regexp, containerDivId, callback) {

	new Ajax.Request(url, 
	{
		method: method,
		requestHeaders:  ['Pragma', 'no-cache', 'Cache-Control', 'must-revalidate','If-Modified-Since', document.lastModified],
		onCreate: function(transport) {
			transport.request.url = url  + (url.indexOf('?') >= 0 ? '&' : '?') + "extractContent=x&regExp="  + encodeURIComponent(regexp) ;
			transport.request.url = transport.request.url.replace(/&+/g, '&').replace(/\\?\\&/, '?').replace(/#$/, '');
		},
		onException: function() { 
		},
		onFailure: function() { 
			displayContentByAjaxError(containerDivId);
		},
		onSuccess: function(transport) 
		{			
			var initialContainer = $('initial_' + containerDivId);
			var successContainer = $('result_' + containerDivId);

			if (successContainer && initialContainer) {
				successContainer.hide();
				
				try {
					var myresponse = transport.responseText;
					if (myresponse) {
						successContainer.update(myresponse);
					} else {
						// could happen if the user clicks to a link before ajax request is back
					}
					
			    } catch (e) {
			    	displayContentByAjaxError(containerDivId);
			    }
				
				new Effect.Fade(initialContainer, {duration: 1.0});
				new Effect.Appear(successContainer, {duration: 1.0});
			}				
			if(callback && typeof window[callback] == 'function') {
				window[callback]();
			}
		}
	});
}

