UNPKG

processmaker-builder

Version:

The gulp task runner for ProcessMaker building

1,415 lines (1,307 loc) 137 kB
/* PACKAGE : GULLIVER FORMS */ function G_Form ( element, id ) { var me=this; this.info = { name:'G_Form', version :'1.0' }; /*this.module=RESERVED*/ this.formula=''; this.element=element; if (!element) return; this.id=id; this.aElements=[]; this.ajaxServer=''; this.getElementIdByName = function (name){ if (name=='') return -1; var j; for(j=0;j<me.aElements.length;j++){ if (me.aElements[j].name===name) return j; } return -1; }; this.getElementByName = function (name) { var i=me.getElementIdByName(name); if (i>=0) return me.aElements[i]; else return null; }; this.hideGroup = function( group, parentLevel ){ if (typeof(parentLevel)==='undefined') parentLevel = 1; for( var r=0 ; r < me.aElements.length ; r++ ) { if ((typeof(me.aElements[r].group)!=='undefined') && (me.aElements[r].group == group )) me.aElements[r].hide(parentLevel); } }; this.showGroup = function( group, parentLevel ){ if (typeof(parentLevel)==='undefined') parentLevel = 1; for( var r=0 ; r < me.aElements.length ; r++ ) { if ((typeof(me.aElements[r].group)!=='undefined') && (me.aElements[r].group == group )) me.aElements[r].show(parentLevel); } }; this.verifyRequiredFields=function(){ var valid=true; for(var i=0;i<me.aElements.length;i++){ var verifiedField=((!me.aElements[i].required)||(me.aElements[i].required && (me.aElements[i].value()!==''))); valid=valid && verifiedField; if (!verifiedField) { me.aElements[i].highLight(); } } return valid; }; } function G_Field ( form, element, name ) { var me=this; this.form=form; this.element=element; this.name=name; this.dependentFields=[]; this.dependentOf=[]; this.hide = function( parentLevel ){ if (typeof(parentLevel)==='undefined') parentLevel = 1; var parent = me.element; for( var r=0; r< parentLevel ; r++ ) parent = parent.parentNode; parent.style.display = 'none'; }; this.show = function( parentLevel ){ if (typeof(parentLevel)==='undefined') parentLevel = 1; var parent = me.element; for( var r=0; r< parentLevel ; r++ ) parent = parent.parentNode; parent.style.display = ''; }; this.setDependentFields = function(dependentFields) { var i; if (dependentFields.indexOf(',') > -1) { dependentFields = dependentFields.split(','); } else { dependentFields = dependentFields.split('|'); } for(i=0;i<dependentFields.length;i++) { if (me.form.getElementIdByName(dependentFields[i])>=0) { me.dependentFields[i] = me.form.getElementByName(dependentFields[i]); me.dependentFields[i].addDependencie(me); } } }; this.addDependencie = function (field) { var exists = false; for (i=0;i<me.dependentOf.length;i++) if (me.dependentOf[i]===field) exists = true; if (!exists) me.dependentOf[i] = field; }; this.updateDepententFields=function(event) { var tempValue; if (me.dependentFields.length===0) return true; var fields=[],Fields = [],i,grid='',row=0; var gridField = ""; for(i in me.dependentFields) { if (me.dependentFields[i].dependentOf) { for (var j = 0; j < me.dependentFields[i].dependentOf.length; j++) { var oAux = me.dependentFields[i].dependentOf[j]; if (oAux.name.indexOf('][') > -1) { var arrayAux = oAux.name.split("]["); grid = arrayAux[0]; row = parseInt(arrayAux[1]); fieldName = arrayAux[2]; gridField = gridGetAllFieldAndValue(oAux.name, 0); //Not get current field if (Fields.length > 0){ aux = Fields; aux.push('?'); if (aux.join('*').indexOf(fieldName + '*') == -1){ Fields.push(fieldName); eval("var oAux2 = {" + fieldName + ":'" + oAux.value() + "'}"); fields = fields.concat(oAux2); } }else{ Fields.push(fieldName); eval("var oAux2 = {" + fieldName + ":'" + oAux.value() + "'}"); fields = fields.concat(oAux2); } } else { aux = Fields; aux.push('?'); oAux = me.dependentFields[i].dependentOf[0]; if (Fields.length > 0){ if (aux.join('*').indexOf(oAux.name + '*') == -1){ Fields.push(oAux.name); fields = fields.concat(me.dependentFields[i].dependentOf); } }else{ Fields.push(oAux.name); fields = fields.concat(me.dependentFields[i].dependentOf); } } } } } var callServer; callServer = new leimnud.module.rpc.xmlhttp({ url: me.form.ajaxServer, async: false, method: "POST", args: "function=reloadField" + "&form=" + encodeURIComponent(me.form.id) + "&fields=" + encodeURIComponent(fields.toJSONString()) + ((grid != "")? "&grid=" + grid + ((gridField != "")? "&gridField=" + encodeURIComponent("{" + gridField + "}") : "") : "") + ((row > 0)? "&row=" + row: "") }); callServer.make(); var response = callServer.xmlhttp.responseText; //Validate the response if (response.substr(0,1)==='[') { var newcont; eval('newcont=' + response + ';'); if (grid == '') { for(var i=0;i<newcont.length;i++) { //alert(newcont[i].name + '-' + newcont[i].value); var j=me.form.getElementIdByName(newcont[i].name); if (typeof(me.form.aElements[j]) != 'undefined' ) { me.form.aElements[j].setValue(newcont[i].value); me.form.aElements[j].setContent(newcont[i].content); me.form.aElements[j].updateDepententFields(); } /*if (me.form.aElements[j].element.fireEvent) { me.form.aElements[j].element.fireEvent("onchange"); } else { var evObj = document.createEvent('HTMLEvents'); evObj.initEvent( 'change', true, true ); me.form.aElements[j].element.dispatchEvent(evObj); }*/ } } else { for(var i=0;i<newcont.length;i++) { var oAux = me.form.getElementByName(grid); if (oAux) { var oAux2 = oAux.getElementByName(row, newcont[i].name); if (oAux2) { oAux2.setValue(newcont[i].value); if (oAux2.element.type != "textarea") { oAux2.setContent(newcont[i].content); } else { //This code fragment is copy of method G_Text.setContent() oAux2.element.value = ""; if (newcont[i].content.options) { if (newcont[i].content.options[0]) { oAux2.element.value = newcont[i].content.options[0].value; } } } oAux2.updateDepententFields(); // this line is also needed to trigger the onchange event to trigger the calculation of // sumatory or average functions in text fields //if (i == (newcont.length-1)){ /* if (oAux2.element.fireEvent) { oAux2.element.fireEvent("onchange"); } else { var evObj = document.createEvent('HTMLEvents'); evObj.initEvent( 'change', true, true ); oAux2.element.dispatchEvent(evObj); }*/ //} } } } } } else { alert('Invalid response: '+response); } // this checks the dependent fields that doesn't have assigned a value // but their master yes and their dependence must be fulfilled within one // onchange event /* if (grid!='') { var checkCallServer; var fieldName ; var index; //fieldName = me.name; checkCallServer = new leimnud.module.rpc.xmlhttp({ url : '../dynaforms/dynaforms_checkDependentFields', async : false, method : "POST", args : 'function=showDependentFields&fields='+response+'&fieldName='+fieldName+'&DYN_UID='+me.form.id+'&form='+encodeURIComponent(fields.toJSONString()) +(grid!=''?'&grid='+grid:'')+(row>0?'&row='+row:'') }); checkCallServer.make(); var dependentList = eval(checkCallServer.xmlhttp.responseText); var field ; var oAuxJs; for ( index in dependentList ){ field = 'form[grid]['+ row +']['+dependentList[index]+']'; oAuxJs = document.getElementById(field); if ( oAuxJs!=null ){ if (oAuxJs.value!="") { if ( oAuxJs.fireEvent ) { oAuxJs.fireEvent("onchange"); } else { var evObj = document.createEvent( 'HTMLEvents' ); evObj.initEvent( 'change', true, true ); oAuxJs.dispatchEvent(evObj); } } } } }*/ return true; }; this.setValue = function(newValue) { me.element.value = newValue; }; this.setContent = function(newContent) { }; this.setAttributes = function (attributes) { for(var a in attributes) { if(a=='formula' && attributes[a]){ //here we called a this function if it has a formula sumaformu(this.element,attributes[a],attributes['mask']); }//end formula switch (typeof(attributes[a])) { case 'string': case 'int': case 'boolean': if (a != 'strTo') { switch (true) { case typeof(me[a])==='undefined': case typeof(me[a])==='object': case typeof(me[a])==='function': case a==='isObject': case a==='isArray': break; default: me[a] = attributes[a]; } } else { me[a] = attributes[a]; } } } }; this.value=function() { return me.element.value; }; this.toJSONString=function() { return '{"'+me.name+'":'+me.element.value.toJSONString()+'}'; }; this.highLight=function(){ try{ G.highLight(me.element); if (G.autoFirstField) { me.element.focus(); G.autoFirstField=false; setTimeout("G.autoFirstField=true;",1000); } } catch (e){ } }; } function G_DropDown( form, element, name ) { var me=this; this.parent = G_Field; this.parent( form, element, name ); this.setContent = function (content) { dropDownSetOption(me, content); }; if (!element) return; leimnud.event.add(this.element,'change',this.updateDepententFields); } G_DropDown.prototype=new G_Field(); function G_Text(form, element, name) { var me = this; this.mType = "text"; this.parent = G_Field; this.browser = {}; this.comma_separator = "."; this.checkBrowser = function(){ var nVer = navigator.appVersion; var nAgt = navigator.userAgent; //alert(navigator.userAgent); var browserName = navigator.appName; var fullVersion = ''+parseFloat(navigator.appVersion); var majorVersion = parseInt(navigator.appVersion,10); var nameOffset,verOffset,ix; // In Opera, the true version is after "Opera" or after "Version" if ((verOffset=nAgt.indexOf("Opera"))!=-1) { browserName = "Opera"; fullVersion = nAgt.substring(verOffset+6); if ((verOffset=nAgt.indexOf("Version"))!=-1) fullVersion = nAgt.substring(verOffset+8); } // In MSIE, the true version is after "MSIE" in userAgent else if ((verOffset=nAgt.indexOf("MSIE"))!=-1) { browserName = "Microsoft Internet Explorer"; fullVersion = nAgt.substring(verOffset+5); } // In Chrome, the true version is after "Chrome" else if ((verOffset=nAgt.indexOf("Chrome"))!=-1) { browserName = "Chrome"; fullVersion = nAgt.substring(verOffset+7); } // In Safari, the true version is after "Safari" or after "Version" else if ((verOffset=nAgt.indexOf("Safari"))!=-1) { browserName = "Safari"; fullVersion = nAgt.substring(verOffset+7); if ((verOffset=nAgt.indexOf("Version"))!=-1) fullVersion = nAgt.substring(verOffset+8); } // In Firefox, the true version is after "Firefox" else if ((verOffset=nAgt.indexOf("Firefox"))!=-1) { browserName = "Firefox"; fullVersion = nAgt.substring(verOffset+8); } // In most other browsers, "name/version" is at the end of userAgent else if ( (nameOffset=nAgt.lastIndexOf(' ')+1) < (verOffset=nAgt.lastIndexOf('/')) ) { browserName = nAgt.substring(nameOffset,verOffset); fullVersion = nAgt.substring(verOffset+1); if (browserName.toLowerCase()==browserName.toUpperCase()) { browserName = navigator.appName; } } // trim the fullVersion string at semicolon/space if present if ((ix=fullVersion.indexOf(";"))!=-1) fullVersion=fullVersion.substring(0,ix); if ((ix=fullVersion.indexOf(" "))!=-1) fullVersion=fullVersion.substring(0,ix); majorVersion = parseInt(''+fullVersion,10); if (isNaN(majorVersion)) { fullVersion = ''+parseFloat(navigator.appVersion); majorVersion = parseInt(navigator.appVersion,10); } this.browser = { name: browserName, fullVersion: fullVersion, majorVersion: majorVersion, userAgent: navigator.userAgent }; }; this.parent( form, element, name ); if (element) { this.prev = element.value; } this.validate = 'Any'; this.mask = ''; this.required = false; this.formula = ''; this.key_Change = false; var doubleChange = false; //FUNCTIONS function IsUnsignedInteger(YourNumber){ var Template = /^d+$/; //Formato de numero entero sin signo return (Template.test(YourNumber)) ? 1 : 0; //Compara "YourNumber" con el formato "Template" y si coincidevuelve verdadero si no devuelve falso } function replaceAll( text, busca, reemplaza ){ while (text.toString().indexOf(busca) != -1){ text = text.toString().replace(busca,reemplaza); } return text; } function isNumberMask (mask){ for ( var key in mask){ if (mask[key]!='#'&&mask[key]!=','&&mask[key]!='.'&&typeof(mask[key])=='string'){ return false; } } return true; } //function renderNewValue(element, keyCode){ /*var myField = element; var myValue = myField.value; var cursorPos = 0; var csel; var newValue = ''; var csel = me.getCursorPosition(); var startPos = csel.selectionStart; var endPos = csel.selectionEnd; var newValue2; switch(keyCode){ case 8: if (startPos>0) { newValue = myValue.substring(0, startPos-1); newValue = newValue + myValue.substring(endPos, myField.value.length); if (mType !== 'text'){ newValue2 = G.toMask(newValue, me.mask, startPos); }else{ newValue2 = G.toMask(newValue, me.mask, startPos, 'normal'); } newValue = newValue2.result; } break; case 46: newValue = myValue.substring(0, startPos); newValue = newValue + myValue.substring(endPos+1, myField.value.length); if (mType !== 'text'){ newValue2 = G.toMask(newValue, me.mask, startPos); }else{ newValue2 = G.toMask(newValue, me.mask, startPos, 'normal'); } newValue = newValue2.result; break; } return {result: newValue, cursor: startPos};*/ //} //MEMBERS this.setContent = function(content) { me.element.value = ''; if (content.options) { if (content.options[0]) { me.element.value = content.options[0].value; } } }; //this.validateKey = function(event){ /* attributes = elementAttributesNS(element, 'pm'); if(me.element.readOnly) return true; me.prev = me.element.value; if (window.event) event=window.event; var keyCode= window.event ? event.keyCode : event.which ; me.mask = typeof(me.mask)==='undefined'?'':me.mask; if(me.mask=='yyyy-mm-dd'){ attributes.mask=attributes.mask.replace('%d','dd'); attributes.mask=attributes.mask.replace('%m','mm'); attributes.mask=attributes.mask.replace('%y','yy'); attributes.mask=attributes.mask.replace('%Y','yyyy'); attributes.mask=attributes.mask.replace('%H','mm'); attributes.mask=attributes.mask.replace('%M','mm'); attributes.mask=attributes.mask.replace('%S','mm'); me.mask=attributes.mask; } //alert(me.mask); if (me.mask !=='' ) { if ((keyCode < 48 || keyCode > 57) && (keyCode != 8 && keyCode != 0 && keyCode != 46)) return false; if((keyCode===118 || keyCode===86) && event.ctrlKey) return false; if (event.ctrlKey) return true; if (event.altKey) return true; if (event.shiftKey) return true; } if ((keyCode===0) ) if (event.keyCode===46) return true; else return true; if ( (keyCode===8)) return true; if (me.mask ==='') { if (me.validate == 'NodeName') { if (me.getCursorPos() == 0) { if ((keyCode >= 48) && (keyCode <= 57)) { return false; } } var k=new leimnud.module.validator({ valid :['Field'], key :event, lang :(typeof(me.language)!=='undefined')?me.language:"en" }); return k.result(); }else{ switch(me.validate){ case "Int": if ((keyCode > 47) && (keyCode < 58) || ( keyCode == 118 && event.ctrlKey)|| (keyCode == 120 && event.ctrlKey)) { return true; }else{ return false; } break; case "Alpha": if (keyCode==8) return true; patron =/[A-Za-z\sáéíóúäëïöüñçÇÑ�É�ÓÚÄË�ÖÜ]/; te = String.fromCharCode(keyCode); return patron.test(te); break; case "AlphaNum": if (keyCode==8) return true; patron =/[A-Za-z0-9\sáéíóúäëïöüñçÇÑ�É�ÓÚÄË�ÖÜ]/; te = String.fromCharCode(keyCode); return patron.test(te); break; default: var k=new leimnud.module.validator({ valid :[me.validate], key :event, lang :(typeof(me.language)!=='undefined')?me.language:"en" }); return k.result(); break; } } }else{ var csel = me.getCursorPosition(); var myValue = String.fromCharCode(keyCode); var startPos = csel.selectionStart; var endPos = csel.selectionEnd; var myField = me.element; var oldValue = myField.value; var newValue = ''; newValue = oldValue.substring(0, startPos); newValue = newValue + myValue; newValue = newValue + oldValue.substring(endPos, oldValue.length); startPos++; var newValue2; if (mType !== 'text'){ newValue2 = G.toMask(newValue, me.mask, startPos); }else{ newValue2 = G.toMask(newValue, me.mask, startPos, 'normal'); } //alert(newValue + ' -> ' + mType + ' -> ' + newValue2.result); //alert(newValue2.result); me.element.value = newValue2.result; //alert(me.element.value); me.setSelectionRange(newValue2.cursor, newValue2.cursor); if (me.element.fireEvent){ me.element.fireEvent("onchange"); }else{ var evObj = document.createEvent('HTMLEvents'); evObj.initEvent( 'change', true, true ); me.element.dispatchEvent(evObj); } return true; }*/ //}; this.putFormatNumber =function (evt) { /* if((typeof(evt)==="undefined" || evt===0) && me.mask!='' ){*/ // var numberSet=me.element.value.split('.'); // maskD = me.mask.split(';'); // maskL = (maskD.length >1)?maskD[1]:maskD[0]; // if (maskL.search(",")==-1){ // return false; // } // maskWithoutC =replaceAll(maskL,",",""); // maskWithoutC =replaceAll(maskWithoutC," ",""); // maskWithoutPto=replaceAll(maskWithoutC,".",""); // if(numberSet.length >=2){ // if(maskWithoutPto.substr( (maskWithoutPto.length -1) ,maskWithoutPto.length) =="%") // me.element.value = me.element.value+' '+maskWithoutPto.substr( (maskWithoutPto.length -1) ,maskWithoutPto.length); // return; // } // // maskElemnts = maskWithoutC.split('.'); // maskpartInt = maskElemnts[0].split(''); // numberwc = replaceAll(me.element.value,",", ""); // numberwc = replaceAll(numberwc,".", ""); // onlynumber = replaceAll(numberwc,".", ""); // onlynumber = replaceAll(numberwc," ", ""); // onlynumber = replaceAll(numberwc,"%", ""); // if(onlynumber=='') return false; // cd = parseInt(Math.log(onlynumber)/Math.LN10+1); // var auxnumber = onlynumber; // var cdaux=0; // while(auxnumber > 0){ // cdaux++; // auxnumber =parseInt(auxnumber / 10); // } // cd=cdaux; // // if (isNumberMask(maskpartInt)){ // if(cd < maskpartInt.length && cd >= 4 && cd !=3){ // var newNumber=''; // var cc=1; // while (onlynumber > 0){ // lastdigito = onlynumber % 10; // if (cc%3==0 && cd != cc){ // newNumber = ','+lastdigito.toString() + newNumber; // } else { // newNumber = lastdigito.toString() + newNumber; // } // onlynumber =parseInt(onlynumber / 10); // cc++; // } // if(maskWithoutPto.substr( (maskWithoutPto.length -1) ,maskWithoutPto.length) =="%") // me.element.value = newNumber+' '+maskWithoutPto.substr( (maskWithoutPto.length -1) ,maskWithoutPto.length); // else // me.element.value = newNumber; // }else{ // if(maskWithoutPto.substr( (maskWithoutPto.length -1) ,maskWithoutPto.length) =="%") // var spaceString; // if (me.element.value.substr( (me.element.value.length -1) ,me.element.value.length) == '%' ){ // spaceString =''; // me.element.value = onlynumber + spaceString + maskWithoutPto.substr( (maskWithoutPto.length -1) ,maskWithoutPto.length); // } else { // spaceString =' '; // me.element.value = onlynumber; // } // } // } //} }; //this.preValidateChange=function(event) { /*var oNewValue; var newValueR; me.putFormatNumber(event); if(me.element.readOnly) return true; if (me.mask ==='') return true; if (event.keyCode === 8){ oNewValue = renderNewValue(me.element,event.keyCode); newValueR = G.toMask(oNewValue.result, me.mask, oNewValue.cursor ); me.element.value=newValueR.result; me.setSelectionRange(oNewValue.cursor - 1, oNewValue.cursor - 1); if (me.element.fireEvent){ me.element.fireEvent("onchange"); }else{ var evObj = document.createEvent('HTMLEvents'); evObj.initEvent( 'change', true, true ); me.element.dispatchEvent(evObj); } return false; } if (event.keyCode === 46){ oNewValue = renderNewValue(me.element,event.keyCode); newValueR = G.toMask(oNewValue.result, me.mask, oNewValue.cursor ); me.element.value=newValueR.result; me.setSelectionRange(oNewValue.cursor, oNewValue.cursor); if (me.element.fireEvent){ me.element.fireEvent("onchange"); }else{ var evObj = document.createEvent('HTMLEvents'); evObj.initEvent( 'change', true, true ); me.element.dispatchEvent(evObj); } return false; } //alert(me.element.value); me.prev=me.element.value; return true;*/ //}; this.execFormula=function(event) { if( me.formula != ''){ leimnud.event.add(getField('faa'),'keypress',function(){ alert(getField('faa').value); }); } return false; }; /*this.validateChange=function(event) { /*if (me.mask ==='') return true; var sel=me.getSelectionRange(); var newValue2=G.cleanMask( me.element.value, me.mask, sel.selectionStart ); newValue2=G.toMask( newValue2.result, me.mask, newValue2.cursor); me.element.value = newValue2.result; me.setSelectionRange(newValue2.cursor, newValue2.cursor); return true;*/ //};*/ this.value = function() { return me.element.value; }; //Get Cursor Position this.getCursorPos = function () { var textElement=me.element; if (!document.selection) return textElement.selectionStart; //save off the current value to restore it later, var sOldText = textElement.value; //create a range object and save off it's text var objRange = document.selection.createRange(); var sOldRange = objRange.text; //set this string to a small string that will not normally be encountered var sWeirdString = '#%~'; //insert the weirdstring where the cursor is at objRange.text = sOldRange + sWeirdString; objRange.moveStart('character', (0 - sOldRange.length - sWeirdString.length)); //save off the new string with the weirdstring in it var sNewText = textElement.value; //set the actual text value back to how it was objRange.text = sOldRange; //look through the new string we saved off and find the location of //the weirdstring that was inserted and return that value for (i=0; i <= sNewText.length; i++) { var sTemp = sNewText.substring(i, i + sWeirdString.length); if (sTemp == sWeirdString) { var cursorPos = (i - sOldRange.length); return cursorPos; } } }; this.setSelectionRange = function(selectionStart, selectionEnd) { var input=me.element; if (input.createTextRange) { //IE var range = input.createTextRange(); range.collapse(true); range.moveEnd('character', selectionEnd); range.moveStart('character', selectionStart); range.select(); } else if (input.setSelectionRange) { //Firefox and others input.focus(); input.setSelectionRange(selectionStart, selectionEnd); } }; //FUNCTION MAYBE IT'S DEPRECATED /*this.getSelectionRange = function() { if (document.selection) { var textElement=me.element; var sOldText = textElement.value; var objRange = document.selection.createRange(); var sOldRange = objRange.text; var sWeirdString = '#%~'; objRange.text = sOldRange + sWeirdString; objRange.moveStart('character', (0 - sOldRange.length - sWeirdString.length)); var sNewText = textElement.value; objRange.text = sOldRange; for (i=0; i <= sNewText.length; i++) { var sTemp = sNewText.substring(i, i + sWeirdString.length); if (sTemp == sWeirdString) { var cursorPos = (i - sOldRange.length); return { selectionStart: cursorPos, selectionEnd: cursorPos+sOldRange.length }; } } }else{ var sel={ selectionStart: 0, selectionEnd: 0 }; sel.selectionStart = me.element.selectionStart; sel.selectionEnd = me.element.selectionEnd; return sel; } }; */ //FUNCTION MAYBE IT'S DEPRECATED /*this.getCursorP =function (field) { if (document.selection) { field.focus(); var oSel = document.selection.createRange(); oSel.moveStart('character', -field.value.length); field.selectionEnd = oSel.text.length; oSel.setEndPoint('EndToStart', document.selection.createRange() ); field.selectionStart = oSel.text.length; } return {selectionStart: field.selectionStart, selectionEnd: field.selectionEnd}; };*/ //Gets cursor position this.getCursorPosition = function(){ if(navigator.appName == 'Microsoft Internet Explorer'){ var field = me.element; if (document.selection) { field.focus(); var oSel = document.selection.createRange(); oSel.moveStart('character', -field.value.length); field.selectionEnd = oSel.text.length; oSel.setEndPoint('EndToStart', document.selection.createRange() ); field.selectionStart = oSel.text.length; } return {selectionStart: field.selectionStart, selectionEnd: field.selectionEnd}; }else{ if (document.selection) { var textElement=me.element; var sOldText = textElement.value; var objRange = document.selection.createRange(); var sOldRange = objRange.text; var sWeirdString = '#%~'; objRange.text = sOldRange + sWeirdString; objRange.moveStart('character', (0 - sOldRange.length - sWeirdString.length)); var sNewText = textElement.value; objRange.text = sOldRange; for (i=0; i <= sNewText.length; i++) { var sTemp = sNewText.substring(i, i + sWeirdString.length); if (sTemp == sWeirdString) { var cursorPos = (i - sOldRange.length); return { selectionStart: cursorPos, selectionEnd: cursorPos+sOldRange.length }; } } }else{ var sel={ selectionStart: 0, selectionEnd: 0 }; sel.selectionStart = me.element.selectionStart; sel.selectionEnd = me.element.selectionEnd; return sel; } } }; this.removeMask = function(){ value = me.element.value; cursor = me.getCursorPosition(); chars = value.split(''); newValue = ''; newCont = 0; newCursor = 0; for(c=0; c < chars.length; c++){ switch(chars[c]){ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': newValue += chars[c]; newCont++; if (c + 1 == cursor.selectionStart){ newCursor = newCont; } break; case me.comma_separator: if(me.mType != 'date') { newValue += chars[c]; newCont++; if (c + 1 == cursor.selectionStart){ newCursor = newCont; } } break; case '-': if (me.validate == 'Real' || me.validate == 'Int'){ newValue += chars[c]; newCont++; if (c + 1 == cursor.selectionStart){ newCursor = newCont; } } break; } } if (cursor.selectionStart != cursor.selectionEnd){ return {result: newValue, cursor: cursor}; } else{ return {result: newValue, cursor: {selectionStart: newCursor, selectionEnd: newCursor}}; } }; this.replaceMask = function(value, cursor, mask, type, comma){ switch(type){ case 'currency': case 'percentage': dir = 'reverse'; break; default: if (me.mType == 'text' && me.validate == 'Real') { dir = 'reverse'; } else { dir = 'forward'; } break; } return G.ApplyMask(value, mask, cursor, dir, comma); }; this.replaceMasks= function(newValue, newCursor){ masks = me.mask; aMasks = masks.split(';'); aResults = []; for(m=0; m < aMasks.length; m++){ mask = aMasks[m]; type = me.mType; comma_sep = me.comma_separator; comma_sep = (comma_sep == '') ? '.' : comma_sep; aResults.push(me.replaceMask(newValue, newCursor, mask, type, comma_sep)); break; } minIndex = 0; minValue = aResults[0].result; if (aResults.length > 1){ for(i=1; i < aResults.length; i++){ if (aResults[i].result < minValue){ minValue = aResults[i].result; minIndex = i; } } } return aResults[minIndex]; }; this.getCleanMask = function(){ aMask = me.mask.split(''); maskOut = ''; for(i=0; i < aMask.length; i++){ if (me.mType == 'currency' || me.mType == 'percentage' || (me.mType == 'text' && me.validate == 'Real')){ switch(aMask[i]){ case '0': case '#': maskOut += aMask[i]; break; case me.comma_separator: maskOut += '_'; break; } } else{ switch(aMask[i]){ case '0': case '#': case 'd': case 'm': case 'y': case 'Y': maskOut += aMask[i]; break; } } } return maskOut; } this.applyMask = function(keyCode){ if (me.mask != ''){ dataWOMask = me.removeMask(); //alert(dataWOMask.result + ', ' + dataWOMask.cursor.selectionStart); currentValue = dataWOMask.result; currentSel = dataWOMask.cursor; cursorStart = currentSel.selectionStart; cursorEnd = currentSel.selectionEnd; var action = "mask"; var swPeriod = false; var i = 0; switch (keyCode) { case 0: action = 'none'; break; case 8: newValue = currentValue.substring(0, cursorStart - 1); newValue += currentValue.substring(cursorEnd, currentValue.length); newCursor = cursorStart - 1; break; case 46: newValue = currentValue.substring(0, cursorStart); newValue += currentValue.substring(cursorEnd + 1, currentValue.length); newCursor = cursorStart; break; case 256: case 44: swPeriod = true; newValue = currentValue.substring(0, cursorStart); if (keyCode == 256) newValue += '.'; else newValue += ','; newValue += currentValue.substring(cursorEnd, currentValue.length); //alert(newValue); newCursor = cursorStart + 1; break; case 35: case 36: case 37: case 38: case 39: case 40: newValue = currentValue; switch(keyCode){ case 36:newCursor = 0;break; case 35:newCursor = currentValue.length;break; case 37:newCursor = cursorStart - 1;break; case 39:newCursor = cursorStart + 1;break; } action = 'move'; break; case 45: if (me.mType == "currency" || (me.mType == "text" && (me.validate == "Real" || me.validate == "Int"))) { newValue = currentValue.substring(0, currentValue.length).split(""); if (newValue.length > 0) { for (i = 0; i <= newValue.length - 1; i++) { var campVal = newValue[i]; if ((typeof campVal == "number" || typeof campVal == "string") && campVal != "" && !isNaN(campVal)) { newValue = currentValue.substring(0, i - 1); newValue = newValue + "-" + currentValue.substring(i); i = newValue.length + 1; newCursor = cursorStart + 1; } else { if (campVal == "-") { newValue = currentValue.substring(0, i - 1); newValue = newValue + currentValue.substring(i + 1); newCursor = cursorStart - 1; i = newValue.length + 1; } } } if (newValue.join) { newValue = newValue.join(""); } } else { //default newKey = String.fromCharCode(keyCode); newValue = currentValue.substring(0, cursorStart); newValue = newValue + newKey; newValue = newValue + currentValue.substring(cursorEnd, currentValue.length); newCursor = cursorStart + 1; } } break; default: newKey = String.fromCharCode(keyCode); newValue = currentValue.substring(0, cursorStart); newValue = newValue + newKey; newValue = newValue + currentValue.substring(cursorEnd, currentValue.length); newCursor = cursorStart + 1; break; } if (newCursor < 0) { newCursor = 0; } if (keyCode != 8 && keyCode != 46 && keyCode != 35 && keyCode != 36 && keyCode != 37 && keyCode != 39){ var testData = dataWOMask.result; var tamData = testData.length; var cleanMask = me.getCleanMask(); var tamMask = cleanMask.length; var sw = false; if (testData.indexOf(me.comma_separator) == -1){ aux = cleanMask.split('_'); tamMask = aux[0].length; sw = true; } if (tamData >= tamMask) { var swMinus = false; if (/^.*\-.*$/.test(newValue)) { swMinus = true; } if (!(keyCode == 45 || (swMinus && tamMask >= tamData))) { if (sw && !swPeriod){ action = "none"; } if (!sw) { action = "none"; } } } } switch(action){ case 'mask': case 'move': dataNewMask = me.replaceMasks(newValue, newCursor); me.element.value = dataNewMask.result; me.setSelectionRange(dataNewMask.cursor,dataNewMask.cursor); break; //case 'move': //alert(newCursor); //me.setSelectionRange(newCursor,newCursor); //break; } } else{ //no mask currentValue = me.element.value; currentSel = me.getCursorPosition(); cursorStart = currentSel.selectionStart; cursorEnd = currentSel.selectionEnd; switch(keyCode){ case 8: newValue = currentValue.substring(0, cursorStart - 1); newValue += currentValue.substring(cursorEnd, currentValue.length); newCursor = cursorStart - 1; break; case 45: case 46: if (me.validate != "Email") { newValue = currentValue.substring(0, cursorStart); newValue += currentValue.substring(cursorEnd + 1, currentValue.length); newCursor = cursorStart; } else { newKey = String.fromCharCode(keyCode); newValue = currentValue.substring(0, cursorStart); newValue += newKey; newValue += currentValue.substring(cursorEnd, currentValue.length); newCursor = cursorStart + 1; } break; case 256: newValue = currentValue.substring(0, cursorStart); newValue += '.'; newValue += currentValue.substring(cursorEnd, currentValue.length); newCursor = cursorStart + 1; break; case 35: case 36: case 37: case 38: case 39: case 40: newValue = currentValue; switch(keyCode){ case 36:newCursor = 0;break; case 35:newCursor = currentValue.length;break; case 37:newCursor = cursorStart - 1;break; case 39:newCursor = cursorStart + 1;break; } break; default: newKey = String.fromCharCode(keyCode); newValue = currentValue.substring(0, cursorStart); newValue += newKey; newValue += currentValue.substring(cursorEnd, currentValue.length); newCursor = cursorStart + 1; break; } if (newCursor < 0) newCursor = 0; me.element.value = newValue; me.setSelectionRange(newCursor,newCursor); } //Launch OnChange Event /*if (me.element.fireEvent){ me.element.fireEvent("onchange"); }else{ var evObj = document.createEvent('HTMLEvents'); evObj.initEvent( 'change', true, true ); me.element.dispatchEvent(evObj); }*/ }; this.sendOnChange = function(){ if (me.element.fireEvent){ me.element.fireEvent("onchange"); }else{ var evObj = document.createEvent('HTMLEvents'); evObj.initEvent( 'change', true, true ); me.element.dispatchEvent(evObj); } }; this.handleKeyDown = function(event){ if (me.element.readOnly) { return true; } //THIS FUNCTION HANDLE BACKSPACE AND DELETE KEYS if (me.validate == 'Any' && me.mask == '') return true; var pressKey = (window.event)? window.event.keyCode : event.which; if (me.validate == "NodeName" && (pressKey == 189 || pressKey == 173)) { return true; } if (me.validate == "NodeName" && (pressKey == 0 || pressKey == 192 || pressKey == 109)) { return false; } if (pressKey == 107 || pressKey == 187 || pressKey == 191 || pressKey == 172 || pressKey == 171 || pressKey == 226 || pressKey == 220 || pressKey == 226 || pressKey == 221 || pressKey == 222 || pressKey == 186) { pressKey = 43; } switch(pressKey){ case 8: case 46: //BACKSPACE OR DELETE case 35: case 36: //HOME OR END case 37: case 38: case 39: case 40: case 43:// ARROW KEYS if ((pressKey == 8 || pressKey == 46) && me.validate == "NodeName") { return true; } if (pressKey == 46 && me.validate == "Email") { return true; } if (me.validate == "Email" && pressKey != 8 &&(me.element.value.length > me.element.maxLength - 1)) { return false; } if (pressKey == 43 && me.validate == "AlphaNum" ) { return false; } me.applyMask(pressKey); if ((pressKey == 8 || pressKey == 46) && (me.validate != 'Login' && me.validate != 'NodeName')) me.sendOnChange(); me.checkBrowser(); if (me.browser.name == 'Chrome' || me.browser.name == 'Safari'){ event.returnValue = false; } else{ return false; } break; case 9: return true; break; default: if (me.validate == 'NodeName' && (pressKey == 190 || pressKey == 189)) { return false; } if (me.mType == 'date' || me.mType == 'currency' || me.mType == 'percentage' || me.validate == 'Real' || me.validate == 'Int') { if ((48 <= pressKey && pressKey <= 57) || (pressKey == 109 || pressKey == 190 || pressKey == 188 || pressKey == 189) || (96 <= pressKey && pressKey <= 111)) { return true; } else { return false; } } break; } return true; }; this.handleKeyPress = function(event){ if (me.element.readOnly) { return true; } if ((me.mType != 'currency' && me.mType != 'percentage' && me.mType != 'date') && (me.element.value.length > me.element.maxLength - 1)) { return true; } if (me.validate == 'Any' && me.mask == '') return true; //THIS FUNCTION HANDLE ALL KEYS EXCEPT BACKSPACE AND DELETE //keyCode = event.keyCode; var keyCode = (window.event)? window.event.keyCode : event.which; if (navigator.userAgent.indexOf('MSIE') != -1) { // Microsoft Internet Explorer if (keyCode == 0) return true; } switch (keyCode) { case 9: case 13: return true; break; } var swShiftKey = ( (me.mType == 'currency') || (me.mType == 'percentage') || (me.validate == 'Real') || (me.validate == 'Int') )? false : true; if (window.event) { if (window.event.altKey) { return true; } if (window.event.ctrlKey) { return true; } //Commented for accept characters with AZERTY keyboard //if (window.event.shiftKey) { // return swShiftKey; //} } else { if (event.altKey) { return true; } if (event.ctrlKey) { return true; } //Commented for accept characters with AZERTY keyboard //if (event.shiftKey) { // return swShiftKey; //} } me.checkBrowser(); //if ((me.browser.name == 'Firefox') && (keyCode == 8 || keyCode == 46)) { if ((me.browser.name == 'Firefox') && (keyCode == 8) && (me.validate != 'NodeName')) { if (me.browser.name == 'Chrome' || me.browser.name == 'Safari'){ event.returnValue = false; } else{ return false; } } else{ //pressKey = window.event ? event.keyCode : event.which; var pressKey = (window.event)? window.event.keyCode : event.which; //if (me.mType == 'date') me.validate = 'Int'; keyValid = true; updateOnChange = true; switch (me.validate) { case 'Any': keyValid = true; break; case 'Int': patron = /[0-9\-]/; key = String.fromCharCode(pressKey); keyValid = patron.test(key); break; case 'Real': if (typeof me.comma_separator != 'undefined') { patron = /[0-9\-]/; } else { patron = /[0-9,\.]/; } key = String.fromCharCode(pressKey); keyValid = patron.test(key); keyValid = keyValid || (pressKey == 45); if (typeof me.comma_separator != 'undefined') { if (me.comma_separator == '.'){ if (me.element.value.indexOf('.')==-1){ keyValid = keyValid || (pressKey == 46); } } else{ if (me.element.value.indexOf(',')==-1){ keyValid = keyValid || (pressKey == 44); } } } break; case 'Alpha': patron =/[a-zA-Z]/; // \sáéíóúäëïöüñçÇÑ�É�ÓÚÄË�ÖÜ]/; key = String.fromCharCode(pressKey); keyValid = patron.test(key); break; case 'AlphaNum': patron =/[A-Za-z0-9\sáéíóúäëïöüñçÇÑÁÉÍÓÚÄËÏÖÜ]/; key = String.fromCharCode(pressKey); keyValid = patron.test(key); break; case 'NodeName': case 'Login': updateOnChange = false; if (me.getCursorPos() == 0) { if ((pressKey >= 48) && (pressKey <= 57)) { keyValid = false; break; } } if ((keyCode == 8) && (me.validate == 'NodeName')) { keyValid = true; } else { var k=new leimnud.module.validator({ valid :['Login'],