UniqueFormField = Class.create(); UniqueFormField.prototype = { validate: function() { // check that the value is not in use, and matches the pattern var suggested = this.value; while( this.restrictedValues[suggested] || suggested == null ) { alert(this.restrictedMessage); suggested = prompt('The following might be a suitable URL segment for the page. Alternatively, you can modify it.', this.suggestNewValue() ); } this.value = suggested; }, suggestNewValue: function() { var parts = this.value.match( /(.*)(\d+)$/ ); var prefix = ''; var count = 1; if( parts ) prefix = parts[1]; else prefix = this.value; if( prefix.charAt(prefix.length-1) != ' ' ) prefix = prefix + ' '; var suggested = prefix + count; while( this.restrictedValues[suggested] ) suggested = prefix + (++count); return suggested; } } UniqueTextField = Class.extend('UniqueFormField'); UniqueTextField.applyTo('input.UniqueTextField'); UniqueTextField.prototype = { initialize: function() { this.onblur = this.validate.bind(this); } } UniqueRestrictedTextField = Class.extend('UniqueTextField'); UniqueRestrictedTextField.applyTo('input.UniqueRestrictedTextField'); UniqueRestrictedTextField.prototype = { initialize: function() { this.loadMessages(); if(this.loadRestrictedValues){ this.loadRestrictedValues()}; this.loadRestrictedChars(); this.onblur = this.validate.bind(this); }, loadRestrictedChars: function() { this.charRegex = new RegExp( $(this.id + '-restricted-chars').value, 'g' ); this.charReplacement = $(this.id + '-restricted-chars-replace').value; this.trimRegex = new RegExp( '^[' + this.charReplacement + ']+|[' + this.charReplacement + ']+$', 'g' ); }, suggestNewValue: function( fromString ) { var prefix = ''; var count = 1; var suggested = fromString || this.value; if( suggested.length == 0 ) { suggested = $('Form_EditForm_Title').value.toLowerCase(); } var escaped = suggested.replace(this.charRegex, this.charReplacement); escaped = escaped.replace( this.trimRegex, '' ); // this.loadRestrictedValues is never called, i think someone missed a function.. if(this.restrictedValues){ if( !this.restrictedValues[escaped] ) return escaped; } var parts = escaped.match( /(.*)(\d+)$/ ); if( parts ) prefix = parts[1]; else prefix = escaped; if( prefix.charAt(prefix.length-1) != this.charReplacement ) prefix = prefix + this.charReplacement; suggested = prefix; suggested = suggested.replace( this.charRegex, this.charReplacement ); suggested = suggested.replace( this.trimRegex, '' ); if(this.restrictedValues){ while( this.restrictedValues[suggested] ) { suggested = prefix + (++count); suggested = suggested.replace( this.charRegex, this.charReplacement ); suggested = suggested.replace( this.trimRegex, '' ); } } return suggested; }, validate: function() { // check that the value is not in use, and matches the pattern var suggested = this.value; if(this.restrictedValues){ var suggestedValue = this.restrictedValues[suggested]; } while( suggested == null || suggested.length == 0 || suggestedValue || suggested.match( this.charRegex ) ) { if( suggested == null ) alert('You will need to enter a new value for this field'); else if( suggested.length == 0 ) alert('This field cannot be left empty'); else if( suggestedValue ) alert(this.restrictedMessage); else alert(this.charMessage); suggested = prompt('The following might be a suitable URL segment for the page. Alternatively, you can modify it.', this.suggestNewValue() ); } this.value = suggested; }, loadMessages: function() { this.restrictedMessage = $(this.id + '-restricted-message').value; this.charMessage = $(this.id + '-restricted-chars-message').value; } } RestrictedTextField = Class.create(); RestrictedTextField.applyTo('input.text.restricted'); RestrictedTextField.prototype = { initialize: function() { this.restrictedChars = $(this.id + '-restricted-chars').value; // this.restrictedRegex = new RegExp( $(this.id.'-restricted-chars').value, 'g' ); }, onkeyup: function() { var lastChar = this.value.charAt(this.value.length - 1); for( var index = 0; index < this.restrictedChars.length; index++ ) { if( lastChar == this.restrictedChars.charAt(index) ) { alert( "The character '" + lastChar + "' cannot be used in this field" ); this.value = this.value.substring( 0, this.value.length - 1 ); } } } }