var RestrictedInput = Class.create({ initialize: function(root) { this.initializationMode = true; this.table = $(root); this.ID_ = this.table.readAttribute('id'); this.table.JSControl = this; this.div = $(root + "_div"); this.input = $(root + "_input"); this.input.JSControl = this; this.scale = $(root + "_scale"); this.oldValue = this.input.value; this.span = new Element('span', {id: this.ID_, localid: this.input.readAttribute('localid'), 'class': this.input.className}); this.span.JSControl = this; this.currentElement = "input"; this.SetCSS(); this.SetAttribute('length', this.table.readAttribute('length')); this.SetAttribute('legal-chars', this.table.readAttribute('legal-chars')); this.SetAttribute('capitalize', this.table.readAttribute('capitalize')); this.SetAttribute('overwrite', this.table.readAttribute('overwrite')); this.SetAttribute('bSpaceReplace', this.table.readAttribute('bSpaceReplace')); this.SetAttribute('spaceSymbol', this.table.readAttribute('spaceSymbol')); this.Clear(); this.initializationMode = true; this.visibility = this.table.readAttribute('visibility'); if (this.visibility == 'link') { this.div.replaceChild(this.span, this.input); this.currentElement = "span"; this.span.writeAttribute('visibility', 'link'); this.scale.writeAttribute('visibility', 'link'); this.table.writeAttribute('visibility', 'link'); } else if (this.visibility == 'ro') { this.input.writeAttribute('readonly', 'yes'); this.input.writeAttribute('visibility', 'ro'); this.input.blur(); this.scale.writeAttribute('visibility', 'ro'); this.table.writeAttribute('visibility', 'ro'); } else if (this.visibility == 'vo') { this.div.replaceChild(this.span, this.input); this.currentElement = "span"; this.span.writeAttribute('visibility', 'vo'); this.scale.writeAttribute('visibility', 'vo'); this.table.writeAttribute('visibility', 'vo'); } else if (this.visibility == 'no') { this.scale.writeAttribute('visibility', 'no'); this.input.writeAttribute('visibility', 'no'); this.span.writeAttribute('visibility', 'no'); this.div.writeAttribute('visibility', 'no'); } else { this.input.writeAttribute('visibility', 'yes'); this.visibility = 'yes'; this.scale.writeAttribute('visibility', 'yes'); this.table.writeAttribute('visibility', 'yes'); } // this.input.observe('focus', this.OnFocus.bind(this)); this.input.observe('blur', this.OnBlur.bind(this)); BindKeyDown(this.input, this.OnKeyDown.bind(this)); if(Prototype.Browser.IE) { this.input.observe('propertychange', this.OnInput.bind(this)); } else { this.input.observe('input', this.OnInput.bind(this)); } this.input.observe('paste', this.OnPaste.bind(this)); this.input.observe('onpaste', this.OnPaste.bind(this)); this.input.observe('dragstart', this.OnDragStart.bind(this)); this.input.observe('drag', this.OnDrag.bind(this)); this.input.observe('dragend', this.OnDragEnd.bind(this)); // this.input.observe('dragenter', this.OnDragEnter.bind(this)); // this.input.observe('dragover', this.OnDragOver.bind(this)); // this.input.observe('dragleave', this.OnDragLeave.bind(this)); this.input.observe('drop', this.OnDrop.bind(this)); this.dragged = false; this.IEdrag = false; this.initializationMode = false; this.mustGetSelection = true; this.startSelection = 0; this.endSelection = 0; this.keyboardInput = false; this.pasting = false; this.updated = false; this.changed = false; LogL("init finished " + this.ID_); }, SetTabOrder: function(nTabBase) { switch (this.visibility) { case 'link': case 'ro': case 'vo': case 'no': break; default: this.input.tabIndex = nTabBase++; } return nTabBase; }, OnDragStart: function() { LogL("start"); this.dragged = true; }, OnDrag: function() { this.dragged = true; }, OnDragEnd: function(evt) { LogL("end"); this.dragged = false; evt.stop(); if (Prototype.Browser.IE) { this.IEdrag = true; } return false; }, // OnDragEnter: function() { // LogL("enter"); // this.dragTarget = true; // }, // // OnDragOver: function() { // this.dragTarget = true; // }, // // OnDragLeave: function() { // LogL("leave"); // this.dragTarget = false; // }, OnDrop: function() { LogL("drop"); this.dragTarget = true; if (!Prototype.Browser.IE) { this.dragged = false; } }, SetCSS: function() { if (Prototype.Browser.IE && parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE")+5)) == 7) { //Browser is IE7 var length = parseInt(this.table.readAttribute('length'), 10); var px = 15; if (isNaN(length)) { length = 8 * px; } else { length *= px; } this.input.setStyle({width: length + 'px'}); this.table.setStyle({'display': 'inline-block', 'float': ''}); this.div.parentNode.setStyle({'float': ''}); } }, Clear: function(){ LogL("clear " + this.ID_); this.initializationMode = true; if (this.maxLength) { var buffer = ''; for (var i = 0; i < this.maxLength; ++i) { buffer += this.spaceSymbol; } if (Prototype.Browser.IE) { if (this.input.value){ setSelectionRange(this.input, 0, this.input.value.length); } else { setCaretPosition(this.input, 0); } this.oldValue = buffer; document.selection.createRange().text = buffer; } else { this.oldValue = buffer; this.input.value = buffer; } } else { this.oldValue = ''; this.input.value = ''; } this.initializationMode = false; this.UpdateSpan(); // LogE("clear finished " + this.ID_ + " : " + this.oldValue + ", " + this.input.value + '.'); if (Prototype.Browser.IE) { this.input.blur; } }, ID: function() { return this.ID_; }, Value: function() { if (this.input.value === "" || this.input.value === null || this.input.value === undefined) { return optional(undefined); } else{ return optional(this.input.value.toString()); } }, SetValue: function(newValue) { // LogL("SetValue : " + this.ID_ + ", " + newValue); if (newValue == undefined || newValue.IsNull()){ this.Clear(); } else { var temp_value = newValue.Value().toString(); var result_value = ""; if (this.modeCapitalize) { temp_value = temp_value.toUpperCase(); } for (var i = 0; i < temp_value.length; ++i) { var c = temp_value.charAt(i); if (c == ' ') { c = String.fromCharCode(160);//nbsp } if (this.legalSymbols[c]) { result_value += c; } } if (this.maxLength) { if (result_value.length > this.maxLength) { result_value = result_value.substring(0, this.maxLength); } else{ while (result_value.length < this.maxLength) { result_value += this.spaceSymbol; } } } this.initializationMode = true; this.oldValue = result_value; this.input.value = result_value; this.UpdateSpan(); this.initializationMode = false; } return false; }, SetAttribute: function(sName, sValue) { if (sName == 'visibility' && sValue != this.visibility) { if((this.visibility=='yes' || this.visibility=='ro' || this.visibility == 'no') && (sValue=='vo' || sValue=='link')) { if (this.currentElement == "input") { this.div.replaceChild(this.span, this.input); } this.currentElement = "span"; this.span.writeAttribute(sName, sValue); this.scale.writeAttribute(sName, sValue); this.table.writeAttribute(sName, sValue); } else if((this.visibility=='vo' || this.visibility=='link' || this.visibility == 'no') && (sValue=='yes' || sValue=='ro')) { if (this.currentElement == "span") { this.div.replaceChild(this.input, this.span); } this.currentElement = "input"; this.input.writeAttribute(sName, sValue); this.scale.writeAttribute(sName, sValue); this.table.writeAttribute(sName, sValue); } else if(sValue == 'yes' || sValue == 'ro') { this.input.writeAttribute(sName, sValue); this.currentElement = "input"; this.scale.writeAttribute(sName, sValue); this.table.writeAttribute(sName, sValue); } else if (sValue == 'vo' || sValue == 'link') { this.span.writeAttribute(sName, sValue); this.currentElement = "span"; this.scale.writeAttribute(sName, sValue); this.table.writeAttribute(sName, sValue); } if (sValue == 'no') { this.scale.writeAttribute(sName, sValue); this.input.writeAttribute(sName, sValue); this.span.writeAttribute(sName, sValue); this.table.writeAttribute(sName, sValue); } else { this.scale.writeAttribute(sName, sValue); this.table.writeAttribute(sName, sValue); } this.visibility = sValue; } else if (sName == 'length') { if (!sValue) { this.maxLength = undefined; } else{ var length = parseInt(sValue, 10); if (isNaN(length)) { this.maxLength = undefined; } else { this.maxLength = length; } } } else if (sName == 'overwrite') { if (sValue == 'yes') { this.modeOverwrite = true; } else { this.modeOverwrite = false; } } else if (sName == 'bSpaceReplace') { if (sValue == 'yes') { this.modeBSpaceReplace = true; } else { this.modeBSpaceReplace = false; } } else if (sName == 'spaceSymbol') { this.legalSymbols = {}; if (sValue) { this.spaceSymbol = sValue.charAt(0); if (this.spaceSymbol == ' ') { this.spaceSymbol = String.fromCharCode(160);//nbsp } } else { this.spaceSymbol = String.fromCharCode(160);//nbsp } if (this.modeCapitalize) { this.spaceSymbol = this.spaceSymbol.toUpperCase(); } this.legalSymbols[this.spaceSymbol] = true; if (this.legalChars) { var tempChars = this.legalChars; if (this.modeCapitalize) { tempChars = tempChars.toUpperCase(); } for (var i = 0; i < tempChars.length; ++i) { this.legalSymbols[tempChars.charAt(i)] = true; } } } else if (sName == 'legal-chars') { this.legalSymbols = {}; if (sValue) { this.legalChars = sValue; if (this.modeCapitalize) { sValue = sValue.toUpperCase(); } for (var i = 0; i < sValue.length; ++i) { var c = sValue.charAt(i); if (c == ' ') { c = String.fromCharCode(160);//nbsp } this.legalSymbols[c] = true; } } else { this.legalChars = ''; } if (this.spaceSymbol) { this.legalSymbols[this.spaceSymbol] = true; } } else if (sName == 'capitalize') { if (sValue == 'yes') { this.modeCapitalize = true; } else { this.modeCapitalize = false; } this.legalSymbols = {}; if (this.modeCapitalize){ if (this.spaceSymbol) { this.spaceSymbol = this.spaceSymbol.toUpperCase(); this.legalSymbols[this.spaceSymbol] = true; } if (this.legalChars) { for (var i = 0; i < this.legalChars.length; ++i) { this.legalSymbols[this.legalChars.charAt(i).toUpperCase()] = true; } } } else { if (this.spaceSymbol) { this.legalSymbols[this.spaceSymbol] = true; } if (this.legalChars) { for (var i = 0; i < this.legalChars.length; ++i) { this.legalSymbols[this.legalChars.charAt(i)] = true; } } } } }, OnKeyDown: function(evt) { var key=$(evt).which || evt.keyCode; if (evt.altKey || evt.shiftKey && (key == 37 || key == 39) || //arrows evt.ctrlKey && String.fromCharCode(key) != 'v' && String.fromCharCode(key) != 'V') { this.mustGetSelection = true; this.keyboardInput = false; return; } this.startSelection = getSelectionStart(this.input); this.endSelection = getSelectionEnd(this.input); this.mustGetSelection = false; if (key == 27) { // escape this.input.value = this.oldValue; evt.stop(); this.mustGetSelection = true; this.keyboardInput = false; this.pasting = false; this.updated = false; return ; } else if (key == 8) {//backspace this.mustGetSelection = true; this.keyboardInput = false; this.pasting = false; if (this.BackSpaceDown()) { evt.stop(); this.updated = false; return false; } return ; } else if (key == 46) {//delete this.mustGetSelection = true; this.keyboardInput = false; this.pasting = false; if (this.DeleteDown()) { evt.stop(); this.updated = false; return false; } return ; } this.keyboardInput = true; if (Prototype.Browser.IE && this.startSelection != this.endSelection) { this.initializationMode = true; } }, OnPaste: function() { if (this.mustGetSelection) { this.startSelection = getSelectionStart(this.input); this.endSelection = getSelectionEnd(this.input); this.mustGetSelection = false; } this.pasting = true; this.initializationMode = false; return; }, OnBlur: function(evt) { if (this.changed) { this.changed = false; new AEvent("CHANGE", {}, this); } }, OnFocus: function(evt) { this.oldValue = this.input.value; }, OnInput: function(evt) { LogL("oninput " + this.ID_); if (this.initializationMode) { if (this.keyboardInput) { this.initializationMode = false; } evt.stop(); return false; } if (this.dragged) { var result = this.input.value; if (result.length != this.oldValue) { this.initializationMode = true; this.input.value = this.oldValue; this.initializationMode = false; evt.stop(); return false; } if (Prototype.Browser.IE) { return; } this.oldValue = this.input.value; this.dragged = false; this.NotifyAboutInput(); this.changed = true; evt.stop(); return false; } if (this.IEdrag) { this.IEdrag = false; this.input.value = this.oldValue; this.NotifyAboutInput(); this.changed = true; evt.stop(); return false; } if (this.updated) { evt.stop(); this.updated = false; return false; } // LogE(this.oldValue + '@' + this.input.value); if (this.oldValue == this.input.value) { // LogE(this.oldValue + '@' + this.input.value); evt.stop(); this.mustGetSelection = true; this.pasting = false; this.keyboardInput = false; return false; } if (this.mustGetSelection) { this.startSelection = getSelectionStart(this.input); this.endSelection = getSelectionEnd(this.input); } this.CheckedUpdate(); this.NotifyAboutInput(); this.changed = true; this.mustGetSelection = true; this.pasting = false; this.keyboardInput = false; evt.stop(); this.updated = false; return false; }, CheckedUpdate: function() { var temp_value = ""; var result_value = this.input.value; var dropping = result_value.length > this.oldValue.length && !this.pasting && !this.keyboardInput; if (this.modeCapitalize) { result_value = result_value.toUpperCase(); } for (var i = 0; i < result_value.length; ++i) { var c = result_value.charAt(i); if (c == ' ') { c = String.fromCharCode(160);//nbsp } if (this.legalSymbols[c]) { temp_value += c; } } if (dropping) { this.endSelection -= result_value.length - this.oldValue.length; this.startSelection = this.endSelection; } this.updated = true; if (this.modeOverwrite) { var caret_position; var first = this.oldValue.substring(0, this.startSelection); var second; var third; if (this.pasting || dropping) { second = temp_value.substring(first.length, first.length + this.endSelection - this.startSelection + temp_value.length - this.oldValue.length); caret_position = first.length + second.length; while (second.length < this.endSelection - this.startSelection) { second += this.spaceSymbol; } var subresultLength = first.length + second.length; third = this.oldValue.substring(subresultLength); } else if (this.keyboardInput) { if (temp_value.length == result_value.length){ second = temp_value.charAt(first.length); caret_position = first.length + 1; while (second.length < this.endSelection - this.startSelection) { second += this.spaceSymbol; } } else { second = ""; caret_position = first.length; } var subresultLength = first.length + second.length; if (subresultLength < this.oldValue.length) { third = this.oldValue.substring(subresultLength); } else { third = ""; } } else { second = ""; third = temp_value.substring(first.length); caret_position = first.length; } result_value = first + second + third; if (this.maxLength) { if (result_value.length > this.maxLength) { result_value = result_value.substring(0, this.maxLength); } else { while (result_value.length < this.maxLength) { result_value += this.spaceSymbol; } } if (caret_position > result_value.length) { caret_position = result_value.length; } } this.oldValue = result_value; this.input.value = result_value; //Mozilla works with both and either: setCaretPosition(this.input, caret_position);//special for IE setCaretPosition.defer(this.input, caret_position);//special for Chrome & IE } else { var caret_position; if (this.keyboardInput) { if (temp_value.length == result_value.length) { caret_position = this.startSelection + 1; } else { temp_value = this.oldValue; caret_position = this.startSelection; } } else if (this.pasting) { if (Prototype.Browser.WebKit) { caret_position = this.endSelection + temp_value.length - result_value.length; } else { caret_position = this.endSelection + temp_value.length - this.oldValue.length; } } else { caret_position = this.endSelection; } result_value = temp_value; if (this.maxLength) { if (result_value.length > this.maxLength) { result_value = result_value.substring(0, this.maxLength); } else { while (result_value.length < this.maxLength) { result_value += this.spaceSymbol; } } } this.oldValue = result_value; this.input.value = result_value; //Mozilla works with both and either: setCaretPosition(this.input, caret_position);//special for IE setCaretPosition.defer(this.input, caret_position);//special for Chrome & IE } return true; }, NotifyAboutInput: function(evt) {//TODO: remove this function??? this.UpdateSpan(); // var fn = function () { // new AEvent("INPUT", {}, this); // }; // fn.bind(this).defer(); }, BackSpaceDown: function() { if (this.endSelection != 0) { var first; if (this.startSelection == 0) { first = ""; } else if (this.startSelection == this.endSelection) { first = this.input.value.substr(0, this.startSelection - 1); } else { first = this.input.value.substr(0, this.startSelection); } var second = ""; if (this.endSelection == this.startSelection) { if (this.modeBSpaceReplace) { second = this.spaceSymbol; } } else { if (this.modeBSpaceReplace) { for (var i = this.endSelection - this.startSelection; i > 0; --i) { second += this.spaceSymbol; } } } var third = this.input.value.substring(this.endSelection); var result_value = first + second + third; if (this.maxLength) { while (result_value.length < this.maxLength) { result_value += this.spaceSymbol; } } this.updated = true; this.oldValue = result_value; this.input.value = result_value; if (this.startSelection == this.endSelection) { setCaretPosition(this.input, this.startSelection - 1); } else { setCaretPosition(this.input, this.startSelection); } this.NotifyAboutInput(); } this.changed = true; return true; }, DeleteDown: function() { if (this.startSelection != this.input.value.length) { var first = this.input.value.substring(0, this.startSelection); var second; if (this.endSelection == this.input.value.length) { second = ""; } else if (this.startSelection == this.endSelection) { second = this.input.value.substring(this.endSelection + 1); } else { second = this.input.value.substring(this.endSelection); } var result_value = first + second; if (this.maxLength) { while (result_value.length < this.maxLength) { result_value += this.spaceSymbol; } } this.updated = true; this.oldValue = result_value; this.input.value = result_value; setCaretPosition(this.input, this.startSelection); this.NotifyAboutInput(); } this.changed = true; return true; }, UpdateSpan: function() { this.span.innerHTML = this.input.value; } });