kilvalidate 1.0.65 → 1.0.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/kilnextvalidation.min.js +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function validateRequiredFields(e){const t=document.querySelector(`${e}`),r=t.querySelectorAll("input[required], select[required], textarea[required]"),a=(t.querySelectorAll("fieldset.radios"),t.querySelectorAll('input[type="radio"]')),s={},o=new Set;t.querySelectorAll('input[type="checkbox"]').forEach((e=>{const t=e.name;s[t]||(s[t]=[]),s[t].push(e),e.hasAttribute("required")&&o.add(t)}));t.querySelectorAll(".select2");let l=!0,d="This Field is Required.";if(t.querySelectorAll(".error-message").forEach((e=>e.remove())),r.forEach((e=>{e.style.border=""})),r.forEach((e=>{const t=e.closest(".form-group")||e.parentNode;e.parentNode;if("date"==e.type){d="Please Select Date",e.style.border="";e.value.trim()||(l=!1,e.style.border="1px solid red",addErrorMessage(t,d))}else d="comments"==e.name?"Please Enter Comments":"email"==e.type?"Please Enter Email":"password"==e.type?"Please Enter Password":"This Field is Required.";e.value.trim()||(l=!1,e.style.border="1px solid red",addErrorMessage(t,d))})),a.length>0){const e={};a.forEach((t=>{const r=t.name;e[r]||(e[r]={isSelected:!1,groupElement:t.closest(".form-group")||t.closest(".mb-3")||t.closest(".form-check")||t.closest(".radios")||t.closest(".col-md-6")}),t.checked&&(e[r].isSelected=!0)})),Object.entries(e).forEach((([e,t])=>{if(!t.isSelected){l=!1;const r="Please select one option.";if(!t.groupElement)return void console.error("Invalid group element for radio group:",e);addErrorMessage(t.groupElement,r)}}))}return Object.keys(s).forEach((e=>{const t=s[e];if(t.some((e=>e.hasAttribute("data-ignore-kilvish"))))return;if(!t.some((e=>e.checked))){l=!1;const r=o.has(e)?"Please check this box to proceed":"Please select at least one option.";addErrorMessage(t[0].closest(".form-group")||t[0].closest(".form-check")||t[0].closest(".checkbox-container")||t[0].closest(".some-other-container"),r)}})),l}function addRealTimeValidation(e){const t=document.getElementById(e),r=t.querySelectorAll("input[required], select[required], textarea[required]"),a=(e,r=!0)=>{let a=t.querySelector(`label[for='${e.name}']`);if(!a){const t=e.closest("fieldset");t&&(a=t.querySelector("legend"))}a&&(r&&!a.innerHTML.includes("*")?a.innerHTML+=' <span style="color:red;">*</span>':!r&&a.innerHTML.includes("*")&&(a.innerHTML=a.innerHTML.replace(' <span style="color:red;">*</span>',"")))};r.forEach((e=>{const t=()=>{e.value.trim()?((e=>{const t=(e.closest(".form-group")||e.closest(".form-check")||e.closest(".radios")||e.closest(".checkbox-container")||e.parentNode).querySelector(".error-message");t&&t.remove(),e.style.border=""})(e),a(e,!1)):a(e,!0)};e.addEventListener("input",t),e.addEventListener("change",t)}));const s=t.querySelectorAll('input[type="radio"]');[...new Set(Array.from(s).map((e=>e.name)))].forEach((e=>{const r=t.querySelectorAll(`input[type="radio"][name="${e}"]`);r.forEach((e=>{e.addEventListener("change",(()=>{if(Array.from(r).some((e=>e.checked))){const t=e.closest(".form-group")||e.closest(".form-check")||e.closest(".radios")||e.closest(".mb-3")||e.closest(".col-md-6"),r=t?.querySelector(".error-message");r&&r.remove()}}))}))}));const o=t.querySelectorAll('input[type="checkbox"]');[...new Set(Array.from(o).map((e=>e.name)))].forEach((e=>{const r=t.querySelectorAll(`input[type="checkbox"][name="${e}"]`);r.forEach((e=>{e.addEventListener("change",(()=>{if(Array.from(r).some((e=>e.checked))){const t=e.closest(".form-group")||e.closest(".form-check")||e.closest(".checkbox-container")||e.closest(".some-other-container"),r=t?.querySelector(".error-message");r&&r.remove()}}))}))}))}function addRealTimeValidation_working(e){const t=document.getElementById(e),r=t.querySelectorAll("input[required], select[required], textarea[required]"),a=(e,r=!0)=>{let a=t.querySelector(`label[for='${e.name}']`);if(!a){const t=e.closest("fieldset");t&&(a=t.querySelector("legend"))}a&&(r&&!a.innerHTML.includes("*")?a.innerHTML+=' <span style="color:red;">*</span>':!r&&a.innerHTML.includes("*")&&(a.innerHTML=a.innerHTML.replace(' <span style="color:red;">*</span>',"")))};r.forEach((e=>{const t=()=>{e.value.trim()?((e=>{e.closest(".form-group")||e.parentNode;const t=(e.closest(".form-group")||e.closest(".form-check")||e.closest(".radios")||e.closest(".checkbox-container")||e.parentNode).querySelector(".error-message");t&&t.remove(),e.style.border=""})(e),a(e,!1)):a(e,!0)};e.addEventListener("input",t),e.addEventListener("change",t)}))}function validateForm(e){validateRequiredFields(e)||event.preventDefault()}function addAsteriskToRequiredFields(){document.querySelectorAll("input, select, textarea").forEach((e=>{if(e.required){let t;if(t=document.querySelector(`label[for='${e.name}']`),!t){const r=e.closest("fieldset");r&&(t=r.querySelector("legend"))}t&&!t.innerHTML.includes("*")&&(t.innerHTML+=' <span style="color:red;">*</span>')}}))}function attachInputEvents(){document.querySelectorAll("input, select, textarea").forEach((e=>{e.hasAttribute("data-ignore-kilvish")||(e.addEventListener("keyup",validateKilvishInput),e.addEventListener("change",validateKilvishInput))}))}function addValidateFormToSubmitButtons(){document.querySelectorAll("form").forEach((e=>{const t=e.id;if(t){e.querySelectorAll('button[type="submit"], input[type="submit"]').forEach((e=>{e.setAttribute("onclick",`validateForm('#${t}')`)}))}else console.warn("Form without ID found. Skipping validation.")}))}function initKilvalidate(){document.querySelectorAll("form").forEach((e=>{const t=e.id;t?addRealTimeValidation(t):console.warn("Form without ID found. Skipping validation.")})),attachInputEvents(),addAsteriskToRequiredFields(),addValidateFormToSubmitButtons()}function validateKilvishInput(e){const t=e.target;let r=/^[a-zA-Z\s]*$/;const a={image:["image/jpeg","image/png","image/bmp","image/tiff","image/webp","image/svg+xml"],doc:["application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],pdf:["application/pdf"],mix:["image/jpeg","image/png","image/bmp","image/tiff","image/webp","image/svg+xml","application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],only_pdf_image:["application/pdf","image/jpeg","image/png","image/bmp","image/tiff","image/webp","image/svg+xml"],only_doc_image:["application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","image/jpeg","image/png","image/bmp","image/tiff","image/webp","image/svg+xml"]},s={image:"Image",doc:"Document",pdf:"PDF",mix:"Image & Document",only_pdf_image:"PDF & Image",only_doc_image:"Document & Image"},o=t.closest(".form-group")||t.closest(".col-lg-12")||t.closest("div")||t.parentNode;t.parentNode;let l=o.querySelector(".error-message");if(l&&l.remove(),t.style.border="","description"===t.name||"address"===t.name){if(r=/^[a-zA-Z0-9@,._\s-'"*]*$/,t.value.length>400)return addErrorMessage(o,"Input exceeds the maximum length of 400 characters!"),t.style.border="1px solid red",void(t.value=t.value.substring(0,400))}else if("firstname"===t.name||"lastname"===t.name||"appointment_by"===t.name){r=/^[a-zA-Z\s-]*$/;const a=/^[a-zA-Z0-9._@-\s]+$/,s=t.value;if(a.test(t.value)){if(s.length>20||s.length<2)return addErrorMessage(o,"This Field Must Be Between 2 And 20 Characters."),t.style.border="1px solid red",void("change"===e.type&&(t.value=""))}else;t.style.border=""}else if("otp"===t.name){r=/^\d{6,6}$/;const a=/^\d+$/,s=t.value;parseInt(s,10);if(a.test(t.value)){if(s.length>6||s.length<6)return addErrorMessage(o,"OTP must be exactly 6 digits"),t.style.border="1px solid red",void("change"===e.type&&(t.value=""))}else;t.style.border=""}else if("number_of_items"===t.name){r=/^\d{0,6}(\.\d{0,2})?$/;const a=/^\d+$/,s=t.value;parseInt(s,10);if(a.test(t.value)){if(s.length>3)return addErrorMessage(o,"Pacakge Number Cannot Be Exceed 3 Digits"),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}else;t.style.border=""}else if("contact"===t.name||"agent_contact"==t.id)r=/^[\d\-\s]{0,20}$/;else if("number"==t.type){r=/^\d{0,20}$/;const a=/^\d+$/,s=t.value;parseInt(s,10);if(a.test(t.value)){if(s.length>20||s.length<1)return addErrorMessage(o,"This Must Be Between 1 And 20 Digits."),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}else;t.style.border=""}else if("tel"===t.type){let a=t.value.trim();a=a.replace(/\s+/g,""),t.value=a;if(r=/^\+?\d{7,15}$/,!/^\+?\d{7,15}$/.test(a))return addErrorMessage(o,"Enter a valid phone number (7–15 digits, optional +)."),t.style.border="2px solid red",void("change"===e.type&&(t.value=""));t.style.border=""}else if("kildate"===t.name){r=/^(?:\d{4}[-\/]\d{2}[-\/]\d{2})$/;const a=t.value.trim(),s=new Date(a.replace(/[-\/]/g,"/")),l=new Date;l.setHours(0,0,0,0);const d=t.getAttribute("data-kilvish-date");if(d){const[r,a]=d.replace("_","").split("_").map(Number),n=new Date(l),i=new Date(l);if(n.setFullYear(l.getFullYear()-r),i.setFullYear(l.getFullYear()-a),s>n||s<i)return addErrorMessage(o,`Birthday cannot be less than ${r} years ago or more than ${a} years in the future.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}else if(s<l)return addErrorMessage(o,"The date cannot be in the past."),t.style.border="2px solid red",void("change"===e.type&&(t.value=""));t.style.border=""}else{if("date"===t.type||"month"===t.type){r=/^(?:\d{4}[-\/]\d{2}[-\/]\d{2})$/;const a=t.value.trim(),s="month"===t.type?new Date(a+"-01"):new Date(a.replace(/[-\/]/g,"/")),l=new Date;l.setHours(0,0,0,0);const d=t.getAttribute("data-kilvish-date");if(d)if(/^_(\d+)_(\d+)$/.test(d)){const[r,a]=d.replace("_","").split("_").map(Number),n=new Date(l),i=new Date(l);if(n.setFullYear(l.getFullYear()-r),i.setFullYear(l.getFullYear()-a),s>n||s<i)return addErrorMessage(o,`Age must be between ${r} and ${a} years.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}else if(/^_(\d+)$/.test(d)){const r=Number(d.replace("_","")),a=new Date(l);if(a.setFullYear(l.getFullYear()-r),s.getTime()!==a.getTime())return addErrorMessage(o,`You must be exactly ${r} years old.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}else if(/future/.test(d)){if("future"===d&&s<=l)return addErrorMessage(o,"The selected date must be in the future."),t.style.border="2px solid red",void("change"===e.type&&(t.value=""));if("today_future"===d&&s<l)return addErrorMessage(o,"The selected date cannot be in the past."),t.style.border="2px solid red",void("change"===e.type&&(t.value=""));if(/(\d+)_days_future/.test(d)){const r=Number(d.match(/(\d+)_days_future/)[1]),a=new Date(l);if(a.setDate(l.getDate()+r),s>a||s<l)return addErrorMessage(o,`The selected date must be within the next ${r} days.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}else if(/^(\d+)_years_future$/.test(d)){const r=Number(d.match(/^(\d+)_years_future$/)[1]),a=new Date(l);if(a.setFullYear(l.getFullYear()+r),s<l||s>a)return addErrorMessage(o,`The date must be within the next ${r} years.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}else if(/^(\d+)_years_after$/.test(d)){const r=Number(d.match(/^(\d+)_years_after$/)[1]),a=new Date(l);if(a.setFullYear(l.getFullYear()+r),s.getTime()!==a.getTime())return addErrorMessage(o,`The date must be exactly ${r} years after today.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}}else if(/past/.test(d)){if("past"===d&&s>=l)return addErrorMessage(o,"The selected date must be in the past."),t.style.border="2px solid red",void("change"===e.type&&(t.value=""));if(/^(\d+)_years_past$/.test(d)){const r=Number(d.match(/^(\d+)_years_past$/)[1]),a=new Date(l);if(a.setFullYear(l.getFullYear()-r),s>l||s<a)return addErrorMessage(o,`The date must be within the past ${r} years.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}}else if(/^(\d+)_years_before$/.test(d)){const r=Number(d.match(/^(\d+)_years_before$/)[1]),a=new Date(l);if(a.setFullYear(l.getFullYear()-r),s>=a)return addErrorMessage(o,`The date must be before ${r} years ago.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}else if(/^(\d+)_years_after$/.test(d)){const r=Number(d.match(/^(\d+)_years_after$/)[1]),a=new Date(l);if(a.setFullYear(l.getFullYear()+r),s<=a)return addErrorMessage(o,`The date must be after ${r} years from today.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}else if(/Between_(\d+)_(\d+)/.test(d)){const[r,a]=d.match(/Between_(\d+)_(\d+)/).slice(1,3).map(Number),l=new Date(r,0,1),n=new Date(a,11,31);if(s<l||s>n)return addErrorMessage(o,`The date must be between ${r} and ${a}.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}else if(/from_(\d+)/.test(d)){const r=Number(d.match(/from_(\d+)/)[1]);if(s<new Date(r,0,1))return addErrorMessage(o,`The date must be from the year ${r} onwards.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}else if(/till_(\d+)/.test(d)){const r=Number(d.match(/till_(\d+)/)[1]);if(s>new Date(r,11,31))return addErrorMessage(o,`The date must be till the year ${r}.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}else{if("not_today"===d&&s.getTime()===l.getTime())return addErrorMessage(o,"Today's date is not allowed."),t.style.border="2px solid red",void("change"===e.type&&(t.value=""));if("weekday"===d&&(0===s.getDay()||6===s.getDay()))return addErrorMessage(o,"Only weekdays (Monday to Friday) are allowed."),t.style.border="2px solid red",void("change"===e.type&&(t.value=""));if("weekend"===d&&s.getDay()>=1&&s.getDay()<=5)return addErrorMessage(o,"Only weekends (Saturday and Sunday) are allowed."),t.style.border="2px solid red",void("change"===e.type&&(t.value=""));if("first_of_month"===d){if(1!==s.getDate())return addErrorMessage(o,"The date must be the first day of the month."),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}else if(/^exact_(\d+)$/.test(d)){const r=Number(d.match(/^exact_(\d+)$/)[1]),a=new Date(l);if(a.setFullYear(l.getFullYear()-r),s.getTime()!==a.getTime())return addErrorMessage(o,`You must be exactly ${r} years old.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}else if("last_of_month"===d){const r=new Date(s.getFullYear(),s.getMonth()+1,0).getDate();if(s.getDate()!==r)return addErrorMessage(o,"The date must be the last day of the month."),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}}const n=t.getAttribute("data-kilvish-dategroup");if(n&&/.+_[12]$/.test(n)){const[r,a]=n.split("_"),s="1"===a?"2":"1",l=`[data-kilvish-dategroup="${r}_${s}"]`,d=document.querySelector(l);if(d&&d.value){const l="month"===t.type?new Date(t.value+"-01"):new Date(t.value.replace(/[-\/]/g,"/")),n="month"===d.type?new Date(d.value+"-01"):new Date(d.value.replace(/[-\/]/g,"/"));if(!("1"===a&&l<=n||"2"===a&&l>=n)){return addErrorMessage(o,`${t.dataset.kilvishDate_name||`Field (${r}_${a})`} must be ${"1"===a?"before or same as":"after or same as"} ${d.dataset.kilvishDate_name||`Field (${r}_${s})`}.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}}}return void(t.style.border="")}if("age"===t.name){const r=t.value.trim(),a=parseInt(r,10);if(isNaN(a))return addErrorMessage(o,"Please enter a valid number for age."),t.style.border="2px solid red",void("change"===e.type&&(t.value=""));const s=t.getAttribute("data-kilvish-age")||"18";if(/^(\d+)$/.test(s)){const r=Number(s);if(a!==r)return addErrorMessage(o,`Age must be exactly ${r} years.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}else if(/^(\d+)_(\d+)$/.test(s)){const[r,l]=s.split("_").map(Number);if(a<r)return addErrorMessage(o,`Minimum age must be ${r} years.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""));if(a>l)return addErrorMessage(o,`Age cannot exceed ${l} years.`),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}return void(t.style.border="")}if("model_name"===t.name||"models[]"===t.name)r=/^[a-zA-Z0-9]{4,20}$/;else if("email"==t.type){r=/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;const a=/^[a-zA-Z0-9._@-]+$/,s=t.value;if(a.test(s)){if(!r.test(s))return addErrorMessage(o,"Invalid Email Format."),t.style.border="1px solid red",void("change"===e.type&&(t.value=""))}else;t.style.border=""}else if(t.hasAttribute("data-kilvish-num")){const a=t.value,s=t.getAttribute("data-kilvish-num");r=/^[0-9]*$/;let l=null,d=null;const n=/^_(\d+)_(\d+)$/,i=s.match(n);i&&(l=parseInt(i[1],10),d=parseInt(i[2],10));const c=/^exact_(\d+)$/,u=s.match(c);let p=null;u&&(p=parseInt(u[1],10)),/^\d*$/.test(a)?null!==p&&a.length!==p?(addErrorMessage(o,`This field must contain exactly ${p} digits.`),t.style.border="2px solid red","change"===e.type&&(t.value="")):l&&a.length<l||d&&a.length>d?(addErrorMessage(o,`This Field Must be between ${l} and ${d} digits.`),t.style.border="2px solid red","change"===e.type&&(t.value="")):t.style.border="":(addErrorMessage(o,"Only numerical characters are allowed."),t.style.border="2px solid red")}else if(t.hasAttribute("data-kilvish-num11")){const a=t.value,s=t.getAttribute("data-kilvish-num");r=/^[0-9]*$/;let l=null,d=null;const n=/^_(\d+)_(\d+)$/,i=s.match(n);i&&(l=parseInt(i[1],10),d=parseInt(i[2],10)),"exact_20"===s&&(r=/^[0-9]{20}$/),r.test(a)?l&&a.length<l||d&&a.length>d?(addErrorMessage(o,`This Field Must be between ${l} and ${d} digits.`),t.style.border="2px solid red","change"===e.type&&(t.value="")):t.style.border="":(addErrorMessage(o,"exact_20"===s?"This field must contain exactly 20 digits.":"Only numerical characters are allowed."),t.style.border="2px solid red")}else if(t.hasAttribute("data-kilvish-char")){const a=t.value,s=t.getAttribute("data-kilvish-char");if(s.startsWith("Yes")||s.startsWith("mix")){"mix"===s?r=/^[a-zA-Z0-9]*$/:"Yes"===s&&(r=/^[a-zA-Z]*$/);const l=s.split("_").slice(1).join("");if(l&&(r=new RegExp(`^[a-zA-Z0-9${l}]*$`)),!r.test(a))return addErrorMessage(o,"Invalid character entered!"),t.style.border="2px solid red",void("change"===e.type&&(t.value=""))}}else if(t.hasAttribute("data-kilvish-amount")){const a=t.getAttribute("data-kilvish-amount");r=/^\d+(\.\d{0,2})?$/;let s="USD",o=null,l=null;const d=/^([A-Z]{3})(?:_(\d+)_(\d+))?$/,n=a.match(d);n&&(s=n[1],o=n[2]?parseFloat(n[2]):null,l=n[3]?parseFloat(n[3]):null),t.addEventListener("input",(e=>{let a=t.selectionStart,o=t.value;r.test(o)||(o=o.replace(/[^0-9.]/g,""),o=o.replace(/(\..*?)\..*/,"$1"),o=o.replace(/(\.\d{2}).*/,"$1")),!o||o.includes(".")||o.endsWith(".")||(o=parseFloat(o).toFixed(2)),t.value=o;const l=o.indexOf(".");-1!==l&&a>l&&(a=Math.min(a,o.length)),t.setSelectionRange(a,a);let d=t.nextElementSibling;d&&d.classList.contains("amount-display")||(d=document.createElement("div"),d.className="amount-display",d.style.color="green",t.parentNode.insertBefore(d,t.nextSibling)),d.textContent=`${s} ${o||"0.00"} .`})),t.addEventListener("blur",(()=>{if(t.readOnly)return;let r=parseFloat(t.value||"0").toFixed(2),a=t.nextElementSibling;return null!==o&&r<o?(addErrorMessage(t.parentNode,`Amount must be at least ${o.toFixed(2)} ${s}.`),t.style.border="2px solid red",void("change"===e.type&&(t.value="",a.textContent=""))):null!==l&&r>l?(addErrorMessage(t.parentNode,`Amount must not exceed ${l.toFixed(2)} ${s}.`),t.style.border="2px solid red",void("change"===e.type&&(t.value="",a.textContent=""))):(t.style.border="",void(t.value=r))}))}else if("password_working"===t.type){const a=e=>{console.log("passworddddddd -",e);const t=e.length;for(let r=0;r<t-3;r++)if(e.charCodeAt(r+1)===e.charCodeAt(r)+1&&e.charCodeAt(r+2)===e.charCodeAt(r)+2&&e.charCodeAt(r+3)===e.charCodeAt(r)+3)return!0;for(let r=0;r<t-3;r++)if(e.charCodeAt(r+1)===e.charCodeAt(r)-1&&e.charCodeAt(r+2)===e.charCodeAt(r)-2&&e.charCodeAt(r+3)===e.charCodeAt(r)-3)return!0;return!1},s=t.getAttribute("data-kilvish-password")||"12",[l,d]=s.split("_").map(Number),n=l||12,i=d||1/0;if(r=new RegExp(`^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[\\W_]).{${n},${i}}$`),!r.test(t.value))return addErrorMessage(t.parentElement,`Password must be between ${n} and ${i} characters long and contain at least one uppercase letter, one lowercase letter, one special character, and one number.`),t.style.border="1px solid red",void("change"===e.type&&(t.value=""));if(a(t.value))return addErrorMessage(o,"Password should not contain sequential characters."),t.style.border="1px solid red",void("change"===e.type&&(t.value=""))}else if("password"===t.type){let a=t.parentElement.querySelector(".password-validation");a||(a=document.createElement("ul"),a.classList.add("password-validation"),a.style.listStyleType="none",a.style.padding="0",a.style.marginTop="5px",t.insertAdjacentElement("afterend",a));const s=t.getAttribute("data-kilvish-password")||"12",[o,l]=s.split("_").map(Number);r=new RegExp(`^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[\\W_]).{${o},${l}}$`);const d={length:`Password must be between ${o} and ${l} characters long`,uppercase:"At least one uppercase letter (A-Z)",lowercase:"At least one lowercase letter (a-z)",number:"At least one number (0-9)",special:"At least one special character (!@#$%^&*)",sequential:"No sequential characters (e.g., 1234, abcd)"},n={};Object.keys(d).forEach((e=>{let t=a.querySelector(`li[data-rule="${e}"]`);t||(t=document.createElement("li"),t.setAttribute("data-rule",e),t.innerHTML=`❌ ${d[e]}`,t.style.color="red",t.style.fontSize="14px",a.appendChild(t)),n[e]=t}));const i=e=>{for(let t=0;t<e.length-3;t++){if(e.charCodeAt(t+1)===e.charCodeAt(t)+1&&e.charCodeAt(t+2)===e.charCodeAt(t)+2&&e.charCodeAt(t+3)===e.charCodeAt(t)+3)return!0;if(e.charCodeAt(t+1)===e.charCodeAt(t)-1&&e.charCodeAt(t+2)===e.charCodeAt(t)-2&&e.charCodeAt(t+3)===e.charCodeAt(t)-3)return!0}return!1},c=t.value,u={length:c.length>=o&&c.length<=l,uppercase:/[A-Z]/.test(c),lowercase:/[a-z]/.test(c),number:/\d/.test(c),special:/[\W_]/.test(c),sequential:!i(c)};Object.keys(u).forEach((e=>{n[e].innerHTML=u[e]?`✅ ${d[e]}`:`❌ ${d[e]}`,n[e].style.color=u[e]?"green":"red",u[e]}));const p=r.test(c);t.style.border=p?"1px solid green":"1px solid red",p||"change"!==e.type||(t.value="")}}if("file"===t.type){const e=t.getAttribute("data-kilvish-file")||"image",[r,...l]=e.split("_");let d=a[e]||a[r]||a.image;const n=t.files;let i=1,c=1/0;if(l.length>=2&&(i=parseInt(l[0],10),c=parseInt(l[1],10)),n.length<i||n.length>c)return addErrorMessage(o,`Please select between ${i} and ${c} valid file(s).`),t.value="",t.style.border="1px solid red",!1;const u=s[e]||r.toUpperCase();for(const e of n)if(!d.includes(e.type))return addErrorMessage(o,`Invalid file type. Allowed types: ${u}.`),t.value="",t.style.border="1px solid red",!1}else"keyup"===e.type&&(r.test(t.value)||("password"!==t.type&&addErrorMessage(o,"Invalid character entered!"),t.style.border="1px solid red")),"change"===e.type&&(r.test(t.value)?(t.style.border="",l&&l.remove()):(t.value="",addErrorMessage(o,"Invalid character or format!"),t.style.border="1px solid red"))}function addErrorMessage(e,t){if(!e.querySelector(".error-message")){const r=document.createElement("div");r.className="error-message",r.style.color="red",r.style.fontSize="12px",r.innerText=t,e.appendChild(r)}}function addErrorMessage_working(e,t){if(!e.querySelector(".error-message")){const r=document.createElement("div");r.className="error-message",r.style.color="red",r.style.fontSize="12px",r.style.marginTop="4px",r.innerText=t;const a=e.querySelector(".input-group, input, select, textarea");a?a.insertAdjacentElement("afterend",r):e.appendChild(r)}}function initPasswordStrengthMeter(){document.querySelectorAll("input[type='password']").forEach((e=>{if(e.hasAttribute("data-ignore-kilvish"))return;const t=document.createElement("div");t.style.display="flex",t.style.alignItems="center",t.style.marginTop="5px";const r=[];for(let e=0;e<3;e++){const e=document.createElement("div");e.style.height="5px",e.style.width="30px",e.style.margin="0 2px",e.style.borderRadius="3px",e.style.background="lightgray",r.push(e),t.appendChild(e)}const a=document.createElement("span");a.textContent="Weak",a.style.marginLeft="10px",a.style.fontSize="12px",a.style.color="gray",t.appendChild(a),e.parentNode.insertBefore(t,e.nextSibling);e.addEventListener("input",(e=>{const t=(e=>{let t=0;return e.length>=12&&(t+=2),/[A-Z]/.test(e)&&(t+=1),/[a-z]/.test(e)&&(t+=1),/\d/.test(e)&&(t+=1),/[\W_]/.test(e)&&(t+=1),(e=>{for(let t=0;t<e.length-3;t++){if(e.charCodeAt(t+1)===e.charCodeAt(t)+1&&e.charCodeAt(t+2)===e.charCodeAt(t)+2&&e.charCodeAt(t+3)===e.charCodeAt(t)+3)return!0;if(e.charCodeAt(t+1)===e.charCodeAt(t)-1&&e.charCodeAt(t+2)===e.charCodeAt(t)-2&&e.charCodeAt(t+3)===e.charCodeAt(t)-3)return!0}return!1})(e)&&(t-=2),Math.max(0,t)})(e.target.value);r.forEach((e=>e.style.background="lightgray")),t<=2?(r[0].style.background="red",a.textContent="Weak",a.style.color="red"):t<=4?(r[0].style.background="yellow",r[1].style.background="yellow",a.textContent="Medium",a.style.color="orange"):(r[0].style.background="green",r[1].style.background="green",r[2].style.background="green",a.textContent="Strong",a.style.color="green")}))}))}"loading"===document.readyState?(document.addEventListener("DOMContentLoaded",initKilvalidate),document.addEventListener("DOMContentLoaded",initPasswordStrengthMeter)):(initKilvalidate(),initPasswordStrengthMeter()),window.kilvalidate={validateRequiredFields:validateRequiredFields,addRealTimeValidation:addRealTimeValidation,validateForm:validateForm,addAsteriskToRequiredFields:addAsteriskToRequiredFields,attachInputEvents:attachInputEvents,addValidateFormToSubmitButtons:addValidateFormToSubmitButtons,validateKilvishInput:validateKilvishInput,addErrorMessage:addErrorMessage,init:initKilvalidate};
|