1/** 2 * Form Validation 3 * 4 * @package WP Pro Real Estate 7 5 * @subpackage JavaScript 6 */ 7 8(function($) { 9 $.fn.validationEngine = function(settings) { 10 11 if($.validationEngineLanguage){ // IS THERE A LANGUAGE LOCALISATION ? 12 allRules = $.validationEngineLanguage.allRules 13 }else{ 14 allRules = {"required":{ // Add your regex rules here, you can take telephone as an example 15 "regex":"none", 16 "alertText":validationError.required, 17 "alertTextCheckboxMultiple":validationError.requiredCheckboxMulti, 18 "alertTextCheckboxe":validationError.requiredCheckbox}, 19 "length":{ 20 "regex":"none", 21 "alertText":"*Between ", 22 "alertText2":" and ", 23 "alertText3": " characters allowed"}, 24 "minCheckbox":{ 25 "regex":"none", 26 "alertText":"* Checks allowed Exceeded"}, 27 "confirm":{ 28 "regex":"none", 29 "alertText":"* Your field is not matching"}, 30 "telephone":{ 31 "regex":"/^[0-9\-\(\)\ ]+$/", 32 "alertText":validationError.invalidTelephone}, 33 "email":{ 34 "regex":"/^[a-zA-Z0-9_\.\-]+\@([a-zA-Z0-9\-]+\\.)+[a-zA-Z0-9]{2,4}$/", 35 "alertText":validationError.invalidEmail}, 36 "date":{ 37 "regex":"/^[0-9]{4}\-\[0-9]{1,2}\-\[0-9]{1,2}$/", 38 "alertText":validationError.invalidDate}, 39 "onlyNumber":{ 40 "regex":"/^[0-9\ ]+$/", 41 "alertText":validationError.numbersOnly}, 42 "noSpecialCaracters":{ 43 "regex":"/^[0-9a-zA-Z]+$/", 44 "alertText":validationError.noSpecialChar}, 45 "ajaxUser":{ 46 "file":"validateUser.php", 47 "alertTextOk":"* This user is available", 48 "alertTextLoad":"* Loading, please wait", 49 "alertText":"* This user is already taken"}, 50 "ajaxName":{ 51 "file":"validateUser.php", 52 "alertText":"* This name is already taken", 53 "alertTextOk":"* This name is available", 54 "alertTextLoad":"* Loading, please wait"}, 55 "onlyLetter":{ 56 "regex":"/^[a-zA-Z\ \']+$/", 57 "alertText":validationError.letterOnly} 58 } 59 } 60 settings = jQuery.extend({ 61 allrules:allRules, 62 inlineValidation: true, 63 ajaxSubmit: false, 64 promptPosition: "topRight", // OPENNING BOX POSITION, IMPLEMENTED: topLeft, topRight, bottomLeft, centerRight, bottomRight 65 success : false, 66 failure : function() {} 67 }, settings); 68 69 70 71 $.validationEngine.ajaxValidArray = new Array() // ARRAY FOR AJAX: VALIDATION MEMORY 72 73 $(this).bind("submit", function(caller){ // ON FORM SUBMIT, CONTROL AJAX FUNCTION IF SPECIFIED ON DOCUMENT READY 74 $.validationEngine.onSubmitValid = true; 75 76 if($.validationEngine.submitValidation(this,settings) == false){ 77 if($.validationEngine.submitForm(this,settings) == true) {return false;} 78 }else{ 79 settings.failure && settings.failure(); 80 return false; 81 } 82 }) 83 if(settings.inlineValidation == true){ // Validating Inline ? 84 85 $(this).find("[class^=validate]").not("[type=checkbox]").bind("blur", function(caller){ _inlinEvent(this) }) 86 $(this).find("[class^=validate][type=checkbox]").bind("click", function(caller){ _inlinEvent(this) }) 87 88 function _inlinEvent(caller){ 89 if($.validationEngine.intercept == false || !$.validationEngine.intercept){ // STOP INLINE VALIDATION THIS TIME ONLY 90 $.validationEngine.onSubmitValid=false; 91 $.validationEngine.loadValidation(caller,settings); 92 }else{ 93 $.validationEngine.intercept = false; 94 } 95 } 96 } 97}; 98$.validationEngine = { 99 submitForm : function(caller){ 100 if($.validationEngine.settings.ajaxSubmit){ 101 $.ajax({ 102 type: "POST", 103 url: $.validationEngine.settings.ajaxSubmitFile, 104 async: true, 105 data: $(caller).serialize(), 106 success: function(data){ 107 if(data == "true"){ // EVERYTING IS FINE, SHOW SUCCESS MESSAGE 108 $(caller).css("opacity",1) 109 $(caller).animate({opacity: 0, height: 0}, function(){ 110 $(caller).css("display","none") 111 $(caller).before("<div class='ajaxSubmit'>"+$.validationEngine.settings.ajaxSubmitMessage+"</div>") 112 $.validationEngine.closePrompt(".formError",true) 113 $(".ajaxSubmit").slideDown("slow") 114 if ($.validationEngine.settings.success){ // AJAX SUCCESS, STOP THE LOCATION UPDATE 115 $.validationEngine.settings.success && $.validationEngine.settings.success(); 116 return false;
117 } 118 }) 119 }else{ // HOUSTON WE GOT A PROBLEM (SOMETING IS NOT VALIDATING) 120 data = eval( "("+data+")"); 121 errorNumber = data.jsonValidateReturn.length 122 for(index=0; index<errorNumber; index++){ 123 fieldId = data.jsonValidateReturn[index][0]; 124 promptError = data.jsonValidateReturn[index][1]; 125 type = data.jsonValidateReturn[index][2]; 126 $.validationEngine.buildPrompt(fieldId,promptError,type); 127 } 128 } 129 } 130 }) 131 return true; 132 } 133 if ($.validationEngine.settings.success){ // AJAX SUCCESS, STOP THE LOCATION UPDATE 134 $.validationEngine.settings.success && $.validationEngine.settings.success(); 135 return true; 136 } 137 return false; 138 }, 139 buildPrompt : function(caller,promptText,type,ajaxed) { // ERROR PROMPT CREATION AND DISPLAY WHEN AN ERROR OCCUR 140 var divFormError = document.createElement('div') 141 var formErrorContent = document.createElement('div') 142 143 $(divFormError).addClass("formError") 144 145 if(type == "pass"){ $(divFormError).addClass("greenPopup") } 146 if(type == "load"){ $(divFormError).addClass("blackPopup") } 147 if(ajaxed){ $(divFormError).addClass("ajaxed") } 148 149 $(divFormError).addClass($(caller).attr("id")) 150 $(formErrorContent).addClass("formErrorContent") 151 152 $("body").append(divFormError) 153 $(divFormError).append(formErrorContent) 154 155 if($.validationEngine.showTriangle != false){ // NO TRIANGLE ON MAX CHECKBOX AND RADIO 156 var arrow = document.createElement('div') 157 $(arrow).addClass("formErrorArrow") 158 $(divFormError).append(arrow) 159 if($.validationEngine.settings.promptPosition == "bottomLeft" || $.validationEngine.settings.promptPosition == "bottomRight"){ 160 $(arrow).addClass("formErrorArrowBottom") 161 $(arrow).html('<div class="line1"><!-- --></div><div class="line2"><!-- --></div><div class="line3"><!-- --></div><div class="line4"><!-- --></div><div class="line5"><!-- --></div><div class="line6"><!-- --></div><div class="line7"><!-- --></div><div class="line8"><!-- --></div><div class="line9"><!-- --></div><div class="line10"><!-- --></div>'); 162 } 163 if($.validationEngine.settings.promptPosition == "topLeft" || $.validationEngine.settings.promptPosition == "topRight"){ 164 $(divFormError).append(arrow) 165 $(arrow).html('<div class="line10"><!-- --></div><div class="line9"><!-- --></div><div class="line8"><!-- --></div><div class="line7"><!-- --></div><div class="line6"><!-- --></div><div class="line5"><!-- --></div><div class="line4"><!-- --></div><div class="line3"><!-- --></div><div class="line2"><!-- --></div><div class="line1"><!-- --></div>'); 166 } 167 } 168 $(formErrorContent).html(promptText) 169 170 callerTopPosition = $(caller).offset().top; 171 callerleftPosition = $(caller).offset().left; 172 callerWidth = $(caller).width() 173 inputHeight = $(divFormError).height() 174 175 /* POSITIONNING */ 176 if($.validationEngine.settings.promptPosition == "topRight"){callerleftPosition += callerWidth -30; callerTopPosition += -inputHeight -10; } 177 if($.validationEngine.settings.promptPosition == "topLeft"){ callerTopPosition += -inputHeight -10; } 178 179 if($.validationEngine.settings.promptPosition == "centerRight"){ callerleftPosition += callerWidth +13; } 180 181 if($.validationEngine.settings.promptPosition == "bottomLeft"){ 182 callerHeight = $(caller).height(); 183 callerleftPosition = callerleftPosition; 184 callerTopPosition = callerTopPosition + callerHeight + 15; 185 } 186 if($.validationEngine.settings.promptPosition == "bottomRight"){ 187 callerHeight = $(caller).height(); 188 callerleftPosition += callerWidth -30; 189 callerTopPosition += callerHeight + 15; 190 } 191 $(divFormError).css({ 192 top:callerTopPosition, 193 left:callerleftPosition, 194 opacity:0 195 }) 196 return $(divFormError).animate({"opacity":0.87},function(){return true;}); 197 }, 198 updatePromptText : function(caller,promptText,type,ajaxed) { // UPDATE TEXT ERROR IF AN ERROR IS ALREADY DISPLAYED 199 updateThisPrompt = $(caller).attr("id"); 200 updateThisPrompt = "."+updateThisPrompt; 201 202 (type == "pass") ? $(updateThisPrompt).addClass("greenPopup") : $(updateThisPrompt).removeClass("greenPopup"); 203 (type == "load") ? $(updateThisPrompt).addClass("blackPopup") : $(updateThisPrompt).removeClass("blackPopup"); 204 (ajaxed) ? $(updateThisPrompt).addClass("ajaxed") : $(updateThisPrompt).removeClass("ajaxed"); 205 206 $(updateThisPrompt).find(".formErrorContent").html(promptText) 207 callerTopPosition = $(caller).offset().top; 208 inputHeight = $(updateThisPrompt).height() 209 210 if($.validationEngine.settings.promptPosition == "bottomLeft" || $.validationEngine.settings.promptPosition == "bottomRight"){ 211 callerHeight = $(caller).height() 212 callerTopPosition = callerTopPosition + callerHeight + 15 213 } 214 if($.validationEngine.settings.promptPosition == "centerRight"){ callerleftPosition += callerWidth +13;} 215 if($.validationEngine.settings.promptPosition == "topLeft" || $.validationEngine.settings.promptPosition == "topRight"){ 216 callerTopPosition = callerTopPosition -inputHeight -10 217 } 218 $(updateThisPrompt).animate({ 219 top:callerTopPosition 220 }); 221 }, 222 loadValidation : function(caller,settings) { // GET VALIDATIONS TO BE EXECUTED 223 $.validationEngine.settings = settings 224 rulesParsing = $(caller).attr('class'); 225 rulesRegExp = /\[(.*)\]/; 226 getRules = rulesRegExp.exec(rulesParsing); 227 str = getRules[1] 228 pattern = /\W+/; 229 result= str.split(pattern); 230
231 var validateCalll = $.validationEngine.validateCall(caller,result) 232 return validateCalll 233 }, 234 validateCall : function(caller,rules) { // EXECUTE VALIDATION REQUIRED BY THE USER FOR THIS FIELD 235 var promptText ="" 236 var prompt = $(caller).attr("id"); 237 var caller = caller; 238 ajaxValidate = false 239 var callerName = $(caller).attr("name"); 240 $.validationEngine.isError = false; 241 $.validationEngine.showTriangle = true 242 callerType = $(caller).attr("type"); 243 244 for (i=0; i<rules.length;i++){ 245 switch (rules[i]){ 246 case "optional": 247 if(!$(caller).val()){ 248 $.validationEngine.closePrompt(caller) 249 return $.validationEngine.isError 250 } 251 break; 252 case "required": 253 _required(caller,rules); 254 break; 255 case "custom": 256 _customRegex(caller,rules,i); 257 break; 258 case "ajax": 259 if(!$.validationEngine.onSubmitValid){ 260 _ajax(caller,rules,i); 261 } 262 break; 263 case "length": 264 _length(caller,rules,i); 265 break; 266 case "minCheckbox": 267 _minCheckbox(caller,rules,i); 268 break; 269 case "confirm": 270 _confirm(caller,rules,i); 271 break; 272 default :; 273 }; 274 }; 275 if ($.validationEngine.isError == true){ 276 277 radioHackOpen(); 278 if ($.validationEngine.isError == true){ // show only one 279 ($("div."+prompt).size() ==0) ? $.validationEngine.buildPrompt(caller,promptText,"error") : $.validationEngine.updatePromptText(caller,promptText); 280 } 281 }else{ 282 radioHackClose(); 283 $.validationEngine.closePrompt(caller); 284 } 285 /* UNFORTUNATE RADIO AND CHECKBOX GROUP HACKS */ 286 /* As my validation is looping input with id's we need a hack for my validation to understand to group these inputs */ 287 function radioHackOpen(){ 288 if($("input[name="+callerName+"]").size()> 1 && callerType == "radio") { // Hack for radio group button, the validation go the first radio 289 caller = $("input[name="+callerName+"]:first"); 290 $.validationEngine.showTriangle = false; 291 var callerId ="."+ $(caller).attr("id"); 292 if($(callerId).size()==0){ $.validationEngine.isError = true; }else{ $.validationEngine.isError = false;} 293 } 294 if($("input[name="+callerName+"]").size()> 1 && callerType == "checkbox") { // Hack for checkbox group button, the validation go the first radio 295 caller = $("input[name="+callerName+"]:first"); 296 $.validationEngine.showTriangle = false; 297 var callerId ="div."+ $(caller).attr("id"); 298 if($(callerId).size()==0){ $.validationEngine.isError = true; }else{ $.validationEngine.isError = false;} 299 } 300 } 301 function radioHackClose(){ 302 if($("input[name="+callerName+"]").size()> 1 && callerType == "radio") { // Hack for radio group button, the validation go the first radio 303 caller = $("input[name="+callerName+"]:first"); 304 } 305 if($("input[name="+callerName+"]").size()> 1 && callerType == "checkbox") { // Hack for checkbox group button, the validation go the first radio 306 caller = $("input[name="+callerName+"]:first"); 307 } 308 } 309 /* VALIDATION FUNCTIONS */ 310 function _required(caller,rules){ // VALIDATE BLANK FIELD 311 callerType = $(caller).attr("type"); 312 if (callerType == "text" || callerType == "password" || callerType == "textarea"){ 313 314 if(!$(caller).val()){ 315 $.validationEngine.isError = true; 316 promptText += $.validationEngine.settings.allrules[rules[i]].alertText+"<br />"; 317 } 318 } 319 if (callerType == "radio" || callerType == "checkbox" ){ 320 callerName = $(caller).attr("name"); 321 322 if($("input[name="+callerName+"]:checked").size() == 0) { 323 $.validationEngine.isError = true; 324 if($("input[name="+callerName+"]").size() ==1) { 325 promptText += $.validationEngine.settings.allrules[rules[i]].alertTextCheckboxe+"<br />"; 326 }else{ 327 promptText += $.validationEngine.settings.allrules[rules[i]].alertTextCheckboxMultiple+"<br />"; 328 } 329 } 330 } 331 if (callerType == "select-one") { // added by [email protected] for select boxes, Thank you 332 callerName = $(caller).attr("id"); 333 334 if(!$("select[name="+callerName+"]").val()) { 335 $.validationEngine.isError = true; 336 promptText += $.validationEngine.settings.allrules[rules[i]].alertText+"<br />"; 337 } 338 } 339 if (callerType == "select-multiple") { // added by [email protected] for select boxes, Thank y
339ou 340 callerName = $(caller).attr("id"); 341 342 if(!$("#"+callerName).val()) { 343 $.validationEngine.isError = true; 344 promptText += $.validationEngine.settings.allrules[rules[i]].alertText+"<br />"; 345 } 346 } 347 } 348 function _customRegex(caller,rules,position){ // VALIDATE REGEX RULES 349 customRule = rules[position+1]; 350 pattern = eval($.validationEngine.settings.allrules[customRule].regex); 351 352 if(!pattern.test($(caller).attr('value'))){ 353 $.validationEngine.isError = true; 354 promptText += $.validationEngine.settings.allrules[customRule].alertText+"<br />"; 355 } 356 } 357 function _ajax(caller,rules,position){ // VALIDATE AJAX RULES 358 359 customAjaxRule = rules[position+1]; 360 postfile = $.validationEngine.settings.allrules[customAjaxRule].file; 361 fieldValue = $(caller).val(); 362 ajaxCaller = caller; 363 fieldId = $(caller).attr("id"); 364 ajaxValidate = true; 365 ajaxisError = $.validationEngine.isError; 366 367 /* AJAX VALIDATION HAS ITS OWN UPDATE AND BUILD UNLIKE OTHER RULES */ 368 if(!ajaxisError){ 369 $.ajax({ 370 type: "POST", 371 url: postfile, 372 async: true, 373 data: "validateValue="+fieldValue+"&validateId="+fieldId+"&validateError="+customAjaxRule, 374 beforeSend: function(){ // BUILD A LOADING PROMPT IF LOAD TEXT EXIST 375 if($.validationEngine.settings.allrules[customAjaxRule].alertTextLoad){ 376 377 if(!$("div."+fieldId)[0]){ 378 return $.validationEngine.buildPrompt(ajaxCaller,$.validationEngine.settings.allrules[customAjaxRule].alertTextLoad,"load"); 379 }else{ 380 $.validationEngine.updatePromptText(ajaxCaller,$.validationEngine.settings.allrules[customAjaxRule].alertTextLoad,"load"); 381 } 382 } 383 }, 384 success: function(data){ // GET SUCCESS DATA RETURN JSON 385 data = eval( "("+data+")"); // GET JSON DATA FROM PHP AND PARSE IT 386 ajaxisError = data.jsonValidateReturn[2]; 387 customAjaxRule = data.jsonValidateReturn[1]; 388 ajaxCaller = $("#"+data.jsonValidateReturn[0])[0]; 389 fieldId = ajaxCaller; 390 ajaxErrorLength = $.validationEngine.ajaxValidArray.length 391 existInarray = false; 392 393 if(ajaxisError == "false"){ // DATA FALSE UPDATE PROMPT WITH ERROR; 394 395 _checkInArray(false) // Check if ajax validation alreay used on this field 396 397 if(!existInarray){ // Add ajax error to stop submit 398 $.validationEngine.ajaxValidArray[ajaxErrorLength] = new Array(2) 399 $.validationEngine.ajaxValidArray[ajaxErrorLength][0] = fieldId 400 $.validationEngine.ajaxValidArray[ajaxErrorLength][1] = false 401 existInarray = false; 402 } 403 404 $.validationEngine.ajaxValid = false; 405 promptText += $.validationEngine.settings.allrules[customAjaxRule].alertText+"<br />"; 406 $.validationEngine.updatePromptText(ajaxCaller,promptText,"",true); 407 }else{ 408 _checkInArray(true) 409 410 $.validationEngine.ajaxValid = true; 411 if($.validationEngine.settings.allrules[customAjaxRule].alertTextOk){ // NO OK TEXT MEAN CLOSE PROMPT 412 $.validationEngine.updatePromptText(ajaxCaller,$.validationEngine.settings.allrules[customAjaxRule].alertTextOk,"pass",true); 413 }else{ 414 ajaxValidate = false; 415 $.validationEngine.closePrompt(ajaxCaller); 416 } 417 } 418 function _checkInArray(validate){ 419 for(x=0;x<ajaxErrorLength;x++){ 420 if($.validationEngine.ajaxValidArray[x][0] == fieldId){ 421 $.validationEngine.ajaxValidArray[x][1] = validate 422 existInarray = true; 423 424 } 425 } 426 } 427 } 428 }); 429 } 430 } 431 function _confirm(caller,rules,position){ // VALIDATE FIELD MATCH 432 confirmField = rules[position+1]; 433 434 if($(caller).attr('value') != $("#"+confirmField).attr('value')){ 435 $.validationEngine.isError = true; 436 promptText += $.validationEngine.settings.allrules["confirm"].alertText+"<br />"; 437 } 438 } 439 function _length(caller,rules,position){ // VALIDATE LENGTH 440 441 startLength = eval(rules[position+1]); 442 endLength = eval(rules[position+2]);
443 feildLength = $(caller).attr('value').length; 444 445 if(feildLength<startLength || feildLength>endLength){ 446 $.validationEngine.isError = true; 447 promptText += $.validationEngine.settings.allrules["length"].alertText+startLength+$.validationEngine.settings.allrules["length"].alertText2+endLength+$.validationEngine.settings.allrules["length"].alertText3+"<br />" 448 } 449 } 450 function _minCheckbox(caller,rules,position){ // VALIDATE CHECKBOX NUMBER 451 452 nbCheck = eval(rules[position+1]); 453 groupname = $(caller).attr("name"); 454 groupSize = $("input[name="+groupname+"]:checked").size(); 455 456 if(groupSize > nbCheck){ 457 $.validationEngine.isError = true; 458 promptText += $.validationEngine.settings.allrules["minCheckbox"].alertText+"<br />"; 459 } 460 } 461 return($.validationEngine.isError) ? $.validationEngine.isError : false; 462 }, 463 closePrompt : function(caller,outside) { // CLOSE PROMPT WHEN ERROR CORRECTED 464 if(outside){ 465 $(caller).fadeTo("fast",0,function(){ 466 $(caller).remove(); 467 }); 468 return false; 469 } 470 if(!ajaxValidate){ 471 closingPrompt = $(caller).attr("id"); 472 473 $("."+closingPrompt).fadeTo("fast",0,function(){ 474 $("."+closingPrompt).remove(); 475 }); 476 } 477 }, 478 submitValidation : function(caller,settings) { // FORM SUBMIT VALIDATION LOOPING INLINE VALIDATION 479 var stopForm = false; 480 $.validationEngine.settings = settings 481 $.validationEngine.ajaxValid = true 482 $(caller).find(".formError").remove(); 483 var toValidateSize = $(caller).find("[class^=validate]").size(); 484 485 $(caller).find("[class^=validate]").each(function(){ 486 callerId = $(this).attr("id") 487 if(!$("."+callerId).hasClass("ajaxed")){ // DO NOT UPDATE ALREADY AJAXED FIELDS (only happen is no normal errors, don't worry) 488 var validationPass = $.validationEngine.loadValidation(this,settings); 489 return(validationPass) ? stopForm = true : ""; 490 } 491 }); 492 ajaxErrorLength = $.validationEngine.ajaxValidArray.length // LOOK IF SOME AJAX IS NOT VALIDATE 493 for(x=0;x<ajaxErrorLength;x++){ 494 if($.validationEngine.ajaxValidArray[x][1] == false){ 495 $.validationEngine.ajaxValid = false 496 } 497 } 498 if(stopForm || !$.validationEngine.ajaxValid){ // GET IF THERE IS AN ERROR OR NOT FROM THIS VALIDATION FUNCTIONS 499 destination = $(".formError:not('.greenPopup'):first").offset().top; 500 $("html:not(:animated),body:not(:animated)").animate({ scrollTop: destination}, 1100); 501 return true; 502 }else{ 503 return false 504 } 505 } 506} 507})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.