/web/selektory/selector/js/jquery.validationEngine.js

https://bitbucket.org/odlc/nauka · JavaScript · 636 lines · 570 code · 49 blank · 17 comment · 140 complexity · d81a17ca5ff77840b0d245e92cec1417 MD5 · raw file

  1. /*
  2. * Inline Form Validation Engine 1.7, jQuery plugin
  3. *
  4. * Copyright(c) 2010, Cedric Dugas
  5. * http://www.position-relative.net
  6. *
  7. * Form validation engine allowing custom regex rules to be added.
  8. * Thanks to Francois Duquette and Teddy Limousin
  9. * and everyone helping me find bugs on the forum
  10. * Licenced under the MIT Licence
  11. */
  12. (function($) {
  13. $.fn.validationEngine = function(settings) {
  14. if($.validationEngineLanguage){ // IS THERE A LANGUAGE LOCALISATION ?
  15. allRules = $.validationEngineLanguage.allRules;
  16. }else{
  17. $.validationEngine.debug("Validation engine rules are not loaded check your external file");
  18. }
  19. settings = jQuery.extend({
  20. allrules:allRules,
  21. validationEventTriggers:"focusout",
  22. inlineValidation: true,
  23. returnIsValid:false,
  24. liveEvent:true,
  25. unbindEngine:true,
  26. containerOverflow:false,
  27. containerOverflowDOM:"",
  28. ajaxSubmit: false,
  29. scroll:true,
  30. promptPosition: "topRight", // OPENNING BOX POSITION, IMPLEMENTED: topLeft, topRight, bottomLeft, centerRight, bottomRight
  31. success : false,
  32. beforeSuccess : function() {},
  33. failure : function() {}
  34. }, settings);
  35. $.validationEngine.settings = settings;
  36. $.validationEngine.ajaxValidArray = new Array(); // ARRAY FOR AJAX: VALIDATION MEMORY
  37. if(settings.inlineValidation == true){ // Validating Inline ?
  38. if(!settings.returnIsValid){ // NEEDED FOR THE SETTING returnIsValid
  39. allowReturnIsvalid = false;
  40. if(settings.liveEvent){ // LIVE event, vast performance improvement over BIND
  41. $(this).find("[class*=validate][type!=checkbox]").live(settings.validationEventTriggers, function(caller){ _inlinEvent(this);})
  42. $(this).find("[class*=validate][type=checkbox]").live("click", function(caller){ _inlinEvent(this); })
  43. }else{
  44. $(this).find("[class*=validate]").not("[type=checkbox]").bind(settings.validationEventTriggers, function(caller){ _inlinEvent(this); })
  45. $(this).find("[class*=validate][type=checkbox]").bind("click", function(caller){ _inlinEvent(this); })
  46. }
  47. firstvalid = false;
  48. }
  49. function _inlinEvent(caller){
  50. $.validationEngine.settings = settings;
  51. if($.validationEngine.intercept == false || !$.validationEngine.intercept){ // STOP INLINE VALIDATION THIS TIME ONLY
  52. $.validationEngine.onSubmitValid=false;
  53. $.validationEngine.loadValidation(caller);
  54. }else{
  55. $.validationEngine.intercept = false;
  56. }
  57. }
  58. }
  59. if (settings.returnIsValid){ // Do validation and return true or false, it bypass everything;
  60. if ($.validationEngine.submitValidation(this,settings)){
  61. return false;
  62. }else{
  63. return true;
  64. }
  65. }
  66. $(this).bind("submit", function(caller){ // ON FORM SUBMIT, CONTROL AJAX FUNCTION IF SPECIFIED ON DOCUMENT READY
  67. $.validationEngine.onSubmitValid = true;
  68. $.validationEngine.settings = settings;
  69. if($.validationEngine.submitValidation(this,settings) == false){
  70. if($.validationEngine.submitForm(this,settings) == true) return false;
  71. }else{
  72. settings.failure && settings.failure();
  73. return false;
  74. }
  75. })
  76. $(".formError").live("click",function(){ // REMOVE BOX ON CLICK
  77. $(this).fadeOut(150,function(){ $(this).remove() })
  78. })
  79. };
  80. $.validationEngine = {
  81. defaultSetting : function(caller) { // NOT GENERALLY USED, NEEDED FOR THE API, DO NOT TOUCH
  82. if($.validationEngineLanguage){
  83. allRules = $.validationEngineLanguage.allRules;
  84. }else{
  85. $.validationEngine.debug("Validation engine rules are not loaded check your external file");
  86. }
  87. settings = {
  88. allrules:allRules,
  89. validationEventTriggers:"blur",
  90. inlineValidation: true,
  91. containerOverflow:false,
  92. containerOverflowDOM:"",
  93. returnIsValid:false,
  94. scroll:true,
  95. unbindEngine:true,
  96. ajaxSubmit: false,
  97. promptPosition: "topRight", // OPENNING BOX POSITION, IMPLEMENTED: topLeft, topRight, bottomLeft, centerRight, bottomRight
  98. success : false,
  99. failure : function() {}
  100. }
  101. $.validationEngine.settings = settings;
  102. },
  103. loadValidation : function(caller) { // GET VALIDATIONS TO BE EXECUTED
  104. if(!$.validationEngine.settings) $.validationEngine.defaultSetting()
  105. rulesParsing = $(caller).attr('class');
  106. rulesRegExp = /\[(.*)\]/;
  107. getRules = rulesRegExp.exec(rulesParsing);
  108. if(getRules == null) return false;
  109. str = getRules[1];
  110. pattern = /\[|,|\]/;
  111. result= str.split(pattern);
  112. var validateCalll = $.validationEngine.validateCall(caller,result)
  113. return validateCalll;
  114. },
  115. validateCall : function(caller,rules) { // EXECUTE VALIDATION REQUIRED BY THE USER FOR THIS FIELD
  116. var promptText =""
  117. if(!$(caller).attr("id")) $.validationEngine.debug("This field have no ID attribut( name & class displayed): "+$(caller).attr("name")+" "+$(caller).attr("class"))
  118. caller = caller;
  119. ajaxValidate = false;
  120. var callerName = $(caller).attr("name");
  121. $.validationEngine.isError = false;
  122. $.validationEngine.showTriangle = true;
  123. callerType = $(caller).attr("type");
  124. for (i=0; i<rules.length;i++){
  125. switch (rules[i]){
  126. case "optional":
  127. if(!$(caller).val()){
  128. $.validationEngine.closePrompt(caller);
  129. return $.validationEngine.isError;
  130. }
  131. break;
  132. case "required":
  133. _required(caller,rules);
  134. break;
  135. case "custom":
  136. _customRegex(caller,rules,i);
  137. break;
  138. case "exemptString":
  139. _exemptString(caller,rules,i);
  140. break;
  141. case "ajax":
  142. if(!$.validationEngine.onSubmitValid) _ajax(caller,rules,i);
  143. break;
  144. case "length":
  145. _length(caller,rules,i);
  146. break;
  147. case "maxCheckbox":
  148. _maxCheckbox(caller,rules,i);
  149. groupname = $(caller).attr("name");
  150. caller = $("input[name='"+groupname+"']");
  151. break;
  152. case "minCheckbox":
  153. _minCheckbox(caller,rules,i);
  154. groupname = $(caller).attr("name");
  155. caller = $("input[name='"+groupname+"']");
  156. break;
  157. case "confirm":
  158. _confirm(caller,rules,i);
  159. break;
  160. case "funcCall":
  161. _funcCall(caller,rules,i);
  162. break;
  163. default :;
  164. };
  165. };
  166. radioHack();
  167. if ($.validationEngine.isError == true){
  168. var linkTofieldText = "." +$.validationEngine.linkTofield(caller);
  169. if(linkTofieldText != "."){
  170. if(!$(linkTofieldText)[0]){
  171. $.validationEngine.buildPrompt(caller,promptText,"error")
  172. }else{
  173. $.validationEngine.updatePromptText(caller,promptText);
  174. }
  175. }else{
  176. $.validationEngine.updatePromptText(caller,promptText);
  177. }
  178. }else{
  179. $.validationEngine.closePrompt(caller);
  180. }
  181. /* UNFORTUNATE RADIO AND CHECKBOX GROUP HACKS */
  182. /* As my validation is looping input with id's we need a hack for my validation to understand to group these inputs */
  183. function radioHack(){
  184. if($("input[name='"+callerName+"']").size()> 1 && (callerType == "radio" || callerType == "checkbox")) { // Hack for radio/checkbox group button, the validation go the first radio/checkbox of the group
  185. caller = $("input[name='"+callerName+"'][type!=hidden]:first");
  186. $.validationEngine.showTriangle = false;
  187. }
  188. }
  189. /* VALIDATION FUNCTIONS */
  190. function _required(caller,rules){ // VALIDATE BLANK FIELD
  191. callerType = $(caller).attr("type");
  192. if (callerType == "text" || callerType == "password" || callerType == "textarea"){
  193. if(!$(caller).val()){
  194. $.validationEngine.isError = true;
  195. promptText += $.validationEngine.settings.allrules[rules[i]].alertText+"<br />";
  196. }
  197. }
  198. if (callerType == "radio" || callerType == "checkbox" ){
  199. callerName = $(caller).attr("name");
  200. if($("input[name='"+callerName+"']:checked").size() == 0) {
  201. $.validationEngine.isError = true;
  202. if($("input[name='"+callerName+"']").size() ==1) {
  203. promptText += $.validationEngine.settings.allrules[rules[i]].alertTextCheckboxe+"<br />";
  204. }else{
  205. promptText += $.validationEngine.settings.allrules[rules[i]].alertTextCheckboxMultiple+"<br />";
  206. }
  207. }
  208. }
  209. if (callerType == "select-one") { // added by paul@kinetek.net for select boxes, Thank you
  210. if(!$(caller).val()) {
  211. $.validationEngine.isError = true;
  212. promptText += $.validationEngine.settings.allrules[rules[i]].alertText+"<br />";
  213. }
  214. }
  215. if (callerType == "select-multiple") { // added by paul@kinetek.net for select boxes, Thank you
  216. if(!$(caller).find("option:selected").val()) {
  217. $.validationEngine.isError = true;
  218. promptText += $.validationEngine.settings.allrules[rules[i]].alertText+"<br />";
  219. }
  220. }
  221. }
  222. function _customRegex(caller,rules,position){ // VALIDATE REGEX RULES
  223. customRule = rules[position+1];
  224. pattern = eval($.validationEngine.settings.allrules[customRule].regex);
  225. if(!pattern.test($(caller).attr('value'))){
  226. if (typeof console != 'undefined') console.log('value of field \'#'+$(caller).attr('id')+'\' to validate \''+$(caller).attr('value')+'\' pattern: \''+$.validationEngine.settings.allrules[customRule].regex+'\'');
  227. $.validationEngine.isError = true;
  228. promptText += $.validationEngine.settings.allrules[customRule].alertText+"<br />";
  229. }
  230. }
  231. function _exemptString(caller,rules,position){ // VALIDATE REGEX RULES
  232. customString = rules[position+1];
  233. if(customString == $(caller).attr('value')){
  234. $.validationEngine.isError = true;
  235. promptText += $.validationEngine.settings.allrules['required'].alertText+"<br />";
  236. }
  237. }
  238. function _funcCall(caller,rules,position){ // VALIDATE CUSTOM FUNCTIONS OUTSIDE OF THE ENGINE SCOPE
  239. customRule = rules[position+1];
  240. funce = $.validationEngine.settings.allrules[customRule].nname;
  241. var fn = window[funce];
  242. if (typeof(fn) === 'function'){
  243. var fn_result = fn();
  244. if(!fn_result){
  245. $.validationEngine.isError = true;
  246. }
  247. promptText += $.validationEngine.settings.allrules[customRule].alertText+"<br />";
  248. }
  249. }
  250. function _ajax(caller,rules,position){ // VALIDATE AJAX RULES
  251. customAjaxRule = rules[position+1];
  252. postfile = $.validationEngine.settings.allrules[customAjaxRule].file;
  253. fieldValue = $(caller).val();
  254. ajaxCaller = caller;
  255. fieldId = $(caller).attr("id");
  256. ajaxValidate = true;
  257. ajaxisError = $.validationEngine.isError;
  258. if($.validationEngine.settings.allrules[customAjaxRule].extraData){
  259. extraData = $.validationEngine.settings.allrules[customAjaxRule].extraData;
  260. }else{
  261. extraData = "";
  262. }
  263. /* AJAX VALIDATION HAS ITS OWN UPDATE AND BUILD UNLIKE OTHER RULES */
  264. if(!ajaxisError){
  265. $.ajax({
  266. type: "POST",
  267. url: postfile,
  268. async: true,
  269. data: "validateValue="+fieldValue+"&validateId="+fieldId+"&validateError="+customAjaxRule+"&extraData="+extraData,
  270. beforeSend: function(){ // BUILD A LOADING PROMPT IF LOAD TEXT EXIST
  271. if($.validationEngine.settings.allrules[customAjaxRule].alertTextLoad){
  272. if(!$("div."+fieldId+"formError")[0]){
  273. return $.validationEngine.buildPrompt(ajaxCaller,$.validationEngine.settings.allrules[customAjaxRule].alertTextLoad,"load");
  274. }else{
  275. $.validationEngine.updatePromptText(ajaxCaller,$.validationEngine.settings.allrules[customAjaxRule].alertTextLoad,"load");
  276. }
  277. }
  278. },
  279. error: function(data,transport){ $.validationEngine.debug("error in the ajax: "+data.status+" "+transport) },
  280. success: function(data){ // GET SUCCESS DATA RETURN JSON
  281. data = eval( "("+data+")"); // GET JSON DATA FROM PHP AND PARSE IT
  282. ajaxisError = data.jsonValidateReturn[2];
  283. customAjaxRule = data.jsonValidateReturn[1];
  284. ajaxCaller = $("#"+data.jsonValidateReturn[0])[0];
  285. fieldId = ajaxCaller;
  286. ajaxErrorLength = $.validationEngine.ajaxValidArray.length;
  287. existInarray = false;
  288. if(ajaxisError == "false"){ // DATA FALSE UPDATE PROMPT WITH ERROR;
  289. _checkInArray(false) // Check if ajax validation alreay used on this field
  290. if(!existInarray){ // Add ajax error to stop submit
  291. $.validationEngine.ajaxValidArray[ajaxErrorLength] = new Array(2);
  292. $.validationEngine.ajaxValidArray[ajaxErrorLength][0] = fieldId;
  293. $.validationEngine.ajaxValidArray[ajaxErrorLength][1] = false;
  294. existInarray = false;
  295. }
  296. $.validationEngine.ajaxValid = false;
  297. promptText += $.validationEngine.settings.allrules[customAjaxRule].alertText+"<br />";
  298. $.validationEngine.updatePromptText(ajaxCaller,promptText,"",true);
  299. }else{
  300. _checkInArray(true);
  301. $.validationEngine.ajaxValid = true;
  302. if(!customAjaxRule) {$.validationEngine.debug("wrong ajax response, are you on a server or in xampp? if not delete de ajax[ajaxUser] validating rule from your form ")}
  303. if($.validationEngine.settings.allrules[customAjaxRule].alertTextOk){ // NO OK TEXT MEAN CLOSE PROMPT
  304. $.validationEngine.updatePromptText(ajaxCaller,$.validationEngine.settings.allrules[customAjaxRule].alertTextOk,"pass",true);
  305. }else{
  306. ajaxValidate = false;
  307. $.validationEngine.closePrompt(ajaxCaller);
  308. }
  309. }
  310. function _checkInArray(validate){
  311. for(x=0;x<ajaxErrorLength;x++){
  312. if($.validationEngine.ajaxValidArray[x][0] == fieldId){
  313. $.validationEngine.ajaxValidArray[x][1] = validate;
  314. existInarray = true;
  315. }
  316. }
  317. }
  318. }
  319. });
  320. }
  321. }
  322. function _confirm(caller,rules,position){ // VALIDATE FIELD MATCH
  323. confirmField = rules[position+1];
  324. if($(caller).attr('value') != $("#"+confirmField).attr('value')){
  325. $.validationEngine.isError = true;
  326. promptText += $.validationEngine.settings.allrules["confirm"].alertText+"<br />";
  327. }
  328. }
  329. function _length(caller,rules,position){ // VALIDATE LENGTH
  330. startLength = eval(rules[position+1]);
  331. endLength = eval(rules[position+2]);
  332. feildLength = $(caller).attr('value').length;
  333. if(feildLength<startLength || feildLength>endLength){
  334. $.validationEngine.isError = true;
  335. promptText += $.validationEngine.settings.allrules["length"].alertText+startLength+$.validationEngine.settings.allrules["length"].alertText2+endLength+$.validationEngine.settings.allrules["length"].alertText3+"<br />"
  336. }
  337. }
  338. function _maxCheckbox(caller,rules,position){ // VALIDATE CHECKBOX NUMBER
  339. nbCheck = eval(rules[position+1]);
  340. groupname = $(caller).attr("name");
  341. groupSize = $("input[name='"+groupname+"']:checked").size();
  342. if(groupSize > nbCheck){
  343. $.validationEngine.showTriangle = false;
  344. $.validationEngine.isError = true;
  345. promptText += $.validationEngine.settings.allrules["maxCheckbox"].alertText+"<br />";
  346. }
  347. }
  348. function _minCheckbox(caller,rules,position){ // VALIDATE CHECKBOX NUMBER
  349. nbCheck = eval(rules[position+1]);
  350. groupname = $(caller).attr("name");
  351. groupSize = $("input[name='"+groupname+"']:checked").size();
  352. if(groupSize < nbCheck){
  353. $.validationEngine.isError = true;
  354. $.validationEngine.showTriangle = false;
  355. promptText += $.validationEngine.settings.allrules["minCheckbox"].alertText+" "+nbCheck+" "+$.validationEngine.settings.allrules["minCheckbox"].alertText2+"<br />";
  356. }
  357. }
  358. return ($.validationEngine.isError) ? $.validationEngine.isError : false;
  359. },
  360. submitForm : function(caller){
  361. if($.validationEngine.settings.ajaxSubmit){
  362. if($.validationEngine.settings.ajaxSubmitExtraData){
  363. extraData = $.validationEngine.settings.ajaxSubmitExtraData;
  364. }else{
  365. extraData = "";
  366. }
  367. $.ajax({
  368. type: "POST",
  369. url: $.validationEngine.settings.ajaxSubmitFile,
  370. async: true,
  371. data: $(caller).serialize()+"&"+extraData,
  372. error: function(data,transport){ $.validationEngine.debug("error in the ajax: "+data.status+" "+transport) },
  373. success: function(data){
  374. if(data == "true"){ // EVERYTING IS FINE, SHOW SUCCESS MESSAGE
  375. $(caller).css("opacity",1)
  376. $(caller).animate({opacity: 0, height: 0}, function(){
  377. $(caller).css("display","none");
  378. $(caller).before("<div class='ajaxSubmit'>"+$.validationEngine.settings.ajaxSubmitMessage+"</div>");
  379. $.validationEngine.closePrompt(".formError",true);
  380. $(".ajaxSubmit").show("slow");
  381. if ($.validationEngine.settings.success){ // AJAX SUCCESS, STOP THE LOCATION UPDATE
  382. $.validationEngine.settings.success && $.validationEngine.settings.success();
  383. return false;
  384. }
  385. })
  386. }else{ // HOUSTON WE GOT A PROBLEM (SOMETING IS NOT VALIDATING)
  387. data = eval( "("+data+")");
  388. if(!data.jsonValidateReturn){
  389. $.validationEngine.debug("you are not going into the success fonction and jsonValidateReturn return nothing");
  390. }
  391. errorNumber = data.jsonValidateReturn.length
  392. for(index=0; index<errorNumber; index++){
  393. fieldId = data.jsonValidateReturn[index][0];
  394. promptError = data.jsonValidateReturn[index][1];
  395. type = data.jsonValidateReturn[index][2];
  396. $.validationEngine.buildPrompt(fieldId,promptError,type);
  397. }
  398. }
  399. }
  400. })
  401. return true;
  402. }
  403. // LOOK FOR BEFORE SUCCESS METHOD
  404. if(!$.validationEngine.settings.beforeSuccess()){
  405. if ($.validationEngine.settings.success){ // AJAX SUCCESS, STOP THE LOCATION UPDATE
  406. if($.validationEngine.settings.unbindEngine){ $(caller).unbind("submit") }
  407. $.validationEngine.settings.success && $.validationEngine.settings.success();
  408. return true;
  409. }
  410. }else{
  411. return true;
  412. }
  413. return false;
  414. },
  415. buildPrompt : function(caller,promptText,type,ajaxed) { // ERROR PROMPT CREATION AND DISPLAY WHEN AN ERROR OCCUR
  416. if(!$.validationEngine.settings){
  417. $.validationEngine.defaultSetting()
  418. }
  419. deleteItself = "." + $(caller).attr("id") + "formError"
  420. if($(deleteItself)[0]){
  421. $(deleteItself).stop();
  422. $(deleteItself).remove();
  423. }
  424. var divFormError = document.createElement('div');
  425. var formErrorContent = document.createElement('div');
  426. linkTofield = $.validationEngine.linkTofield(caller)
  427. $(divFormError).addClass("formError")
  428. if(type == "pass") $(divFormError).addClass("greenPopup")
  429. if(type == "load") $(divFormError).addClass("blackPopup")
  430. if(ajaxed) $(divFormError).addClass("ajaxed")
  431. $(divFormError).addClass(linkTofield);
  432. $(formErrorContent).addClass("formErrorContent");
  433. if($.validationEngine.settings.containerOverflow){ // Is the form contained in an overflown container?
  434. $(caller).before(divFormError);
  435. }else{
  436. $("body").append(divFormError);
  437. }
  438. $(divFormError).append(formErrorContent);
  439. if($.validationEngine.showTriangle != false){ // NO TRIANGLE ON MAX CHECKBOX AND RADIO
  440. var arrow = document.createElement('div');
  441. $(arrow).addClass("formErrorArrow");
  442. $(divFormError).append(arrow);
  443. if($.validationEngine.settings.promptPosition == "bottomLeft" || $.validationEngine.settings.promptPosition == "bottomRight"){
  444. $(arrow).addClass("formErrorArrowBottom")
  445. $(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>');
  446. }
  447. if($.validationEngine.settings.promptPosition == "topLeft" || $.validationEngine.settings.promptPosition == "topRight"){
  448. $(divFormError).append(arrow);
  449. $(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>');
  450. }
  451. }
  452. $(formErrorContent).html(promptText)
  453. var calculatedPosition = $.validationEngine.calculatePosition(caller,promptText,type,ajaxed,divFormError)
  454. calculatedPosition.callerTopPosition +="px";
  455. calculatedPosition.callerleftPosition +="px";
  456. calculatedPosition.marginTopSize +="px"
  457. $(divFormError).css({
  458. "top":calculatedPosition.callerTopPosition,
  459. "left":calculatedPosition.callerleftPosition,
  460. "marginTop":calculatedPosition.marginTopSize,
  461. "opacity":0
  462. })
  463. return $(divFormError).animate({"opacity":0.87},function(){return true;});
  464. },
  465. updatePromptText : function(caller,promptText,type,ajaxed) { // UPDATE TEXT ERROR IF AN ERROR IS ALREADY DISPLAYED
  466. linkTofield = $.validationEngine.linkTofield(caller);
  467. var updateThisPrompt = "."+linkTofield;
  468. if(type == "pass") { $(updateThisPrompt).addClass("greenPopup") }else{ $(updateThisPrompt).removeClass("greenPopup")};
  469. if(type == "load") { $(updateThisPrompt).addClass("blackPopup") }else{ $(updateThisPrompt).removeClass("blackPopup")};
  470. if(ajaxed) { $(updateThisPrompt).addClass("ajaxed") }else{ $(updateThisPrompt).removeClass("ajaxed")};
  471. $(updateThisPrompt).find(".formErrorContent").html(promptText);
  472. var calculatedPosition = $.validationEngine.calculatePosition(caller,promptText,type,ajaxed,updateThisPrompt)
  473. calculatedPosition.callerTopPosition +="px";
  474. calculatedPosition.callerleftPosition +="px";
  475. calculatedPosition.marginTopSize +="px"
  476. $(updateThisPrompt).animate({ "top":calculatedPosition.callerTopPosition,"marginTop":calculatedPosition.marginTopSize });
  477. },
  478. calculatePosition : function(caller,promptText,type,ajaxed,divFormError){
  479. if($.validationEngine.settings.containerOverflow){ // Is the form contained in an overflown container?
  480. callerTopPosition = 0;
  481. callerleftPosition = 0;
  482. callerWidth = $(caller).width();
  483. inputHeight = $(divFormError).height(); // compasation for the triangle
  484. var marginTopSize = "-"+inputHeight;
  485. }else{
  486. callerTopPosition = $(caller).offset().top;
  487. callerleftPosition = $(caller).offset().left;
  488. callerWidth = $(caller).width();
  489. inputHeight = $(divFormError).height();
  490. var marginTopSize = 0;
  491. }
  492. /* POSITIONNING */
  493. if($.validationEngine.settings.promptPosition == "topRight"){
  494. if($.validationEngine.settings.containerOverflow){ // Is the form contained in an overflown container?
  495. callerleftPosition += callerWidth -30;
  496. }else{
  497. callerleftPosition += callerWidth -30;
  498. callerTopPosition += -inputHeight;
  499. }
  500. }
  501. if($.validationEngine.settings.promptPosition == "topLeft"){ callerTopPosition += -inputHeight -10; }
  502. if($.validationEngine.settings.promptPosition == "centerRight"){ callerleftPosition += callerWidth +13; }
  503. if($.validationEngine.settings.promptPosition == "bottomLeft"){
  504. callerHeight = $(caller).height();
  505. callerTopPosition = callerTopPosition + callerHeight + 15;
  506. }
  507. if($.validationEngine.settings.promptPosition == "bottomRight"){
  508. callerHeight = $(caller).height();
  509. callerleftPosition += callerWidth -30;
  510. callerTopPosition += callerHeight +5;
  511. }
  512. return {
  513. "callerTopPosition":callerTopPosition,
  514. "callerleftPosition":callerleftPosition,
  515. "marginTopSize":marginTopSize
  516. }
  517. },
  518. linkTofield : function(caller){
  519. var linkTofield = $(caller).attr("id") + "formError";
  520. linkTofield = linkTofield.replace(/\[/g,"");
  521. linkTofield = linkTofield.replace(/\]/g,"");
  522. return linkTofield;
  523. },
  524. closePrompt : function(caller,outside) { // CLOSE PROMPT WHEN ERROR CORRECTED
  525. if(!$.validationEngine.settings){
  526. $.validationEngine.defaultSetting()
  527. }
  528. if(outside){
  529. $(caller).fadeTo("fast",0,function(){
  530. $(caller).remove();
  531. });
  532. return false;
  533. }
  534. if(typeof(ajaxValidate)=='undefined'){ajaxValidate = false}
  535. if(!ajaxValidate){
  536. closingPrompt = "."+$.validationEngine.linkTofield(caller);
  537. $(closingPrompt).fadeTo("fast",0,function(){
  538. $(closingPrompt).remove();
  539. });
  540. }
  541. },
  542. debug : function(error) {
  543. if(!$("#debugMode")[0]){
  544. $("body").append("<div id='debugMode'><div class='debugError'><strong>This is a debug mode, you got a problem with your form, it will try to help you, refresh when you think you nailed down the problem</strong></div></div>");
  545. }
  546. $(".debugError").append("<div class='debugerror'>"+error+"</div>");
  547. },
  548. submitValidation : function(caller) { // FORM SUBMIT VALIDATION LOOPING INLINE VALIDATION
  549. var stopForm = false;
  550. $.validationEngine.ajaxValid = true;
  551. var toValidateSize = $(caller).find("[class*=validate]").size();
  552. $(caller).find("[class*=validate]").each(function(){
  553. linkTofield = $.validationEngine.linkTofield(this);
  554. if(!$("."+linkTofield).hasClass("ajaxed")){ // DO NOT UPDATE ALREADY AJAXED FIELDS (only happen if no normal errors, don't worry)
  555. var validationPass = $.validationEngine.loadValidation(this);
  556. return(validationPass) ? stopForm = true : "";
  557. };
  558. });
  559. ajaxErrorLength = $.validationEngine.ajaxValidArray.length; // LOOK IF SOME AJAX IS NOT VALIDATE
  560. for(x=0;x<ajaxErrorLength;x++){
  561. if($.validationEngine.ajaxValidArray[x][1] == false) $.validationEngine.ajaxValid = false;
  562. }
  563. if(stopForm || !$.validationEngine.ajaxValid){ // GET IF THERE IS AN ERROR OR NOT FROM THIS VALIDATION FUNCTIONS
  564. if($.validationEngine.settings.scroll){
  565. if(!$.validationEngine.settings.containerOverflow){
  566. var destination = $(".formError:not('.greenPopup'):first").offset().top;
  567. $(".formError:not('.greenPopup')").each(function(){
  568. testDestination = $(this).offset().top;
  569. if(destination>testDestination) destination = $(this).offset().top;
  570. })
  571. $("html:not(:animated),body:not(:animated)").animate({ scrollTop: destination}, 1100);
  572. }else{
  573. var destination = $(".formError:not('.greenPopup'):first").offset().top;
  574. var scrollContainerScroll = $($.validationEngine.settings.containerOverflowDOM).scrollTop();
  575. var scrollContainerPos = - parseInt($($.validationEngine.settings.containerOverflowDOM).offset().top);
  576. var destination = scrollContainerScroll + destination + scrollContainerPos -5
  577. var scrollContainer = $.validationEngine.settings.containerOverflowDOM+":not(:animated)"
  578. $(scrollContainer).animate({ scrollTop: destination}, 1100);
  579. }
  580. }
  581. return true;
  582. }else{
  583. return false;
  584. }
  585. }
  586. }
  587. })(jQuery);