/*
* ************************************************************* *
* Name : Power Widgets *
* Date : May 2012 *
* Owner : CreativeMilk *
* Url : www.creativemilk.net *
* Version : 2.5 *
* Updated : 22/03/2013 *
* Developer : Mark *
* Dependency : jQuery UI core, json2(ie7) *
* Lib : jQuery 1.7+ *
* Licence : http://codecanyon.net/item/power-widgets-manage-and-display-your-content/2901689
* ************************************************************* *
*/
;(function($, window, document, undefined){
//"use strict"; // jshint ;_;
var pluginName = 'panels';
function Plugin(element, options){
/**
* Variables.
**/
this.obj = $(element);
this.o = $.extend({}, $.fn[pluginName].defaults, options);
this.objId = this.obj.attr('id');
this.pwCtrls = '.panel-ctrls'
this.widget = this.obj.find(this.o.widgets);
this.toggleClass = this.o.toggleClass.split('|');
this.editClass = this.o.editClass.split('|');
this.toggleColorClass= this.o.toggleColorClass.split('|');
this.fullscreenClass = this.o.fullscreenClass.split('|');
this.customClass = this.o.customClass.split('|');
this.init();
};
Plugin.prototype = {
/**
* Important settings like storage and touch support.
*
* @param:
**/
_settings: function(){
var self = this;
//*****************************************************************//
//////////////////////// LOCALSTORAGE CHECK /////////////////////////
//*****************************************************************//
storage = !!function() {
var result,
uid = +new Date;
try {
localStorage.setItem(uid, uid);
result = localStorage.getItem(uid) == uid;
localStorage.removeItem(uid);
return result;
} catch(e) {}
}() && localStorage;
//*****************************************************************//
/////////////////////////// SET/GET KEYS ////////////////////////////
//*****************************************************************//
if(storage && self.o.localStorage){
keySettings = 'panels_settings_'+location.pathname+'_'+self.objId;
getKeySettings = localStorage.getItem(keySettings);
keyPosition = 'panels_position_'+location.pathname+'_'+self.objId;
getKeyPosition = localStorage.getItem(keyPosition);
}
//*****************************************************************//
////////////////////////// TOUCH SUPPORT ////////////////////////////
//*****************************************************************//
/**
* Check for touch support and set right click events.
**/
if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch){
clickEvent = 'click tap';
}else{
clickEvent = 'click';
}
},
/**
* Function for the indicator image.
*
* @param:
**/
_runLoaderWidget: function(elm){
var self = this;
if(self.o.indicator === true){
elm
.parents(self.o.widgets)
.find('.panel-loader')
.stop(true, true)
.fadeIn(100)
.delay(self.o.indicatorTime)
.fadeOut(100);
}
},
/**
* Create a fixed timestamp.
*
* @param: t | date | Current date.
**/
_getPastTimestamp: function(t) {
var self = this;
var da = new Date(t);
/**
* Get and set the date and time.
**/
tsMonth = da.getMonth() + 1;// index based
tsDay = da.getDate();
tsYear = da.getFullYear();
tsHours = da.getHours();
tsMinutes = da.getMinutes();
tsSeconds = da.getUTCSeconds();
/**
* Checking for one digit values, if so add an zero.
**/
if(tsMonth < 10) { var tsMonth = '0'+tsMonth }
if(tsDay < 10) { var tsDay = '0'+tsDay }
if(tsHours < 10) { var tsHours = '0'+tsHours }
if(tsMinutes < 10) { var tsMinutes = '0'+tsMinutes }
if(tsSeconds < 10) { var tsSeconds = '0'+tsSeconds }
/**
* The output, how you want it.
**/
var format = self.o.timestampFormat
.replace(/%d%/g, tsDay)
.replace(/%m%/g, tsMonth)
.replace(/%y%/g, tsYear)
.replace(/%h%/g, tsHours)
.replace(/%i%/g, tsMinutes)
.replace(/%s%/g, tsSeconds);
return format;
},
/**
* AJAX load File, which get and shows the .
*
* @param: awidget | object | The widget.
* @param: file | file | The file thats beeing loaded.
* @param: loader | object | The widget.
**/
_loadAjaxFile: function(awidget, file, loader){
var self = this;
awidget.find('.panel-ajax-placeholder').append('
')
.children('div')
.removeAttr('style')
.end()
.find('.panel-fullscreen-btn')
.children()
.removeClass(self.fullscreenClass[1])
.addClass(self.fullscreenClass[0])
.parents(self.pwCtrls)
.children('a')
.show();
/**
* Reset collapsed widgets.
**/
if(thisWidgetContent.hasClass('panel-visible')){
thisWidgetContent.hide().removeClass('panel-visible');
}
}else{
/**
* Prevent the body from scrolling.
**/
$('body').addClass('nooverflow');
/**
* Wrap, append it to the body, show the right button
* and hide all other buttons.
**/
thisWidget
.wrap('
')
.parent()
.find('.panel-fullscreen-btn')
.children()
.removeClass(self.fullscreenClass[0])
.addClass(self.fullscreenClass[1])
.parents(self.pwCtrls)
.children('a:not(.panel-fullscreen-btn)')
.hide();
/**
* Show collapsed widgets.
**/
if(thisWidgetContent.is(':hidden')){
thisWidgetContent
.show()
.addClass('panel-visible');
}
}
/**
* Run the set height function.
**/
heightFullscreen();
/**
* Run the callback function.
**/
if(typeof self.o.onFullscreen == 'function'){
self.o.onFullscreen.call(this, thisWidget);
}
e.preventDefault();
});
/**
* Run the set fullscreen height function when the screen resizes.
**/
$(window).resize(function(){
/**
* Run the set height function.
**/
heightFullscreen();
});
//*****************************************************************//
//////////////////////////// EDIT WIDGETS ///////////////////////////
//*****************************************************************//
/**
* Allow users to show/hide a edit box.
**/
self.widget.on(clickEvent,'.panel-edit-btn', function(e){
var tWidget = $(this).parents(self.o.widgets);
/**
* Run function for the indicator image.
**/
self._runLoaderWidget($(this));
/**
* Show/hide the edit box.
**/
tWidget.find(self.o.toggleColorsPlaceholder).slideUp();
if(tWidget.find(self.o.editPlaceholder).is(':visible')){
$(this)
.children()
.removeClass(self.editClass[1])
.addClass(self.editClass[0])
.parents(self.o.widgets)
.find(self.o.editPlaceholder)
.slideUp(self.o.editSpeed,function(){
self._saveSettingsWidget();
});
$(this).parents(self.o.widgets).removeClass('panel-toolbar-editbox panel-toolbar-colorbox');
}else{
$(this)
.children()
.removeClass(self.editClass[0])
.addClass(self.editClass[1])
.parents(self.o.widgets)
.find(self.o.editPlaceholder)
.slideDown(self.o.editSpeed);
$(this).parents(self.o.widgets).removeClass('panel-toolbar-colorbox');
$(this).parents(self.o.widgets).addClass('panel-toolbar-editbox');
}
/**
* Run the callback function.
**/
if(typeof self.o.onEdit == 'function'){
self.o.onEdit.call(this, tWidget);
}
e.preventDefault();
});
/**
* Allow users to show/hide a toggleColorBox box lel.
**/
self.widget.on(clickEvent,'.panel-toggle-color', function(e){
var tWidget = $(this).parents(self.o.widgets);
/**
* Run function for the indicator image.
**/
self._runLoaderWidget($(this));
/**
* Show/hide the edit box.
**/
tWidget.find(self.o.editPlaceholder).slideUp();
if(tWidget.find(self.o.toggleColorsPlaceholder).is(':visible')){
$(this)
.children()
.removeClass(self.editClass[1])
.addClass(self.editClass[0])
.parents(self.o.widgets)
.find(self.o.toggleColorsPlaceholder)
.slideUp(self.o.editSpeed,function(){
self._saveSettingsWidget();
});
$(this).parents(self.o.widgets).removeClass('panel-toolbar-editbox panel-toolbar-colorbox');
}else{
$(this)
.children()
.removeClass(self.editClass[0])
.addClass(self.editClass[1])
.parents(self.o.widgets)
.find(self.o.toggleColorsPlaceholder)
.slideDown(self.o.editSpeed);
$(this).parents(self.o.widgets).removeClass('panel-toolbar-editbox');
$(this).parents(self.o.widgets).addClass('panel-toolbar-colorbox');
}
/**
* Run the callback function.
**/
if(typeof self.o.onEdit == 'function'){
self.o.onEdit.call(this, tWidget);
}
e.preventDefault();
});
/**
* Update the widgets title by using the edit input.
**/
$(self.o.editPlaceholder).find('input').keyup(function(){
$(this)
.parents(self.o.widgets)
.children('.panel-heading')
.children('h2')
.text($(this).val());
});
/**
* Set a custom style.
**/
self.widget.on(clickEvent,'[data-widget-setstyle]', function(e){
var val = $(this).data('widget-setstyle');
var styles = '';
/**
* Get all other styles, in order to remove it.
**/
$(this).parents(self.o.toggleColorsPlaceholder).find('[data-widget-setstyle]').each(function(){
styles += $(this).data('widget-setstyle')+' ';
});
/**
* Set the new style.
**/
$(this).parents(self.o.widgets).attr('data-widget-attstyle', ''+val+'').removeClass(styles).addClass(val);
/**
* Run function for the indicator image.
**/
self._runLoaderWidget($(this));
/**
* Lets save the setings.
**/
self._saveSettingsWidget();
e.preventDefault();
});
//*****************************************************************//
/////////////////////////// CUSTOM ACTION ///////////////////////////
//*****************************************************************//
/**
* Allow users to show/hide a edit box.
**/
self.widget.on(clickEvent,'.panel-custom-btn', function(e){
var w = $(this).parents(self.o.widgets);
/**
* Run function for the indicator image.
**/
self._runLoaderWidget($(this));
/**
* Start and end custom action.
**/
if($(this).children('.'+self.customClass[0]).length){
$(this)
.children()
.removeClass(self.customClass[0])
.addClass(self.customClass[1]);
/**
* Run the callback function.
**/
if(typeof self.o.customStart == 'function'){
self.o.customStart.call(this, w);
}
}else{
$(this)
.children()
.removeClass(self.customClass[1])
.addClass(self.customClass[0]);
/**
* Run the callback function.
**/
if(typeof self.o.customEnd == 'function'){
self.o.customEnd.call(this, w);
}
}
/**
* Lets save the setings.
**/
self._saveSettingsWidget();
e.preventDefault();
});
//*****************************************************************//
/////////////////////////// DELETE WIDGETS //////////////////////////
//*****************************************************************//
/**
* Allow users to delete the widgets.
**/
self.widget.on(clickEvent,'.panel-delete-btn', function(e){
var tWidget = $(this).parents(self.o.widgets);
var removeId = tWidget.attr('id');
var widTitle = tWidget.children('.panel-heading').children('h2').text();
/**
* Delete the widgets with a confirm popup.
**/
// var cleared = confirm(self.o.labelDelete+' "'+widTitle+'"');
var that = this;
if (bootbox !== undefined) {
bootbox.confirm("Are you sure?", function(result) {
// Example.show("Confirm result: "+result);
if(result) {
/**
* Run function for the indicator image.
**/
self._runLoaderWidget($(that));
/**
* Delete the right widget.
**/
$('#'+removeId).fadeOut(self.o.deleteSpeed, function(){
$(this).remove();
/**
* Run the callback function.
**/
if(typeof self.o.onDelete == 'function'){
self.o.onDelete.call(this, tWidget);
}
});
}
});
} else {
var cleared = confirm(self.o.labelDelete+' "'+widTitle+'"');
if(cleared) {
/**
* Run function for the indicator image.
**/
self._runLoaderWidget($(that));
/**
* Delete the right widget.
**/
$('#'+removeId).fadeOut(self.o.deleteSpeed, function(){
$(this).remove();
/**
* Run the callback function.
**/
if(typeof self.o.onDelete == 'function'){
self.o.onDelete.call(this, tWidget);
}
});
}
}
e.preventDefault();
});
//******************************************************************//
/////////////////////////// REFRESH BUTTON ///////////////////////////
//******************************************************************//
/**
* Refresh ajax upon clicking refresh link.
**/
self.widget.on(clickEvent, '.panel-refresh-btn', function(e){
/**
* Variables.
**/
var rItem = $(this).parents(self.o.widgets);
var pathToFile = rItem.data('widget-load');
var ajaxLoader = rItem.children();
/**
* Run the ajax function.
**/
self._loadAjaxFile(rItem, pathToFile, ajaxLoader);
e.preventDefault();
});
},
/**
* Destroy.
*
* @param:
**/
destroy: function(){
var self = this;
self.widget.off('click',self._clickEvents());
self.obj.removeData(pluginName);
}
};
$.fn[pluginName] = function(option) {
return this.each(function() {
var $this = $(this);
var data = $this.data(pluginName);
var options = typeof option == 'object' && option;
if (!data){
$this.data(pluginName, (data = new Plugin(this, options)))
}
if (typeof option == 'string'){
data[option]();
}
});
};
/**
* Default settings(dont change).
* You can globally override these options
* by using $.fn.pluginName.key = 'value';
**/
$.fn[pluginName].defaults = {
grid: '.bs-grid',
widgets: '.panel',
localStorage: true,
deleteSettingsKey: '',
settingsKeyLabel: 'Reset settings?',
deletePositionKey: '',
positionKeyLabel: 'Reset position?',
sortable: true,
buttonsHidden: false,
toggleButton: true,
toggleClass: 'fa fa-minus | fa fa-plus',
toggleSpeed: 200,
onToggle: function(){},
deleteButton: true,
deleteClass: 'fa fa-times',
deleteSpeed: 200,
onDelete: function(){},
editButton: true,
toggleColors: false,
editPlaceholder: '.panel-editbox',
toggleColorsPlaceholder: '.panel-colorbox',
editClass: 'fa fa-pencil | fa fa-pencil',
editSpeed: 200,
toggleColorClass: 'fa fa-tint',
onEdit: function(){},
fullscreenButton: true,
fullscreenClass: 'fa fa-expand | fa fa-compress',
fullscreenDiff: 3,
onFullscreen: function(){},
customButton: true,
customClass: '',
customStart: function(){},
customEnd: function(){},
buttonOrder: '%refresh% %delete% %custom% %edit% %toggleColors% %fullscreen% %toggle%',
opacity: 1.0,
dragHandle: '> .panel-heading',
placeholderClass: 'panel-placeholder',
indicator: true,
indicatorTime: 600,
ajax: true,
loadingLabel: 'loading...',
timestampPlaceholder:'.panel-timestamp',
timestampFormat: 'Last update: %m%/%d%/%y% %h%:%i%:%s%',
refreshButton: true,
refreshButtonClass: 'fa fa-refresh',
labelError:'Sorry but there was a error:',
labelUpdated: 'Last Update:',
labelRefresh: 'Refresh',
labelDelete: 'Delete widget:',
afterLoad: function(){},
rtl: false,
onChange: function(){},
onSave: function(){}
};
})(jQuery, window, document);