\n\t
$", "
\n\t "], ["\n\t
\n\t

\n\t
\n\t
$", "
\n\t "]),
_templateObject8 = _taggedTemplateLiteral(["
", "$", ""], ["
", "$", ""]),
_templateObject9 = _taggedTemplateLiteral(["
$", ""], ["
$", ""]),
_templateObject10 = _taggedTemplateLiteral(["\n\t\t
\n\t\t "], ["\n\t\t
\n\t\t "]),
_templateObject11 = _taggedTemplateLiteral(["

"], ["

"]),
_templateObject12 = _taggedTemplateLiteral(["

"], ["

"]),
_templateObject13 = _taggedTemplateLiteral(["\n\t
$", "
\n\t
\n\t "], ["\n\t
$", "
\n\t
\n\t "]),
_templateObject14 = _taggedTemplateLiteral(["\n\t\t
\n\t\t
$", "\n\t\t
\n\t\t
\n\t\t
\n\t\t "], ["\n\t\t
\n\t\t
$", "\n\t\t
\n\t\t
\n\t\t
\n\t\t "]),
_templateObject15 = _taggedTemplateLiteral(["
$", "", ""], ["
$", "", ""]),
_templateObject16 = _taggedTemplateLiteral(["$", "", ""], ["$", "", ""]),
_templateObject17 = _taggedTemplateLiteral(["
$", ""], ["
$", ""]),
_templateObject18 = _taggedTemplateLiteral(["\n\t\t\t
\n\t\t\t $", " | \n\t\t\t ", " | \n\t\t\t
\n\t\t\t "], ["\n\t\t\t
\n\t\t\t $", " | \n\t\t\t ", " | \n\t\t\t
\n\t\t\t "]),
_templateObject19 = _taggedTemplateLiteral(["\n\t\t \n\t\t
\n\t\t "], ["\n\t\t \n\t\t
\n\t\t "]);
function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
function gup(b) {
b = b.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var a = "[\\?&]" + b + "=([^]*)";
var d = new RegExp(a);
var c = d.exec(window.location.href);
if (c === null) return '';else return c[1];
}
/**
* @description This module is used to generate HTML-Code.
* @copyright 2015 by Tobias Reich
*/
build = {};
build.iconic = function (icon) {
var classes = arguments.length <= 1 || arguments[1] === undefined ? '' : arguments[1];
var html = '';
html += lychee.html(_templateObject, classes, icon);
return html;
};
build.divider = function (title) {
var html = '';
html += lychee.html(_templateObject2, title);
return html;
};
build.editIcon = function (id) {
var html = '';
html += lychee.html(_templateObject3, id, build.iconic('pencil'));
return html;
};
build.multiselect = function (top, left) {
return lychee.html(_templateObject4, top, left);
};
build.album = function (data) {
var html = '';
var _lychee$retinize = lychee.retinize(data.thumbs[0]);
var retinaThumbUrl = _lychee$retinize.path;
var isPhoto = _lychee$retinize.isPhoto;
html += lychee.html(_templateObject5, data.id, data.thumbs[2], data.thumbs[1], data.thumbs[0], retinaThumbUrl, isPhoto, data.title, data.title, data.sysdate);
if (lychee.publicMode === false) {
html += lychee.html(_templateObject6, data.star === '1' ? 'badge--visible' : '', build.iconic('star'), data.public === '1' ? 'badge--visible' : '', build.iconic('eye'), data.unsorted === '1' ? 'badge--visible' : '', build.iconic('list'), data.recent === '1' ? 'badge--visible' : '', build.iconic('clock'), data.password === '1' ? 'badge--visible' : '', build.iconic('lock-locked'));
}
html += '
';
return html;
};
build.photo = function (data) {
var html = '';
var _lychee$retinize2 = lychee.retinize(data.thumbUrl);
var retinaThumbUrl = _lychee$retinize2.path;
html += lychee.html(_templateObject7, data.album, data.id, data.thumbUrl, retinaThumbUrl, data.title, data.title);
if (data.cameraDate === '1') html += lychee.html(_templateObject8, build.iconic('camera-slr'), data.sysdate);else html += lychee.html(_templateObject9, data.sysdate);
html += "
";
if (lychee.publicMode === false) {
html += lychee.html(_templateObject10, data.star === '1' ? 'badge--visible' : '', build.iconic('star'), data.public === '1' && album.json.public !== '1' ? 'badge--visible' : '', build.iconic('eye'));
}
html += "
";
return html;
};
build.imageview = function (data, visibleControls) {
var html = '';
var hasMedium = data.medium !== '';
if (hasMedium === false) {
html += lychee.html(_templateObject11, visibleControls === true ? '' : 'full', data.url);
} else {
html += lychee.html(_templateObject12, visibleControls === true ? '' : 'full', data.url, data.medium, data.url, data.width);
}
html += "\n\t
\n\t
\n\t ";
return html;
};
build.no_content = function (typ) {
var html = '';
html += "\n\t
\n\t " + build.iconic(typ) + "\n\t ";
switch (typ) {
case 'magnifying-glass':
html += "
No results
";
break;
case 'eye':
html += "
No public albums
";
break;
case 'cog':
html += "
No configuration
";
break;
case 'question-mark':
html += "
Photo not found
";
break;
}
html += "
";
return html;
};
build.uploadModal = function (title, files) {
var html = '';
html += lychee.html(_templateObject13, title);
var i = 0;
while (i < files.length) {
var file = files[i];
if (file.name.length > 40) file.name = file.name.substr(0, 17) + '...' + file.name.substr(file.name.length - 20, 20);
html += lychee.html(_templateObject14, file.name);
i++;
}
html += "
";
return html;
};
build.tags = function (tags) {
var html = '';
if (tags !== '') {
tags = tags.split(',');
tags.forEach(function (tag, index, array) {
html += lychee.html(_templateObject15, tag, index, build.iconic('x'));
});
} else {
html = "
No Tags
";
}
return html;
};
/**
* @description This module communicates with Lychee's API
* @copyright 2015 by Tobias Reich
*/
api = {
path: 'php/index.php',
onError: null
};
api.post = function (fn, params, callback) {
loadingBar.show();
params = $.extend({ function: fn }, params);
var success = function success(data) {
setTimeout(loadingBar.hide, 100);
// Catch errors
if (typeof data === 'string' && data.substring(0, 7) === 'Error: ') {
api.onError(data.substring(7, data.length), params, data);
return false;
}
callback(data);
};
var error = function error(jqXHR, textStatus, errorThrown) {
api.onError('Server error or API not found.', params, errorThrown);
};
$.ajax({
type: 'POST',
url: api.path,
data: params,
dataType: 'json',
success: success,
error: error
});
};
/**
* @description This module takes care of the header.
* @copyright 2015 by Tobias Reich
*/
header = {
_dom: $('.header')
};
header.dom = function (selector) {
if (selector == null || selector === '') return header._dom;
return header._dom.find(selector);
};
header.bind = function () {
// Event Name
var eventName = lychee.getEventName();
header.dom('.header__title').on(eventName, function (e) {
if ($(this).hasClass('header__title--editable') === false) return false;
if (visible.photo()) contextMenu.photoTitle(album.getID(), photo.getID(), e);else contextMenu.albumTitle(album.getID(), e);
});
header.dom('#button_share').on(eventName, function (e) {
if (photo.json.public === '1' || photo.json.public === '2') contextMenu.sharePhoto(photo.getID(), e);else photo.setPublic(photo.getID(), e);
});
header.dom('#button_share_album').on(eventName, function (e) {
if (album.json.public === '1') contextMenu.shareAlbum(album.getID(), e);else album.setPublic(album.getID(), true, e);
});
header.dom('#button_signin').on(eventName, lychee.loginDialog);
header.dom('#button_settings').on(eventName, contextMenu.settings);
header.dom('#button_info_album').on(eventName, sidebar.toggle);
header.dom('#button_info').on(eventName, sidebar.toggle);
header.dom('.button_add').on(eventName, contextMenu.add);
header.dom('#button_more').on(eventName, function (e) {
contextMenu.photoMore(photo.getID(), e);
});
header.dom('#button_move').on(eventName, function (e) {
contextMenu.move([photo.getID()], e);
});
header.dom('.header__hostedwith').on(eventName, function () {
window.open(lychee.website);
});
header.dom('#button_trash_album').on(eventName, function () {
album.delete([album.getID()]);
});
header.dom('#button_trash').on(eventName, function () {
photo.delete([photo.getID()]);
});
header.dom('#button_archive').on(eventName, function () {
album.getArchive(album.getID());
});
header.dom('#button_star').on(eventName, function () {
photo.setStar([photo.getID()]);
});
header.dom('#button_back_home').on(eventName, function () {
lychee.goto();
});
header.dom('#button_back').on(eventName, function () {
lychee.goto(album.getID());
});
header.dom('.header__search').on('keyup click', function () {
search.find($(this).val());
});
header.dom('.header__clear').on(eventName, function () {
header.dom('.header__search').focus();
search.reset();
});
return true;
};
header.show = function () {
clearTimeout($(window).data('timeout'));
lychee.imageview.removeClass('full');
header.dom().removeClass('header--hidden');
return true;
};
header.hide = function (e) {
var delay = arguments.length <= 1 || arguments[1] === undefined ? 500 : arguments[1];
if (visible.photo() && !visible.sidebar() && !visible.contextMenu() && basicModal.visible() === false) {
clearTimeout($(window).data('timeout'));
$(window).data('timeout', setTimeout(function () {
lychee.imageview.addClass('full');
header.dom().addClass('header--hidden');
}, delay));
return true;
}
return false;
};
header.setTitle = function () {
var title = arguments.length <= 0 || arguments[0] === undefined ? 'Untitled' : arguments[0];
var $title = header.dom('.header__title');
var html = lychee.html(_templateObject16, title, build.iconic('caret-bottom'));
$title.html(html);
return true;
};
header.setMode = function (mode) {
if (mode === 'albums' && lychee.publicMode === true) mode = 'public';
switch (mode) {
case 'public':
header.dom().removeClass('header--view');
header.dom('.header__toolbar--albums, .header__toolbar--album, .header__toolbar--photo').removeClass('header__toolbar--visible');
header.dom('.header__toolbar--public').addClass('header__toolbar--visible');
return true;
break;
case 'albums':
header.dom().removeClass('header--view');
header.dom('.header__toolbar--public, .header__toolbar--album, .header__toolbar--photo').removeClass('header__toolbar--visible');
header.dom('.header__toolbar--albums').addClass('header__toolbar--visible');
return true;
break;
case 'album':
var albumID = album.getID();
header.dom().removeClass('header--view');
header.dom('.header__toolbar--public, .header__toolbar--albums, .header__toolbar--photo').removeClass('header__toolbar--visible');
header.dom('.header__toolbar--album').addClass('header__toolbar--visible');
// Hide download button when album empty
if (album.json.content === false) $('#button_archive').hide();else $('#button_archive').show();
// Hide download button when not logged in and album not downloadable
if (lychee.publicMode === true && album.json.downloadable === '0') $('#button_archive').hide();
if (albumID === 's' || albumID === 'f' || albumID === 'r') {
$('#button_info_album, #button_trash_album, #button_share_album').hide();
} else if (albumID === '0') {
$('#button_info_album, #button_share_album').hide();
$('#button_trash_album').show();
} else {
$('#button_info_album, #button_trash_album, #button_share_album').show();
}
return true;
break;
case 'photo':
header.dom().addClass('header--view');
header.dom('.header__toolbar--public, .header__toolbar--albums, .header__toolbar--album').removeClass('header__toolbar--visible');
header.dom('.header__toolbar--photo').addClass('header__toolbar--visible');
return true;
break;
}
return false;
};
header.setEditable = function (editable) {
var $title = header.dom('.header__title');
// Hide editable icon when not logged in
if (lychee.publicMode === true) editable = false;
if (editable) $title.addClass('header__title--editable');else $title.removeClass('header__title--editable');
return true;
};
/**
* @description This module is used to check if elements are visible or not.
* @copyright 2015 by Tobias Reich
*/
visible = {};
visible.albums = function () {
if (header.dom('.header__toolbar--public').hasClass('header__toolbar--visible')) return true;
if (header.dom('.header__toolbar--albums').hasClass('header__toolbar--visible')) return true;
return false;
};
visible.album = function () {
if (header.dom('.header__toolbar--album').hasClass('header__toolbar--visible')) return true;
return false;
};
visible.photo = function () {
if ($('#imageview.fadeIn').length > 0) return true;
return false;
};
visible.search = function () {
if (search.hash != null) return true;
return false;
};
visible.sidebar = function () {
if (sidebar.dom().hasClass('active') === true) return true;
return false;
};
visible.sidebarbutton = function () {
if (visible.photo()) return true;
if (visible.album() && $('#button_info_album:visible').length > 0) return true;
return false;
};
visible.header = function () {
if (header.dom().hasClass('header--hidden') === true) return false;
return true;
};
visible.contextMenu = function () {
return basicContext.visible();
};
visible.multiselect = function () {
if ($('#multiselect').length > 0) return true;
return false;
};
/**
* @description This module takes care of the sidebar.
* @copyright 2015 by Tobias Reich
*/
sidebar = {
_dom: $('.sidebar'),
types: {
DEFAULT: 0,
TAGS: 1
},
createStructure: {}
};
sidebar.dom = function (selector) {
if (selector == null || selector === '') return sidebar._dom;
return sidebar._dom.find(selector);
};
sidebar.bind = function () {
// This function should be called after building and appending
// the sidebars content to the DOM.
// This function can be called multiple times, therefore
// event handlers should be removed before binding a new one.
// Event Name
var eventName = lychee.getEventName();
sidebar.dom('#edit_title').off(eventName).on(eventName, function () {
if (visible.photo()) photo.setTitle([photo.getID()]);else if (visible.album()) album.setTitle([album.getID()]);
});
sidebar.dom('#edit_description').off(eventName).on(eventName, function () {
if (visible.photo()) photo.setDescription(photo.getID());else if (visible.album()) album.setDescription(album.getID());
});
sidebar.dom('#edit_tags').off(eventName).on(eventName, function () {
photo.editTags([photo.getID()]);
});
sidebar.dom('#tags .tag span').off(eventName).on(eventName, function () {
photo.deleteTag(photo.getID(), $(this).data('index'));
});
return true;
};
sidebar.toggle = function () {
if (visible.sidebar() || visible.sidebarbutton()) {
header.dom('.button--info').toggleClass('active');
lychee.content.toggleClass('content--sidebar');
sidebar.dom().toggleClass('active');
return true;
}
return false;
};
sidebar.setSelectable = function () {
var selectable = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
// Attributes/Values inside the sidebar are selectable by default.
// Selection needs to be deactivated to prevent an unwanted selection
// while using multiselect.
if (selectable === true) sidebar.dom().removeClass('notSelectable');else sidebar.dom().addClass('notSelectable');
};
sidebar.changeAttr = function (attr) {
var value = arguments.length <= 1 || arguments[1] === undefined ? '-' : arguments[1];
var dangerouslySetInnerHTML = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];
if (attr == null || attr === '') return false;
// Set a default for the value
if (value == null || value === '') value = '-';
// Escape value
if (dangerouslySetInnerHTML === false) value = lychee.escapeHTML(value);
// Set new value
sidebar.dom('.attr_' + attr).html(value);
return true;
};
sidebar.createStructure.photo = function (data) {
if (data == null || data === '') return false;
var editable = false;
var exifHash = data.takestamp + data.make + data.model + data.shutter + data.aperture + data.focal + data.iso;
var structure = {};
var _public = '';
// Enable editable when user logged in
if (lychee.publicMode === false) editable = true;
// Set value for public
switch (data.public) {
case '0':
_public = 'No';
break;
case '1':
_public = 'Yes';
break;
case '2':
_public = 'Yes (Album)';
break;
default:
_public = '-';
break;
}
structure.basics = {
title: 'Basics',
type: sidebar.types.DEFAULT,
rows: [{ title: 'Title', value: data.title, editable: editable }, { title: 'Uploaded', value: data.sysdate }, { title: 'Description', value: data.description, editable: editable }]
};
structure.image = {
title: 'Image',
type: sidebar.types.DEFAULT,
rows: [{ title: 'Size', value: data.size }, { title: 'Format', value: data.type }, { title: 'Resolution', value: data.width + ' x ' + data.height }]
};
// Only create tags section when user logged in
if (lychee.publicMode === false) {
structure.tags = {
title: 'Tags',
type: sidebar.types.TAGS,
value: build.tags(data.tags),
editable: editable
};
} else {
structure.tags = {};
}
// Only create EXIF section when EXIF data available
if (exifHash !== '0') {
structure.exif = {
title: 'Camera',
type: sidebar.types.DEFAULT,
rows: [{ title: 'Captured', value: data.takedate }, { title: 'Make', value: data.make }, { title: 'Type/Model', value: data.model }, { title: 'Shutter Speed', value: data.shutter }, { title: 'Aperture', value: data.aperture }, { title: 'Focal Length', value: data.focal }, { title: 'ISO', value: data.iso }]
};
} else {
structure.exif = {};
}
structure.sharing = {
title: 'Sharing',
type: sidebar.types.DEFAULT,
rows: [{ title: 'Public', value: _public }]
};
// Construct all parts of the structure
structure = [structure.basics, structure.image, structure.tags, structure.exif, structure.sharing];
return structure;
};
sidebar.createStructure.album = function (data) {
if (data == null || data === '') return false;
var editable = false;
var structure = {};
var _public = '';
var hidden = '';
var downloadable = '';
var password = '';
// Enable editable when user logged in
if (lychee.publicMode === false) editable = true;
// Set value for public
switch (data.public) {
case '0':
_public = 'No';
break;
case '1':
_public = 'Yes';
break;
default:
_public = '-';
break;
}
// Set value for hidden
switch (data.visible) {
case '0':
hidden = 'Yes';
break;
case '1':
hidden = 'No';
break;
default:
hidden = '-';
break;
}
// Set value for downloadable
switch (data.downloadable) {
case '0':
downloadable = 'No';
break;
case '1':
downloadable = 'Yes';
break;
default:
downloadable = '-';
break;
}
// Set value for password
switch (data.password) {
case '0':
password = 'No';
break;
case '1':
password = 'Yes';
break;
default:
password = '-';
break;
}
structure.basics = {
title: 'Basics',
type: sidebar.types.DEFAULT,
rows: [{ title: 'Title', value: data.title, editable: editable }, { title: 'Description', value: data.description, editable: editable }]
};
structure.album = {
title: 'Album',
type: sidebar.types.DEFAULT,
rows: [{ title: 'Created', value: data.sysdate }, { title: 'Images', value: data.num }]
};
structure.share = {
title: 'Share',
type: sidebar.types.DEFAULT,
rows: [{ title: 'Public', value: _public }, { title: 'Hidden', value: hidden }, { title: 'Downloadable', value: downloadable }, { title: 'Password', value: password }]
};
// Construct all parts of the structure
structure = [structure.basics, structure.album, structure.share];
return structure;
};
sidebar.render = function (structure) {
if (structure == null || structure === '') return false;
var html = '';
var renderDefault = function renderDefault(section) {
var _html = '';
_html += "\n\t\t \n\t\t
\n\t\t ";
section.rows.forEach(function (row) {
var value = row.value;
// Set a default for the value
if (value === '' || value == null) value = '-';
// Wrap span-element around value for easier selecting on change
value = lychee.html(_templateObject17, row.title.toLowerCase(), value);
// Add edit-icon to the value when editable
if (row.editable === true) value += ' ' + build.editIcon('edit_' + row.title.toLowerCase());
_html += lychee.html(_templateObject18, row.title, value);
});
_html += "\n\t\t
\n\t\t ";
return _html;
};
var renderTags = function renderTags(section) {
var _html = '';
var editable = '';
// Add edit-icon to the value when editable
if (section.editable === true) editable = build.editIcon('edit_tags');
_html += lychee.html(_templateObject19, section.title, section.title.toLowerCase(), section.value, editable);
return _html;
};
structure.forEach(function (section) {
if (section.type === sidebar.types.DEFAULT) html += renderDefault(section);else if (section.type === sidebar.types.TAGS) html += renderTags(section);
});
return html;
};
/**
* @description Used to view single photos with view.php
* @copyright 2015 by Tobias Reich
*/
// Sub-implementation of lychee -------------------------------------------------------------- //
var lychee = {};
lychee.content = $('.content');
lychee.escapeHTML = function () {
var html = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];
// Ensure that html is a string
html += '';
// Escape all critical characters
html = html.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/`/g, '`');
return html;
};
lychee.html = function (literalSections) {
// Use raw literal sections: we don’t want
// backslashes (\n etc.) to be interpreted
var raw = literalSections.raw;
var result = '';
for (var _len = arguments.length, substs = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
substs[_key - 1] = arguments[_key];
}
substs.forEach(function (subst, i) {
// Retrieve the literal section preceding
// the current substitution
var lit = raw[i];
// If the substitution is preceded by a dollar sign,
// we escape special characters in it
if (lit.slice(-1) === '$') {
subst = lychee.escapeHTML(subst);
lit = lit.slice(0, -1);
}
result += lit;
result += subst;
});
// Take care of last literal section
// (Never fails, because an empty template string
// produces one literal section, an empty string)
result += raw[raw.length - 1];
return result;
};
lychee.getEventName = function () {
var touchendSupport = /Android|iPhone|iPad|iPod/i.test(navigator.userAgent || navigator.vendor || window.opera) && 'ontouchend' in document.documentElement;
var eventName = touchendSupport === true ? 'touchend' : 'click';
return eventName;
};
// Sub-implementation of photo -------------------------------------------------------------- //
var photo = {};
photo.share = function (photoID, service) {
var url = location.toString();
switch (service) {
case 'twitter':
window.open("https://twitter.com/share?url=" + encodeURI(url));
break;
case 'facebook':
window.open("http://www.facebook.com/sharer.php?u=" + encodeURI(url));
break;
case 'mail':
location.href = "mailto:?subject=&body=" + encodeURI(url);
break;
}
};
photo.getDirectLink = function () {
return $('#imageview img').attr('src').replace(/"/g, '').replace(/url\(|\)$/ig, '');
};
// Sub-implementation of contextMenu -------------------------------------------------------------- //
var contextMenu = {};
contextMenu.sharePhoto = function (photoID, e) {
var iconClass = 'ionicons';
var items = [{ title: build.iconic('twitter', iconClass) + 'Twitter', fn: function fn() {
return photo.share(photoID, 'twitter');
} }, { title: build.iconic('facebook', iconClass) + 'Facebook', fn: function fn() {
return photo.share(photoID, 'facebook');
} }, { title: build.iconic('envelope-closed') + 'Mail', fn: function fn() {
return photo.share(photoID, 'mail');
} }, { title: build.iconic('link-intact') + 'Direct Link', fn: function fn() {
return window.open(photo.getDirectLink(), '_newtab');
} }];
basicContext.show(items, e.originalEvent);
};
// Main -------------------------------------------------------------- //
var loadingBar = {
show: function show() {},
hide: function hide() {}
};
var imageview = $('#imageview');
$(document).ready(function () {
// Save ID of photo
var photoID = gup('p');
// Set API error handler
api.onError = error;
// Share
header.dom('#button_share').on('click', function (e) {
contextMenu.sharePhoto(photoID, e);
});
// Infobox
header.dom('#button_info').on('click', sidebar.toggle);
// Load photo
loadPhotoInfo(photoID);
});
var loadPhotoInfo = function loadPhotoInfo(photoID) {
var params = {
photoID: photoID,
albumID: 0,
password: ''
};
api.post('Photo::get', params, function (data) {
if (data === 'Warning: Photo private!' || data === 'Warning: Wrong password!') {
$('body').append(build.no_content('question-mark'));
$('body').removeClass('view');
header.dom().remove();
return false;
}
// Set title
if (!data.title) data.title = 'Untitled';
document.title = 'Lychee - ' + data.title;
header.dom('.header__title').html(lychee.escapeHTML(data.title));
// Render HTML
imageview.html(build.imageview(data, true));
imageview.find('.arrow_wrapper').remove();
imageview.addClass('fadeIn').show();
// Render Sidebar
var structure = sidebar.createStructure.photo(data);
var html = sidebar.render(structure);
sidebar.dom('.sidebar__wrapper').html(html);
sidebar.bind();
});
};
var error = function error(errorThrown, params, data) {
console.error({
description: errorThrown,
params: params,
response: data
});
loadingBar.show('error', errorThrown);
};