Changeset 985

Show
Ignore:
Timestamp:
06/12/08 22:23:48 (6 months ago)
Author:
laurentj
Message:

ticket #564: jforms: implementation of <choice>. dynamic behavior in javascript is still missing.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/experimental/jforms-groups/lib/jelix-www/js/jforms.js

    r967 r985  
    4141    tControl: null, 
    4242    tControl2: null, 
     43    frmElt: null, 
    4344 
    4445    declareForm : function(aForm){ 
    4546        this._forms[aForm.name]=aForm; 
    4647        var elem = document.getElementById(aForm.name); 
    47  
    4848        if (elem.addEventListener) { 
    4949            elem.addEventListener("submit", function (ev) { if(!jForms.verifyForm(elem)) {ev.preventDefault(); ev.stopPropagation(); return false;} return true; }, false); 
     
    5858 
    5959    verifyForm : function(frmElt){ 
    60         var f = this._forms[frmElt.attributes.getNamedItem("id").value]; // we cannot use getAttribute for id because a bug with IE 
     60        this.tForm = this._forms[frmElt.attributes.getNamedItem("id").value]; // we cannot use getAttribute for id because a bug with IE 
     61        this.frmElt = frmElt; 
    6162        var msg = ''; 
    6263        var valid = true; 
    63         f.errorDecorator.start(); 
    64         for(var i =0; i < f.controls.length; i++){ 
    65             var c = f.controls[i]; 
     64        this.tForm.errorDecorator.start(); 
     65        for(var i =0; i < this.tForm.controls.length; i++){ 
     66            var c = this.tForm.controls[i]; 
    6667            var elt = frmElt.elements[c.name]; 
    6768            if (!elt) continue; // sometimes, all controls are not generated... 
    68             var val = this._getValue(elt); 
     69            var val = this.getValue(elt); 
    6970            if(val == ''){ 
    7071                if(c.required){ 
    71                     f.errorDecorator.addError(c, 1); 
     72                    this.tForm.errorDecorator.addError(c, 1); 
    7273                    valid = false; 
    7374                } 
    7475            }else{ 
    75                 var ok = false; 
    76                 switch(c.datatype){ 
    77                     case 'string' : 
    78                         ok = true; 
    79                         if(c.minLength != -1 && val.length < c.minLength) 
    80                             ok = false; 
    81                         if(c.maxLength != -1 && val.length > c.maxLength) 
    82                             ok = false; 
    83                         break; 
    84                     case 'boolean' : 
    85                         ok = (val == 'true' || val == 'false'); 
    86                         break; 
    87                     case 'decimal' : 
    88                         ok = ( -1 != val.search(/^\s*[\+\-]?\d+(\.\d+)?\s*$/)); 
    89                         break; 
    90                     case 'integer' : 
    91                         ok = ( -1 != val.search(/^\s*[\+\-]?\d+\s*$/)); 
    92                         break; 
    93                     case 'hexadecimal' :  
    94                         ok = (val.search(/^0x[a-f0-9A-F]+$/) != -1); 
    95                         break; 
    96                     case 'datetime' :  
    97                         var t = val.match(/^(\d{4})\-(\d{2})\-(\d{2}) (\d{2}):(\d{2})(:(\d{2}))?$/); 
    98                         if(t == null){ ok=false; break; }; 
    99                         var yy = parseInt(t[1],10); 
    100                         var mm = parseInt(t[2],10) -1; 
    101                         var dd = parseInt(t[3],10); 
    102                         var th = parseInt(t[4],10); 
    103                         var tm = parseInt(t[5],10); 
    104                         var ts = 0; 
    105                         if(t[7] != null) 
    106                             ts = parseInt(t[7],10); 
    107                         var dt = new Date(yy,mm,dd,th,tm,ts); 
    108                         if(yy != dt.getFullYear() || mm != dt.getMonth() || dd != dt.getDate() || th != dt.getHours() || tm != dt.getMinutes() || ts != dt.getSeconds()) 
    109                             ok = false; 
    110                         else 
    111                             ok = true; 
    112                         break; 
    113                     case 'date' : 
    114                         var t = val.match(/^(\d{4})\-(\d{2})\-(\d{2})$/); 
    115                         if(t == null){ ok=false; break; }; 
    116                         var yy = parseInt(t[1],10); 
    117                         var mm = parseInt(t[2],10) -1; 
    118                         var dd = parseInt(t[3],10); 
    119                         var dt = new Date(yy,mm,dd,0,0,0); 
    120                         if(yy != dt.getFullYear() || mm != dt.getMonth() || dd != dt.getDate()) 
    121                             ok = false; 
    122                         else 
    123                             ok = true; 
    124                         break; 
    125                     case 'localetime' : 
    126                     case 'time' : 
    127                         var t = val.match(/^(\d{2}):(\d{2})(:(\d{2}))?$/); 
    128                         if(t == null){ ok=false; break; }; 
    129                         var th = parseInt(t[1],10); 
    130                         var tm = parseInt(t[2],10); 
    131                         var ts = 0; 
    132                         if(t[4] != null) 
    133                             ts = parseInt(t[4],10); 
    134                         var dt = new Date(2007,05,02,th,tm,ts); 
    135                         if(th != dt.getHours() || tm != dt.getMinutes() || ts != dt.getSeconds()) 
    136                             ok = false; 
    137                         else 
    138                             ok = true; 
    139                         break; 
    140                     case 'localedatetime' : 
    141                         var yy, mm, dd, th, tm, ts; 
    142                         if(c.lang.indexOf('fr_') == 0) { 
    143                             var t = val.match(/^(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2})(:(\d{2}))?$/); 
    144                             if(t == null){ ok=false; break; } 
    145                             yy = parseInt(t[3],10); 
    146                             mm = parseInt(t[2],10) -1; 
    147                             dd = parseInt(t[1],10); 
    148                             th = parseInt(t[4],10); 
    149                             tm = parseInt(t[5],10); 
    150                             ts = 0; 
    151                             if(t[7] != null) 
    152                                 ts = parseInt(t[7],10); 
    153                         }else{ 
    154                             //default is en_* format 
    155                             var t = val.match(/^(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2})(:(\d{2}))?$/); 
    156                             if(t == null){ ok=false; break; } 
    157                             yy = parseInt(t[3],10); 
    158                             mm = parseInt(t[1],10) -1; 
    159                             dd = parseInt(t[2],10); 
    160                             th = parseInt(t[4],10); 
    161                             tm = parseInt(t[5],10); 
    162                             ts = 0; 
    163                             if(t[7] != null) 
    164                                 ts = parseInt(t[7],10); 
    165                         } 
    166                         var dt = new Date(yy,mm,dd,th,tm,ts); 
    167                         if(yy != dt.getFullYear() || mm != dt.getMonth() || dd != dt.getDate() || th != dt.getHours() || tm != dt.getMinutes() || ts != dt.getSeconds()) 
    168                             ok = false; 
    169                         else 
    170                             ok = true; 
    171                         break; 
    172                     case 'localedate' : 
    173                         var yy, mm, dd; 
    174                         if(c.lang.indexOf('fr_') == 0) { 
    175                             var t = val.match(/^(\d{2})\/(\d{2})\/(\d{4})$/); 
    176                             if(t == null){ ok=false; break; } 
    177                             yy = parseInt(t[3],10); 
    178                             mm = parseInt(t[2],10) -1; 
    179                             dd = parseInt(t[1],10); 
    180                         }else{ 
    181                             //default is en_* format 
    182                             var t = val.match(/^(\d{2})\/(\d{2})\/(\d{4})$/); 
    183                             if(t == null){ ok=false; break; } 
    184                             yy = parseInt(t[3],10); 
    185                             mm = parseInt(t[1],10) -1; 
    186                             dd = parseInt(t[2],10); 
    187                         } 
    188                         var dt = new Date(yy,mm,dd,0,0,0); 
    189                         if(yy != dt.getFullYear() || mm != dt.getMonth() || dd != dt.getDate()) 
    190                             ok = false; 
    191                         else 
    192                             ok = true; 
    193                         break; 
    194                     case 'url' : 
    195                         ok = (val.search(/^[a-z]+:\/\/((((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))((\/)|$)/) != -1); 
    196                         break; 
    197                     case 'email' : 
    198                         ok = (val.search(/^((\"[^\"f\n\r\t\b]+\")|([\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/) != -1); 
    199                         break; 
    200                     case 'ipv4' : 
    201                          var t = val.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/); 
    202                          if(t) 
    203                             ok = (t[1] > 255 || t[2] > 255 || t[3] > 255 || t[4] > 255); 
    204                          else 
    205                             ok = false; 
    206                         break; 
    207                     case 'ipv6' : 
    208                         ok = (val.search(/^([a-f0-9]{1,4})(:([a-f0-9]{1,4})){7}$/i) != -1); 
    209                         break; 
    210                 } 
    211                 if(!ok){ 
    212                     f.errorDecorator.addError(c, 2); 
     76                if(!c.check(val, this)){ 
     77                    this.tForm.errorDecorator.addError(c, 2); 
    21378                    valid = false; 
    21479                } 
    21580            } 
    216             if(c.isConfirmField){ 
    217                 var val2 = this._getValue(frmElt.elements[c.confirmFieldOf]); 
    218                 if(val != val2){ 
    219                     f.errorDecorator.addError(c, 2); 
    220                     valid = false; 
    221                 } 
    222             } 
    22381        } 
    22482        if(!valid) 
    225             f.errorDecorator.end(); 
     83            this.tForm.errorDecorator.end(); 
    22684        return valid; 
    22785    }, 
    22886 
    22987 
    230     _getValue : function (elt){ 
     88    getValue : function (elt){ 
    23189        var value=''; 
    23290        if(elt.nodeType) { // this is a node 
     
    285143                break; 
    286144            } 
     145            if (ctrls[i].confirmField &&  ctrls[i].confirmField.name == aControlName) { 
     146                ctrl = ctrls[i].confirmField; 
     147                break; 
     148            } 
    287149        } 
    288150        if (ctrl) { 
     
    316178}; 
    317179 
    318 /* 
    319  * informations about a control 
    320  */ 
    321 function jFormsControl(name, label, datatype) { 
    322     this.name = name; 
    323     this.label = label
    324     this.datatype = datatype
     180 
     181/** 
     182 * control with string 
     183 */ 
     184function jFormsControlString(name, label) { 
     185    this.name = name
     186    this.label = label
    325187    this.required = false; 
    326188    this.errInvalid = ''; 
     
    332194    this.maxLength = -1; 
    333195}; 
     196jFormsControlString.prototype.check = function (val) { 
     197    if(this.minLength != -1 && val.length < this.minLength) 
     198        return false; 
     199    if(this.maxLength != -1 && val.length > this.maxLength) 
     200        return false; 
     201    return true; 
     202}; 
     203 
     204/** 
     205 * control with optional confirmation string 
     206 */ 
     207function jFormsControlSecret(name, label) { 
     208    this.name = name; 
     209    this.label = label; 
     210    this.required = false; 
     211    this.errInvalid = ''; 
     212    this.errRequired = ''; 
     213    this.help=''; 
     214    this.confirmField = null; 
     215    this.minLength = -1; 
     216    this.maxLength = -1; 
     217}; 
     218jFormsControlSecret.prototype.check = function (val, jfrm) { 
     219    if(this.minLength != -1 && val.length < this.minLength) 
     220        return false; 
     221    if(this.maxLength != -1 && val.length > this.maxLength) 
     222        return false; 
     223 
     224    if(this.confirmField){ 
     225        var val2 = jfrm.getValue(jfrm.frmElt.elements[this.confirmField.name]); 
     226        if(val != val2){ 
     227            jfrm.tForm.errorDecorator.addError(this.confirmField, 2); 
     228            return false; 
     229        } 
     230    } 
     231    return true; 
     232}; 
     233function jFormsControlSecretConfirm(name, label) { 
     234    this.name = name; 
     235    this.label = label; 
     236    this.errInvalid = ''; 
     237    this.errRequired = ''; 
     238    this.help=''; 
     239    this.minLength = -1; 
     240    this.maxLength = -1; 
     241}; 
     242 
     243 
     244 
     245/** 
     246 * control with boolean 
     247 */ 
     248function jFormsControlBoolean(name, label) { 
     249    this.name = name; 
     250    this.label = label; 
     251    this.required = false; 
     252    this.errInvalid = ''; 
     253    this.errRequired = ''; 
     254    this.help=''; 
     255}; 
     256jFormsControlBoolean.prototype.check = function (val) { 
     257    return (val == 'true' || val == 'false'); 
     258}; 
     259 
     260/** 
     261 * control with Decimal 
     262 */ 
     263function jFormsControlDecimal(name, label) { 
     264    this.name = name; 
     265    this.label = label; 
     266    this.required = false; 
     267    this.errInvalid = ''; 
     268    this.errRequired = ''; 
     269    this.help=''; 
     270}; 
     271jFormsControlDecimal.prototype.check = function (val) { 
     272    return ( -1 != val.search(/^\s*[\+\-]?\d+(\.\d+)?\s*$/)); 
     273}; 
     274 
     275/** 
     276 * control with Integer 
     277 */ 
     278function jFormsControlInteger(name, label) { 
     279    this.name = name; 
     280    this.label = label; 
     281    this.required = false; 
     282    this.errInvalid = ''; 
     283    this.errRequired = ''; 
     284    this.help=''; 
     285}; 
     286jFormsControlInteger.prototype.check = function (val) { 
     287    return ( -1 != val.search(/^\s*[\+\-]?\d+\s*$/)); 
     288}; 
     289 
     290/** 
     291 * control with Hexadecimal 
     292 */ 
     293function jFormsControlHexadecimal(name, label) { 
     294    this.name = name; 
     295    this.label = label; 
     296    this.required = false; 
     297    this.errInvalid = ''; 
     298    this.errRequired = ''; 
     299    this.help=''; 
     300}; 
     301jFormsControlHexadecimal.prototype.check = function (val) { 
     302  return (val.search(/^0x[a-f0-9A-F]+$/) != -1); 
     303}; 
     304 
     305/** 
     306 * control with Datetime 
     307 */ 
     308function jFormsControlDatetime(name, label) { 
     309    this.name = name; 
     310    this.label = label; 
     311    this.required = false; 
     312    this.errInvalid = ''; 
     313    this.errRequired = ''; 
     314    this.help=''; 
     315}; 
     316jFormsControlDatetime.prototype.check = function (val) { 
     317    var t = val.match(/^(\d{4})\-(\d{2})\-(\d{2}) (\d{2}):(\d{2})(:(\d{2}))?$/); 
     318    if(t == null) return false; 
     319    var yy = parseInt(t[1],10); 
     320    var mm = parseInt(t[2],10) -1; 
     321    var dd = parseInt(t[3],10); 
     322    var th = parseInt(t[4],10); 
     323    var tm = parseInt(t[5],10); 
     324    var ts = 0; 
     325    if(t[7] != null) 
     326        ts = parseInt(t[7],10); 
     327    var dt = new Date(yy,mm,dd,th,tm,ts); 
     328    if(yy != dt.getFullYear() || mm != dt.getMonth() || dd != dt.getDate() || th != dt.getHours() || tm != dt.getMinutes() || ts != dt.getSeconds()) 
     329        return false; 
     330    else 
     331        return true; 
     332}; 
     333 
     334/** 
     335 * control with Date 
     336 */ 
     337function jFormsControlDate(name, label) { 
     338    this.name = name; 
     339    this.label = label; 
     340    this.required = false; 
     341    this.errInvalid = ''; 
     342    this.errRequired = ''; 
     343    this.help=''; 
     344}; 
     345jFormsControlDate.prototype.check = function (val) { 
     346    var t = val.match(/^(\d{4})\-(\d{2})\-(\d{2})$/); 
     347    if(t == null) return false; 
     348    var yy = parseInt(t[1],10); 
     349    var mm = parseInt(t[2],10) -1; 
     350    var dd = parseInt(t[3],10); 
     351    var dt = new Date(yy,mm,dd,0,0,0); 
     352    if(yy != dt.getFullYear() || mm != dt.getMonth() || dd != dt.getDate()) 
     353        return false; 
     354    else 
     355        return true; 
     356}; 
     357 
     358/** 
     359 * control with time 
     360 */ 
     361function jFormsControlTime(name, label) { 
     362    this.name = name; 
     363    this.label = label; 
     364    this.required = false; 
     365    this.errInvalid = ''; 
     366    this.errRequired = ''; 
     367    this.help=''; 
     368}; 
     369jFormsControlTime.prototype.check = function (val) { 
     370    var t = val.match(/^(\d{2}):(\d{2})(:(\d{2}))?$/); 
     371    if(t == null) return false; 
     372    var th = parseInt(t[1],10); 
     373    var tm = parseInt(t[2],10); 
     374    var ts = 0; 
     375    if(t[4] != null) 
     376        ts = parseInt(t[4],10); 
     377    var dt = new Date(2007,05,02,th,tm,ts); 
     378    if(th != dt.getHours() || tm != dt.getMinutes() || ts != dt.getSeconds()) 
     379        return false; 
     380    else 
     381        return true; 
     382}; 
     383 
     384/** 
     385 * control with LocaleDateTime 
     386 */ 
     387function jFormsControlLocaledatetime(name, label) { 
     388    this.name = name; 
     389    this.label = label; 
     390    this.required = false; 
     391    this.errInvalid = ''; 
     392    this.errRequired = ''; 
     393    this.help=''; 
     394    this.lang=''; 
     395}; 
     396jFormsControlLocaledatetime.prototype.check = function (val) { 
     397    var yy, mm, dd, th, tm, ts; 
     398    if(this.lang.indexOf('fr_') == 0) { 
     399        var t = val.match(/^(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2})(:(\d{2}))?$/); 
     400        if(t == null) return false; 
     401        yy = parseInt(t[3],10); 
     402        mm = parseInt(t[2],10) -1; 
     403        dd = parseInt(t[1],10); 
     404        th = parseInt(t[4],10); 
     405        tm = parseInt(t[5],10); 
     406        ts = 0; 
     407        if(t[7] != null) 
     408            ts = parseInt(t[7],10); 
     409    }else{ 
     410        //default is en_* format 
     411        var t = val.match(/^(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2})(:(\d{2}))?$/); 
     412        if(t == null) return false; 
     413        yy = parseInt(t[3],10); 
     414        mm = parseInt(t[1],10) -1; 
     415        dd = parseInt(t[2],10); 
     416        th = parseInt(t[4],10); 
     417        tm = parseInt(t[5],10); 
     418        ts = 0; 
     419        if(t[7] != null) 
     420            ts = parseInt(t[7],10); 
     421    } 
     422    var dt = new Date(yy,mm,dd,th,tm,ts); 
     423    if(yy != dt.getFullYear() || mm != dt.getMonth() || dd != dt.getDate() || th != dt.getHours() || tm != dt.getMinutes() || ts != dt.getSeconds()) 
     424        return false; 
     425    else 
     426        return true; 
     427}; 
     428 
     429/** 
     430 * control with localedate 
     431 */ 
     432function jFormsControlLocaledate(name, label) { 
     433    this.name = name; 
     434    this.label = label; 
     435    this.required = false; 
     436    this.errInvalid = ''; 
     437    this.errRequired = ''; 
     438    this.help=''; 
     439    this.lang=''; 
     440}; 
     441jFormsControlLocaledate.prototype.check = function (val) { 
     442    var yy, mm, dd; 
     443    if(this.lang.indexOf('fr_') == 0) { 
     444        var t = val.match(/^(\d{2})\/(\d{2})\/(\d{4})$/); 
     445        if(t == null) return false; 
     446        yy = parseInt(t[3],10); 
     447        mm = parseInt(t[2],10) -1; 
     448        dd = parseInt(t[1],10); 
     449    }else{ 
     450        //default is en_* format 
     451        var t = val.match(/^(\d{2})\/(\d{2})\/(\d{4})$/); 
     452        if(t == null) return false; 
     453        yy = parseInt(t[3],10); 
     454        mm = parseInt(t[1],10) -1; 
     455        dd = parseInt(t[2],10); 
     456    } 
     457    var dt = new Date(yy,mm,dd,0,0,0); 
     458    if(yy != dt.getFullYear() || mm != dt.getMonth() || dd != dt.getDate()) 
     459        return false; 
     460    else 
     461        return true; 
     462}; 
     463 
     464/** 
     465 * control with Url 
     466 */ 
     467function jFormsControlUrl(name, label) { 
     468    this.name = name; 
     469    this.label = label; 
     470    this.required = false; 
     471    this.errInvalid = ''; 
     472    this.errRequired = ''; 
     473    this.help=''; 
     474}; 
     475jFormsControlUrl.prototype.check = function (val) { 
     476    return (val.search(/^[a-z]+:\/\/((((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))((\/)|$)/) != -1); 
     477}; 
     478 
     479/** 
     480 * control with email 
     481 */ 
     482function jFormsControlEmail(name, label) { 
     483    this.name = name; 
     484    this.label = label; 
     485    this.required = false; 
     486    this.errInvalid = ''; 
     487    this.errRequired = ''; 
     488    this.help=''; 
     489}; 
     490jFormsControlEmail.prototype.check = function (val) { 
     491    return (val.search(/^((\"[^\"f\n\r\t\b]+\")|([\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/) != -1); 
     492}; 
     493 
     494 
     495/** 
     496 * control with ipv4 
     497 */ 
     498function jFormsControlIpv4(name, label) { 
     499    this.name = name; 
     500    this.label = label; 
     501    this.required = false; 
     502    this.errInvalid = ''; 
     503    this.errRequired = ''; 
     504    this.help=''; 
     505}; 
     506jFormsControlIpv4.prototype.check = function (val) { 
     507    var t = val.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/); 
     508    if(t) 
     509        return (t[1] > 255 || t[2] > 255 || t[3] > 255 || t[4] > 255); 
     510    return false; 
     511}; 
     512 
     513/** 
     514 * control with ipv6 
     515 */ 
     516function jFormsControlIpv6(name, label) { 
     517    this.name = name; 
     518    this.label = label; 
     519    this.required = false; 
     520    this.errInvalid = ''; 
     521    this.errRequired = ''; 
     522    this.help=''; 
     523}; 
     524jFormsControlIpv6.prototype.check = function (val) { 
     525    return (val.search(/^([a-f0-9]{1,4})(:([a-f0-9]{1,4})){7}$/i) != -1); 
     526}; 
     527 
     528/** 
     529 * choice control 
     530 */ 
     531function jFormsControlChoice(name, label) { 
     532    this.name = name; 
     533    this.label = label; 
     534    this.required = true; 
     535    this.errInvalid = ''; 
     536    this.errRequired = ''; 
     537    this.help=''; 
     538    this.items = {}; 
     539}; 
     540jFormsControlChoice.prototype.addControl = function (ctrl, itemValue) { 
     541    if(this.items[itemValue] == undefined) 
     542        this.items[itemValue] = []; 
     543    this.items[itemValue].push(ctrl); 
     544}; 
     545jFormsControlChoice.prototype.check = function (val, jfrm) { 
     546    if(this.items[val] == undefined) 
     547        return false; 
     548 
     549    var list = this.items[val]; 
     550    for(var i=0; i < list.length; i++) { 
     551        var val2 = jfrm.getValue(jfrm.frmElt.elements[list[i].name]); 
     552        if (!list[i].check(val2, jfrm)) { 
     553            jfrm.tForm.errorDecorator.addError(list[i], 2); 
     554        } 
     555    } 
     556    return true; 
     557}; 
     558 
    334559 
    335560 
  • branches/experimental/jforms-groups/lib/jelix-www/js/jforms.js

    r967 r985  
    4141    tControl: null, 
    4242    tControl2: null, 
     43    frmElt: null, 
    4344 
    4445    declareForm : function(aForm){ 
    4546        this._forms[aForm.name]=aForm; 
    4647        var elem = document.getElementById(aForm.name); 
    47  
    4848        if (elem.addEventListener) { 
    4949            elem.addEventListener("submit", function (ev) { if(!jForms.verifyForm(elem)) {ev.preventDefault(); ev.stopPropagation(); return false;} return true; }, false); 
     
    5858 
    5959    verifyForm : function(frmElt){ 
    60         var f = this._forms[frmElt.attributes.getNamedItem("id").value]; // we cannot use getAttribute for id because a bug with IE 
     60        this.tForm = this._forms[frmElt.attributes.getNamedItem("id").value]; // we cannot use getAttribute for id because a bug with IE 
     61        this.frmElt = frmElt; 
    6162        var msg = ''; 
    6263        var valid = true; 
    63         f.errorDecorator.start(); 
    64         for(var i =0; i < f.controls.length; i++){ 
    65             var c = f.controls[i]; 
     64        this.tForm.errorDecorator.start(); 
     65        for(var i =0; i < this.tForm.controls.length; i++){ 
     66            var c = this.tForm.controls[i]; 
    6667            var elt = frmElt.elements[c.name]; 
    6768            if (!elt) continue; // sometimes, all controls are not generated... 
    68             var val = this._getValue(elt); 
     69            var val = this.getValue(elt); 
    6970            if(val == ''){ 
    7071                if(c.required){ 
    71                     f.errorDecorator.addError(c, 1); 
     72                    this.tForm.errorDecorator.addError(c, 1); 
    7273                    valid = false; 
    7374                } 
    7475            }else{ 
    75                 var ok = false; 
    76                 switch(c.datatype){ 
    77                     case 'string' : 
    78                         ok = true; 
    79                         if(c.minLength != -1 && val.length < c.minLength) 
    80                             ok = false; 
    81                         if(c.maxLength != -1 && val.length > c.maxLength) 
    82                             ok = false; 
    83                         break; 
    84                     case 'boolean' : 
    85                         ok = (val == 'true' || val == 'false'); 
    86                         break; 
    87                     case 'decimal' : 
    88                         ok = ( -1 != val.search(/^\s*[\+\-]?\d+(\.\d+)?\s*$/)); 
    89                         break; 
    90                     case 'integer' : 
    91                         ok = ( -1 != val.search(/^\s*[\+\-]?\d+\s*$/)); 
    92                         break; 
    93                     case 'hexadecimal' :  
    94                         ok = (val.search(/^0x[a-f0-9A-F]+$/) != -1); 
    95                         break; 
    96                     case 'datetime' :  
    97                         var t = val.match(/^(\d{4})\-(\d{2})\-(\d{2}) (\d{2}):(\d{2})(:(\d{2}))?$/); 
    98                         if(t == null){ ok=false; break; }; 
    99                         var yy = parseInt(t[1],10); 
    100                         var mm = parseInt(t[2],10) -1; 
    101                         var dd = parseInt(t[3],10); 
    102                         var th = parseInt(t[4],10); 
    103                         var tm = parseInt(t[5],10); 
    104                         var ts = 0; 
    105                         if(t[7] != null) 
    106                             ts = parseInt(t[7],10); 
    107                         var dt = new Date(yy,mm,dd,th,tm,ts); 
    108                         if(yy != dt.getFullYear() || mm != dt.getMonth() || dd != dt.getDate() || th != dt.getHours() || tm != dt.getMinutes() || ts != dt.getSeconds()) 
    109                             ok = false; 
    110                         else 
    111                             ok = true; 
    112                         break; 
    113                     case 'date' : 
    114                         var t = val.match(/^(\d{4})\-(\d{2})\-(\d{2})$/); 
    115                         if(t == null){ ok=false; break; }; 
    116                         var yy = parseInt(t[1],10); 
    117                         var mm = parseInt(t[2],10) -1; 
    118                         var dd = parseInt(t[3],10); 
    119                         var dt = new Date(yy,mm,dd,0,0,0); 
    120                         if(yy != dt.getFullYear() || mm != dt.getMonth() || dd != dt.getDate()) 
    121                             ok = false; 
    122                         else 
    123                             ok = true; 
    124                         break; 
    125                     case 'localetime' : 
    126                     case 'time' : 
    127                         var t = val.match(/^(\d{2}):(\d{2})(:(\d{2}))?$/); 
    128                         if(t == null){ ok=false; break; }; 
    129                         var th = parseInt(t[1],10); 
    130                         var tm = parseInt(t[2],10); 
    131                         var ts = 0; 
    132                         if(t[4] != null) 
    133                             ts = parseInt(t[4],10); 
    134                         var dt = new Date(2007,05,02,th,tm,ts); 
    135                         if(th != dt.getHours() || tm != dt.getMinutes() || ts != dt.getSeconds()) 
    136                             ok = false; 
    137                         else 
    138                             ok = true; 
    139                         break; 
    140                     case 'localedatetime' : 
    141                         var yy, mm, dd, th, tm, ts; 
    142                         if(c.lang.indexOf('fr_') == 0) { 
    143                             var t = val.match(/^(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2})(:(\d{2}))?$/); 
    144                             if(t == null){ ok=false; break; } 
    145                             yy = parseInt(t[3],10); 
    146                             mm = parseInt(t[2],10) -1; 
    147                             dd = parseInt(t[1],10); 
    148                             th = parseInt(t[4],10); 
    149                             tm = parseInt(t[5],10); 
    150                             ts = 0; 
    151                             if(t[7] != null) 
    152                                 ts = parseInt(t[7],10); 
    153                         }else{ 
    154                             //default is en_* format 
    155                             var t = val.match(/^(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2})(:(\d{2}))?$/); 
    156                             if(t == null){ ok=false; break; } 
    157                             yy = parseInt(t[3],10); 
    158                             mm = parseInt(t[1],10) -1; 
    159                             dd = parseInt(t[2],10); 
    160                             th = parseInt(t[4],10); 
    161                             tm = parseInt(t[5],10); 
    162                             ts = 0; 
    163                             if(t[7] != null) 
    164                                 ts = parseInt(t[7],10); 
    165                         } 
    166                         var dt = new Date(yy,mm,dd,th,tm,ts); 
    167                         if(yy != dt.getFullYear() || mm != dt.getMonth() || dd != dt.getDate() || th != dt.getHours() || tm != dt.getMinutes() || ts != dt.getSeconds()) 
    168                             ok = false; 
    169                         else 
    170                             ok = true; 
    171                         break; 
    172                     case 'localedate' : 
    173                         var yy, mm, dd; 
    174                         if(c.lang.indexOf('fr_') == 0) { 
    175                             var t = val.match(/^(\d{2})\/(\d{2})\/(\d{4})$/); 
    176                             if(t == null){ ok=false; break; } 
    177                             yy = parseInt(t[3],10); 
    178                             mm = parseInt(t[2],10) -1; 
    179                             dd = parseInt(t[1],10); 
    180                         }else{ 
    181                             //default is en_* format 
    182                             var t = val.match(/^(\d{2})\/(\d{2})\/(\d{4})$/); 
    183                             if(t == null){ ok=false; break; } 
    184                             yy = parseInt(t[3],10); 
    185                             mm = parseInt(t[1],10) -1; 
    186                             dd = parseInt(t[2],10); 
    187                         } 
    188                         var dt = new Date(yy,mm,dd,0,0,0); 
    189                         if(yy != dt.getFullYear() || mm != dt.getMonth() || dd != dt.getDate()) 
    190                             ok = false; 
    191                         else 
    192                             ok = true; 
    193                         break; 
    194                     case 'url' : 
    195                         ok = (val.search(/^[a-z]+:\/\/((((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))((\/)|$)/) != -1); 
    196                         break; 
    197                     case 'email' : 
    198                         ok = (val.search(/^((\"[^\"f\n\r\t\b]+\")|([\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/) != -1); 
    199                         break; 
    200                     case 'ipv4' : 
    201                          var t = val.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/); 
    202                          if(t) 
    203                             ok = (t[1] > 255 || t[2] > 255 || t[3] > 255 || t[4] > 255); 
    204                          else 
    205                             ok = false; 
    206                         break; 
    207                     case 'ipv6' : 
    208                         ok = (val.search(/^([a-f0-9]{1,4})(:([a-f0-9]{1,4})){7}$/i) != -1); 
    209                         break; 
    210                 } 
    211                 if(!ok){ 
    212                     f.errorDecorator.addError(c, 2); 
     76                if(!c.check(val, this)){ 
     77                    this.tForm.errorDecorator.addError(c, 2); 
    21378                    valid = false; 
    21479                } 
    21580            } 
    216             if(c.isConfirmField){ 
    217                 var val2 = this._getValue(frmElt.elements[c.confirmFieldOf]); 
    218                 if(val != val2){ 
    219                     f.errorDecorator.addError(c, 2); 
    220                     valid = false; 
    221                 } 
    222             } 
    22381        } 
    22482        if(!valid) 
    225             f.errorDecorator.end(); 
     83            this.tForm.errorDecorator.end(); 
    22684        return valid; 
    22785    }, 
    22886 
    22987 
    230     _getValue : function (elt){ 
     88    getValue : function (elt){ 
    23189        var value=''; 
    23290        if(elt.nodeType) { // this is a node 
     
    285143                break; 
    286144            } 
     145            if (ctrls[i].confirmField &&  ctrls[i].confirmField.name == aControlName) { 
     146                ctrl = ctrls[i].confirmField; 
     147                break; 
     148            } 
    287149        } 
    288150        if (ctrl) { 
     
    316178}; 
    317179 
    318 /* 
    319  * informations about a control 
    320  */ 
    321 function jFormsControl(name, label, datatype) { 
    322     this.name = name; 
    323     this.label = label
    324     this.datatype = datatype
     180 
     181/** 
     182 * control with string 
     183 */ 
     184function jFormsControlString(name, label) { 
     185    this.name = name
     186    this.label = label
    325187    this.required = false; 
    326188&nb