/** * Placeholders */ function MfFormPlaceholders() { /** * Sprawdza czy jest dostepna natywna obsluga placeholdera */ var hasPlaceholderSupport = function() { return 'placeholder' in document.createElement('input'); } var placeholderBox = $(''); // obsluga placeholdera if (!hasPlaceholderSupport()) { var inputs = $('[placeholder]'); if (inputs.length) { var focusInput = function() { $(this).siblings('.mf-placeholder').hide(); } var blurInput = function() { var $this = $(this); if ($.trim($this.val()) == '') { $this.siblings('.mf-placeholder').show(); } } inputs.each(function(key) { var input = inputs.eq(key); var pBox = placeholderBox.clone().text(input.attr('placeholder')); input.removeAttr('placeholder'); input.after(pBox); input.bind('focus', focusInput).bind('blur', blurInput); }); } } } /** * Validacja formularzy */ function MfFormsValidation(formClass) { if (!formClass) formClass = 'mff-validation'; var _this = this; this.jForms = $('.' + formClass); this.oForms = []; this.jForms.each(function(key) { _this.oForms.push(new MfFormValidation(_this.jForms.eq(key))); }); } /** * Validacja formularza */ function MfFormValidation(form) { this.form = form; this.options = []; var _this = this; /** * Klasa dla errorBoxa */ this.errorBoxClass = 'mff-errorbox'; /** * Inicjalizacja * * Zapamietuje pola formularza i wiaze z nimi ograniczenia */ this.init = function() { if (this.form) { this.submit = this.form.find('input[type=submit]'); var elements = this.form.find('input[type=text], textarea'); elements.each(function(key) { // pobiera wszystkie ograniczenia dla elementow var element = elements.eq(key); var option = {}; // jesli wymagany if (element.hasClass('mffv-require') || element.siblings().find('em').length) { option['require'] = true; } // musi byc emailem if (element.hasClass('mffv-email')) { option['email'] = true; } // musi byc liczba if (element.hasClass('mffv-number')) { option['number'] = true; } if (!$.isEmptyObject(option)) { // jesli wykryto jakies ograniczenia - dodaj do sprawdzania pod tym kontem var options = { 'element' : element, 'limits': option }; _this.options.push(options); } }); this.bindSubmitAction(); this.bindBlurAction(); this.bindCaptcha(); } } /** * Binduje akcje na wyslaniu formularza * * Przy wyslaniu formularza nastepuje walidacja * jesli sie nie powiedzie, wysylanie formularza zostanie przerwane * oraz wyswietlone zostana komunikaty o bledach */ this.bindSubmitAction = function() { this.form.bind('submit', function() { if (_this.validate()) { _this.submit.attr('disabled', 'disabled'); // zablokuj submita oraz wyslij formularz return true; } else { return false; } }); } /** * Binduje akcje na opuszczenie danego pola */ this.bindBlurAction = function() { for(var item in this.options ){ this.options[item]['element'].bind('blur', function() { _this.validateElement($(this)); }); } } /** * Binduje akcje na captchy */ this.bindCaptcha = function() { this.form.find('.mff-captcha .mff-crefresh').bind('click', function() { var captcha = $(this).closest('.mff-captcha'); var img = captcha.find('.mff-captcha-img > img'), src = img.attr('src'); captcha.find('.mff-captcha-input > input').val(''); if (img.length) { if (src.lastIndexOf('?') != -1) src = src.slice(0, src.lastIndexOf('?')); src += '?' + new Date().getTime(); img.attr('src', src); } }); } /** * Przeprowadza walidacje danego pola formularza */ this.validateElement = function(element, limits){ var status = true; if (typeof limits == 'undefined') { // jesli ograniczenia nie podane - pobierz z opcji for(var item in this.options ){ // szuka elementu w opcjach if (this.options[item]['element'][0] == element[0]) { limits = this.options[item]['limits']; break; } } if (typeof limits == 'undefined') return true; // nie znaleziony } var limitsFailure = [], empty = this.restrictions['require'](element) ? false : true; if (empty) { // jesli niezmodyfikowany i jest wymagany to wygeneruj blad if (limits['require']) { limitsFailure.push('require'); } } // jesli jest zmodyfikowany to sprawdz pozostale ograniczenia else { for(var limitName in limits) { if (limitName != 'require') { // require zostal zostal juz sprawdzony if ($.isFunction(this.restrictions[limitName])) { if (!this.restrictions[limitName](element)) { // sprawdza ograniczenie limitsFailure.push(limitName); } } } } } if (limitsFailure.length) { // wystapila niezgodnosc z organiczeniami status = false; this.generateErrorBox(element, limitsFailure); } else { this.removeErrorBox(element); // usuwa errorBoxa } return status; } /** * Przeprowadza walidacje formularza */ this.validate = function(){ var status = true, element, limits; for(var item in this.options ){ // sprawdza po koleji wszystkie ograniczenia element = this.options[item]['element']; limits = this.options[item]['limits']; if (!this.validateElement(element, limits)) { status = false; } } return status; } /** * Generuje boxa z informacjami o bledach */ this.generateErrorBox = function(element, limitsFailure) { var limitName, html = ''; for (var limitNr in limitsFailure) { msg = MfFormValidation.errorMsg[limitsFailure[limitNr]] ? MfFormValidation.errorMsg[limitsFailure[limitNr]] : MfFormValidation.errorMsg['others']; html += '