Skip to content

Instantly share code, notes, and snippets.

@corpix
Created November 22, 2011 06:16
Show Gist options
  • Save corpix/1385031 to your computer and use it in GitHub Desktop.
Save corpix/1385031 to your computer and use it in GitHub Desktop.
Мой файл с биндингами для форм и немного сахара
(function(){
var ajaxBindings = function(){
if(window.csrf) {
$('body').bind('ajaxSend', function(ev, xhr, s){
if (s.type == 'POST') {
xhr.setRequestHeader('X-CSRF-Token', csrf);
}
});
}
var parse = function(e){
if(e.responseText) { // TODO check header
try {
var j = JSON.parse(e.responseText);
return j;
} catch(e) {
return false;
}
}
}
var error = function(x, e) {
if(e == 'parsererror')
return $.sticky('Ошибка парсинга ответа с сервера');
if(e == 'timeout')
return $.sticky('Таймаут запроса');
switch(e.status){
case 0:
$.sticky('Нет соединения с сайтом');
break;
case 403:
$.sticky('Доступ запрещён');
break;
case 404:
$.sticky('Ресурс не найден');
break;
case 413:
$.sticky('Слижком большое тело запроса');
break;
case 500:
$.sticky('Ошибка на сервере');
break;
default:
$.sticky('Неизвестная ошибка');
}
}
var complete = function(x, e){
var res = parse(e);
if(res.csrf)
csrf = res.csrf;
if(res.error)
if(typeof res.error == 'object')
for(var i in res.error)
$.sticky(res.error[i]);
else
$.sticky(res.error);
if(res.message)
$.sticky(res.message);
if(res.url)
location.href = res.url;
}
$(document).ajaxError(error).ajaxComplete(complete);
}
var ajaxForms = function(/* TODO translations */){
var self = this;
$('form.ajax').each(function(i, form){
var f = $(form)
, submit = f.find('input[type="submit"]');
if($.fn.html5Uploader && f.hasClass('html5')){
f.find('input[type="file"]').html5Uploader();
}
submit.click(function(){
var data = {}, errors = [];
f.find('[name]').each(function(i, input){
var field = $(input)
, v = self._validate(field);
for(var i in v) {
if(typeof v[i] == 'object')
errors.push(v[i]);
}
if(errors.length > 0)
return false;
if(field.is('[type="file"]'))
return; // continue
var name = field.attr('name')
, val = field.val();
data[name] = val;
});
if(errors.length > 0) {
self._displayErrors(errors);
return false;
}
if(!data.csrf)
data.csrf = csrf;
$.ajax({
url: f.attr('action'),
type: f.attr('method'),
context: f,
data: data,
success: function(res){
if(!res.error){
for(var i in data){
f.find('*[name="'+i+'"]').val('');
}
f.trigger('res', res);
}
}
});
return false;
})
});
}
ajaxForms.prototype._validate = function(field){
var classes = field.attr('class');
if(!classes)
return true;
classes = classes.split(/\s/g);
var result = [];
for(var i in classes){
if(this[classes[i]] instanceof Function)
result.push(this[classes[i]](field));
}
return result;
}
ajaxForms.prototype._displayErrors = function(errors){
for(var i in errors){
$.sticky(errors[i].error);
}
}
ajaxForms.prototype._getLabelOf = function(field){
var id = field.attr('id');
if(!id)
return '';
var label = field.closest('form.ajax').find('label[for="' + id + '"]');
if(!label)
return '';
return label.text();
}
ajaxForms.prototype.required = function(field){
if(!field.val()) {
var label = this._getLabelOf(field);
return { error: 'Поле "' + label + '" не заполнено' };
}
return true;
}
var toggler = function(){
var el = $('.toggle')
, parent = el.parent()
, target = parent.find('.hidden');
el.click(function(){
target.toggleClass('hidden');
});
}
$(document).ready(ajaxBindings).ready(function(){ new ajaxForms(); }).ready(toggler);
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment