/**
* $Source: /home/cvs/cvsroot/cms/integration/web/components/form/form.js,v $
* $Author: mpih $
* $Revision: 1.54 $
* $Date: 2010/10/20 20:47:45 $
**/
var MONTH_LENGTH =
new Array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var RESERVED_NAMES =
new Array('totalcomments', 'lastcommentdate', 'firstcommentdate', 'length');
// CAPTCHA - begin
/**
* Issues a new image CAPTCHA challenge.
*/
function changeCaptcha(captchaType) {
var img = document.getElementById("captcha-image");
if (img) {
img.style.display = '';
var now = new Date();
var millis = Date.parse(now);
img.src = "/system/servlet/captcha?nocache=" + millis;
}
var audioPlayer = document.getElementById('captcha-audio');
if (audioPlayer) {
audioPlayer.style.display = 'none';
}
if (window.event) {
window.event.returnValue = false;
}
return false;
}
/**
* Issues a new audio CAPTCHA challenge.
*/
function changeAudioCaptcha() {
var img = document.getElementById("captcha-image");
if (img) {
img.style.display = 'none';
}
var audioPlayer = document.getElementById('captcha-audio');
if (audioPlayer) {
audioPlayer.style.display = '';
var now = new Date();
var millis = Date.parse(now);
// For the inline audio player, we need the fully-qualified URL to the Captcha service.
var captchaURL = location.protocol + '//' + location.host + '/system/servlet/captcha?type=sound&nocache=' + millis;
// Use a different audio player depending on the browser.
// - Apple QuickTime for Opera and Safari.
// - Windows Media Player for everything else.
if (YAHOO.env.ua.opera || YAHOO.env.ua.webkit) {
audioPlayer.innerHTML = '';
} else {
audioPlayer.innerHTML='';
}
}
if (window.event) {
window.event.returnValue = false;
}
return false;
}
function validateCaptcha(formName) {
var form = document.forms[formName];
if (! form) {
return true;
}
var captcha = form.elements["captcha"];
if (! captcha) {
return true;
}
RPCHandler.setResponseHandler("CAPTCHA_VALID",
new Function("handleValidCaptcha('" + formName + "')"));
RPCHandler.setResponseHandler("CAPTCHA_INVALID",
new Function("handleInvalidCaptcha('" + formName + "')"));
RPCHandler.submit("/system/actions/captcha-verify.jsp?answer=" +
captcha.value);
if (window.event) {
window.event.returnValue = false;
}
return false;
}
function handleValidCaptcha(formName) {
var form = document.forms[formName];
if (! form) { return; }
form.submit();
}
function getCaptchaType() {
var img = document.getElementById("captcha-image");
var audioPlayer = document.getElementById('captcha-audio');
var type = null;
if (img && img.style.display != 'none') {
type = 'image';
} else if (audioPlayer && audioPlayer.style.display != 'none') {
type = 'audio';
} else {
throw('Invalid captcha type.');
}
return type;
}
function handleInvalidCaptcha(formName) {
var form = document.forms[formName];
if (! form) { return; }
var captcha = form.elements["captcha"];
if (! captcha) { return; }
var captchaType = getCaptchaType();
if (captchaType == 'audio') {
alert("Your answer to the challenge does not match the audio sample. " +
"Please try again.");
changeAudioCaptcha();
}
if (captchaType == 'image') {
alert("Your answer to the challenge does not match the image. " +
"Please try again.");
changeCaptcha();
}
captcha.value = '';
try {
captcha.focus();
} catch (e) {}
// Make sure submit buttons are enabled if an invalid CAPTCHA answer
// prevented a form submit.
toggleSubmitButtons(false);
}
// CAPTCHA - end
function isLeapYear(year){
return (year % 4 == 0 && ((year % 100 != 0) || (year % 400 == 0)));
}
function isButtonGroup(element) {
return (! element.tagName && element.length);
}
function isSelect(element) {
return (element.type == "select-one");
}
function check4KLengths(formName) {
var form = document.forms[formName];
if (! form) { return; }
var elements = form.elements;
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
if (element.name == "body" || element.id == "body") { continue; }
if (element.tagName == 'INPUT' && element.type == "hidden") {
continue;
}
if (! element.value) {
continue;
}
if (element.value.length > 4000) {
alert("The text of field '" + element.name +
"' is longer than the limit of 4000 characters " +
"(current width " + element.value.length + ")");
element.focus();
if (window.event) {
window.event.returnValue = false;
}
return false;
}
}
return true;
}
/**
* Validates a form for duplicate fields. Form fields includes
* WYSIWYG editor fields.
*
* @param form The form
* @param element The form field
* @param name The name of the field
* @return false if a dupe field is found, otherwise true
*/
function checkDupeFieldName(element, name, form) {
if (! form) {
form = element.form;
}
if (form) {
// Search for a form field with the same name.
// Note: form.elements[name] did not work for radio buttons,
// so instead, we iterate over each form element.
var testElement;
var fields = form.elements;
for (var i=0; i max) {
if (message != "") {
alert(message);
}
element.focus();
if (window.event) { window.event.returnValue = false; }
return false;
}
return true;
}
function checkEmailValue(s) {
var emailPattern = /^.+@.+\..{2,}$/;
if (! emailPattern.test(s)) {
return false;
}
var illegalChars= /[\(\)\<\>\,\;\:\\\/\"\ \[\]]/
if (s.match(illegalChars)) {
return false;
}
return true;
}
function checkEmail(formName, elementName, message) {
return checkFunction(formName, elementName, message, checkEmailValue);
}
function checkFileName(formName, elementName, fileType) {
if (! checkPattern(formName, elementName,
"The " + fileType + " must begin with a letter or digit",
/^[a-z0-9A-Z]/)) {
return false;
}
return checkPattern(formName, elementName,
"The " + fileType +
" can only contain letters, digits, dashes and underscores",
/^[a-z0-9A-Z\-_]+$/);
}
function checkImageFileName(formName, elementName, fileType) {
if (!checkFileName(formName, elementName, fileType)) {
return;
}
if (! checkPattern(formName, elementName,
"The " + fileType +
" filename must end with '.jpg', '.jpeg', '.gif' or '.png'",
/^(.*)(.(gif|jpg|jpeg|png))$/, true)) {
return;
}
return true;
}
function checkDate(formName, elementName, message) {
var datePattern = /^(0?\d|\d\d)\/(0?\d|\d\d)\/(\d\d\d\d)$/;
return checkPattern(formName, elementName, message, datePattern);
}
function checkInt(formName, elementName, message) {
var intPattern = /^\d+$/;
return checkPattern(formName, elementName, message, intPattern);
}
function checkNum(formName, elementName, message) {
var numPattern = /^(\d+(\.\d*)?|\.\d+)$/;
return checkPattern(formName, elementName, message, numPattern);
}
function checkRelativeURL(formName, elementName, message) {
var pathPattern = /\/([a-zA-Z0-9_?&=%,\-\.\/]*$)/;
return checkPattern(formName, elementName, message, pathPattern);
}
function checkURL(formName, elementName, message) {
var urlPattern = /^(ftp|https?):\/\/(?:[a-zA-Z0-9](?:[-a-z-A-Z0-9]*[a-zA-Z0-9])?)+\b(?:\d+)?(?:\/[^;"'<>()\[\]{}\s\x7f-\xff]*(?:[.,?]+[^;"'<>()\[\]{}\s\x7f-\xff]+)*)?/;
return checkPattern(formName, elementName, message, urlPattern);
}
function checkTime(formName, elementName, message) {
var timePattern = /\d{1,2}:\d\d\ ([aA][mM]|[pP][mM])/;
return checkPattern(formName, elementName, message, timePattern);
}
function checkPattern(formName, elementName, message, pattern, ignoreCase) {
var element = getElement(formName, elementName);
if (element == null) {
alert("Element " + elementName + " not found.");
if (window.event) { window.event.returnValue = false; }
return false;
}
var value = element.value;
if (ignoreCase) {
value = value.toLowerCase();
}
if (! pattern.exec(value)) {
alert(message);
element.focus();
if (window.event) { window.event.returnValue = false; }
return false;
}
return true;
}
function checkFunction(formName, elementName, message, f) {
var element = getElement(formName, elementName);
if (element == null) {
alert("Element " + elementName + " not found.");
if (window.event) { window.event.returnValue = false; }
return false;
}
if (element.tagName == "INPUT" && element.type == "hidden") {
return true;
}
var value = element.value;
if (! f(value)) {
alert(message);
element.focus();
if (window.event) { window.event.returnValue = false; }
return false;
}
return true;
}
// Function that checks that a pair of form elements is either both
// set or both unset.
function checkValuePair(formName, elementOne, elementTwo, message) {
var element1 = document.forms[formName].elements[elementOne];
var element2 = document.forms[formName].elements[elementTwo];
if (! element1) {
alert("Could not find element " + elementOne + " in form " + formName);
return;
}
if (! element2) {
alert("Could not find element " + elementTwo + " in form " + formName);
return;
}
if (isButtonGroup(element1)) {
var value1 = getCheckedValue(elementOne);
} else {
if (isSelect(element1)) {
var value1 = getSelectedValue(formName, elementOne);
} else {
var value1 = element1.value;
}
}
if (isButtonGroup(element2)) {
var value2 = getCheckedValue(elementTwo);
} else {
if (isSelect(element2)) {
var value2 = getSelectedValue(formName, elementTwo);
} else {
var value2 = element2.value;
}
}
if ((value1 == "" && value2 != "") || (value1 != "" && value2 == "")) {
alert(message);
if (value1 == "") {
element1.focus();
} else {
element2.focus();
}
if (window.event) { window.event.returnValue = false; }
return false;
}
return true;
}
function getCheckedValue(elementName, elements) {
if (! elements) {
elements = document.getElementsByName(elementName);
}
for (i = 0; i < elements.length; i++) {
var element = elements.item(i);
if (element.checked) {
return element.value;
}
}
return "";
}
function getCheckedValues(elementName) {
var elements = document.getElementsByName(elementName);
var values = new Array();
var valueCount = 0;
for (i = 0; i < elements.length; i++) {
if (elements.item(i).checked) {
values[valueCount++] = elements.item(i).value;
}
}
return values;
}
function getSelectedValue(formName, elementName) {
var element = document.forms[formName].elements[elementName];
if (element.selectedIndex != -1) {
return element.item(element.selectedIndex).value;
}
return "";
}
// form data takes the form [ [elementName, whichTest, errorMessage], ... ]
// valid tests are "notnull" and "date"
function checkValues(formName, formData) {
for (i = 0; i < formData.length; i++) {
var elementData = formData[i];
var elementName = elementData[0];
var whichTest = elementData[1];
var errorMessage = elementData[2];
if (whichTest == "notnull") {
if (! checkValue(formName, elementName, errorMessage))
return false;
}
}
return true;
}
function getElement(formName, elementName, ignoreCase) {
var form = document.forms[formName];
if (! form) {
alert("No such form " + formName);
return null;
}
var element = null;
if (! ignoreCase) {
element = form.elements[elementName];
} else {
elementName = elementName.toLowerCase();
for (var i = 0; i < form.elements.length; i++) {
if (form.elements[i].name == elementName) {
element = form.elements[i];
break;
}
}
}
if (! element) {
alert("No such element " + elementName);
return null;
}
return element;
}
function getValue(formName, elementName) {
var element = getElement(formName, elementName);
if (element == null) { return; }
if (element.tagName == "SELECT") {
return getSelectedValue(formName, elementName);
}
if (element.length) {
return getCheckedValue(elementName, element);
}
return element.value;
}
function setValue(formName, elementName, value) {
var element = getElement(formName, elementName);
if (element == null) { return; }
if (element.length && element.tagName != "SELECT") {
setCheckedValue(element, value);
return;
}
if (element.tagName == "SELECT") {
setSelectedValue(element, value);
}
element.value = value;
}
function setCheckedValue(elements, value) {
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
element.checked = (element.value == value);
}
}
function setSelectedValue(element, value) {
var options = element.options;
for (var i = 0; i < options.length; i++) {
var option = options[i];
option.selected = (option.value == value);
}
}
function setCheckedValues(formName, elementName, values) {
var element = getElement(formName, elementName);
if (element == null) { return; }
var elements = element;
if (! element.length) {
elements = new Array();
elements[0] = element;
}
for (var i = 0; i < values.length; i++) {
var value = values[i];
for (var j = 0; j < elements.length; j++) {
var element = elements[j];
if (element.value == value) element.checked = true;
}
}
}
function focusElement(formName, elementName, selectAll) {
if (! elementName) { return; }
var element = getElement(formName, elementName);
if (element == null) { return; }
element.focus();
if (selectAll)
element.select();
}
function Validator(type, required) {
this.type = type;
this.required = required;
this.validate = validateValue;
this.checkType = checkType;
this.checkLength = checkLength;
this.checkChars = checkChars;
this.checkRange = checkRange;
this.toString = function() {
var s = "";
var i = 0;
for (var name in this) {
var value = this[name];
if (! value || value instanceof Function) { continue; }
if (i++ > 0) { s += ";"; }
s += name + ":" + value;
}
return s;
};
}
function validateValue(value) {
if (value == "") {
if (this.required) {
this.message = "A value is required for the field '" + this.label + "'";
return false;
} else {
return true;
}
}
switch (this.type) {
case "text":
if (! this.checkLength(value)) { return false; }
if (! this.checkChars(value)) { return false; }
break;
case "integer":
if (! this.checkType(value)) { return false; }
var intValue = parseInt(value);
if (! this.checkRange(intValue)) { return false; }
break;
case "number":
if (! this.checkType(value)) { return false; }
var numValue = parseFloat(value);
if (! this.checkRange(numValue)) { return false; }
break;
case "date":
if (! this.checkType(value)) { return false; }
break;
case "email":
if (! this.checkType(value)) { return false; }
break;
case "filename":
if (! this.checkType(value)) { return false; }
break;
}
return true;
}
function checkType(value) {
switch (this.type) {
case "integer":
var pattern = /^\d+$/;
if (! pattern.exec(value)) {
this.message = "'" + value + "' is not a valid integer.";
return false;
}
break;
case "number":
var numPattern = /^(\d+(\.\d*)?|\.\d+)$/;
if (! numPattern.exec(value)) {
this.message = "'" + value + "' is not a valid number.";
return false;
}
if (this.decimalPlaces) {
if (this.decimalPlaces > 0) {
numPattern = new RegExp("^(\\d+(\\.\\d{0," + this.decimalPlaces +
"})?|\\.\\d{1," + this.decimalPlaces + "})$");
} else {
numPattern = /^\d+$/;
}
if (! numPattern.exec(value)) {
this.message = "'" + value + "' has more than " +
this.decimalPlaces + " digits after the decimal point.";
return false;
}
}
break;
case "date":
var datePattern = /^(0?\d|\d\d)\/(0?\d|\d\d)\/(\d\d\d\d)$/;
var ary = datePattern.exec(value);
if (ary == null) {
this.message = "'" + value + "' is not a valid date (MM/dd/YYYY).";
return false;
}
var month = parseInt(ary[1].replace(/^0/, ""));
var date = parseInt(ary[2].replace(/^0/, ""));
var year = parseInt(ary[3]);
if (month < 1 || month > 12) {
this.message = "Please enter a month between 1 and 12.";
return false;
}
var monthLength = MONTH_LENGTH[month];
if (month == 2 && isLeapYear(year)) { monthLength++; }
if (date < 1 || date > monthLength) {
this.message = "Please enter a date between 1 and " + monthLength;
return false;
}
if (year < 1000 || year > 2100) {
this.message = "Please enter a year between 1000 and 2100.";
return false;
}
break;
case "email":
if (! checkEmailValue(value)) {
this.message = "'" + value + "' is not a valid e-mail address.";
return false;
}
break;
case "filename":
var filePattern = /^[a-zA-Z0-9_\-]+$/;
if (! filePattern.exec(value)) {
this.message = "'" + value + "' is not a valid file name. Only letters, digits, underscores and dashes are allowed.";
return false;
}
break;
}
return true;
}
function checkRange(value) {
var nVal = parseFloat(value);
if (this.minValue) {
var nMin = parseFloat(this.minValue);
if (! this.minBound) this.minBound = "ge";
if (this.minBound == "gt" && nVal <= nMin) {
this.message = "Value must be greater than " + this.minValue + ".";
return false;
}
if (this.minBound == "ge" && nVal < nMin) {
this.message = "Value must be greater than or equal to " +
this.minValue + ".";
return false;
}
}
if (this.maxValue) {
var nMax = parseFloat(this.maxValue);
if (! this.maxBound) this.maxBound = "le";
if (this.maxBound == "lt" && nVal >= nMax) {
this.message = "Value must be less than " + this.maxValue + ".";
return false;
}
if (this.maxBound == "le" && nVal > nMax) {
this.message = "Value must be less than or equal to " +
this.maxValue + ".";
return false;
}
}
return true;
}
function checkLength(value) {
var length = value.length;
if (this.minLength && length < this.minLength) {
this.message =
"Value of " + this.label + " cannot be less than " + this.minLength + " characters long " +
"(current length is " + length + " characters)";
return false;
}
if (this.maxLength && length > this.maxLength) {
this.message =
"Value of " + this.label + " cannot be more than " + this.maxLength + " characters long." +
"(current length is " + length + " characters)";
return false;
}
return true;
}
function checkChars(value) {
if (! this.allowChars) { return true; }
var chars = this.allowChars.split(",");
var isDigit = false;
var isLetter = false;
var isSpace = false;
for (var i = 0; i < chars.length; i++) {
var c = chars[i];
if (c == 'digit') {
isDigit = true;
} else if (c == 'white') {
isSpace = true;
} else if (c == 'letter') {
isLetter = true;
}
}
var digPat = /\d/;
if (! isDigit && value.search(digPat) != -1) {
this.message = "Value cannot contain digits.";
return false;
}
var letPat = /[a-zA-Z]/;
if (! isLetter && value.search(letPat) != -1) {
this.message = "Value cannot contain letters.";
return false;
}
var spacePat = /\s/;
if (! isSpace && value.search(spacePat) != -1) {
this.message = "Value cannot contain spaces.";
return false;
}
return true;
}
/*
function toString() {
var s = "";
var i = 0;
alert("test**");
alert(this);
for (var name in this) {
alert("test 2 " + this[name]);
var value = this[name];
if (! value || value instanceof Function) { continue; }
if (i++ > 0) { s += ";"; }
s += name + ":" + value;
}
return s;
}
*/
function validateForm(formName) {
// disables submit button first
toggleSubmitButtons(true);
var form = document.forms[formName];
if (! form) {
alert("No form named '" + formName + "' to validate.");
return;
}
var elements = form.elements;
// Re-enables submit button when we leave page (so it's available on 'Back' tt# 106790)
// Only re-enable the submit button if there is no file upload field, otherwise
// multiple copies of files are uploaded.
var hasFileUpload = false;
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
if (element.type && element.type == "file") {
hasFileUpload = true;
break;
}
}
if (! hasFileUpload) {
document.onunload = toggleSubmitButtons(false);
}
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
if (element.tagName == "INPUT" &&
(element.type == "hidden" || element.type == "submit")) {
continue;
}
var validation = element.getAttribute("validation");
if (! validation) { continue; }
var validator = createValidator(validation);
validator.label = element.title ? element.title : element.name;
var isButton = (element.tagName == "INPUT" &&
element.type == "checkbox" || element.type == "radio");
var selectionMissed = false;
if (isButton && validator.required) {
selectionMissed = ! element.checked;
var a = elements[element.name];
if (a && a.length) {
for (var j=0; j < a.length; j++) {
if (a[j].checked) {
selectionMissed = false;
break;
}
}
}
}
var value = element.value;
if (element.style.display == "none" ||
element.style.visibility == "hidden") {
var hiddenElements = form.getElementsByTagName("INPUT");
for (var j = 0; j < hiddenElements.length; j++) {
var he = hiddenElements[j];
if (he.type != "hidden" || he.name != element.name) { continue; }
if (he.value) {
value = he.value;
break;
}
}
}
if (selectionMissed || ! validator.validate(value)) {
var msg = selectionMissed ?
"Please make at least one selection for " + element.name :
validator.message;
alert(msg);
if (element.style.display != "none" &&
element.style.visibility != "hidden") {
element.focus();
}
toggleSubmitButtons(false);
if (window.event) {
window.event.returnValue = false;
}
return false;
}
}
return validateCaptcha(formName);
}
function highlightForm(formName) {
var form = document.forms[formName];
if (! form) { return; }
var elements = form.elements;
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
if (element.tagName == "TEXTAREA") {
if (YAHOO.env.ua.ie > 0) {
element.innerText = trimString(element.innerText);
} else {
element.textContent = trimString(element.textContent);
}
}
var validationAttribute = element.getAttribute("validation");
if (element.tagName == "SELECT" && element.size > 1 &&
(! validationAttribute || validationAttribute.indexOf("required:true") == -1)) {
var option = document.createElement("OPTION");
if (YAHOO.env.ua.ie > 0) {
option.innerText = "None";
} else {
option.innerHTML = "None";
}
option.value = "";
element.insertBefore(option, element.firstChild);
}
if (! validationAttribute) { continue; }
var validator = createValidator(validationAttribute);
// Highlight required fields.
var isButton = (element.tagName == "INPUT" &&
element.type == "checkbox" || element.type == "radio");
if (validator.required && ! isButton) {
element.className = "formWidgetRequired";
}
// Prepopulate user fields.
if (validator.standard && window.user && validator.defaultRule == "user") {
if (window.user[validator.standard]) {
element.value = window.user[validator.standard];
}
}
}
}
function createValidator(parameterString) {
if (! parameterString) { parameterString = ""; }
var validator = new Validator("text", false);
var params = parameterString.split(";");
for (var i = 0; i < params.length; i++) {
var param = params[i].split(":");
validator[param[0]] = param[1];
}
return validator;
}
function objectToString(object) {
var s = "";
var i = 0;
for (var name in object) {
var value = object[name];
if (! value || value instanceof Function) { continue; }
if (i++ > 0) { s += ";"; }
if (typeof value == "object") {
s += name + ": { " + objectToString(value) + " }";
} else {
s += name + ":" + value;
}
}
return s;
}
function stringToObject(str, obj) {
if (! obj) {
obj = new Object();
}
var params = str.split(";");
for (var i = 0; i < params.length; i++) {
var param = params[i].split(":");
obj[param[0]] = param[1];
}
return obj;
}
function trimString(s) {
if (s == null) return "";
s = s.replace(/^\s*(.*)/, "$1");
s = s.replace(/(.*?)\s*$/, "$1");
return s;
}
/**
* Updates the element label in the common situation where
* a 2-column table is used to layout the form.
**/
function updateLabel(element, label, oldElement) {
var cell = element.parentNode;
// maybe widget is wrapped w/ chooser div
if ( cell.tagName == "DIV" && cell.parentNode.tagName == "TD") {
cell = cell.parentNode;
}
if (cell != null) {
var previousSibling = MceUtils.previousNonTextSibling(cell);
if (cell.tagName == "TD" && previousSibling) {
cell = previousSibling;
if (cell.innerHTML && cell.innerHTML == " " ||
(oldElement && cell.innerHTML == oldElement.title) || //Ungrouped elements
(oldElement && oldElement.title.indexOf(cell.innerHTML + ' ::') == 0) || //Grouped elements' title should start with their label.
cell.innerHTML.match(/mce_bogus/) || //This seems to be a safer check
cell.innerHTML == ' ' || //This may not be strictly necessary, but I saw it once.
cell.innerHTML == '') {
cell.innerHTML = label;
}
}}
}
function setFieldName(label, formName) {
if (! label) { return; }
var name = getValue(formName, "name");
if (name != "" && ! name.match(/^field/)) { return; }
name = labelToName(label);
setValue(formName, "name", name);
}
function labelToName(label) {
var name = label.toLowerCase();
name = name.replace(/\s/g, "_");
name = name.replace(/\W/g, "");
return name;
}
function labelToFileName(label, separator) {
if (! separator) {
separator = "-";
}
var name = label.toLowerCase();
name = name.replace(/\s/g, separator);
name = name.replace(/[^a-zA-Z0-9-_]/g, "");
return name;
}
// truncates the string "s" to a maximum of "maxLength" characters
// if "cleanBreak" is not false, the break occurs between words (at a ' ' at least)
// "trailer" is appended to the truncated string
function truncate(s, maxLength, cleanBreak, trailer) {
if (s == null) return "";
if (cleanBreak) {
return (s.length < maxLength) ? s :
s.substring(0, s.substring(0,maxLength).lastIndexOf(' ')) + trailer;
} else {
return (s.length < maxLength) ? s :
s.substring(0, maxLength - 3) + trailer;
}
}
function tabToElement(formName, tabIndex) {
var elements = document.forms[formName].elements;
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
if (element.tabIndex == tabIndex) {
element.focus();
break;
}
}
}
function showContextHelp(contextPath, path, anchor) {
path = contextPath + "/admin/help/context/" + path + ".html";
if (anchor) { path += "#" + anchor; }
helpWin = window.showHelp(path);
}
function getValues(formName) {
var values = new Array();
var form = document.forms[formName];
if (! form) {
alert("No form named " + formName);
return;
}
var elements = form.elements;
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
var value = element.value;
if (element.type && element.type =="hidden" &&
element.htmlEditor) {
value = element.htmlEditor.value;
}
if (element.tagName == "INPUT" &&
(element.type == "checkbox" || element.type == "radio") &&
! element.checked) { continue; }
if (element.tagName == "SELECT" && element.multiple) {
var selectValues = new Array();
for (var j = 0; j < element.options.length; j++) {
var option = element.options[j];
if (option.selected) { selectValues.push(option.value); }
}
value = selectValues.join(' ');
}
values.push(value);
}
return values;
}
var gRecordFormName = "record";
var gRecordParam = "com.frontleaf.record.RecordID";
function doFormLoad() {
highlightForm(gRecordFormName);
var form = document.forms[gRecordFormName];
if (form == null) { return; }
var cookie = getCookie("submittedRecords");
var recordID = getValue(gRecordFormName, gRecordParam);
if (cookie) {
var re = new RegExp("\\b" + recordID + "\\b");
if (cookie.match(re)) {
window.location.reload(true);
}
}
}
function toggleSubmitButtons(isDisabled) {
var elements = document.getElementsByTagName("INPUT");
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
if (element.type &&
(element.type == "submit" || element.type == "button")) {
element.disabled = isDisabled;
}
}
}
function doImageChoose(formName, widgetName, folderID) {
var item =
showDialog("/admin/components/explorer/dialog.jsp?folderID=" + folderID,
null, 600, 400);
if (item == null) {
return;
}
var div = document.getElementById("thumbnail-" + widgetName);
if (div == null) { return; }
div.style.border = "0 none";
div.innerHTML = "
" + item.fileName + "
";
setValue(formName, widgetName, item.id);
}
function doImageChooseClear(formName, widgetName, folderID) {
var div = document.getElementById("thumbnail-" + widgetName);
if (div == null) { return; }
div.style.border = "white inset 2";
div.style.height = div.clientHeight;
div.style.width = div.clientWidth;
div.innerHTML = "No image selected";
setValue(formName, widgetName, "");
}
function doImageChoosePreview() {
var image = event.srcElement;
if (image == null || image.tagName != "IMG" || ! image.id) { return; }
var idData = image.id.split("-");
var itemID = idData[1];
showDialog("/admin/components/explorer/image-preview.jsp?itemID=" + itemID);
}
function doRelatedItemsChoose(formName, widgetName, folderID) {
var path = "/admin/components/related/dialog.jsp?folderID=" + folderID;
var itemIDs = new Array();
var select = getElement(formName, widgetName);
for (var i = 0; i < select.options.length; i++) {
itemIDs.push(select.options[i].value);
}
if (itemIDs.length > 0) {
path += "&itemIDs=" + itemIDs.join(",");
}
var items = showDialog(path, null, 600, 400);
if (items == null) {
return;
}
var select = getElement(formName, widgetName);
select.innerHTML = "";
var div = document.getElementById("relatedItems-" + widgetName);
if (div == null) { return; }
if (items.length == 0) {
div.innerHTML = "
No items selected
";
return;
}
div.innerHTML = "";
for (var i = 0; i < items.length; i++) {
var item = items[i];
var itemDiv = document.createElement("DIV");
itemDiv.innerHTML = " " + item.title + "";
itemDiv.id = item.id;
div.appendChild(itemDiv);
var option =
document.createElement("