Current File : /home/escuelai/public_html/rsedu/assets/formoid/formoid.min.js |
jQuery(function ($) {
var Formoid = (function () {
var API_URL = ('https:' == location.protocol ? 'https:' : 'http:') + '//formoid.net/api/push';
var $ajax = (function () {
var ie = (/MSIE (\d+)\./.exec(navigator.userAgent) || [0, 0])[1];
if (8 == ie || (9 == ie && 'file:' != location.protocol)) {
return function (url, settings) {
var xdr = new XDomainRequest(), defer = $.Deferred();
xdr.open(settings.type, url);
xdr.onload = function () {
defer.resolve(this.responseText);
};
xdr.onerror = function () {
defer.reject();
};
xdr.send(settings.data);
return defer;
};
} else {
$.support.cors = true;
return $.ajax;
}
})();
var prop = function (name, args) {
name = '__' + name + '__';
if (args.length) {
this[name] = args[0];
return this;
}
return this[name];
};
var attachMethods = function (obj, context, methods) {
$.each(methods, function (i, method) {
obj[method] = function () {
return context[method].apply(context, arguments);
};
});
return obj;
};
var Form = function (settings) {
settings = settings || {};
this.__email__ = settings.email || '';
this.__title__ = settings.title || '';
this.__data__ = settings.data || [];
};
Form.prototype.email = function (value) {
return prop.call(this, 'email', arguments);
};
Form.prototype.title = function (value) {
return prop.call(this, 'title', arguments);
};
Form.prototype.data = function (value) {
return prop.call(this, 'data', arguments);
};
Form.prototype.send = function (data, beforeStart) {
var defer = attachMethods($.Deferred(), this, ['email', 'title', 'data', 'send']);
if (beforeStart) {
beforeStart.call(this, defer);
if ('pending' != defer.state())
return defer;
}
$ajax(API_URL, {
type: 'POST',
data: JSON.stringify({
email: this.__email__,
form: {
title: this.__title__,
data: (arguments.length ? data : this.__data__)
}
})
}).done(function (responseText) {
try {
var data = JSON.parse(responseText);
if (data.error) defer.reject(data.error);
else defer.resolve(data.response);
} catch (e) {
defer.reject('Incorrect server response.');
}
}).fail(function () {
var error = 'Failed to query the server. ';
if ('onLine' in navigator && !navigator.onLine)
error += 'No connection to the Internet.';
else error += 'Check the connection and try again.';
defer.reject(error);
});
return defer;
};
return {
Form: function (settings) {
return new Form(settings);
}
}
})();
var isValidEmail = function (input) {
var isValid = true,
value = $(input).val();
if (value) {
isValid = /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i.test(value);
}
return isValid;
};
$('[data-form-type="formoid"]').each(function () {
var form,
$this = $(this),
$form = $this.is('form') ? $this : $this.find('form'),
$title = $this.is('[data-form-title]') ? $this : $this.find('[data-form-title]'),
$submit = $this.find('[type="submit"]'),
$inputArr = $form.find('[data-form-field]');
var $alert = $this.find('[data-form-alert-success]').length != 0 ? $this.find('[data-form-alert-success]') : $this.find('[data-form-alert]'),
alertSuccess = $alert.html();
// on change form inputs if input[type=file].files[0]size>1mb disable sumbit button and show form alert
$form.change(function (event) {
if (event.target.type === 'file') {
if (event.target.files[0].size > 1000000) {
$alert.removeAttr('hidden');
$alert.removeClass('alert-success').addClass('alert-danger');
$alert.html('File size must be less than 1mb');
$submit.addClass('btn-loading').prop('disabled', true);
}
}
});
$inputArr.each(function (index, elem) {
$(elem).on("focus", function () {
$alert.attr('hidden', 'hidden');
$alert.addClass('alert-success').removeClass('alert-danger');
$alert.html('');
$submit.removeClass('btn-loading').prop('disabled', false);
})
});
// event on form submit
$form.submit(function (event) {
event.preventDefault();
if ($submit.hasClass('btn-loading')) return;
var data = [],
inputs = $inputArr;
$form.addClass('form-active');
$submit.addClass('btn-loading').prop('disabled', true);
$alert.html('');
form = form || Formoid.Form({
email: $this.find('[data-form-email]').val(),
title: $title.attr('data-form-title') || $title.text()
});
function parseInputs(inputs) {
var def = $.Deferred(),
arrDeferred = [];
inputs.each(function (index, input) {
var $input = $(input),
typeInput = $input.attr('type'),
objDeferred = $.Deferred();
arrDeferred.push(objDeferred);
// valide email
if ($input.attr('name') === "email") {
if (!isValidEmail(input)) {
$submit.removeClass('btn-loading').prop('disabled', true);
def.reject(new Error('Form is not valid'));
return false;
}
}
switch (typeInput) {
case 'file': {
var reader = new FileReader,
name = $input.attr('data-form-field') || $input.attr('name'),
files = $input[0].files[0];
reader.onloadend = function () {
data.push([
name,
reader.result
]);
objDeferred.resolve();
};
reader.onerror = function () {
$alert.html(reader.error);
def.reject(reader.error);
};
if (files) {
reader.readAsDataURL(files);
}
}
break;
case 'checkbox': {
data.push([
$input.attr('data-form-field') || $input.attr('name'),
$input.prop("checked") ? $input.val() : 'No'
]);
objDeferred.resolve();
}
break;
case 'radio': {
if ($input.prop("checked")) {
data.push([
$input.attr('data-form-field') || $input.attr('name'),
$input.val()
]);
}
objDeferred.resolve();
}
break;
default: {
data.push([
$input.attr('data-form-field') || $input.attr('name'),
$input.val()
]);
objDeferred.resolve();
}
}
});
return def.resolve(arrDeferred);
}
parseInputs(inputs).then(function (arrDef) {
$.when.apply(this, arrDef).then(function () {
form.send(data)
.always(function () {
$submit.removeClass('btn-loading').prop('disabled', false);
$alert.removeAttr('hidden');
})
.then(function (message) {
inputs.each(function () {
if ($(this).prop('checked') && $(this).attr('type') === 'checkbox') $(this).removeAttr('checked')
else $(this).val('')
});
$form.removeClass('form-active');
if ($alert.is('[data-form-alert-success]')) {
$alert.html(alertSuccess || message);
$alert.removeClass('alert-danger').addClass('alert-success')
}
if ($alert.is('[data-form-alert]')) {
$alert.removeClass('alert alert-success alert-danger')
$alert.empty().append($('<div class="alert alert-form alert-success text-xs-center"/>').html(alertSuccess || message))
}
})
.fail(function (error) {
if ($alert.is('[data-form-alert-success]')) {
$alert.text(error);
$alert.removeClass('alert-success').addClass('alert-danger');
}
if ($alert.is('[data-form-alert]')) {
$alert.empty().append($('<div class="alert alert-form alert-danger text-xs-center"/>').text(error));
}
})
}, function (err) {
if ($alert.is('[data-form-alert-success]')) {
$alert.html(err.message);
$alert.removeClass('alert-success').addClass('alert-danger');
}
if ($alert.is('[data-form-alert]')) {
$alert.empty().append($('<div class="alert alert-form alert-danger text-xs-center"/>').text(err.message))
}
$alert.removeAttr('hidden');
})
});
});
});
});