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.";
		}
		errorDiv.update(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;
}