');
} else {
if(response.readyState == 0 && error==null) return;
if(error!=null){
if(response.errorCode && response.errorCode=='401') window.location = 'action.php?action=logout';
error(response);
}else{
$.message('error','Erreur indefinie, merci de contacter un administrateur',0);
}
}
},
xhr: function() {
var xhr = new window.XMLHttpRequest();
if(data.downloadResponse) xhr.responseType = 'blob';
xhr.upload.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
var percentComplete = (evt.loaded / evt.total) * 100;
percentComplete = Math.round(percentComplete * 100) / 100;
if(progress) progress(percentComplete,'upload');
}
}, false);
xhr.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
if(progress) progress(percentComplete,'download');
}
}, false);
xhr.addEventListener('readystatechange', function(e) {
if(xhr.readyState == 4 && xhr.status == 200) {
if(data.downloadResponse){
var disposition = xhr.getResponseHeader('content-disposition');
var matches = /"([^"]*)"/.exec(disposition);
var filename = (matches != null && matches[1] ? matches[1] : 'file');
var blob = new Blob([xhr.response], { type: xhr.response.type });
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = filename;
$('body').append(link);
link.click();
link.remove();
window.URL.revokeObjectURL(link);
}
}
});
return xhr;
}
};
if(!hasFile){
request.data = data;
}else{
request.data = formData;
request.processData = false;
request.contentType = false;
}
$.ajax(request);
}
$.localhost = function(){
return (document.location.hostname=='127.0.0.1' || document.location.hostname=='localhost');
}
$.hashData = function(name){
var page = window.location.hash.substring(1);
page += "&"+window.location.search.substring(1);
data = {};
if(page!='' && page!= null){
options = page.split('&');
var data = {};
for(var key in options){
infos = options[key].split('=');
data[infos[0]] = infos[1];
}
}
if(name == null) return data;
if(typeof name === "object"){
data = name;
hashstring = '';
for(var key in data)
hashstring+= "&"+key+"="+data[key];
hashstring = hashstring.substring(1);
window.location.hash = hashstring;
return;
}
return typeof data[name] == "undefined" ? '':data[name];
}
$.urlParam = function (name,value) {
var parameters = window.location.href.match(/[\\?&]([^]*)=([^]*)/g);
var data = {};
for (var key in parameters) {
var couple = parameters[key].substring(1, parameters[key].length).split('=');
data[couple[0]] = couple[1];
}
if(name == null) return data;
if (value == null)
return data[name] ? data[name] : null;
if (value != false) data[name] = value;
var url = '?';
for (var key in data) {
if (value == false && key == name) continue;
url += key + '=' + data[key]+'&';
}
window.history.pushState('', document.title, url.substring(0, url.length-1));
}
$.fn.extend({
toJson : function(){
return $.getForm(this);
},
getForm : function(){
var o = {};
var obj = $(this);
for(var key in obj.data()){
if(key!="action" && key != "id") continue;
o[key] = obj.attr('data-'+key);
}
$('input,select,textarea',obj).each(function(i,element){
if(element.id!=null && element.id!=""){
if($(element).attr("type")=='checkbox' || $(element).attr("type")=='radio'){
o[element.id] = ($(element).is(':checked')?1:0);
}else{
o[element.id] = $(element).val();
}
}
});
return o;
},
upload: function (options) {
//var options = $.extend(defaults, options);
return this.each(function () {
var o = options;
var droppedFiles = false;
var div = $(this);
var data = div.data();
data.html =!div.attr('data-label') ? '': div.attr('data-label');
data.label = data.html;
div.html('');
var o = $.extend(o, data);
if(o.readonly == false){
var form = $('');
div.append(form);
var input = form.find('input[type="file"]');
var zone = $('
' + o.label + '
');
div.append(zone);
//test if dnd is enabled n browser
var div = document.createElement('div');
var dragAndDropEnabled = (('draggable' in div) || ('ondragstart' in div && 'ondrop' in div)) && 'FormData' in window && 'FileReader' in window;
//set elements styles
input.attr('style', "width: 0.1px;height: 0.1px;opacity: 0;overflow: hidden; position: absolute;z-index: -1");
zone.css('cursor', "pointer");
//set events
zone
.on('click', function (e) {
form.find('input[type="file"]').trigger('click');
e.preventDefault();
e.stopPropagation();
})
.on('drag dragstart dragend dragover dragenter dragleave drop', function (e) {
e.preventDefault();
e.stopPropagation();
})
.on('dragover dragenter', function () {
if (o.hover) form.addClass(o.hover);
})
.on('dragleave dragend drop', function () {
if (o.hover) form.removeClass(o.hover);
})
.on('drop', function (e) {
droppedFiles = e.originalEvent.dataTransfer.files;
form.trigger('submit');
});
input.on('change', function (e) {
form.trigger('submit');
});
form.on('submit', function (e) {
if (o.start) o.start();
if (dragAndDropEnabled) {
e.preventDefault();
var ajaxData = new FormData();
if (droppedFiles) {
$.each(droppedFiles, function (i, file) {
var ext = file.name.split('.');
ext = ext.pop();
if(o.allowed && $.inArray(ext.toLowerCase(),o.allowed.split(','))===-1){
$.message('error','Extension fichier '+ext+' non permise (autorisé:'+o.allowed+')',0);
return;
}
if(o.size && file.size > o.size){
$.message('error','Taille fichier '+file.size+' octets trop grande (autorisé:'+o.size+' octets)',0);
return;
}
ajaxData.append(input.attr('name'), file);
});
}else{
ajaxData = new FormData(form.get(0));
for(var key in $('input',form).get(0).files){
var file = $('input',form).get(0).files[key];
if(file.name==null || typeof file !='object') continue;
var ext = file.name.split('.');
ext = ext.pop();
if(o.allowed && $.inArray(ext.toLowerCase(),o.allowed.split(','))===-1){
$.message('error','Extension fichier '+ext+' non permise (autorisé:'+o.allowed+')',0);
$('input',form).val();
return;
}
if(o.size && file.size > o.size){
$.message('error','Taille fichier '+file.size+' octets trop grande (autorisé:'+o.size+' octets)',0);
$('input',form).val();
return;
}
}
}
if (o.addData){
var addionalData = o.addData();
for(var k in addionalData){
ajaxData.append(k, addionalData[k]);
}
}
droppedFiles = null;
$.ajax({
url: form.attr('action'),
type: form.attr('method'),
data: ajaxData,
dataType: 'json',
cache: false,
contentType: false,
processData: false,
complete: function (data) {
if (o.complete) o.complete(data.responseJSON);
},
success: function (data) {
if (o.success) o.success(data);
},
error: function (data) {
if (o.error) o.error(data);
}
});
} else {
var iframeName = 'uploadiframe' + new Date().getTime();
iframe = $('');
$('body').append(iframe);
form.attr('target', iframeName);
iframe.one('load', function () {
var data = JSON.parse(iframe.contents().find('body').text());
if (!data.success) alert(data.error);
form.removeAttr('target');
iframe.remove();
if (o.complete) o.complete();
});
}
});
}
});
},
clear: function (){
return this.each(function() {
var obj = $(this);
obj.find('input,select,textarea').val('').prop('checked',false).prop('selected',false);
});
},
addLine: function (rows){
return this.each(function() {
var obj = $(this);
var model = null;
var container = null;
if(obj.prop("tagName") == 'UL'){
container = obj;
model = container.find('li:first-child');
container.find('li:visible').remove();
}else if(obj.prop("tagName") == 'TABLE'){
container = obj.find('tbody');
model = container.find('tr:first-child');
container.find('tr:visible').remove();
}else{
container = obj;
childName = container.children().get(0).nodeName;
model = container.find(childName+':first-child');
container.find(childName+':visible:not(.nofill)').remove();
}
var tpl = model.get(0).outerHTML;
//fix jquery backslahes break
tpl = tpl.replace(/{{##/g,'{{/').replace(/{{\/(.*)}}=""/g,'{{/$1}}');
//fix images url not found on template
tpl = tpl.replace(/(]*\s)(data-src)/g,'$1src');
for(var key in rows){
var line = $(Mustache.render(tpl,rows[key]));
container.append(line);
line.removeClass('hidden');
}
});
},
fill: function (option,callback,progress){
return this.each(function() {
var obj = $(this);
var model = null;
var container = null;
option = $.extend({
differential : false,
showing : function(item){
//permet la personnalisation de l'apparition des lignes ( removeClass('hidden') par defaut)
item.removeClass('hidden');
}
},option);
var preloader = null;
if(option.preloader){
var preloader = $(option.preloader);
preloader.css('position','absolute');
preloader.css('left',(obj.offset().left+obj.width()/2)+'px');
preloader.css('top',(obj.offset().top+30)+'px');
$('body').append(preloader);
}
if(obj.prop("tagName") == 'UL'){
container = obj;
model = container.find('li:first-child');
if(!option.export && !option.differential) container.children('li:visible').remove();
} else if(obj.prop("tagName") == 'TABLE'){
container = obj.find('tbody');
model = container.find('tr:first-child');
if(!option.export && !option.differential) container.children('tr:visible').remove();
} else if(obj.prop("tagName") == "SELECT"){
container = obj;
model = container.find('option[value*="{{"]');
if(model.length==0) model = $('');
if(!option.export && !option.differential) container.find('option:not([value*="{{"])').remove();
} else{
container = obj;
childName = container.children().get(0).nodeName;
model = container.find(childName+':first-child');
if(!option.export && !option.differential) container.find(childName+':visible:not(.nofill)').remove();
}
var tpl = model.get(0).outerHTML;
//fix jquery backslashes break
tpl = tpl.replace(/{{##/g,'{{/').replace(/{{\/(.*)}}=""/g,'{{/$1}}');
//fix images url not found on template
tpl = tpl.replace(/(]*\s?)(data-src)/g,'$1src');
var pagination = obj.nextAll('.pagination').length ? obj.nextAll('.pagination') : obj.parent().nextAll('.pagination');
if(pagination.length!=0) option.page = $('li.active',pagination).attr('data-value');
tpl = tpl.replace(/(data-style)/g, 'style');
if(option.export)
option.downloadResponse = true;
//on clone l'objet option pour ne transmettre que des datas utiles
data = $.extend({},option);
delete data.showing;
delete data.templating;
$.action(data,function(r){
//On ne gere la pagination et l'affichage tableau que si on est pas en mode export
if(!option.export){
var activeIds = [];
for(var key in r.rows){
var line;
var data = r.rows[key];
var lineTpl = tpl;
if(option.templating) lineTpl = option.templating(data,line,tpl);
if(!option.differential){
line = $(Mustache.render(lineTpl,data));
container.append(line);
option.showing(line,key);
}else{
activeIds.push(data.id);
var existing = $('> [data-id="'+data.id+'"]',container);
//existe en data et pas dans le dom : ajout
if(existing.length == 0){
line = $(Mustache.render(lineTpl,data));
line.attr('data-update-tag',data.updated);
if(key==0){
container.append(line);
}else{
var previousIndex = key-1;
var previous = $('>[data-id]:visible',container).eq(previousIndex);
previous.after(line);
}
option.showing(line,key);
}else{
//existe en data et dans le dom et pas de modification : on passe au suivant
if(existing.attr('data-update-tag') == data.updated){
continue;
//existe en data et dans le dom mais a été modifié : on remplace
}else{
line = $(Mustache.render(lineTpl,data));
line.attr('data-update-tag',data.updated);
existing.after(line);
existing.remove();
option.showing(line,key);
}
}
}
}
//suppression des élements dom qui ne sont plus en db
if(option.differential){
$('>[data-id]:visible',container).each(function(i,line){
var line = $(line);
if(activeIds.indexOf(line.attr('data-id')) == -1){
console.log(line.attr('data-id'));
console.log('suppression ',line);
line.remove();
}
});
}
if(r.pagination){
$('.page-item-previous,.page-item-next').remove();
r.pagination.pages = Math.ceil(r.pagination.pages);
var previewNumber = pagination.attr('data-range') != '' && pagination.attr('data-range') != null ? parseInt(pagination.attr('data-range')) : 5;
previewNumber = previewNumber < 2 ? 2 : previewNumber;
var template = pagination.find('li:not(:visible)');
if(template.length>0 ){
template = template.get(0).outerHTML;
$('li:not(:eq(0))',pagination).remove();
var current = parseInt(r.pagination.current);
var previousPages = current-previewNumber;
var nextPages = current+previewNumber;
var dropDownTpl = '