Files
alfresco-community-repo/source/web/scripts/validation.js
Dave Ward ac519b9bc3 Merged V3.3 to HEAD
20025: Created Enterprise branch V3.3
   20026: ALF-2597 : IMAP : permissions on home space.
      - now, by default, people can't read other's mail.
   20030: Merged BRANCHES/V3.2 to BRANCHES/V3.3:
      19919: Merged BRANCHES/V3.1 to BRANCHES/V3.2:
         19766: Fixed ALF-2351: Oracle upgrade scripts need enhancements from 2.2SP7
      20027: Merged BRANCHES/V3.1 to BRANCHES/V3.2:
         19983: Changes for ALF-2545: Cannot upgrade from 2.1.2a (b 209) to the 3.1.2 (.a3 458) on Oracle
         20008: ALF-2351: Oracle upgrade scripts need enhancements from 2.2SP7
   20032: Merged HEAD to BRANCHES/V3.3 (RECORD ONLY)
      20031: Fix ALF-2626 - Share Repository browser broken
   20035: Enterprise branding for Share & Explorer - DO NOT MERGE (RECORD ONLY)
      Also: SAIL-282: Update the Help URLs for 3.3 Enterprise
   20039: Fix ALF-2393 - Alfresco Comunity 3.3 deployment error on JBoss v6
   20044: Fix ALF-750 (versioning does not persist node associations)
      - TODO: review version migrator (if upgrading directly from Ent 2.x to Ent 3.3)
   20049: Merged PATCHES/V3.2.r to BRANCHES/V3.3
      20047: Fix for ALF-2640: Share: Edit Offline and Upload New Version fails with HTML uploader on FF3.5, works on IE
   20054: Fix ALF-750 (versioning does not persist node associations)
      - update version migrator (only applies if not already run, ie. upgrading directly from Ent 2.x to Ent 3.3)
   20057: Merged HEAD to BRANCHES/V3.3: (RECORD ONLY)
      20033: Accordion example was broken when FDK is deployed as a JAR
   20064: Fix for ALF-2623: Alfresco 3.3G's Share site is prone to cross site scripting attacks
      - Bug is actually in the wiki components
   20065: Fix unreported issue (auto-versioning for metadata-only updates stops working after checkin) & additional improvements to LockService
      - explicitly remove lockable aspect (rather than nullifying properties) for unlock / checkin
      - use txn resource to track ignorable nodes (for lockable aspect behaviours)
      - note: currently affects Alfresco Explorer only (since Alfresco Share explicitly disables autoVersionOnUpdateProps)
   20066: Increased PermGen space for tests to 256M from 128M
   20071: AVM - check for circular layered directories (ALF-813 / ALF-910)
   20073: Fix LockService tests
      - fix typo (introduced in r20065)
      - TODO: review LockOwnerDynamicAuthorityTest.testCheckOutCheckInAuthorities
   20076: Fix LockOwnerDynamicAuthorityTest.testCheckOutCheckInAuthorities
   20078: Fixed ALF-2464 "Missing i18n labels when rules fail to run"
   20081: Fixed ALF-1626 "The position:absolute behaviour of the Flash preview container needs a re-think"
      - Now handles long file names (resize was already fixed)
   20083: Fix for ALF-2708: Unmodifiable exception thrown when Web Script f/w attempts to report error (latest Spring Surf webscripts libraries)
   20084: Fixed ALF-253 "Unfriendly message appears when trying to login with username which contains symbol '\'"
      - also fixed bug whereerror messages for illegal characters was displayed as undefined for FF on Mac
   20085: Merging HEAD into BRANCHES/V3.3:
      20074: ALF-959 The invitation email 'subject' can now be set as a localizable property in invitation-services.properties:
      20080: Fixing failing test InvitationServiceImplTest.
   20087: ALF-1498: RM web script puts Alfresco in endless loop
      This was a general issue with the onUpdateProperties behaviour in the versionable aspect.  This code now disables the behaviour whilst it is executing to prevent the endless loop occuring.
   20088: Fixed an issue when uploading 2 or more documents for a new site. 
      - A failure occured since it asynchronously tried to create the documentLibrary container twice and the second attempt failed since it already existed.
   20089: SAIL-356: Action label changes
   20090: Dynamic models: minor improvements to DictionaryModelType
      - add (optional) concurrency locking
      - remove duplicate bean def
      - bind remaining class behaviours (onCreateNode, onRemoveAspect) based on type
   20091: Fixed ALF-1046 "Leave button is displayed for admin on Site Finder page near private site where admin is not invited"
   20092: Merged DEV/BELARUS/V3.2-2010_03_17 to V3.3
      20043: ALF-928: Upgrade from 2.1.7 to 3.2 with lots of content items - GC overhead limit exceeded exception
         Call getChildAssocs(NodeRef, QNamePattern, QNamePattern, boolean) with a value of 'false' for the preload argument to avoid preloading all the child nodes
   20093: Fix for ALF-2721: Upgrade clean 2.2.current + 20k users to 3.3.current fails in CalendarModelUriPatch updating URI that does not exist
   20094: ALF-2630: LDAP differential sync was failing to sync group memberships of users who themselves hadn't changed
      - New post process deals with group associations of unprocessed users
      - Modified unit test to properly simulate differential sync
   20095: Fix for ALF-2715: Rule creation in Alfresco Share 3.3G leads to an "Internal Server Error" failure message
   20096: Fix webview and wiki dashlet titles in yellow and gdocs themes.
   20097: Follow-up fix to cross-browser WebView dashlet (iframe) resizing
   20098: Workaround for ALF-2211: Share - Accessing User homes from Share/JSF integration freezes the browser.
      - The tree control has been given a configurable maximum folder count setting for both Site and Repository working modes. By default these are "unlimited" in Site mode and 500 in Repository mode. These values can be overridden in share-config-custom.xml - see the sample configuration file for details.
      - The workaround is to display a "Too many sub-folders to display" message when the maximum number of folders has been reached.
      - To aid users to select their User Home space (or sub-folder thereof) for Copy and Move actions, a new "My User Home" button is provided on the folder picker control.
   20099: Fix for ALF-2606: Manage Permissions on multiple nodes.
      - Toolbar action removed when in Repository Browser, as the fine-grained permissions page does not support multiple nodes.
   20100: Merged Outlook Meeting Workspace integration from BRANCHES/DEV/BELARUS/V3.2-2010_01_11
   20102: Fix for ALF-478: Authority CRC calculations must use UTF-8
   20103: Follow up from ALF-253 (Unfriendly message appears when trying to login with username which contains symbol '\')
      - Making lastName mandatory in Share ui since service otherwise complains
   20106: Fixed ALF-1041 "Revert action is available for SiteContributor and SiteConsumer" (and added a missing msg key for blogs)
   20108: ALF-2235: Permission exception when creating non-electronic records by Power User with Read and File permssions
   20109: Fix for ALF-2706 "ConcurrentModificationException in AsynchronousActionExecutionQueueImpl"
   20110: Merge Dev to V3.3
      ALF-1980 - Huge UIDVALIDITY giving IMAP client problems
   20111: Latest webeditor JAR containing change to orientation strings in WEF
   20113: Fix Share DocLib copy/move actions from recent refactor. Picker now appears with correct Site/Repository mode set upon opening.
   20114: Fix for ALF-2726: 'Transform and Copy content' action causes error.
   20115: Fix for ALF-2697 - File encoding is hard-coded for upload.post.js (Webscript API)
   20116: Fix for ALF-1090
   20119: ALF-2734 - Incorrect behaviour on creating google docs in Repository Browser
   20120: Enterprise build fix for Index check tests 
      - disable user usage updates
      - this should not be required
   20121: ALF-959 The site name/title should now correctly appear in the invite email subject, replacing '{0}'.
   20123: Merged HEAD to V3.3 (RECORD ONLY)
      20122: First part of fix for ALF-2718:  DOD5015 module breaks CMIS Atom DiscoveryService webscripts
   20126: Fix rule rest api json so numbers are not incorrectly formatted.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@20565 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
2010-06-09 12:47:50 +00:00

326 lines
9.2 KiB
JavaScript

//
// Validation functions
// Gavin Cornwell 30-11-2005
//
/**
* Informs the user of the given 'message', if 'showMessage' is true.
* If 'showMessage' is true focus is given to the 'control'.
*/
function informUser(control, message, showMessage)
{
if (showMessage)
{
alert(message);
if (control.type != "hidden") control.focus();
}
}
/**
* Ensures the value of the 'control' is not null or 0.
*
* @return true if the mandatory validation passed
*/
function validateMandatory(control, message, showMessage)
{
var result = true;
if (control.value == null || control.value.length == 0)
{
informUser(control, message, showMessage);
result = false;
}
return result;
}
/**
* Ensures the value of the 'control' is more than 'min' and less than 'max'.
*
* @return true if the number range validation passed
*/
function validateNumberRange(control, min, max, message, showMessage)
{
var result = true;
if (isNaN(control.value) || control.value < min || control.value > max)
{
informUser(control, message, showMessage);
result = false;
}
return result;
}
/**
* Ensures the value of the 'control' is a number.
*
* @return true if the value is a number
*/
function validateIsNumber(control, message, showMessage)
{
var result = true;
if (isNaN(control.value))
{
informUser(control, message, showMessage);
result = false;
}
return result;
}
/**
* Ensures the value of the 'control' has a string length more than 'min' and less than 'max'.
*
* @return true if the string length validation passed
*/
function validateStringLength(control, min, max, message, showMessage)
{
var result = true;
if (control.value.length < min || control.value.length > max)
{
informUser(control, message, showMessage);
result = false;
}
return result;
}
/**
* Ensures the value of the 'control' matches the 'expression' if 'requiresMatch' is true.
* Ensures the value of the 'control' does not match the 'expression' if 'requiresMatch' is false.
*
* @return true if the regex validation passed
*/
function validateMultivalueRegex(control, expression, requiresMatch, matchMessage, noMatchMessage, showMessage)
{
var result = true;
var pattern = new RegExp(decode(expression));
var arrayOfStrings = control.value.substring(1, control.value.length - 1).split(", ");
for (var i=0; i < arrayOfStrings.length; i++)
{
var matches = pattern.test(arrayOfStrings[i]);
if (matches != requiresMatch)
{
if (requiresMatch)
{
informUser(control, noMatchMessage, showMessage);
return false;
}
else
{
informUser(control, matchMessage, showMessage);
return false;
}
}
}
return result;
}
/**
* Ensures the value of the 'control' matches the 'expression' if 'requiresMatch' is true.
* Ensures the value of the 'control' does not match the 'expression' if 'requiresMatch' is false.
*
* @return true if the regex validation passed
*/
function validateRegex(control, expression, requiresMatch, matchMessage, noMatchMessage, showMessage)
{
var result = true;
var pattern = new RegExp(decode(expression));
var matches = pattern.test(control.value);
if (matches != requiresMatch)
{
if (requiresMatch)
{
informUser(control, noMatchMessage, showMessage);
}
else
{
informUser(control, matchMessage, showMessage);
}
result = false;
}
return result;
}
/**
* Ensures the value of the 'control' does not contain any illegal characters.
*
* @return true if the file name is valid
*/
function validateName(control, message, showMessage)
{
var result = true;
var pattern = /([\"\*\\\>\<\?\/\:\|]+)|([ ]+$)|([\.]?[\.]+$)/;
var trimed = control.value.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
var idx = trimed.search(pattern);
if (idx != -1)
{
informUser(control, "'" + trimed.charAt(idx) + "' " + message, showMessage);
result = false;
}
return result;
}
function validateDialog()
{
if (finishButtonPressed)
{
finishButtonPressed = false;
var message = $("dialog:dialog-body:validation_invalid_character").textContent ? $("dialog:dialog-body:validation_invalid_character").textContent : $("dialog:dialog-body:validation_invalid_character").innerText;
return validateName($("dialog:dialog-body:name"), message, true);
}
else
{
return true;
}
}
function validateWizard()
{
if (finishButtonPressed)
{
finishButtonPressed = false;
var message = $("wizard:wizard-body:validation_invalid_character").textContent ? $("wizard:wizard-body:validation_invalid_character").textContent : $("wizard:wizard-body:validation_invalid_character").innerText;
return validateName($("wizard:wizard-body:name"), message, true);
}
else
{
return true;
}
}
/**
* Decodes the given string
*
* @param str The string to decode
* @return The decoded string
*/
function decode(str)
{
var s0, i, j, s, ss, u, n, f;
s0 = ""; // decoded str
for (i = 0; i < str.length; i++)
{
// scan the source str
s = str.charAt(i);
if (s == "+")
{
// "+" should be changed to SP
s0 += " ";
}
else
{
if (s != "%")
{
// add an unescaped char
s0 += s;
}
else
{
// escape sequence decoding
u = 0; // unicode of the character
f = 1; // escape flag, zero means end of this sequence
while (true)
{
ss = ""; // local str to parse as int
for (j = 0; j < 2; j++ )
{
// get two maximum hex characters for parse
sss = str.charAt(++i);
if (((sss >= "0") && (sss <= "9")) || ((sss >= "a") && (sss <= "f")) || ((sss >= "A") && (sss <= "F")))
{
ss += sss; // if hex, add the hex character
}
else
{
// not a hex char., exit the loop
--i;
break;
}
}
// parse the hex str as byte
n = parseInt(ss, 16);
// single byte format
if (n <= 0x7f) { u = n; f = 1; }
// double byte format
if ((n >= 0xc0) && (n <= 0xdf)) { u = n & 0x1f; f = 2; }
// triple byte format
if ((n >= 0xe0) && (n <= 0xef)) { u = n & 0x0f; f = 3; }
// quaternary byte format (extended)
if ((n >= 0xf0) && (n <= 0xf7)) { u = n & 0x07; f = 4; }
// not a first, shift and add 6 lower bits
if ((n >= 0x80) && (n <= 0xbf)) { u = (u << 6) + (n & 0x3f); --f; }
// end of the utf byte sequence
if (f <= 1) { break; }
if (str.charAt(i + 1) == "%")
{
// test for the next shift byte
i++ ;
}
else
{
// abnormal, format error
break;
}
}
// add the escaped character
s0 += String.fromCharCode(u);
}
}
}
return s0;
}
/**
* This function validates Output Path Pattern parameter for Create Web Site and
* Create Form Wizards
*
* @param disablingElement -
* some input control for disabling if Pattern parameter is not valid
* @param outputPathInput -
* input that contains Pattern parameter
* @param additionalConditionInput -
* input that contains additional parameter for enabling
* disablingElement. If this parameter is 'null' then
* disablingElement will be enabled
*/
function validateOutputPathPattern(disabledElement, outputPathInput, additionalConditionInput)
{
var path = (null != outputPathInput) ? (outputPathInput.value) : (null);
var pattern = new RegExp("^([\\s\u0020]*)([^\\s\\u0020]+)([^\\0]*)$", "");
if ((null == path) || ("" == path) || !pattern.test(path))
{
disabledElement.disabled = true;
}
else
{
value = (null != additionalConditionInput) ? (additionalConditionInput.value) : (null);
disabledElement.disabled = (null != value) ? (("" == value.trim()) || !pattern.test(value)) : (false);
}
}