/*
Name: Theme Base
Written by: usp.br/nds
*/
window.theme = {};
// Navigation
(function( $ ) {
'use strict';
var $items = $( '.nav-main li.nav-parent' );
function expand( li ) {
li.children( 'ul.nav-children' ).slideDown( 'fast', function() {
li.addClass( 'nav-expanded' );
$(this).css( 'display', '' );
ensureVisible( li );
});
}
function collapse( li ) {
li.children('ul.nav-children' ).slideUp( 'fast', function() {
$(this).css( 'display', '' );
li.removeClass( 'nav-expanded' );
});
}
function ensureVisible( li ) {
var scroller = li.offsetParent();
if ( !scroller.get(0) ) {
return false;
}
var top = li.position().top;
if ( top < 0 ) {
scroller.animate({
scrollTop: scroller.scrollTop() + top
}, 'fast');
}
}
$items.find('> a').on('click', function() {
var prev = $( this ).closest('ul.nav').find('> li.nav-expanded' ),
next = $( this ).closest('li');
if ( prev.get( 0 ) !== next.get( 0 ) ) {
collapse( prev );
expand( next );
} else {
collapse( prev );
}
});
}).apply( this, [ jQuery ]);
// Skeleton
(function(theme, $) {
'use strict';
theme = theme || {};
var $body = $( 'body' ),
$html = $( 'html' ),
$window = $( window ),
isAndroid = navigator.userAgent.toLowerCase().indexOf('android') > -1;
// mobile devices with fixed has a lot of issues when focus inputs and others...
if ( typeof $.browser !== 'undefined' && $.browser.mobile && $html.hasClass('fixed') ) {
$html.removeClass( 'fixed' ).addClass( 'scroll' );
}
var Skeleton = {
options: {
sidebars: {
menu: '#content-menu',
left: '#sidebar-left',
right: '#sidebar-right'
}
},
customScroll: ( !Modernizr.overflowscrolling && !isAndroid && $.fn.nanoScroller !== 'undefined'),
initialize: function() {
this
.setVars()
.build()
.events();
},
setVars: function() {
this.sidebars = {};
this.sidebars.left = {
$el: $( this.options.sidebars.left )
};
this.sidebars.right = {
$el: $( this.options.sidebars.right ),
isOpened: $html.hasClass( 'sidebar-right-opened' )
};
this.sidebars.menu = {
$el: $( this.options.sidebars.menu ),
isOpened: $html.hasClass( 'inner-menu-opened' )
};
return this;
},
build: function() {
if ( typeof $.browser !== 'undefined' && $.browser.mobile ) {
$html.addClass( 'mobile-device' );
} else {
$html.addClass( 'no-mobile-device' );
}
$html.addClass( 'custom-scroll' );
if ( this.customScroll ) {
this.buildSidebarLeft();
this.buildContentMenu();
}
this.buildSidebarRight();
return this;
},
events: function() {
if ( this.customScroll ) {
this.eventsSidebarLeft();
}
this.eventsSidebarRight();
this.eventsContentMenu();
if ( typeof $.browser !== 'undefined' && !this.customScroll && isAndroid ) {
this.fixScroll();
}
return this;
},
fixScroll: function() {
var _self = this;
$window
.on( 'sidebar-left-opened sidebar-right-toggle', function( e, data ) {
_self.preventBodyScrollToggle( data.added );
});
},
buildSidebarLeft: function() {
this.sidebars.left.$nano = this.sidebars.left.$el.find( '.nano' );
this.sidebars.left.$nano.nanoScroller({
alwaysVisible: true,
preventPageScrolling: true
});
return this;
},
eventsSidebarLeft: function() {
var $nano = this.sidebars.left.$nano;
var updateNanoScroll = function() {
if ( $.support.transition ) {
$nano.nanoScroller();
$nano
.one('bsTransitionEnd', updateNanoScroll)
.emulateTransitionEnd(150)
} else {
updateNanoScroll();
}
};
this.sidebars.left.$el
.on( 'click', function() {
updateNanoScroll();
});
$nano
.on( 'mouseenter', function() {
if ( $html.hasClass( 'sidebar-left-collapsed' ) ) {
$nano.nanoScroller();
}
})
.on( 'mouseleave', function() {
if ( $html.hasClass( 'sidebar-left-collapsed' ) ) {
$nano.nanoScroller();
}
});
return this;
},
buildSidebarRight: function() {
this.sidebars.right.isOpened = $html.hasClass( 'sidebar-right-opened' );
if ( this.customScroll ) {
this.sidebars.right.$nano = this.sidebars.right.$el.find( '.nano' );
this.sidebars.right.$nano.nanoScroller({
alwaysVisible: true,
preventPageScrolling: true
});
}
return this;
},
eventsSidebarRight: function() {
var _self = this;
var open = function() {
if ( _self.sidebars.right.isOpened ) {
return close();
}
_self.sidebars.right.isOpened = true;
$html.addClass( 'sidebar-right-opened' );
$window.trigger( 'sidebar-right-toggle', {
added: true,
removed: false
});
$html.on( 'click.close-right-sidebar', function(e) {
e.stopPropagation();
close(e);
});
};
var close = function(e) {
if ( !!e && !!e.target && ($(e.target).closest( '.sidebar-right' ).get(0) || !$(e.target).closest( 'html' ).get(0)) ) {
e.preventDefault();
return false;
}
$html.removeClass( 'sidebar-right-opened' );
$html.off( 'click.close-right-sidebar' );
$window.trigger( 'sidebar-right-toggle', {
added: false,
removed: true
});
_self.sidebars.right.isOpened = false;
};
var bind = function() {
$('[data-open="sidebar-right"]').on('click', function(e) {
var $el = $(this);
e.stopPropagation();
if ( $el.is('a') )
e.preventDefault();
open();
});
};
this.sidebars.right.$el.find( '.mobile-close' )
.on( 'click', function( e ) {
e.preventDefault();
$html.trigger( 'click.close-right-sidebar' );
});
bind();
return this;
},
buildContentMenu: function() {
if ( !$html.hasClass( 'fixed' ) ) {
return false;
}
this.sidebars.menu.$nano = this.sidebars.menu.$el.find( '.nano' );
this.sidebars.menu.$nano.nanoScroller({
alwaysVisible: true,
preventPageScrolling: true
});
return this;
},
eventsContentMenu: function() {
var _self = this;
var open = function() {
if ( _self.sidebars.menu.isOpened ) {
return close();
}
_self.sidebars.menu.isOpened = true;
$html.addClass( 'inner-menu-opened' );
$window.trigger( 'inner-menu-toggle', {
added: true,
removed: false
});
$html.on( 'click.close-inner-menu', function(e) {
close(e);
});
};
var close = function(e) {
if ( !!e && !!e.target && !$(e.target).closest( '.inner-menu-collapse' ).get(0) && ($(e.target).closest( '.inner-menu' ).get(0) || !$(e.target).closest( 'html' ).get(0)) ) {
return false;
}
e.stopPropagation();
$html.removeClass( 'inner-menu-opened' );
$html.off( 'click.close-inner-menu' );
$window.trigger( 'inner-menu-toggle', {
added: false,
removed: true
});
_self.sidebars.menu.isOpened = false;
};
var bind = function() {
$('[data-open="inner-menu"]').on('click', function(e) {
var $el = $(this);
e.stopPropagation();
if ( $el.is('a') )
e.preventDefault();
open();
});
};
bind();
/* Nano Scroll */
if ( $html.hasClass( 'fixed' ) ) {
var $nano = this.sidebars.menu.$nano;
var updateNanoScroll = function() {
if ( $.support.transition ) {
$nano.nanoScroller();
$nano
.one('bsTransitionEnd', updateNanoScroll)
.emulateTransitionEnd(150)
} else {
updateNanoScroll();
}
};
this.sidebars.menu.$el
.on( 'click', function() {
updateNanoScroll();
});
}
return this;
},
preventBodyScrollToggle: function( shouldPrevent, $el ) {
setTimeout(function() {
if ( shouldPrevent ) {
$body
.data( 'scrollTop', $body.get(0).scrollTop )
.css({
position: 'fixed',
top: $body.get(0).scrollTop * -1
})
} else {
$body
.css({
position: '',
top: ''
})
.scrollTop( $body.data( 'scrollTop' ) );
}
}, 150);
}
};
// expose to scope
$.extend(theme, {
Skeleton: Skeleton
});
}).apply(this, [ window.theme, jQuery ]);
// Base
(function(theme, $) {
'use strict';
theme = theme || {};
theme.Skeleton.initialize();
}).apply(this, [ window.theme, jQuery ]);
/*
Name: Theme Admin Extension
Written by: usp.br/nds
*/
window.theme = {};
// Mailbox
(function(theme, $) {
theme = theme || {};
var instanceName = '__mailbox';
var capitalizeString = function( str ) {
return str.charAt( 0 ).toUpperCase() + str.slice( 1 );
}
var Mailbox = function($wrapper) {
return this.initialize($wrapper);
};
Mailbox.prototype = {
initialize: function($wrapper) {
if ( $wrapper.data( instanceName ) ) {
return this;
}
this.$wrapper = $wrapper;
this
.setVars()
.setData()
.build()
.events();
return this;
},
setVars: function() {
this.view = capitalizeString( this.$wrapper.data( 'mailbox-view' ) || "" );
return this;
},
setData: function() {
this.$wrapper.data(instanceName, this);
return this;
},
build: function() {
if ( typeof this[ 'build' + this.view ] === 'function' ) {
this[ 'build' + this.view ].call( this );
}
return this;
},
events: function() {
if ( typeof this[ 'events' + this.view ] === 'function' ) {
this[ 'events' + this.view ].call( this );
}
return this;
},
buildFolder: function() {
this.$wrapper.find('.mailbox-email-list .nano').nanoScroller({
alwaysVisible: true,
preventPageScrolling: true
});
},
buildEmail: function() {
this.buildComposer();
},
buildCompose: function() {
this.buildComposer();
},
buildComposer: function() {
this.$wrapper.find( '#compose-field' ).summernote({
height: 250,
toolbar: [
['style', ['style']],
['font', ['bold', 'italic', 'underline', 'clear']],
['fontname', ['fontname']],
['color', ['color']],
['para', ['ul', 'ol', 'paragraph']],
['height', ['height']],
['table', ['table']],
['insert', ['link', 'picture', 'video']],
['view', ['fullscreen']],
['help', ['help']]
]
});
},
eventsCompose: function() {
var $composer,
$contentBody,
$html,
$innerBody;
$composer = $( '.note-editable' );
$contentBody = $( '.content-body' );
$html = $( 'html' );
$innerBody = $( '.inner-body' );
var adjustComposeSize = function() {
var composerHeight,
composerTop,
contentBodyPaddingBottom,
innerBodyHeight,
viewportHeight,
viewportWidth;
contentBodyPaddingBottom = parseInt( $contentBody.css('paddingBottom'), 10 ) || 0;
viewportHeight = Math.max( document.documentElement.clientHeight, window.innerHeight || 0 );
viewportWidth = Math.max( document.documentElement.clientWidth, window.innerWidth || 0 );
$composer.css( 'height', '' );
if ( viewportWidth < 767 || $html.hasClass('mobile-device') ) {
composerTop = $composer.offset().top;
composerHeight = viewportHeight - composerTop;
} else {
if ( $html.hasClass( 'fixed' ) ) {
composerTop = $composer.offset().top;
} else {
composerTop = $composer.position().top;
}
composerHeight = $innerBody.outerHeight() - composerTop;
}
composerHeight -= contentBodyPaddingBottom;
$composer.css({
height: composerHeight
});
};
var timer;
$(window)
.on( 'resize orientationchange sidebar-left-toggle mailbox-recalc', function() {
clearTimeout( timer );
timer = setTimeout(function() {
adjustComposeSize();
}, 100);
});
adjustComposeSize();
}
};
// expose to scope
$.extend(theme, {
Mailbox: Mailbox
});
// jquery plugin
$.fn.themeMailbox = function(opts) {
return this.each(function() {
var $this = $(this);
if ($this.data(instanceName)) {
return $this.data(instanceName);
} else {
return new Mailbox($this);
}
});
}
}).apply(this, [ window.theme, jQuery ]);
// Lock Screen
(function( $ ) {
'use strict';
var LockScreen = {
initialize: function() {
this.$body = $( 'body' );
this
.build()
.events();
},
build: function() {
var lockHTML,
userinfo;
userinfo = this.getUserInfo();
this.lockHTML = this.buildTemplate( userinfo );
this.$lock = this.$body.children( '#LockScreenInline' );
this.$userPicture = this.$lock.find( '#LockUserPicture' );
this.$userName = this.$lock.find( '#LockUserName' );
this.$userEmail = this.$lock.find( '#LockUserEmail' );
return this;
},
events: function() {
var _self = this;
this.$body.find( '[data-lock-screen="true"]' ).on( 'click', function( e ) {
e.preventDefault();
_self.show();
});
return this;
},
formEvents: function( $form ) {
var _self = this;
$form.on( 'submit', function( e ) {
e.preventDefault();
_self.hide();
});
},
show: function() {
var _self = this,
userinfo = this.getUserInfo();
this.$userPicture.attr( 'src', userinfo.picture );
this.$userName.text( userinfo.username );
this.$userEmail.text( userinfo.email );
this.$body.addClass( 'show-lock-screen' );
$.magnificPopup.open({
items: {
src: this.lockHTML,
type: 'inline'
},
modal: true,
mainClass: 'mfp-lock-screen',
callbacks: {
change: function() {
_self.formEvents( this.content.find( 'form' ) );
}
}
});
},
hide: function() {
$.magnificPopup.close();
},
getUserInfo: function() {
var $info,
picture,
name,
email;
// always search in case something is changed through ajax
$info = $( '#userbox' );
picture = $info.find( '.profile-picture img' ).attr( 'data-lock-picture' );
name = $info.find( '.profile-info' ).attr( 'data-lock-name' );
email = $info.find( '.profile-info' ).attr( 'data-lock-email' );
return {
picture: picture,
username: name,
email: email
};
},
buildTemplate: function( userinfo ) {
return [
'
{location}
', '', '', '', '" + marker.description + "
") : "" ); marker._infoWindow = new google.maps.InfoWindow({ content: html }); google.maps.event.addListener( marker._instance, 'click', function() { if ( marker._infoWindow.isOpened ) { marker._infoWindow.close(); marker._infoWindow.isOpened = false; } else { marker._infoWindow.open( _self.map, this ); marker._infoWindow.isOpened = true; } }); }, preview: function() { var customScript, googleScript, iframe, previewHtml; previewHtml = [ '', '' ]; iframe = this.$previewModal.find( 'iframe' ).get(0).contentWindow.document; iframe.body.innerHTML = previewHtml.join(''); customScript = iframe.createElement( 'script' ); customScript.type = 'text/javascript'; customScript.text = "window.initialize = function() { " + this.generate() + " init(); }; "; iframe.body.appendChild( customScript ); googleScript = iframe.createElement( 'script' ); googleScript.type = 'text/javascript'; googleScript.text = 'function loadScript() { var script = document.createElement("script"); script.type = "text/javascript"; script.src = "http://maps.googleapis.com/maps/api/js?key=&sensor=&callback=initialize"; document.body.appendChild(script); } loadScript()'; iframe.body.appendChild( googleScript ); }, getCode: function() { this.$getCodeModal.find('.modal-body pre').html( this.generate().replace( //g, '>' ) ); }, // GENERATE CODE // ----------------------------------------------------------------------------- generate: function() { var i, work; var output = [ ' google.maps.event.addDomListener(window, "load", init);', ' var map;', ' function init() {', ' var mapOptions = {', ' center: new google.maps.LatLng({lat}, {lng}),', ' zoom: {zoom},', ' zoomControl: {zoomControl},', ' {zoomControlOptions}', ' disableDoubleClickZoom: {disableDoubleClickZoom},', ' mapTypeControl: {mapTypeControl},', ' {mapTypeControlOptions}', ' scaleControl: {scaleControl},', ' scrollwheel: {scrollwheel},', ' panControl: {panControl},', ' streetViewControl: {streetViewControl},', ' draggable : {draggable},', ' overviewMapControl: {overviewMapControl},', ' {overviewMapControlOptions}', ' mapTypeId: google.maps.MapTypeId.{mapTypeId}{styles}', ' };', '', ' var mapElement = document.getElementById("{mapid}");', ' var map = new google.maps.Map(mapElement, mapOptions);', ' {locations}', ' }' ]; output = output.join("\r\n"); var zoomControl = this.$wrapper.find('[data-builder-field="zoomcontrol"] option:selected').val() !== 'false'; var mapTypeControl = this.$wrapper.find('[data-builder-field="maptypecontrol"] option:selected').val() !== 'false'; var overviewMapControl = this.$wrapper.find('[data-builder-field="overviewcontrol"] option:selected').val().toLowerCase(); var $themeControl = this.$wrapper.find('[data-builder-field="maptheme"] option:selected').filter( ':selected' ); output = output .replace( /\{mapid\}/, this.$wrapper.find('[data-builder-field="mapid"]').val() ) .replace( /\{lat\}/, this.$wrapper.find('[data-builder-field][name="latitude"]').val() ) .replace( /\{lng\}/, this.$wrapper.find('[data-builder-field][name="longitude"]').val() ) .replace( /\{zoom\}/, this.$wrapper.find('[data-builder-field="zoomlevel"] option:selected').val() ) .replace( /\{zoomControl\}/, zoomControl ) .replace( /\{disableDoubleClickZoom\}/, this.$wrapper.find('[data-builder-field="clicktozoomcontrol"] option:selected').val() === 'false' ) .replace( /\{mapTypeControl\}/, mapTypeControl ) .replace( /\{scaleControl\}/, this.$wrapper.find('[data-builder-field="scalecontrol"] option:selected').val() !== 'false' ) .replace( /\{scrollwheel\}/, this.$wrapper.find('[data-builder-field="scrollwheelcontrol"] option:selected').val() !== 'false' ) .replace( /\{panControl\}/, this.$wrapper.find('[data-builder-field="pancontrol"] option:selected').val() !== 'false' ) .replace( /\{streetViewControl\}/, this.$wrapper.find('[data-builder-field="streetviewcontrol"] option:selected').val() !== 'false' ) .replace( /\{draggable\}/, this.$wrapper.find('[data-builder-field="draggablecontrol"] option:selected').val() !== 'false' ) .replace( /\{overviewMapControl\}/, overviewMapControl !== 'false' ) .replace( /\{mapTypeId\}/, this.$wrapper.find('[data-builder-field="maptype"] option:selected').val().toUpperCase() ); if ( zoomControl ) { work = { zoomControlOptions: { style: this.$wrapper.find('[data-builder-field="maptypecontrol"] option:selected').val().toUpperCase() } }; output = output.replace( /\{zoomControlOptions\}/, "zoomControlOptions: {\r\n style: google.maps.ZoomControlStyle." + this.$wrapper.find('[data-builder-field="zoomcontrol"] option:selected').val().toUpperCase() + "\r\n\ },"); } else { output = output.replace( /\{zoomControlOptions\}/, '' ); } if ( mapTypeControl ) { work = { zoomControlOptions: { style: this.$wrapper.find('[data-builder-field="maptypecontrol"] option:selected').val().toUpperCase() } }; output = output.replace( /\{mapTypeControlOptions\}/, "mapTypeControlOptions: {\r\n style: google.maps.MapTypeControlStyle." + this.$wrapper.find('[data-builder-field="maptypecontrol"] option:selected').val().toUpperCase() + "\r\n\ },"); } else { output = output.replace( /\{mapTypeControlOptions\}/, '' ); } if ( overviewMapControl !== 'false' ) { output = output.replace( /\{overviewMapControlOptions\}/, "overviewMapControlOptions: {\r\n opened: " + (overviewMapControl === 'opened') + "\r\n\ },"); } else { output = output.replace( /\{overviewMapControlOptions\}/, '' ); } if ( $themeControl.val() !== 'false' ) { output = output.replace( /\{styles\}/, ',\r\n styles: ' + $themeControl.data( 'json' ).replace(/\r\n/g, '') ); } else { output = output.replace( /\{styles\}/, '' ); } if ( this.markers.length > 0 ) { var work = [ 'var locations = [' ]; var m, object; for( i = 0; i < this.markers.length; i++ ) { m = this.markers[ i ]; object = ''; object += ' { lat: ' + m.lat + ', lng: ' + m.lng; if ( !!m.title ) { object += ', title: "' + m.title + '"'; } if ( !!m.description ) { object += ', description: "' + m.description + '"'; } object += ' }'; if ( i + 1 < this.markers.length ) { object += ','; } work.push( object ); } work.push( ' ];\r\n' ) work.push( ' var opts = {};' ) work.push( ' for (var i = 0; i < locations.length; i++) {' ); work.push( ' opts.position = new google.maps.LatLng( locations[ i ].lat, locations[ i ].lng );' ); work.push( ' opts.map = map;' ); work.push( ' if ( !!locations[ i ] .title ) { opts.title = locations[ i ].title; }'); work.push( ' if ( !!locations[ i ] .description ) { opts.description = locations[ i ].description; }'); work.push( ' marker = new google.maps.Marker( opts );' ); work.push( '' ); work.push( ' (function() {' ); work.push( ' var html = [' ); work.push( ' \'" + opts.description + "
") : "" );' ); work.push( ' var infoWindow = new google.maps.InfoWindow({ content: html });' ); work.push( ' google.maps.event.addListener( marker, \'click\', function() {' ); work.push( ' if ( infoWindow.isOpened ) {' ); work.push( ' infoWindow.close();' ); work.push( ' infoWindow.isOpened = false;' ); work.push( ' } else {' ); work.push( ' infoWindow.open( map, this );' ); work.push( ' infoWindow.isOpened = true;' ); work.push( ' }' ); work.push( ' });' ); work.push( ' })();' ) work.push( ' }'); output = output.replace( /\{locations\}/, work.join('\r\n') ); } else { output = output.replace( /\{locations\}/, '' ); } console.log( output ); return output; } }; // expose $.extend( true, theme, { Maps: { GMapBuilder: GMapBuilder } }); // jQuery plugin $.fn.themeGMapBuilder = function( opts ) { return this.map(function() { var $this = $( this ), instance; instance = $this.data( instanceName ); if ( instance ) { return instance; } else { return (new GMapBuilder( $this, opts )); } }); }; // auto initialize $(function() { $('[data-theme-gmap-builder]').each(function() { var $this = $( this ); window.builder = $this.themeGMapBuilder(); }); }); }).apply(this, [ window.theme, jQuery ]); // Animate (function(theme, $) { theme = theme || {}; var instanceName = '__animate'; var PluginAnimate = function($el, opts) { return this.initialize($el, opts); }; PluginAnimate.defaults = { accX: 0, accY: -150, delay: 1 }; PluginAnimate.prototype = { initialize: function($el, opts) { if ( $el.data( instanceName ) ) { return this; } this.$el = $el; this .setData() .setOptions(opts) .build(); return this; }, setData: function() { this.$el.data(instanceName, this); return this; }, setOptions: function(opts) { this.options = $.extend(true, {}, PluginAnimate.defaults, opts, { wrapper: this.$el }); return this; }, build: function() { var self = this, $el = this.options.wrapper, delay = 0; $el.addClass('appear-animation'); if(!$('html').hasClass('no-csstransitions') && $(window).width() > 767) { $el.appear(function() { delay = ($el.attr('data-appear-animation-delay') ? $el.attr('data-appear-animation-delay') : self.options.delay); if(delay > 1) { $el.css('animation-delay', delay + 'ms'); } $el.addClass($el.attr('data-appear-animation')); setTimeout(function() { $el.addClass('appear-animation-visible'); }, delay); }, {accX: self.options.accX, accY: self.options.accY}); } else { $el.addClass('appear-animation-visible'); } return this; } }; // expose to scope $.extend(theme, { PluginAnimate: PluginAnimate }); // jquery plugin $.fn.themePluginAnimate = function(opts) { return this.map(function() { var $this = $(this); if ($this.data(instanceName)) { return $this.data(instanceName); } else { return new PluginAnimate($this, opts); } }); }; }).apply(this, [ window.theme, jQuery ]); // Carousel (function(theme, $) { theme = theme || {}; var initialized = false; var instanceName = '__carousel'; var PluginCarousel = function($el, opts) { return this.initialize($el, opts); }; PluginCarousel.defaults = { itemsDesktop: false, itemsDesktopSmall: false, itemsTablet: false, itemsTabletSmall: false, itemsMobile: false }; PluginCarousel.prototype = { initialize: function($el, opts) { if ( $el.data( instanceName ) ) { return this; } this.$el = $el; this .setData() .setOptions(opts) .build(); return this; }, setData: function() { this.$el.data(instanceName, this); return this; }, setOptions: function(opts) { this.options = $.extend(true, {}, PluginCarousel.defaults, opts, { wrapper: this.$el }); return this; }, build: function() { this.options.wrapper.owlCarousel(this.options).addClass("owl-carousel-init"); return this; } }; // expose to scope $.extend(theme, { PluginCarousel: PluginCarousel }); // jquery plugin $.fn.themePluginCarousel = function(opts) { return this.map(function() { var $this = $(this); if ($this.data(instanceName)) { return $this.data(instanceName); } else { return new PluginCarousel($this, opts); } }); } }).apply(this, [ window.theme, jQuery ]); // Chart Circular (function(theme, $) { theme = theme || {}; var instanceName = '__chartCircular'; var PluginChartCircular = function($el, opts) { return this.initialize($el, opts); }; PluginChartCircular.defaults = { accX: 0, accY: -150, delay: 1, barColor: '#0088CC', trackColor: '#f2f2f2', scaleColor: false, scaleLength: 5, lineCap: 'round', lineWidth: 13, size: 175, rotate: 0, animate: ({ duration: 2500, enabled: true }) }; PluginChartCircular.prototype = { initialize: function($el, opts) { if ( $el.data( instanceName ) ) { return this; } this.$el = $el; this .setData() .setOptions(opts) .build(); return this; }, setData: function() { this.$el.data(instanceName, this); return this; }, setOptions: function(opts) { this.options = $.extend(true, {}, PluginChartCircular.defaults, opts, { wrapper: this.$el }); return this; }, build: function() { var self = this, $el = this.options.wrapper, value = ($el.attr('data-percent') ? $el.attr('data-percent') : 0), percentEl = $el.find('.percent'), shouldAnimate, data; shouldAnimate = $.isFunction($.fn[ 'appear' ]) && ( typeof $.browser !== 'undefined' && !$.browser.mobile ); data = { accX: self.options.accX, accY: self.options.accY }; $.extend(true, self.options, { onStep: function(from, to, currentValue) { percentEl.html(parseInt(currentValue)); } }); $el.attr('data-percent', (shouldAnimate ? 0 : value) ); $el.easyPieChart( this.options ); if ( shouldAnimate ) { $el.appear(function() { setTimeout(function() { $el.data('easyPieChart').update(value); $el.attr('data-percent', value); }, self.options.delay); }, data); } else { $el.data('easyPieChart').update(value); $el.attr('data-percent', value); } return this; } }; // expose to scope $.extend(true, theme, { Chart: { PluginChartCircular: PluginChartCircular } }); // jquery plugin $.fn.themePluginChartCircular = function(opts) { return this.map(function() { var $this = $(this); if ($this.data(instanceName)) { return $this.data(instanceName); } else { return new PluginChartCircular($this, opts); } }); } }).apply(this, [ window.theme, jQuery ]); // Lightbox (function(theme, $) { theme = theme || {}; var instanceName = '__lightbox'; var PluginLightbox = function($el, opts) { return this.initialize($el, opts); }; PluginLightbox.defaults = { tClose: 'Close (Esc)', // Alt text on close button tLoading: 'Loading...', // Text that is displayed during loading. Can contain %curr% and %total% keys gallery: { tPrev: 'Previous (Left arrow key)', // Alt text on left arrow tNext: 'Next (Right arrow key)', // Alt text on right arrow tCounter: '%curr% of %total%' // Markup for "1 of 7" counter }, image: { tError: 'The image could not be loaded.' // Error message when image could not be loaded }, ajax: { tError: 'The content could not be loaded.' // Error message when ajax request failed } }; PluginLightbox.prototype = { initialize: function($el, opts) { if ( $el.data( instanceName ) ) { return this; } this.$el = $el; this .setData() .setOptions(opts) .build(); return this; }, setData: function() { this.$el.data(instanceName, this); return this; }, setOptions: function(opts) { this.options = $.extend(true, {}, PluginLightbox.defaults, opts, { wrapper: this.$el }); return this; }, build: function() { this.options.wrapper.magnificPopup(this.options); return this; } }; // expose to scope $.extend(theme, { PluginLightbox: PluginLightbox }); // jquery plugin $.fn.themePluginLightbox = function(opts) { return this.each(function() { var $this = $(this); if ($this.data(instanceName)) { return $this.data(instanceName); } else { return new PluginLightbox($this, opts); } }); } }).apply(this, [ window.theme, jQuery ]); // Portlets (function(theme, $) { theme = theme || {}; var instanceName = '__portlet', storageOrderKey = '__portletOrder', storageStateKey = '__portletState'; var PluginPortlet = function($el, opts) { return this.initialize($el, opts); }; PluginPortlet.defaults = { connectWith: '[data-plugin-portlet]', items: '[data-portlet-item]', handle: '.portlet-handler', opacity: 0.7, placeholder: 'portlet-placeholder', cancel: 'portlet-cancel', forcePlaceholderSize: true, forceHelperSize: true, tolerance: 'pointer', helper: 'original', revert: 200 }; PluginPortlet.prototype = { initialize: function($el, opts) { if ( $el.data( instanceName ) ) { return this; } this.$el = $el; this .setData() .setOptions(opts) .build(); return this; }, setData: function() { this.$el.data(instanceName, this); return this; }, setOptions: function(opts) { var _self = this; this.options = $.extend(true, {}, PluginPortlet.defaults, opts, { wrapper: this.$el, update: _self.onUpdate, create: _self.onLoad }); return this; }, onUpdate: function(event, ui) { var key = storageOrderKey, data = store.get(key), $this = $(this), porletId = $this.prop('id'); if (!data) { data = {}; } if (!!porletId) { data[porletId] = $this.sortable('toArray'); store.set(key, data); } }, onLoad: function(event, ui) { var key = storageOrderKey, data = store.get(key), $this = $(this), porletId = $this.prop('id'), portlet = $('#' + porletId); if (!!data) { var panels = data[porletId]; if (!!panels) { $.each(panels, function(index, panelId) { $('#' + panelId).appendTo(portlet); }); } } }, saveState: function( panel ) { var key = storageStateKey, data = store.get(key), panelId = panel.prop('id'); if (!data) { data = {}; } if (!panelId) { return this; } var collapse = panel.find('.panel-actions').children('a.fa-caret-up, a.fa-caret-down'), isCollapsed = !!collapse.hasClass('fa-caret-up'), isRemoved = !panel.closest('body').get(0); if (isRemoved) { data[panelId] = 'removed'; } else if (isCollapsed) { data[panelId] = 'collapsed'; } else { delete data[panelId]; } store.set(key, data); return this; }, loadState: function() { var key = storageStateKey, data = store.get(key); if (!!data) { $.each(data, function(panelId, state) { var panel = $('#' + panelId); if (!panel.data('portlet-state-loaded')) { if (state == 'collapsed') { panel.find('.panel-actions a.fa-caret-down').trigger('click'); } else if (state == 'removed') { panel.find('.panel-actions a.fa-times').trigger('click'); } panel.data('portlet-state-loaded', true); } }); } return this; }, build: function() { var _self = this; if ( $.isFunction( $.fn.sortable ) ) { this.$el.sortable( this.options ); this.$el.find('[data-portlet-item]').each(function() { _self.events( $(this) ); }); } var portlet = this.$el; portlet.css('min-height', 150); return this; }, events: function($el) { var _self = this, portlet = $el.closest('[data-plugin-portlet]'); this.loadState(); $el.find('.panel-actions').on( 'click', 'a.fa-caret-up, a.fa-caret-down, a.fa-times', function( e ) { setTimeout(function() { _self.saveState( $el ); }, 250); }); return this; } }; // expose to scope $.extend(theme, { PluginPortlet: PluginPortlet }); // jquery plugin $.fn.themePluginPortlet = function(opts) { return this.map(function() { var $this = $(this); if ($this.data(instanceName)) { return $this.data(instanceName); } else { return new PluginPortlet($this, opts); } }); } }).apply(this, [ window.theme, jQuery ]); // Slider (function(theme, $) { theme = theme || {}; var instanceName = '__slider'; var PluginSlider = function($el, opts) { return this.initialize($el, opts); }; PluginSlider.defaults = { }; PluginSlider.prototype = { initialize: function($el, opts) { if ( $el.data( instanceName ) ) { return this; } this.$el = $el; this .setVars() .setData() .setOptions(opts) .build(); return this; }, setVars: function() { var $output = $( this.$el.data('plugin-slider-output') ); this.$output = $output.get(0) ? $output : null; return this; }, setData: function() { this.$el.data(instanceName, this); return this; }, setOptions: function(opts) { var _self = this; this.options = $.extend( true, {}, PluginSlider.defaults, opts ); if ( this.$output ) { $.extend( this.options, { slide: function( event, ui ) { _self.onSlide( event, ui ); } }); } return this; }, build: function() { this.$el.slider( this.options ); return this; }, onSlide: function( event, ui ) { if ( !ui.values ) { this.$output.val( ui.value ); } else { this.$output.val( ui.values[ 0 ] + '/' + ui.values[ 1 ] ); } this.$output.trigger('change'); } }; // expose to scope $.extend(theme, { PluginSlider: PluginSlider }); // jquery plugin $.fn.themePluginSlider = function(opts) { return this.each(function() { var $this = $(this); if ($this.data(instanceName)) { return $this.data(instanceName); } else { return new PluginSlider($this, opts); } }); } }).apply(this, [ window.theme, jQuery ]); // Toggle (function(theme, $) { theme = theme || {}; var instanceName = '__toggle'; var PluginToggle = function($el, opts) { return this.initialize($el, opts); }; PluginToggle.defaults = { duration: 350, isAccordion: false, addIcons: true }; PluginToggle.prototype = { initialize: function($el, opts) { if ( $el.data( instanceName ) ) { return this; } this.$el = $el; this .setData() .setOptions(opts) .build(); return this; }, setData: function() { this.$el.data(instanceName, this); return this; }, setOptions: function(opts) { this.options = $.extend(true, {}, PluginToggle.defaults, opts, { wrapper: this.$el }); return this; }, build: function() { var self = this, $wrapper = this.options.wrapper, $items = $wrapper.find('.toggle'), $el = null; $items.each(function() { $el = $(this); if(self.options.addIcons) { $el.find('> label').prepend( $('').addClass('fa fa-plus'), $('').addClass('fa fa-minus') ); } if($el.hasClass('active')) { $el.find('> p').addClass('preview-active'); $el.find('> .toggle-content').slideDown(self.options.duration); } self.events($el); }); if(self.options.isAccordion) { self.options.duration = self.options.duration/2; } return this; }, events: function($el) { var self = this, previewParCurrentHeight = 0, previewParAnimateHeight = 0, toggleContent = null; $el.find('> label').click(function(e) { var $this = $(this), parentSection = $this.parent(), parentWrapper = $this.parents('.toggle'), previewPar = null, closeElement = null; if(self.options.isAccordion && typeof(e.originalEvent) != 'undefined') { closeElement = parentWrapper.find('.toggle.active > label'); if(closeElement[0] == $this[0]) { return; } } parentSection.toggleClass('active'); // Preview Paragraph if(parentSection.find('> p').get(0)) { previewPar = parentSection.find('> p'); previewParCurrentHeight = previewPar.css('height'); previewPar.css('height', 'auto'); previewParAnimateHeight = previewPar.css('height'); previewPar.css('height', previewParCurrentHeight); } // Content toggleContent = parentSection.find('> .toggle-content'); if(parentSection.hasClass('active')) { $(previewPar).animate({ height: previewParAnimateHeight }, self.options.duration, function() { $(this).addClass('preview-active'); }); toggleContent.slideDown(self.options.duration, function() { if(closeElement) { closeElement.trigger('click'); } }); } else { $(previewPar).animate({ height: 0 }, self.options.duration, function() { $(this).removeClass('preview-active'); }); toggleContent.slideUp(self.options.duration); } }); } }; // expose to scope $.extend(theme, { PluginToggle: PluginToggle }); // jquery plugin $.fn.themePluginToggle = function(opts) { return this.map(function() { var $this = $(this); if ($this.data(instanceName)) { return $this.data(instanceName); } else { return new PluginToggle($this, opts); } }); } }).apply(this, [ window.theme, jQuery ]); // Widget - Todo (function(theme, $) { theme = theme || {}; var instanceName = '__widgetTodoList'; var WidgetTodoList = function($el, opts) { return this.initialize($el, opts); }; WidgetTodoList.defaults = { }; WidgetTodoList.prototype = { initialize: function($el, opts) { if ( $el.data( instanceName ) ) { return this; } this.$el = $el; this .setData() .setOptions(opts) .build() .events(); return this; }, setData: function() { this.$el.data(instanceName, this); return this; }, setOptions: function(opts) { this.options = $.extend( true, {}, WidgetTodoList.defaults, opts ); return this; }, check: function( input, label ) { if ( input.is(':checked') ) { label.addClass('line-through'); } else { label.removeClass('line-through'); } }, build: function() { var _self = this, $check = this.$el.find('.todo-check'); $check.each(function () { var label = $(this).closest('li').find('.todo-label'); _self.check( $(this), label ); }); return this; }, events: function() { var _self = this, $remove = this.$el.find( '.todo-remove' ), $check = this.$el.find('.todo-check'), $window = $( window ); $remove.on('click.widget-todo-list', function( ev ) { ev.preventDefault(); $(this).closest("li").remove(); }); $check.on('change', function () { var label = $(this).closest('li').find('.todo-label'); _self.check( $(this), label ); }); if ( $.isFunction( $.fn.sortable ) ) { this.$el.sortable({ sort: function(event, ui) { var top = event.pageY - _self.$el.offset().top - (ui.helper.outerHeight(true) / 2); ui.helper.css({'top' : top + 'px'}); } }); } return this; } }; // expose to scope $.extend(theme, { WidgetTodoList: WidgetTodoList }); // jquery plugin $.fn.themePluginWidgetTodoList = function(opts) { return this.each(function() { var $this = $(this); if ($this.data(instanceName)) { return $this.data(instanceName); } else { return new WidgetTodoList($this, opts); } }); } }).apply(this, [ window.theme, jQuery ]); // Widget - Toggle (function(theme, $) { theme = theme || {}; var instanceName = '__widgetToggleExpand'; var WidgetToggleExpand = function($el, opts) { return this.initialize($el, opts); }; WidgetToggleExpand.defaults = { }; WidgetToggleExpand.prototype = { initialize: function($el, opts) { if ( $el.data( instanceName ) ) { return this; } this.$el = $el; this .setData() .setOptions(opts) .build() .events(); return this; }, setData: function() { this.$el.data(instanceName, this); return this; }, setOptions: function(opts) { this.options = $.extend( true, {}, WidgetToggleExpand.defaults, opts ); return this; }, build: function() { return this; }, events: function() { var _self = this, $toggler = this.$el.find( '.widget-toggle' ); $toggler.on('click.widget-toggler', function() { _self.$el.hasClass('widget-collapsed') ? _self.expand( _self.$el ) : _self.collapse( _self.$el ); }); return this; }, expand: function( content ) { content.children( '.widget-content-expanded' ).slideDown( 'fast', function() { $(this).css( 'display', '' ); content.removeClass( 'widget-collapsed' ); }); }, collapse: function( content ) { content.children('.widget-content-expanded' ).slideUp( 'fast', function() { content.addClass( 'widget-collapsed' ); $(this).css( 'display', '' ); }); } }; // expose to scope $.extend(theme, { WidgetToggleExpand: WidgetToggleExpand }); // jquery plugin $.fn.themePluginWidgetToggleExpand = function(opts) { return this.each(function() { var $this = $(this); if ($this.data(instanceName)) { return $this.data(instanceName); } else { return new WidgetToggleExpand($this, opts); } }); } }).apply(this, [ window.theme, jQuery ]); // Word Rotate (function(theme, $) { theme = theme || {}; var instanceName = '__wordRotate'; var PluginWordRotate = function($el, opts) { return this.initialize($el, opts); }; PluginWordRotate.defaults = { delay: 2000 }; PluginWordRotate.prototype = { initialize: function($el, opts) { if ( $el.data( instanceName ) ) { return this; } this.$el = $el; this .setData() .setOptions(opts) .build(); return this; }, setData: function() { this.$el.data(instanceName, this); return this; }, setOptions: function(opts) { this.options = $.extend(true, {}, PluginWordRotate.defaults, opts, { wrapper: this.$el }); return this; }, build: function() { var $el = this.options.wrapper, itemsWrapper = $el.find(".word-rotate-items"), items = itemsWrapper.find("> span"), firstItem = items.eq(0), firstItemClone = firstItem.clone(), itemHeight = firstItem.height(), currentItem = 1, currentTop = 0; itemsWrapper.append(firstItemClone); $el .height(itemHeight) .addClass("active"); setInterval(function() { currentTop = (currentItem * itemHeight); itemsWrapper.animate({ top: -(currentTop) + "px" }, 300, function() { currentItem++; if(currentItem > items.length) { itemsWrapper.css("top", 0); currentItem = 1; } }); }, this.options.delay); return this; } }; // expose to scope $.extend(theme, { PluginWordRotate: PluginWordRotate }); // jquery plugin $.fn.themePluginWordRotate = function(opts) { return this.each(function() { var $this = $(this); if ($this.data(instanceName)) { return $this.data(instanceName); } else { return new PluginWordRotate($this, opts); } }); } }).apply(this, [ window.theme, jQuery ]); // Data Tables - Config (function($) { 'use strict'; // we overwrite initialize of all datatables here // because we want to use select2, give search input a bootstrap look // keep in mind if you overwrite this fnInitComplete somewhere, // you should run the code inside this function to keep functionality. // // there's no better way to do this at this time :( if ( $.isFunction( $.fn[ 'dataTable' ] ) ) { $.extend(true, $.fn.dataTable.defaults, { sDom: "<'row datatables-header form-inline'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>r><'table-responsive't><'row datatables-footer'<'col-sm-12 col-md-6'i><'col-sm-12 col-md-6'p>>", oLanguage: { sLengthMenu: '_MENU_ registros por pagina', sProcessing: ' Carregando' }, fnInitComplete: function( settings, json ) { // select 2 if ( $.isFunction( $.fn[ 'select2' ] ) ) { $('.dataTables_length select', settings.nTableWrapper).select2({ minimumResultsForSearch: -1 }); } var options = $( 'table', settings.nTableWrapper ).data( 'plugin-options' ) || {}; // search var $search = $('.dataTables_filter input', settings.nTableWrapper); $search .attr({ placeholder: typeof options.searchPlaceholder !== 'undefined' ? options.searchPlaceholder : 'Buscar' }) .addClass('form-control'); if ( $.isFunction( $.fn.placeholder ) ) { $search.placeholder(); } } }); } }).apply( this, [ jQuery ]); // Notifications - Config (function($) { 'use strict'; // use font awesome icons if available if ( typeof PNotify != 'undefined' ) { PNotify.prototype.options.styling = "fontawesome"; $.extend(true, PNotify.prototype.options, { shadow: false, stack: { spacing1: 15, spacing2: 15 } }); $.extend(PNotify.styling.fontawesome, { // classes container: "notification", notice: "notification-warning", info: "notification-info", success: "notification-success", error: "notification-danger", // icons notice_icon: "fa fa-exclamation", info_icon: "fa fa-info", success_icon: "fa fa-check", error_icon: "fa fa-times" }); } }).apply(this, [jQuery]);