function inputfilter_init() { $$('input[type="text"]').each( function (input) { input = $(input); if (!input) return; var vt = input.readAttribute("validationtype"); if (!vt) return; if (input.hasClassName('initialized')) return; input.addClassName('initialized'); if (vt != null && vt != '') { if (vt == 'numeric' || vt == 'decimal' || vt == 'currency') { var oc = input.readAttribute('onchange'); if (oc) { input.aspnetOnChange = input.onchange; input.onchange = null; input.writeAttribute('onchange', undefined); } input .observe("keydown", NumericInput_OnKeyDown) .observe("keyup", NumericInput_OnKeyUp) .observe("blur", NumericInput_OnBlur) .observe("focus", NumericInput_OnFocus) .observe("change", NumericInput_OnChange); } else { var portions = input.getAttribute('portions'); if (portions != null) { var p = portions.split(","); var wrapper = new Element('div'); var separatorCharacters = (input.getAttribute('separator') ? input.getAttribute('separator') : ''); if (separatorCharacters != '' && input.value != '') var cv = input.value.split(separatorCharacters); if (cv == undefined && input.value.length > 0 && input.value.indexOf(separatorCharacters) == 0) { var n = 0; var t = input.value.toArray() cv = []; p.each(function (ps, i) { ps = ps.parseInt(); cv.push(t.slice(n, n + ps).join('')); n += ps; }); } input.insert({ before: wrapper }).remove(); wrapper.insert(new Element('input', { type: 'hidden', id: input.id, name: input.name, separator: separatorCharacters, value: input.value })); var cssClasses = input.getAttribute('cssClasses'); if (cssClasses != null) { cssClasses = cssClasses.split(","); } p.each(function (ps, i) { if (i == p.size() - 1) { var section = new Element('input', { type: 'text', id: input.id + '_' + (i + 1), name: input.name + '_' + (i + 1), size: ps, length: ps, maxlength: ps }); } else { var section = new Element('input', { type: 'text', id: input.id + '_' + (i + 1), name: input.name + '_' + (i + 1), size: ps, length: ps }); } if (cv && cv.length > i) section.value = cv[i].substring(0, ps); section.addClassName('autowidth').observe('keydown', NumericInput_OnKeyDown).observe('keyup', NumericInput_OnKeyUp).observe('change', SplitInput_OnChange).observe('keydown', SplitInput_KeyDown); if (cssClasses != null) { section.addClassName(cssClasses[i]); } wrapper.insert(section); if (i != p.size() - 1) wrapper.insert(new Element('span', { className: 'separator' }).update(separatorCharacters)); }); } } } }); } var lastHighlight; function SplitInput_KeyDown(e) { var key = (e.keyCode)?e.keyCode:(e.which)?e.which:undefined; if (key != undefined) { if (key != 8) { if ((this.value.length+1) > this.getAttribute('length') && key != 9) { var ni = this.next('input[type=text]'); if (ni != null) { ni.focus(); setCaretPos(ni,ni.value.length); } } if (key == 9) { var ni = this.next('input[type=text]'); if (ni != null) { ni.focus(); setCaretPos(ni,ni.value.length); e.stop(); } } }else{ if (key == 8) { //backspace if (getCaretPos(this) == 0) { var pi = this.previous('input[type=text]'); if (pi != null) { pi.focus(); setCaretPos(pi,pi.value.length); e.stop(); } } } } } } function SplitInput_OnChange(e) { //filter inputs var validatorRegEx = new RegExp("^([0-9]*)$"); var numRegEx = new RegExp("[0-9]*","g"); this.up().select('input[type=text]').each(function (ps) { var ns = ps.value; var OK = validatorRegEx.test(ns); if (!OK) { var matches = ns.match(numRegEx); ns = matches.join(""); ps.value = ns; } }); //inputs have been filtered //divy up the paste content if ((this.value.length) > this.getAttribute('length')) { var content = this.value; var l = this.getAttribute('length') this.value = content.substring(0,l); content = content.substring(l,content.length-l); var ci = this.next('input[type=text]'); while(ci != null) { var l = ci.getAttribute('length'); ci.value = content.substring(0,l); content = content.substring(l); ci = ci.next('input[type=text]'); } this.up().select('input[type=text]').last().focus(); } var hf = this.up().select('input[type=hidden]').first(); var separator = hf.getAttribute('separator'); var items = this.up().select('input[type=text]').inject([], function (arr, p) { arr.push(p.value); return arr; }); hf.value = items.join(separator); } /* function formatCurrency(s) { alert('formatCurrency'); var d = s.toFixed(2).toString(); var s = d.substring(0,d.indexOf('.')); var o = d.substring(d.indexOf('.')+1, d.length); var g = s.toArray().inGroupsOf(3).invoke('join','').join(','); var r = '$' + g + '.' + o; alert(r); return r; //return s.toFixed(2).toString().split('').reverse().join('').replace(/(?=\d*\.?)(\d{3})/g,'$1,').split('').reverse().join('').replace(/^[\,]/,'') } */ function formatCurrency(amount) { var delimiter = ","; // replace comma if desired var a = amount.toString().split('.', 2) var d = a[1]; var i = parseFloat(a[0]); if (isNaN(i)) { return ''; } var minus = ''; if (i < 0) { minus = '-'; } i = Math.abs(i); var n = new String(i); var a = []; while (n.length > 3) { var nn = n.substr(n.length - 3); a.unshift(nn); n = n.substr(0, n.length - 3); } if (n.length > 0) { a.unshift(n); } n = a.join(delimiter); if (!d || d.length < 1) { d = '00'; }else{ d = parseFloat(d).toPaddedString(2); } return '$' + minus + n + '.' + d; } function formatFloat(amount, dps) { if (!dps) dps = 2; var delimiter = ","; // replace comma if desired var a = (Math.round(amount * Math.pow(10, dps)) / Math.pow(10, dps)).toString().split('.', 2) var d = a[1]; // very hacky but it works var i = parseFloat(a[0]); if (isNaN(i)) { return ''; } var minus = ''; if (i < 0) { minus = '-'; } i = Math.abs(i); var n = new String(i); var a = []; while (n.length > 3) { var nn = n.substr(n.length - 3); a.unshift(nn); n = n.substr(0, n.length - 3); } if (n.length > 0) { a.unshift(n); } n = a.join(delimiter); if (!d || d.length < 1) { d = ''; for (var i = 0; i < dps; ++i) d += '0'; } else { d = parseFloat(d).toPaddedString(dps); } return minus + n + '.' + d; } function NumericInput_OnBlur(e) { var srcElement = Event.element(e); var validationType = srcElement.getAttribute("validationtype"); if (validationType == 'currency' && srcElement.value != '' && srcElement.value.toArray()[0] != '$') { srcElement.value = formatCurrency(srcElement.value.parseCurrency()); } if (validationType == 'decimal' && srcElement.value != '') { try{ var num = parseFloat(srcElement.value); var dp = parseFloat(srcElement.readAttribute('decimalplaces')); srcElement.value = num.toFixed(dp); }catch(e) { } } } //123456789 function NumericInput_OnFocus(e) { var srcElement = Event.element(e); var cp = getCaretPos(srcElement); var validationType = srcElement.getAttribute("validationtype"); if (validationType == 'currency' && srcElement.value != '' && srcElement.value.toArray()[0] == '$') { srcElement.value = srcElement.value.substring(1); setCaretPos(srcElement, cp - 1); cp = getCaretPos(srcElement); if (srcElement.value.include(',')) { var cl = srcElement.value.length; var ov = srcElement.value; var ncp = cp - (ov.substring(0, cp).length - ov.substring(0, cp).gsub(",","").length) srcElement.value = srcElement.value.gsub(",", ""); setCaretPos(srcElement, Math.max(ncp,0)); } cp = getCaretPos(srcElement); if (cp == srcElement.value.length) { srcElement.activate(); } } } function NumericInput_OnChange(e) { var srcElement = Event.element(e); var validationType = srcElement.getAttribute("validationtype"); var ns = srcElement.value; if (validationType != null) { if (validationType == 'numeric') { var validatorRegEx = new RegExp("^([\-]?[0-9]*)$"); var OK = validatorRegEx.test(ns); if (!OK) { var numRegEx = new RegExp("[\-]?[0-9]*", "g"); var matches = ns.match(numRegEx); ns = matches.join(""); } } else { if(validationType == 'decimal' || validationType == 'currency') { var dprx = ""; var dp = srcElement.getAttribute("decimalPlaces"); if (dp != null) dprx = "([\-]?[.0-9]{1," + (new Number(dp) + 1) + "})?$" var validatorRegEx = new RegExp("^([0-9]*)" + dprx); var OK = validatorRegEx.test(ns); if (!OK) { var numRegEx = new RegExp("[\-]?[0-9.]*", "g"); var matches = srcElement.value.match(numRegEx); ns = matches.join(""); var allowedDp = srcElement.getAttribute("decimalplaces") if (srcElement.value.lastIndexOf(".") != -1) { var dpc = ns.substr(ns.lastIndexOf(".")+1); dp = dpc.length; if (dp > allowedDp) ns = ns.replace("."+dpc, "." + dpc.substring(0,allowedDp)); } srcElement.value = ns; } }else{ //new Insertion.Top($('debug'),'changed with validation
'); } } //just to ensure the max length is not violated by a paste var ml = srcElement.getAttribute('maxlength'); if(Prototype.Browser.IE && ml == '2147483647') ml = null; //ie fix srcElement.value = ns.substring(ml?ns.length-ml:0); //if there is a min/max attribute var minV = srcElement.getAttribute('minvalue'); var maxV = srcElement.getAttribute('maxvalue'); if (minV!=null && parseInt(srcElement.value) < minV) srcElement.value = minV; if (maxV != null && parseInt(srcElement.value) > maxV) srcElement.value = maxV; if (srcElement.aspnetOnChange) { srcElement.aspnetOnChange(); } } } function getCaretPos(oField) { var iCaretPos = 0; if (Prototype.Browser.IE) { try{ var oSel = document.selection.createRange(); oSel.moveStart ('character', -oField.value.length); iCaretPos = oSel.text.length; }catch(e) { } }else{ iCaretPos = oField.selectionEnd; } return iCaretPos; } function setCaretPos(oField, iCaretPos) { if (Prototype.Browser.IE) { var t = oField.createTextRange(); start = iCaretPos; end = iCaretPos; end -= start + oField.value.slice(start + 1, end).split("\n").length - 1; start -= oField.value.slice(0, start).split("\n").length - 1; t.move("character", start); t.moveEnd("character", end); t.select(); } else { oField.selectionStart = iCaretPos; oField.selectionEnd = iCaretPos; oField.focus(); } } var ctrlKey = false; function NumericInput_OnKeyUp(e) { var key = (e.keyCode)?e.keyCode:(e.which)?e.which:undefined; if (key != undefined) { if (key == 17) { //user releasing ctrl ctrlKey = false; } } } function NumericInput_OnKeyDown(e) { var srcElement = Event.element(e); var key = (e.keyCode)?e.keyCode:(e.which)?e.which:undefined; if (key != undefined) { if (key==17) { //user pressing ctrl ctrlKey = true; return; } if (ctrlKey && (key == 86 || key == 67 || key == 88)) { //ctrl + xcv return; } //- if allow negative var allowedNegative = srcElement.getAttribute("allownegative") if (allowedNegative) { if (key == 189 || key == 109) { if (!srcElement.value.startsWith('-') || srcElement.value == '') { if (getCaretPos(srcElement) == 0) { return; } } } } var validationType = srcElement.getAttribute("validationtype"); var dp = 0; var allowedDp = srcElement.getAttribute("decimalplaces") if (srcElement.value.lastIndexOf(".") != -1) dp = srcElement.value.substr(srcElement.value.lastIndexOf(".")+1).length + 1; var ml = srcElement.getAttribute('maxlength'); if(Prototype.Browser.IE && ml == '2147483647') ml = null; //ie fix if (ml == null || (ml != null && srcElement.value.length <= ml)) { if (getSel(srcElement) == '') { if ((validationType == 'currency' || validationType == 'decimal') && dp > allowedDp) //check it's length of decimal places if (srcElement.value.lastIndexOf(".") < getCaretPos(srcElement)) if (key<8||key>9) //if not tab/backspace if (!(key >= 35 && key <= 40) && key != 46 && key != 116) //if not arrows, home, end, delete, f5 failedValidation(e,key,srcElement); if (key<8||key>9) //if not tab/backspace if (!(key >= 35 && key <= 40) && key != 46 && key != 110) //if not arrows, home, end, delete, num pad . if (key<48||(key>57 && !(key >= 96 && key <=105)) ||e.shiftKey) //if not a number and shift not pressed (symbols) if ((validationType != "decimal" && validationType!= "currency") || (validationType == 'decimal' && (key == 190 || key == 110) && !srcElement.value.toArray().select(function (c) { return c=="."; }).length == 0) || (validationType == 'decimal' && key != 190) || (validationType == 'currency' && key == 190 && !srcElement.value.toArray().select(function (c) { return c=="."; }).length == 0) || (validationType == 'currency' && key != 190)) failedValidation(e,key,srcElement); }else{ if (key<8||key>9) //if not tab/backspace if (!(key >= 35 && key <= 40) && key != 46 && key != 110 && key != 116) //if not arrows, home, end, delete, num pad ., f5 if (key<48||(key>57 && !(key >= 96 && key <=105)) ||e.shiftKey) //if not a number and shift not pressed (symbols) failedValidation(e,key,srcElement); } }else{ if(srcElement.value.length <= ml) failedValidation(e,key,srcElement); } } } function failedValidation(e,key,srcElement) { e.stop(); if (lastHighlight) lastHighlight.cancel(); if (key >= 20) lastHighlight = inputFilterHighlight(srcElement); return; } function inputFilterHighlight(element) { return new Effect.Highlight(element, { duration: .5, startcolor: "#ff9999", endcolor: "#ffffff", restorecolor: "#ffffff" }); } function getSel(oField) { var caretInfo = getCaretInfo(oField); return oField.value.substring(caretInfo.start,caretInfo.end); } function getCaretInfo(oTextarea) { var docObj = oTextarea.ownerDocument; var result = {start:0, end:0, caret:0}; if (navigator.appVersion.indexOf("MSIE")!=-1) { if (oTextarea.tagName.toLowerCase() == "textarea") { if (oTextarea.value.charCodeAt(oTextarea.value.length-1) < 14) { oTextarea.value=oTextarea.value.replace(/34/g,'')+String.fromCharCode(28); } var oRng = docObj.selection.createRange(); var oRng2 = oRng.duplicate(); oRng2.moveToElementText(oTextarea); oRng2.setEndPoint('StartToEnd', oRng); result.end = oTextarea.value.length-oRng2.text.length; oRng2.setEndPoint('StartToStart', oRng); result.start = oTextarea.value.length-oRng2.text.length; result.caret = result.end; if (oTextarea.value.substr(oTextarea.value.length-1) == String.fromCharCode(28)) { oTextarea.value = oTextarea.value.substr(0, oTextarea.value.length-1); } } else { try{ var range = docObj.selection.createRange(); var r2 = range.duplicate(); result.start = 0 - r2.moveStart('character', -100000); result.end = result.start + range.text.length; result.caret = result.end; }catch(e){ } } } else { result.start = oTextarea.selectionStart; result.end = oTextarea.selectionEnd; result.caret = result.end; } if (result.start < 0) { result = {start:0, end:0, caret:0}; } return result; } Event.observe(document, 'sniper:initcontrols', function(e) { inputfilter_init(); }); Event.observe(document, 'dom:loaded', function(e) { document.fire("sniper:initcontrols"); }); Object.extend(String.prototype, { parseInt: parseInt.methodize(), parseFloat: parseFloat.methodize(), parseCurrency: function(s) { var r = parseFloat(s.replace('$', '').gsub(',', '')); return r; } .methodize(), parsePercent: function(s) { return s.replace('%', '').parseFloat(); } .methodize() });