/**
load content via ajax . for more information please refer to documentation #basics/ajax
*/
(function($ , undefined) {
var ajax_loaded_scripts = {}
function aceajax(contentarea, settings) {
var $contentarea = $(contentarea);
var self = this;
$contentarea.attr('data-ajax-content', 'true');
//get a list of 'data-*' attributes that override 'defaults' and 'settings'
var attrib_values = ace.helper.getattrsettings(contentarea, $.fn.ace_ajax.defaults);
this.settings = $.extend({}, $.fn.ace_ajax.defaults, settings, attrib_values);
var working = false;
var $overlay = $();//empty set
this.force_reload = false;//set jquery ajax's cache option to 'false' to reload content
this.loadurl = function(hash, cache) {
var url = false;
hash = hash.replace(/^(\#\!)?\#/, '');
this.force_reload = (cache === false)
if(typeof this.settings.content_url === 'function') url = this.settings.content_url(hash);
if(typeof url === 'string') this.geturl(url, hash, false);
}
this.loadaddr = function(url, hash, cache) {
this.force_reload = (cache === false);
this.geturl(url, hash, false);
}
this.geturl = function(url, hash, manual_trigger) {
if(working) {
return;
}
var event
$contentarea.trigger(event = $.event('ajaxloadstart'), {url: url, hash: hash})
if (event.isdefaultprevented()) return;
self.startloading();
$.ajax({
'url': url,
'cache': !this.force_reload
})
.error(function() {
$contentarea.trigger('ajaxloaderror', {url: url, hash: hash});
self.stoploading(true);
})
.done(function(result) {
$contentarea.trigger('ajaxloaddone', {url: url, hash: hash});
var link_element = null, link_text = '';;
if(typeof self.settings.update_active === 'function') {
link_element = self.settings.update_active.call(null, hash, url);
}
else if(self.settings.update_active === true && hash) {
link_element = $('a[data-url="'+hash+'"]');
if(link_element.length > 0) {
var nav = link_element.closest('.nav');
if(nav.length > 0) {
nav.find('.active').each(function(){
var $class = 'active';
if( $(this).hasclass('hover') || self.settings.close_active ) $class += ' open';
$(this).removeclass($class);
if(self.settings.close_active) {
$(this).find(' > .submenu').css('display', '');
}
})
var active_li = link_element.closest('li').addclass('active').parents('.nav li').addclass('active open');
nav.closest('.sidebar[data-sidebar-scroll=true]').each(function() {
var $this = $(this);
$this.ace_sidebar_scroll('reset');
if(manual_trigger) $this.ace_sidebar_scroll('scroll_to_active');//first time only
})
}
}
}
/////////
if(typeof self.settings.update_breadcrumbs === 'function') {
link_text = self.settings.update_breadcrumbs.call(null, hash, url, link_element);
}
else if(self.settings.update_breadcrumbs === true && link_element != null && link_element.length > 0) {
link_text = updatebreadcrumbs(link_element);
}
/////////
//convert "title" and "link" tags to "div" tags for later processing
result = string(result)
.replace(/<(title|link)([\s\>])/gi,'
/gi,'
')
$overlay.addclass('content-loaded').detach();
$contentarea.empty().html(result);
$(self.settings.loading_overlay || $contentarea).append($overlay);
//remove previous stylesheets inserted via ajax
settimeout(function() {
$('head').find('link.ace-ajax-stylesheet').remove();
var main_selectors = ['link.ace-main-stylesheet', 'link#main-ace-style', 'link[href*="/ace.min.css"]', 'link[href*="/ace.css"]']
var ace_style = [];
for(var m = 0; m < main_selectors.length; m++) {
ace_style = $('head').find(main_selectors[m]).first();
if(ace_style.length > 0) break;
}
$contentarea.find('.ajax-append-link').each(function(e) {
var $link = $(this);
if ( $link.attr('href') ) {
var new_link = jquery('', {type : 'text/css', rel: 'stylesheet', 'class': 'ace-ajax-stylesheet'})
if( ace_style.length > 0 ) new_link.insertbefore(ace_style);
else new_link.appendto('head');
new_link.attr('href', $link.attr('href'));//we set "href" after insertion, for ie to work
}
$link.remove();
})
}, 10);
//////////////////////
if(typeof self.settings.update_title === 'function') {
self.settings.update_title.call(null, hash, url, link_text);
}
else if(self.settings.update_title === true) {
updatetitle(link_text);
}
if( !manual_trigger ) {
$('html,body').animate({scrolltop: 0}, 250);
}
//////////////////////
$contentarea.trigger('ajaxloadcomplete', {url: url, hash: hash});
//////////////////////
self.stoploading();
})
}
///////////////////////
var fixpos = false;
var loadtimer = null;
this.startloading = function() {
if(working) return;
working = true;
if(!this.settings.loading_overlay && $contentarea.css('position') == 'static') {
$contentarea.css('position', 'relative');//for correct icon positioning
fixpos = true;
}
$overlay.remove();
$overlay = $(' '+this.settings.loading_text+'
')
if(this.settings.loading_overlay == 'body') $('body').append($overlay.addclass('ajax-overlay-body'));
else if(this.settings.loading_overlay) $(this.settings.loading_overlay).append($overlay);
else $contentarea.append($overlay);
if(this.settings.max_load_wait !== false)
loadtimer = settimeout(function() {
loadtimer = null;
if(!working) return;
var event
$contentarea.trigger(event = $.event('ajaxloadlong'))
if (event.isdefaultprevented()) return;
self.stoploading(true);
}, this.settings.max_load_wait * 1000);
}
this.stoploading = function(stopnow) {
if(stopnow === true) {
working = false;
$overlay.remove();
if(fixpos) {
$contentarea.css('position', '');//restore previous 'position' value
fixpos = false;
}
if(loadtimer != null) {
cleartimeout(loadtimer);
loadtimer = null;
}
}
else {
$overlay.addclass('almost-loaded');
$contentarea.one('ajaxscriptsloaded.inner_call', function() {
self.stoploading(true);
/**
if(window.pace && pace.running == true) {
pace.off('done');
pace.once('done', function() { self.stoploading(true) })
}
else self.stoploading(true);
*/
})
}
}
this.working = function() {
return working;
}
///////////////////////
function updatebreadcrumbs(link_element) {
var link_text = '';
//update breadcrumbs
var breadcrumbs = $('.breadcrumb');
if(breadcrumbs.length > 0 && breadcrumbs.is(':visible')) {
breadcrumbs.find('> li:not(:first-child)').remove();
var i = 0;
link_element.parents('.nav li').each(function() {
var link = $(this).find('> a');
var link_clone = link.clone();
link_clone.find('i,.fa,.glyphicon,.ace-icon,.menu-icon,.badge,.label').remove();
var text = link_clone.text();
link_clone.remove();
var href = link.attr('href');
if(i == 0) {
var li = $('').appendto(breadcrumbs);
li.text(text);
link_text = text;
}
else {
var li = $('').insertafter(breadcrumbs.find('> li:first-child'));
li.find('a').attr('href', href).text(text);
}
i++;
})
}
return link_text;
}
function updatetitle(link_text) {
var $title = $contentarea.find('.ajax-append-title');
if($title.length > 0) {
document.title = $title.text();
$title.remove();
}
else if(link_text.length > 0) {
var extra = $.trim(string(document.title).replace(/^(.*)[\-]/, ''));//for example like " - ace admin"
if(extra) extra = ' - ' + extra;
link_text = $.trim(link_text) + extra;
}
}
this.loadscripts = function(scripts, callback) {
$.ajaxprefilter('script', function(opts) {opts.cache = true});
settimeout(function() {
//let's keep a list of loaded scripts so that we don't load them more than once!
function finishloading() {
if(typeof callback === 'function') callback();
$('.btn-group[data-toggle="buttons"] > .btn').button();
$contentarea.trigger('ajaxscriptsloaded');
}
//var deferreds = [];
var deferred_count = 0;//deferreds count
var resolved = 0;
for(var i = 0; i < scripts.length; i++) if(scripts[i]) {
(function() {
var script_name = "js-"+scripts[i].replace(/[^\w\d\-]/g, '-').replace(/\-\-/g, '-');
if( ajax_loaded_scripts[script_name] !== true ) deferred_count++;
})()
}
function nextscript(index) {
index += 1;
if(index < scripts.length) loadscript(index);
else {
finishloading();
}
}
function loadscript(index) {
index = index || 0;
if(!scripts[index]) {//could be null sometimes
return nextscript(index);
}
var script_name = "js-"+scripts[index].replace(/[^\w\d\-]/g, '-').replace(/\-\-/g, '-');
//only load scripts that are not loaded yet!
if( ajax_loaded_scripts[script_name] !== true ) {
$.getscript(scripts[index])
.done(function() {
ajax_loaded_scripts[script_name] = true;
})
//.fail(function() {
//})
.complete(function() {
resolved++;
if(resolved >= deferred_count && working) {
finishloading();
}
else {
nextscript(index);
}
})
}
else {//script previoisly loaded
nextscript(index);
}
}
if (deferred_count > 0) {
loadscript();
}
else {
finishloading();
}
}, 10)
}
/////////////////
$(window)
.off('hashchange.ace_ajax')
.on('hashchange.ace_ajax', function(e, manual_trigger) {
var hash = $.trim(window.location.hash);
if(!hash || hash.length == 0) return;
self.loadurl(hash);
}).trigger('hashchange.ace_ajax', [true]);
var hash = $.trim(window.location.hash);
if(!hash && this.settings.default_url) window.location.hash = this.settings.default_url;
}//aceajax
$.fn.aceajax = $.fn.ace_ajax = function (option, value, value2, value3) {
var method_call;
var $set = this.each(function () {
var $this = $(this);
var data = $this.data('ace_ajax');
var options = typeof option === 'object' && option;
if (!data) $this.data('ace_ajax', (data = new aceajax(this, options)));
if (typeof option === 'string' && typeof data[option] === 'function') {
if(value3 != undefined) method_call = data[option](value, value2, value3);
else if(value2 != undefined) method_call = data[option](value, value2);
else method_call = data[option](value);
}
});
return (method_call === undefined) ? $set : method_call;
}
$.fn.aceajax.defaults = $.fn.ace_ajax.defaults = {
content_url: false,
default_url: false,
loading_icon: 'fa fa-spin fa-spinner fa-2x orange',
loading_text: '',
loading_overlay: null,
update_breadcrumbs: true,
update_title: true,
update_active: true,
close_active: false,
max_load_wait: false
}
})(window.jquery);