processmaker-builder
Version:
The gulp task runner for ProcessMaker building
1,415 lines (1,307 loc) • 137 kB
JavaScript
/* 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'],