function triggerChartsResize(){
try {
if (window.onresize){
window.onresize();
}
} catch (e){
//just swallow it
}
$(window).trigger('resize');
}
$(function(){
//settings
var $settings = $("#settings"),
$sidebarSettings = $("#sidebar-settings"),
settingsState = JSON.parse(localStorage.getItem("settings-state")) || {
sidebar: 'left',
sidebarState: 'auto',
displaySidebar: true
},
$pageHeader = $(".page-header"),
$body = $("body"),
popoverReallyHide = function(){
$settings.data('bs.popover').hoverState = 'out'; //yeah. cool BS3 fix. popover programmatic APi works only on HOVER
$settings.popover('hide');
},
popoverClose = function(e){
var $popover = $settings.siblings(".popover");
if($popover.length && !$.contains($popover[0], e.target)){
popoverReallyHide();
$(document).off("click", popoverClose);
}
},
sidebarSide = function(side){
if (side == "right"){
$body.addClass("sidebar-on-right")
} else {
$body.removeClass("sidebar-on-right")
}
},
sidebarState = function(state, triggerResize){
var $template = $('#sidebar-settings-template');
triggerResize = triggerResize == undefined ? true : false;
if (!$template[0]){
return;
}
$sidebarSettings.html(_.template($template.html())({sidebarState: state}));
if (state == "auto"){
$(".sidebar, .side-nav, .wrap, .logo").removeClass("sidebar-icons");
} else {
$(".sidebar, .side-nav, .wrap, .logo").addClass("sidebar-icons");
}
if (triggerResize){
triggerChartsResize();
}
},
displaySidebar = function(display, triggerResize){
triggerResize = triggerResize == undefined ? true : false;
if (display == true){
$body.removeClass("sidebar-hidden")
} else {
$body.addClass("sidebar-hidden")
}
if (triggerResize){
triggerChartsResize();
}
};
sidebarSide(settingsState.sidebar);
sidebarState(settingsState.sidebarState, false);
displaySidebar(settingsState.displaySidebar, false);
if (!$settings[0]){
return;
}
$settings.popover({
template: '
',
html: true,
animation: false,
placement: 'bottom',
content: function(){
return _.template($('#settings-template').html())(settingsState);
}
}).click(function(e){
//close all open dropdowns
$('.page-header .dropdown.open .dropdown-toggle').dropdown('toggle');
// need to remove popover on anywhere-click
$(document).on("click", popoverClose);
$(this).focus();
return false;
});
$(".page-header .dropdown-toggle").click(function(){
popoverReallyHide()
$(document).off("click", popoverClose);
});
//sidevar left/right
$pageHeader.on("click", ".popover #sidebar-toggle .btn", function(){
var $this = $(this),
side = $this.data("value");
sidebarSide(side);
settingsState.sidebar = side;
localStorage.setItem("settings-state", JSON.stringify(settingsState));
});
//sidebar visibility
$pageHeader.on("click", ".popover #display-sidebar-toggle .btn", function(){
var $this = $(this),
display = $this.data("value");
displaySidebar(display);
settingsState.displaySidebar = display;
localStorage.setItem("settings-state", JSON.stringify(settingsState));
});
//sidebar state {active, icons}
$sidebarSettings.on("click", ".btn", function(){
var $this = $(this),
state = $this.data("value");
if (state == 'icons'){
closeNavigation();
}
sidebarState(state);
settingsState.sidebarState = state;
localStorage.setItem("settings-state", JSON.stringify(settingsState));
});
//close navigation if sidebar in icons state
if (($("#sidebar").is(".sidebar-icons") || $(window).width() < 1049) && $(window).width() > 767){
closeNavigation();
}
//imitate buttons radio behavior
$pageHeader.on("click", ".popover [data-toggle='buttons-radio'] .btn:not(.active)", function(){
var $this = $(this),
$buttons = $this.parent().find('.btn');
$buttons.removeClass('active');
setTimeout(function(){
$this.addClass('active');
}, 0)
});
});
/**
* A global object containing theme specific colors, screen variables & color functions.
* @type Object
*/
window.LightBlue = {
screens: {
'xs-max': 767,
'sm-min': 768,
'sm-max': 991,
'md-min': 992,
'md-max': 1199,
'lg-min': 1200
},
isScreen: function(size){
var screenPx = window.innerWidth;
return (screenPx >= this.screens[size + '-min'] || size == 'xs') && (screenPx <= this.screens[size + '-max'] || size == 'lg');
},
getScreenSize: function(){
var screenPx = window.innerWidth;
if (screenPx <= this.screens['xs-max']) return 'xs';
if ((screenPx >= this.screens['sm-min']) && (screenPx <= this.screens['sm-max'])) return 'sm';
if ((screenPx >= this.screens['md-min']) && (screenPx <= this.screens['md-max'])) return 'md';
if (screenPx >= this.screens['lg-min']) return 'lg';
},
//credit http://stackoverflow.com/questions/1507931/generate-lighter-darker-color-in-css-using-javascript
changeColor: function(color, ratio, darker) {
var pad = function(num, totalChars) {
var pad = '0';
num = num + '';
while (num.length < totalChars) {
num = pad + num;
}
return num;
};
// Trim trailing/leading whitespace
color = color.replace(/^\s*|\s*$/, '');
// Expand three-digit hex
color = color.replace(
/^#?([a-f0-9])([a-f0-9])([a-f0-9])$/i,
'#$1$1$2$2$3$3'
);
// Calculate ratio
var difference = Math.round(ratio * 256) * (darker ? -1 : 1),
// Determine if input is RGB(A)
rgb = color.match(new RegExp('^rgba?\\(\\s*' +
'(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])' +
'\\s*,\\s*' +
'(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])' +
'\\s*,\\s*' +
'(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])' +
'(?:\\s*,\\s*' +
'(0|1|0?\\.\\d+))?' +
'\\s*\\)$'
, 'i')),
alpha = !!rgb && rgb[4] != null ? rgb[4] : null,
// Convert hex to decimal
decimal = !!rgb? [rgb[1], rgb[2], rgb[3]] : color.replace(
/^#?([a-f0-9][a-f0-9])([a-f0-9][a-f0-9])([a-f0-9][a-f0-9])/i,
function() {
return parseInt(arguments[1], 16) + ',' +
parseInt(arguments[2], 16) + ',' +
parseInt(arguments[3], 16);
}
).split(/,/),
returnValue;
// Return RGB(A)
return !!rgb ?
'rgb' + (alpha !== null ? 'a' : '') + '(' +
Math[darker ? 'max' : 'min'](
parseInt(decimal[0], 10) + difference, darker ? 0 : 255
) + ', ' +
Math[darker ? 'max' : 'min'](
parseInt(decimal[1], 10) + difference, darker ? 0 : 255
) + ', ' +
Math[darker ? 'max' : 'min'](
parseInt(decimal[2], 10) + difference, darker ? 0 : 255
) +
(alpha !== null ? ', ' + alpha : '') +
')' :
// Return hex
[
'#',
pad(Math[darker ? 'max' : 'min'](
parseInt(decimal[0], 10) + difference, darker ? 0 : 255
).toString(16), 2),
pad(Math[darker ? 'max' : 'min'](
parseInt(decimal[1], 10) + difference, darker ? 0 : 255
).toString(16), 2),
pad(Math[darker ? 'max' : 'min'](
parseInt(decimal[2], 10) + difference, darker ? 0 : 255
).toString(16), 2)
].join('');
},
lighten: function(color, ratio) {
return this.changeColor(color, ratio, false);
},
darken: function(color, ratio) {
return this.changeColor(color, ratio, true);
}
};