// The JavaScript Junkyard // interesting and semi-useful JS snippets // from scottandrew.com/junkyard/js/ // copyright 2001 scott andrew lepera, damn you! // addEvent and removeEvent // cross-browser event handling for IE5+, NS6 and Mozilla function addEvent(elm, evType, fn, useCapture) { if (elm.addEventListener) { // dom standard elm.addEventListener(evType, fn, useCapture); return true; } else if (elm.attachEvent) { // ie var r = elm.attachEvent("on" + evType, fn); return r; } else { alert("Handler could not be added"); } } function removeEvent(elm, evType, fn, useCapture) { if (elm.removeEventListener) { elm.removeEventListener(evType, fn, useCapture); return true; } else if (elm.detachEvent) { var r = elm.detachEvent("on" + evType, fn); return r; } else { alert("Handler could not be removed"); } } /** End JavaScript Junkyard */ // checks for specific browser version, variable and dom support this.ver = navigator.appVersion; this.agent = navigator.userAgent this.dom = document.getElementById?1:0 this.ie8 = (this.ver.indexOf("MSIE 8") > -1 && this.dom)?1:0; this.ie7 = (this.ver.indexOf("MSIE 7") > -1 && this.dom)?1:0; this.ie5 = (this.ver.indexOf("MSIE 5") > -1 && this.dom)?1:0; this.ie6 = (this.ver.indexOf("MSIE 6") > -1 && this.dom)?1:0; this.ie4 = (document.all && !this.dom)?1:0; this.ie = this.ie4 || this.ie5 || this.ie6 || this.ie7 || this.ie8 this.mac = this.agent.indexOf("Mac") > -1 this.opera5 = this.agent.indexOf("Opera 5") > -1 this.ns6 = (this.dom && parseInt(this.ver) >= 5) ?1:0; this.ns4 = (document.layers && !this.dom)?1:0; this.bw = (this.ie8 ||this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera5 || this.dom) /** * Safely copy value into an existing field. */ function safeCopyValue(element, value) { if (document.forms[0].elements[element]) document.forms[0].elements[element].value = value; } /** * Clear and give focus to the specified lookup field. Lookup fields must conform to the following name convention: * [field]Name (example: personName) * [field]Id (example: personId) */ function clearLookupField(field) { safeCopyValue(field + "Id", ""); safeCopyValue(field + "Name", ""); if (document.forms[0].elements[field + "Name"]) document.forms[0].elements[field + "Name"].focus(); } /** * Make use of the add element cross browser function with multiples * elements of the same type. */ function addEventByNames(tagName, evType, fn, useCapture) { elements = document.getElementsByTagName(tagName); for (var i = 0; i < elements.length; i++) { addEvent(elements[i], evType, fn, useCapture); } } /** * Submit current form on ENTER key press event. */ function doSaveOnEnter(evt) { var code = 0; if (evt) // dom code = evt.keyCode; else if (window.event && window.event.keyCode) // ie code = window.event.keyCode; if (code == 13) { // ENTER KEY = 13 doSave(); } else { return true; } } /** * Submit form. */ function doSave() { safeCopyValue("action", "save"); document.forms[0].submit(); } function doSaveAndCancel(id) { safeCopyValue("action", "cancel"); var changed = "N"; try { changed = document.forms[0].elements["changed"].value; } catch(e) { // ignore } if (changed == "Y") { if (confirm("???egms.globals.messages.changeAware???")) { safeCopyValue("action", "saveAndCancel"); } } document.forms[0].submit(); } function doCancel() { safeCopyValue("action", "cancel"); document.forms[0].submit(); } /** * Hide selected element. */ function hideElement(element) { var obj = (typeof element == "string") ? document.getElementById(element) : element; obj.style.display = "none"; } function hideSection(event, element) { var strName; if (element != null) { strName = element; } else { strName = getTargetElement(event).name; } for (var i = 1; i < 12; i++) { if (document.getElementById(strName + "Container" + i)) hideElement(strName + "Container" + i); } } function putHideTriggerYesNo(element) { var obj = (typeof element == "string") ? document.getElementById(element) : element; if (obj == null) return; addEvent(obj, "click", hideSection, false); // hide section on loading when option checked if (obj.checked) { var strName = obj.name; strName = strName.replace("No"); strName = strName.replace("Yes"); hideSection(null, strName); } } /** * Show selected element. */ function showElement(element) { var obj = (typeof element == "string") ? document.getElementById(element) : element; obj.style.display = ""; } function showSection(event, element) { var strName; if (element != null) { strName = element; } else { strName = getTargetElement(event).name; } for (var i = 1; i < 15; i++) { if (document.getElementById(strName + "Container" + i)) showElement(strName + "Container" + i); } } function putShowTriggerYesNo(element) { var obj = (typeof element == "string") ? document.getElementById(element) : element; if (obj == null) return; addEvent(obj, "click", showSection, false); // hide section on loading when option checked if (obj.checked) { var strName = obj.name; strName = strName.replace("No"); strName = strName.replace("Yes") showSection(null, strName); } } /** * Compatibility function to get event target element. */ function getTargetElement(event) { if (event != null) return event.target || event.srcElement; else return null; } /** * Open a new browser window. */ function doPopup(url) { newwindow = window.open(url, '', 'width=800,height=750,resizable=true,scrollbars=true,toolbar=false,location=false,status=true,directories=false'); } /** * Add a new array file input to a zone in the web page named Container. The * count for the array must be held in a hidden input named Counter. */ function addArrayFileInput(element) { if (!dom) return; // grab the dom container in which we must add the file input var container = document.getElementById(element + 'Container'); // grab the dom counter and make sure its initialized var counter = document.getElementById(element + 'Counter'); if (!counter.value) counter.setAttribute("value", "0"); // prepare the dom structure var arrayName = element + "[" + counter.value + "]"; var divInput = document.createElement("div"); var space = document.createTextNode(" "); var removeLink = document.createElement("a"); removeLink.setAttribute("href", "javascript:removeArrayFileInput('" + arrayName + "')"); var removeLinkText = document.createTextNode("remove"); removeLink.appendChild(removeLinkText); // create the file input var fileInput = document.createElement("input"); fileInput.setAttribute("type", "file"); fileInput.setAttribute("name", arrayName); fileInput.setAttribute("id", arrayName); // append the file input and link into the prepared div into to the container divInput.appendChild(fileInput); divInput.appendChild(space); divInput.appendChild(removeLink); container.appendChild(divInput); // increment counter for next counter.value = parseInt(counter.value) + 1; } /** * Remove the array file input element from the document dom. */ function removeArrayFileInput(arrayElement) { if (!dom) return; // grab the file input dom element var fileInput = document.getElementById(arrayElement); // grab the container's parent and remove the child var container = fileInput.parentNode; var containerParent = container.parentNode; containerParent.removeChild(container); } /** * Call delete attachments service with an array of ids. Attachments to delete must * be named Delete and checkboxes. This function differs to deleteDocumentStudies * as it calls specific deleteDocumentXxx actions, it always delete the same attachment * type in the same form. */ function deleteDocuments(element, url) { if (!dom) return; var newUrl = url; // grap all elements named Delete var elements = document.getElementsByName(element + "Delete"); var params = ""; // build params with the checked attachments to delete for (var i = 0; i < elements.length; i++) { var attachmentToDelete = elements[i]; if (attachmentToDelete.checked == true) { newUrl = addParameter(newUrl, "id", attachmentToDelete.value); } } // call delete attachments service window.location = newUrl; } /** * Add a parameter to an url. */ function addParameter(url, parameterName, parameterValue) { var newUrl; var parameterString = url.replace(/.*\?(.*)/, "$1"); var parameterTokens = parameterString.split("&"); if (url.indexOf("?") != -1) { newUrl = url + "&"; } else { newUrl = url + "?"; } newUrl = newUrl + parameterName + "=" + parameterValue; return newUrl; }