parent
8b9d0921db
commit
f3d358a6d5
7 changed files with 52 additions and 2260 deletions
@ -1,240 +0,0 @@ |
|||||||
/** |
|
||||||
* Created by pavel.handleman@gmail.com on 15.10.2014. |
|
||||||
* commonly using snippets and functions. this module must be loaded on every page |
|
||||||
*/ |
|
||||||
var EXPO = EXPO || {}; //isolated namespace
|
|
||||||
//общий для всех страниц модуль Функционал общий для всех страниц
|
|
||||||
if (EXPO.common){ |
|
||||||
console.warn('WARNING: EXPO.common is already defined!'); |
|
||||||
}else { |
|
||||||
|
|
||||||
EXPO.common = (function () { |
|
||||||
// variables
|
|
||||||
var that = {}; |
|
||||||
var matches = function(el, selector) { |
|
||||||
return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector); |
|
||||||
}; |
|
||||||
that.settings = {}; //свойства по умолчанию
|
|
||||||
// Валидация форм, каждый объект содержит поля объектов формы и методы работы с формой
|
|
||||||
var Validation = function(obj){ |
|
||||||
//поля над которыми проводится валидация
|
|
||||||
this.fields = []; |
|
||||||
//флаг которые опдвтерждает отправку формы. если true то ошибок нет
|
|
||||||
this.allIsClear = false; |
|
||||||
this.ajaxUrl = obj.getAttribute('action'); |
|
||||||
this.DOM = obj; |
|
||||||
this._initFields(); |
|
||||||
this._eventController(); |
|
||||||
|
|
||||||
|
|
||||||
}; |
|
||||||
Validation.prototype = { |
|
||||||
//связывает данные объекта с html кодом
|
|
||||||
_eventController: function () { |
|
||||||
var self = this; |
|
||||||
if(this.DOM.addEventListener){ |
|
||||||
this.DOM.addEventListener("submit", function (event) { |
|
||||||
self.validate(); |
|
||||||
event.preventDefault(); |
|
||||||
return false; |
|
||||||
}, false); //Modern browsers
|
|
||||||
}else if(this.DOM.attachEvent){ |
|
||||||
this.DOM.attachEvent('onsubmit', function (event) { |
|
||||||
self.validate(); |
|
||||||
event.preventDefault(); |
|
||||||
return false; |
|
||||||
}); //Old IE
|
|
||||||
} |
|
||||||
}, |
|
||||||
//берет все поля с классом required
|
|
||||||
_initFields: function () { |
|
||||||
//this.fields = this.DOM.querySelectorAll('.required input');
|
|
||||||
|
|
||||||
}, |
|
||||||
//проводит валидацию, выводит сообщение об ошибках
|
|
||||||
validate: function () { |
|
||||||
var self = this, |
|
||||||
formData = $(self.DOM).serialize(), |
|
||||||
responseData, |
|
||||||
inputObj ={}, |
|
||||||
errBoxClass = 'err-message-box', |
|
||||||
DOMerrBox = self.DOM.querySelector('.'+errBoxClass), |
|
||||||
errBoxText = DOMerrBox.innerHTML, |
|
||||||
handler = function (data){ |
|
||||||
responseData = data; |
|
||||||
self.unHighlightFields(); |
|
||||||
if(responseData.success){ |
|
||||||
if(DOMerrBox){ |
|
||||||
EXPO.common.removeClass(DOMerrBox, 'active'); |
|
||||||
} |
|
||||||
window.location.reload(); |
|
||||||
}else{ |
|
||||||
EXPO.common.removeClass(DOMerrBox, 'active'); |
|
||||||
inputObj ={}; |
|
||||||
self.fields = []; |
|
||||||
for(var prop in responseData.errors) { |
|
||||||
if (!responseData.errors.hasOwnProperty(prop)) continue; |
|
||||||
if(prop != '__all__'){ |
|
||||||
inputObj ={'name':prop, 'id':'id_'+prop, 'errorText':responseData.errors[prop]}; |
|
||||||
//inputObj.name = prop;
|
|
||||||
//inputObj.id = 'id_'+prop;
|
|
||||||
//inputObj.errorText = responseData.errors[prop];
|
|
||||||
self.fields.push(inputObj); |
|
||||||
}else{ |
|
||||||
if(DOMerrBox){ |
|
||||||
EXPO.common.addClass(DOMerrBox, 'active'); |
|
||||||
if(errBoxText.indexOf(responseData.errors[prop]) < 0) { |
|
||||||
DOMerrBox.insertAdjacentHTML('beforeend', responseData.errors[prop]+' '); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
} |
|
||||||
self.highliteFields(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
}; |
|
||||||
self.unHighlightFields(); |
|
||||||
EXPO.common.postRequest(formData, self.ajaxUrl,handler); |
|
||||||
|
|
||||||
}, |
|
||||||
//подсвечивает неправильно введенные поля,
|
|
||||||
highliteFields: function () { |
|
||||||
var DOMfield, |
|
||||||
DOMfieldWrap; |
|
||||||
for(var i = 0; i < this.fields.length; i++){ |
|
||||||
DOMfield = this.DOM.querySelector('#'+ this.fields[i].id); |
|
||||||
DOMfieldWrap = DOMfield.parentNode; |
|
||||||
EXPO.common.addClass(DOMfieldWrap,'required'); |
|
||||||
EXPO.common.addClass(DOMfieldWrap,'err'); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
}, |
|
||||||
unHighlightFields: function () { |
|
||||||
var DOMfield, |
|
||||||
DOMfieldWrap; |
|
||||||
for(var i = 0; i < this.fields.length; i++){ |
|
||||||
DOMfield = this.DOM.querySelector('#'+ this.fields[i].id); |
|
||||||
DOMfieldWrap = DOMfield.parentNode; |
|
||||||
EXPO.common.removeClass(DOMfieldWrap,'required'); |
|
||||||
EXPO.common.removeClass(DOMfieldWrap,'err'); |
|
||||||
} |
|
||||||
}, |
|
||||||
submit: function () { |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
}; |
|
||||||
//dependences
|
|
||||||
|
|
||||||
//private
|
|
||||||
$(function () { |
|
||||||
/* Нестандартное оформление для поля checkbox */ |
|
||||||
$.fn.customRadioCheck = function () { |
|
||||||
return $(this).each(function () { |
|
||||||
var $el = $(this); |
|
||||||
var type = $el.attr("type"); |
|
||||||
var $label = $el.closest("label"); |
|
||||||
var $customCheckbox = $el.wrap("<span class='custom-"+ type +"' />").parent(); |
|
||||||
$label.addClass("custom-radio-check"); |
|
||||||
function setState () { |
|
||||||
if (type == 'radio') { |
|
||||||
var name = $el.attr('name'); |
|
||||||
var $radios = $('input[type="radio"]').filter('[name="' + name + '"]'); |
|
||||||
$radios.each(function () { |
|
||||||
var $container = $(this).closest('.custom-radio'); |
|
||||||
$container.removeClass('checked'); |
|
||||||
if ($(this).is(':checked')) { |
|
||||||
$container.addClass('checked'); |
|
||||||
} |
|
||||||
}); |
|
||||||
} else { |
|
||||||
if ($el.prop("checked")) { |
|
||||||
$customCheckbox.addClass("checked"); |
|
||||||
} else { |
|
||||||
$customCheckbox.removeClass("checked"); |
|
||||||
} |
|
||||||
} |
|
||||||
$el.trigger('blur'); |
|
||||||
} |
|
||||||
setState(); |
|
||||||
$el.on("change", setState); |
|
||||||
}); |
|
||||||
}; |
|
||||||
var forms = []; |
|
||||||
$(function () { |
|
||||||
$('form.validate').each(function () { |
|
||||||
forms.push(new Validation(this)); |
|
||||||
}); |
|
||||||
|
|
||||||
}); |
|
||||||
|
|
||||||
$("input[type='checkbox'], input[type='radio']").customRadioCheck(); |
|
||||||
}); |
|
||||||
|
|
||||||
// methods
|
|
||||||
//инициализация общих свойств
|
|
||||||
that.init = function (options) { |
|
||||||
$.extend(this.settings, options); |
|
||||||
var self = this; |
|
||||||
|
|
||||||
|
|
||||||
}; |
|
||||||
that.hasClass = function (DOM, className) { |
|
||||||
if (DOM.classList) |
|
||||||
return DOM.classList.contains(className); |
|
||||||
else |
|
||||||
return new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className); |
|
||||||
}; |
|
||||||
that.addClass = function (DOM, className) { |
|
||||||
if (!that.hasClass(DOM, className)) { |
|
||||||
if (DOM.classList) |
|
||||||
DOM.classList.add(className); |
|
||||||
else |
|
||||||
DOM.className += ' ' + className; |
|
||||||
} |
|
||||||
return DOM; |
|
||||||
}; |
|
||||||
that.removeClass = function (DOM, className) { |
|
||||||
var newClass = ' ' + DOM.className.replace(/[\t\r\n]/g, ' ') + ' '; |
|
||||||
if (that.hasClass(DOM, className)) { |
|
||||||
if (DOM.classList){ |
|
||||||
DOM.classList.remove(className); |
|
||||||
}else{ |
|
||||||
while (newClass.indexOf( ' ' + className + ' ') >= 0) { |
|
||||||
newClass = newClass.replace(' ' + className + ' ', ' '); |
|
||||||
} |
|
||||||
DOM.className = newClass.replace(/^\s+|\s+$/g, ' '); |
|
||||||
} |
|
||||||
} |
|
||||||
return DOM; |
|
||||||
}; |
|
||||||
//Jquery .closest analog for pure js
|
|
||||||
that.closest = function(el, className) { |
|
||||||
var fn = function(className){ |
|
||||||
return that.hasClass(el, className); |
|
||||||
}; |
|
||||||
while (el) { |
|
||||||
if (fn(className)) return el; |
|
||||||
el = el.parentNode; |
|
||||||
} |
|
||||||
}; |
|
||||||
//JQUERY .children alternative ie 9+
|
|
||||||
that.children = function (elm, sel){ |
|
||||||
var ret = [], i = 0, l = elm.childNodes.length; |
|
||||||
for (var i; i < l; ++i){ |
|
||||||
if (matches(elm.childNodes[i], sel)){ |
|
||||||
ret.push(elm.childNodes[i]); |
|
||||||
} |
|
||||||
} |
|
||||||
return ret; |
|
||||||
}; |
|
||||||
return that; |
|
||||||
}()); |
|
||||||
} |
|
||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue