You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1950 lines
43 KiB
1950 lines
43 KiB
/** |
|
* Xenon Main |
|
* |
|
* Theme by: www.laborator.co |
|
**/ |
|
|
|
var public_vars = public_vars || {}; |
|
|
|
;(function($, window, undefined){ |
|
|
|
"use strict"; |
|
|
|
$(document).ready(function() |
|
{ |
|
// Main Vars |
|
public_vars.$body = $("body"); |
|
public_vars.$pageContainer = public_vars.$body.find(".page-container"); |
|
public_vars.$chat = public_vars.$pageContainer.find("#chat"); |
|
public_vars.$sidebarMenu = public_vars.$pageContainer.find('.sidebar-menu'); |
|
public_vars.$sidebarProfile = public_vars.$sidebarMenu.find('.sidebar-user-info'); |
|
public_vars.$mainMenu = public_vars.$sidebarMenu.find('.main-menu'); |
|
|
|
public_vars.$horizontalNavbar = public_vars.$body.find('.navbar.horizontal-menu'); |
|
public_vars.$horizontalMenu = public_vars.$horizontalNavbar.find('.navbar-nav'); |
|
|
|
public_vars.$mainContent = public_vars.$pageContainer.find('.main-content'); |
|
public_vars.$mainFooter = public_vars.$body.find('footer.main-footer'); |
|
|
|
public_vars.$userInfoMenuHor = public_vars.$body.find('.navbar.horizontal-menu'); |
|
public_vars.$userInfoMenu = public_vars.$body.find('nav.navbar.user-info-navbar'); |
|
|
|
public_vars.$settingsPane = public_vars.$body.find('.settings-pane'); |
|
public_vars.$settingsPaneIn = public_vars.$settingsPane.find('.settings-pane-inner'); |
|
|
|
public_vars.wheelPropagation = true; // used in Main menu (sidebar) |
|
|
|
public_vars.$pageLoadingOverlay = public_vars.$body.find('.page-loading-overlay'); |
|
|
|
public_vars.defaultColorsPalette = ['#68b828','#7c38bc','#0e62c7','#fcd036','#4fcdfc','#00b19d','#ff6264','#f7aa47']; |
|
|
|
|
|
|
|
// Page Loading Overlay |
|
if(public_vars.$pageLoadingOverlay.length) |
|
{ |
|
$(window).load(function() |
|
{ |
|
public_vars.$pageLoadingOverlay.addClass('loaded'); |
|
}); |
|
} |
|
|
|
window.onerror = function() |
|
{ |
|
// failsafe remove loading overlay |
|
public_vars.$pageLoadingOverlay.addClass('loaded'); |
|
} |
|
|
|
|
|
// Setup Sidebar Menu |
|
setup_sidebar_menu(); |
|
|
|
|
|
// Setup Horizontal Menu |
|
setup_horizontal_menu(); |
|
|
|
|
|
// Sticky Footer |
|
if(public_vars.$mainFooter.hasClass('sticky')) |
|
{ |
|
stickFooterToBottom(); |
|
$(window).on('xenon.resized', stickFooterToBottom); |
|
} |
|
|
|
|
|
// Perfect Scrollbar |
|
if($.isFunction($.fn.perfectScrollbar)) |
|
{ |
|
if(public_vars.$sidebarMenu.hasClass('fixed')) |
|
ps_init(); |
|
|
|
$(".ps-scrollbar").each(function(i, el) |
|
{ |
|
var $el = $(el); |
|
|
|
if($el.hasClass('ps-scroll-down')) |
|
{ |
|
$el.scrollTop($el.prop('scrollHeight')); |
|
} |
|
|
|
$el.perfectScrollbar({ |
|
wheelPropagation: false |
|
}); |
|
}); |
|
|
|
|
|
// Chat Scrollbar |
|
var $chat_inner = public_vars.$pageContainer.find('#chat .chat-inner'); |
|
|
|
if($chat_inner.parent().hasClass('fixed')) |
|
$chat_inner.css({maxHeight: $(window).height()}).perfectScrollbar(); |
|
|
|
|
|
// User info opening dropdown trigger PS update |
|
$(".dropdown:has(.ps-scrollbar)").each(function(i, el) |
|
{ |
|
var $scrollbar = $(this).find('.ps-scrollbar'); |
|
|
|
$(this).on('click', '[data-toggle="dropdown"]', function(ev) |
|
{ |
|
ev.preventDefault(); |
|
|
|
setTimeout(function() |
|
{ |
|
$scrollbar.perfectScrollbar('update'); |
|
}, 1); |
|
}); |
|
}); |
|
|
|
|
|
// Scrollable |
|
$("div.scrollable").each(function(i, el) |
|
{ |
|
var $this = $(el), |
|
max_height = parseInt(attrDefault($this, 'max-height', 200), 10); |
|
|
|
max_height = max_height < 0 ? 200 : max_height; |
|
|
|
$this.css({maxHeight: max_height}).perfectScrollbar({ |
|
wheelPropagation: true |
|
}); |
|
}); |
|
} |
|
|
|
|
|
// User info search button |
|
var $uim_search_form = $(".user-info-menu .search-form, .nav.navbar-right .search-form"); |
|
|
|
$uim_search_form.each(function(i, el) |
|
{ |
|
var $uim_search_input = $(el).find('.form-control'); |
|
|
|
$(el).on('click', '.btn', function(ev) |
|
{ |
|
if($uim_search_input.val().trim().length == 0) |
|
{ |
|
jQuery(el).addClass('focused'); |
|
setTimeout(function(){ $uim_search_input.focus(); }, 100); |
|
return false; |
|
} |
|
}); |
|
|
|
$uim_search_input.on('blur', function() |
|
{ |
|
jQuery(el).removeClass('focused'); |
|
}); |
|
}); |
|
|
|
|
|
|
|
// Fixed Footer |
|
if(public_vars.$mainFooter.hasClass('fixed')) |
|
{ |
|
public_vars.$mainContent.css({ |
|
paddingBottom: public_vars.$mainFooter.outerHeight(true) |
|
}); |
|
} |
|
|
|
|
|
|
|
// Go to top links |
|
$('body').on('click', 'a[rel="go-top"]', function(ev) |
|
{ |
|
ev.preventDefault(); |
|
|
|
var obj = {pos: $(window).scrollTop()}; |
|
|
|
TweenLite.to(obj, .3, {pos: 0, ease:Power4.easeOut, onUpdate: function() |
|
{ |
|
$(window).scrollTop(obj.pos); |
|
}}); |
|
}); |
|
|
|
|
|
|
|
|
|
// User info navbar equal heights |
|
if(public_vars.$userInfoMenu.length) |
|
{ |
|
public_vars.$userInfoMenu.find('.user-info-menu > li').css({ |
|
minHeight: public_vars.$userInfoMenu.outerHeight() - 1 |
|
}); |
|
} |
|
|
|
|
|
|
|
// Autosize |
|
if($.isFunction($.fn.autosize)) |
|
{ |
|
$(".autosize, .autogrow").autosize(); |
|
} |
|
|
|
|
|
// Custom Checkboxes & radios |
|
cbr_replace(); |
|
|
|
|
|
|
|
// Auto hidden breadcrumbs |
|
$(".breadcrumb.auto-hidden").each(function(i, el) |
|
{ |
|
var $bc = $(el), |
|
$as = $bc.find('li a'), |
|
collapsed_width = $as.width(), |
|
expanded_width = 0; |
|
|
|
$as.each(function(i, el) |
|
{ |
|
var $a = $(el); |
|
|
|
expanded_width = $a.outerWidth(true) + 5; |
|
$a.addClass('collapsed').width(expanded_width); |
|
|
|
$a.hover(function() |
|
{ |
|
$a.removeClass('collapsed'); |
|
}, |
|
function() |
|
{ |
|
$a.addClass('collapsed'); |
|
}); |
|
}); |
|
}); |
|
|
|
|
|
|
|
// Close Modal on Escape Keydown |
|
$(window).on('keydown', function(ev) |
|
{ |
|
// Escape |
|
if(ev.keyCode == 27) |
|
{ |
|
// Close opened modal |
|
if(public_vars.$body.hasClass('modal-open')) |
|
$(".modal-open .modal:visible").modal('hide'); |
|
} |
|
}); |
|
|
|
|
|
// Minimal Addon focus interaction |
|
$(".input-group.input-group-minimal:has(.form-control)").each(function(i, el) |
|
{ |
|
var $this = $(el), |
|
$fc = $this.find('.form-control'); |
|
|
|
$fc.on('focus', function() |
|
{ |
|
$this.addClass('focused'); |
|
}).on('blur', function() |
|
{ |
|
$this.removeClass('focused'); |
|
}); |
|
}); |
|
|
|
|
|
|
|
// Spinner |
|
$(".input-group.spinner").each(function(i, el) |
|
{ |
|
var $ig = $(el), |
|
$dec = $ig.find('[data-type="decrement"]'), |
|
$inc = $ig.find('[data-type="increment"]'), |
|
$inp = $ig.find('.form-control'), |
|
|
|
step = attrDefault($ig, 'step', 1), |
|
min = attrDefault($ig, 'min', 0), |
|
max = attrDefault($ig, 'max', 0), |
|
umm = min < max; |
|
|
|
|
|
$dec.on('click', function(ev) |
|
{ |
|
ev.preventDefault(); |
|
|
|
var num = new Number($inp.val()) - step; |
|
|
|
if(umm && num <= min) |
|
{ |
|
num = min; |
|
} |
|
|
|
$inp.val(num); |
|
}); |
|
|
|
$inc.on('click', function(ev) |
|
{ |
|
ev.preventDefault(); |
|
|
|
var num = new Number($inp.val()) + step; |
|
|
|
if(umm && num >= max) |
|
{ |
|
num = max; |
|
} |
|
|
|
$inp.val(num); |
|
}); |
|
}); |
|
|
|
|
|
|
|
|
|
// Select2 Dropdown replacement |
|
if($.isFunction($.fn.select2)) |
|
{ |
|
$(".select2").each(function(i, el) |
|
{ |
|
var $this = $(el), |
|
opts = { |
|
allowClear: attrDefault($this, 'allowClear', false) |
|
}; |
|
|
|
$this.select2(opts); |
|
$this.addClass('visible'); |
|
|
|
//$this.select2("open"); |
|
}); |
|
|
|
|
|
if($.isFunction($.fn.niceScroll)) |
|
{ |
|
$(".select2-results").niceScroll({ |
|
cursorcolor: '#d4d4d4', |
|
cursorborder: '1px solid #ccc', |
|
railpadding: {right: 3} |
|
}); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
// SelectBoxIt Dropdown replacement |
|
if($.isFunction($.fn.selectBoxIt)) |
|
{ |
|
$("select.selectboxit").each(function(i, el) |
|
{ |
|
var $this = $(el), |
|
opts = { |
|
showFirstOption: attrDefault($this, 'first-option', true), |
|
'native': attrDefault($this, 'native', false), |
|
defaultText: attrDefault($this, 'text', ''), |
|
}; |
|
|
|
$this.addClass('visible'); |
|
$this.selectBoxIt(opts); |
|
}); |
|
} |
|
|
|
|
|
|
|
// Datepicker |
|
if($.isFunction($.fn.datepicker)) |
|
{ |
|
$(".datepicker").each(function(i, el) |
|
{ |
|
var $this = $(el), |
|
opts = { |
|
format: attrDefault($this, 'format', 'mm/dd/yyyy'), |
|
startDate: attrDefault($this, 'startDate', ''), |
|
endDate: attrDefault($this, 'endDate', ''), |
|
daysOfWeekDisabled: attrDefault($this, 'disabledDays', ''), |
|
startView: attrDefault($this, 'startView', 0), |
|
rtl: rtl() |
|
}, |
|
$n = $this.next(), |
|
$p = $this.prev(); |
|
|
|
$this.datepicker(opts); |
|
|
|
if($n.is('.input-group-addon') && $n.has('a')) |
|
{ |
|
$n.on('click', function(ev) |
|
{ |
|
ev.preventDefault(); |
|
|
|
$this.datepicker('show'); |
|
}); |
|
} |
|
|
|
if($p.is('.input-group-addon') && $p.has('a')) |
|
{ |
|
$p.on('click', function(ev) |
|
{ |
|
ev.preventDefault(); |
|
|
|
$this.datepicker('show'); |
|
}); |
|
} |
|
}); |
|
} |
|
|
|
|
|
|
|
// Date Range Picker |
|
if($.isFunction($.fn.daterangepicker)) |
|
{ |
|
$(".daterange").each(function(i, el) |
|
{ |
|
// Change the range as you desire |
|
var ranges = { |
|
'Today': [moment(), moment()], |
|
'Yesterday': [moment().subtract('days', 1), moment().subtract('days', 1)], |
|
'Last 7 Days': [moment().subtract('days', 6), moment()], |
|
'Last 30 Days': [moment().subtract('days', 29), moment()], |
|
'This Month': [moment().startOf('month'), moment().endOf('month')], |
|
'Last Month': [moment().subtract('month', 1).startOf('month'), moment().subtract('month', 1).endOf('month')] |
|
}; |
|
|
|
var $this = $(el), |
|
opts = { |
|
format: attrDefault($this, 'format', 'MM/DD/YYYY'), |
|
timePicker: attrDefault($this, 'timePicker', false), |
|
timePickerIncrement: attrDefault($this, 'timePickerIncrement', false), |
|
separator: attrDefault($this, 'separator', ' - '), |
|
}, |
|
min_date = attrDefault($this, 'minDate', ''), |
|
max_date = attrDefault($this, 'maxDate', ''), |
|
start_date = attrDefault($this, 'startDate', ''), |
|
end_date = attrDefault($this, 'endDate', ''); |
|
|
|
if($this.hasClass('add-ranges')) |
|
{ |
|
opts['ranges'] = ranges; |
|
} |
|
|
|
if(min_date.length) |
|
{ |
|
opts['minDate'] = min_date; |
|
} |
|
|
|
if(max_date.length) |
|
{ |
|
opts['maxDate'] = max_date; |
|
} |
|
|
|
if(start_date.length) |
|
{ |
|
opts['startDate'] = start_date; |
|
} |
|
|
|
if(end_date.length) |
|
{ |
|
opts['endDate'] = end_date; |
|
} |
|
|
|
|
|
$this.daterangepicker(opts, function(start, end) |
|
{ |
|
var drp = $this.data('daterangepicker'); |
|
|
|
if($this.is('[data-callback]')) |
|
{ |
|
//daterange_callback(start, end); |
|
callback_test(start, end); |
|
} |
|
|
|
if($this.hasClass('daterange-inline')) |
|
{ |
|
$this.find('span').html(start.format(drp.format) + drp.separator + end.format(drp.format)); |
|
} |
|
}); |
|
|
|
if(typeof opts['ranges'] == 'object') |
|
{ |
|
$this.data('daterangepicker').container.removeClass('show-calendar'); |
|
} |
|
}); |
|
} |
|
|
|
|
|
|
|
// Timepicker |
|
if($.isFunction($.fn.timepicker)) |
|
{ |
|
$(".timepicker").each(function(i, el) |
|
{ |
|
var $this = $(el), |
|
opts = { |
|
template: attrDefault($this, 'template', false), |
|
showSeconds: attrDefault($this, 'showSeconds', false), |
|
defaultTime: attrDefault($this, 'defaultTime', 'current'), |
|
showMeridian: attrDefault($this, 'showMeridian', true), |
|
minuteStep: attrDefault($this, 'minuteStep', 15), |
|
secondStep: attrDefault($this, 'secondStep', 15) |
|
}, |
|
$n = $this.next(), |
|
$p = $this.prev(); |
|
|
|
$this.timepicker(opts); |
|
|
|
if($n.is('.input-group-addon') && $n.has('a')) |
|
{ |
|
$n.on('click', function(ev) |
|
{ |
|
ev.preventDefault(); |
|
|
|
$this.timepicker('showWidget'); |
|
}); |
|
} |
|
|
|
if($p.is('.input-group-addon') && $p.has('a')) |
|
{ |
|
$p.on('click', function(ev) |
|
{ |
|
ev.preventDefault(); |
|
|
|
$this.timepicker('showWidget'); |
|
}); |
|
} |
|
}); |
|
} |
|
|
|
|
|
|
|
// Colorpicker |
|
if($.isFunction($.fn.colorpicker)) |
|
{ |
|
$(".colorpicker").each(function(i, el) |
|
{ |
|
var $this = $(el), |
|
opts = { |
|
}, |
|
$n = $this.next(), |
|
$p = $this.prev(), |
|
|
|
$preview = $this.siblings('.input-group-addon').find('.color-preview'); |
|
|
|
$this.colorpicker(opts); |
|
|
|
if($n.is('.input-group-addon') && $n.has('a')) |
|
{ |
|
$n.on('click', function(ev) |
|
{ |
|
ev.preventDefault(); |
|
|
|
$this.colorpicker('show'); |
|
}); |
|
} |
|
|
|
if($p.is('.input-group-addon') && $p.has('a')) |
|
{ |
|
$p.on('click', function(ev) |
|
{ |
|
ev.preventDefault(); |
|
|
|
$this.colorpicker('show'); |
|
}); |
|
} |
|
|
|
if($preview.length) |
|
{ |
|
$this.on('changeColor', function(ev){ |
|
|
|
$preview.css('background-color', ev.color.toHex()); |
|
}); |
|
|
|
if($this.val().length) |
|
{ |
|
$preview.css('background-color', $this.val()); |
|
} |
|
} |
|
}); |
|
} |
|
|
|
|
|
|
|
|
|
// Form Validation |
|
if($.isFunction($.fn.validate)) |
|
{ |
|
$("form.validate").each(function(i, el) |
|
{ |
|
var $this = $(el), |
|
opts = { |
|
rules: {}, |
|
messages: {}, |
|
errorElement: 'span', |
|
errorClass: 'validate-has-error', |
|
highlight: function (element) { |
|
$(element).closest('.form-group').addClass('validate-has-error'); |
|
}, |
|
unhighlight: function (element) { |
|
$(element).closest('.form-group').removeClass('validate-has-error'); |
|
}, |
|
errorPlacement: function (error, element) |
|
{ |
|
if(element.closest('.has-switch').length) |
|
{ |
|
error.insertAfter(element.closest('.has-switch')); |
|
} |
|
else |
|
if(element.parent('.checkbox, .radio').length || element.parent('.input-group').length) |
|
{ |
|
error.insertAfter(element.parent()); |
|
} |
|
else |
|
{ |
|
error.insertAfter(element); |
|
} |
|
} |
|
}, |
|
$fields = $this.find('[data-validate]'); |
|
|
|
|
|
$fields.each(function(j, el2) |
|
{ |
|
var $field = $(el2), |
|
name = $field.attr('name'), |
|
validate = attrDefault($field, 'validate', '').toString(), |
|
_validate = validate.split(','); |
|
|
|
for(var k in _validate) |
|
{ |
|
var rule = _validate[k], |
|
params, |
|
message; |
|
|
|
if(typeof opts['rules'][name] == 'undefined') |
|
{ |
|
opts['rules'][name] = {}; |
|
opts['messages'][name] = {}; |
|
} |
|
|
|
if($.inArray(rule, ['required', 'url', 'email', 'number', 'date', 'creditcard']) != -1) |
|
{ |
|
opts['rules'][name][rule] = true; |
|
|
|
message = $field.data('message-' + rule); |
|
|
|
if(message) |
|
{ |
|
opts['messages'][name][rule] = message; |
|
} |
|
} |
|
// Parameter Value (#1 parameter) |
|
else |
|
if(params = rule.match(/(\w+)\[(.*?)\]/i)) |
|
{ |
|
if($.inArray(params[1], ['min', 'max', 'minlength', 'maxlength', 'equalTo']) != -1) |
|
{ |
|
opts['rules'][name][params[1]] = params[2]; |
|
|
|
|
|
message = $field.data('message-' + params[1]); |
|
|
|
if(message) |
|
{ |
|
opts['messages'][name][params[1]] = message; |
|
} |
|
} |
|
} |
|
} |
|
}); |
|
|
|
$this.validate(opts); |
|
}); |
|
} |
|
|
|
|
|
|
|
|
|
// Input Mask |
|
if($.isFunction($.fn.inputmask)) |
|
{ |
|
$("[data-mask]").each(function(i, el) |
|
{ |
|
var $this = $(el), |
|
mask = $this.data('mask').toString(), |
|
opts = { |
|
numericInput: attrDefault($this, 'numeric', false), |
|
radixPoint: attrDefault($this, 'radixPoint', ''), |
|
rightAlign: attrDefault($this, 'numericAlign', 'left') == 'right' |
|
}, |
|
placeholder = attrDefault($this, 'placeholder', ''), |
|
is_regex = attrDefault($this, 'isRegex', ''); |
|
|
|
if(placeholder.length) |
|
{ |
|
opts[placeholder] = placeholder; |
|
} |
|
|
|
switch(mask.toLowerCase()) |
|
{ |
|
case "phone": |
|
mask = "(999) 999-9999"; |
|
break; |
|
|
|
case "currency": |
|
case "rcurrency": |
|
|
|
var sign = attrDefault($this, 'sign', '$');; |
|
|
|
mask = "999,999,999.99"; |
|
|
|
if($this.data('mask').toLowerCase() == 'rcurrency') |
|
{ |
|
mask += ' ' + sign; |
|
} |
|
else |
|
{ |
|
mask = sign + ' ' + mask; |
|
} |
|
|
|
opts.numericInput = true; |
|
opts.rightAlignNumerics = false; |
|
opts.radixPoint = '.'; |
|
break; |
|
|
|
case "email": |
|
mask = 'Regex'; |
|
opts.regex = "[a-zA-Z0-9._%-]+@[a-zA-Z0-9-]+\\.[a-zA-Z]{2,4}"; |
|
break; |
|
|
|
case "fdecimal": |
|
mask = 'decimal'; |
|
$.extend(opts, { |
|
autoGroup : true, |
|
groupSize : 3, |
|
radixPoint : attrDefault($this, 'rad', '.'), |
|
groupSeparator : attrDefault($this, 'dec', ',') |
|
}); |
|
} |
|
|
|
if(is_regex) |
|
{ |
|
opts.regex = mask; |
|
mask = 'Regex'; |
|
} |
|
|
|
$this.inputmask(mask, opts); |
|
}); |
|
} |
|
|
|
|
|
|
|
// Form Wizard |
|
if($.isFunction($.fn.bootstrapWizard)) |
|
{ |
|
$(".form-wizard").each(function(i, el) |
|
{ |
|
var $this = $(el), |
|
$tabs = $this.find('> .tabs > li'), |
|
$progress = $this.find(".progress-indicator"), |
|
_index = $this.find('> ul > li.active').index(); |
|
|
|
// Validation |
|
var checkFormWizardValidaion = function(tab, navigation, index) |
|
{ |
|
if($this.hasClass('validate')) |
|
{ |
|
var $valid = $this.valid(); |
|
|
|
if( ! $valid) |
|
{ |
|
$this.data('validator').focusInvalid(); |
|
return false; |
|
} |
|
} |
|
|
|
return true; |
|
}; |
|
|
|
// Setup Progress |
|
if(_index > 0) |
|
{ |
|
$progress.css({width: _index/$tabs.length * 100 + '%'}); |
|
$tabs.removeClass('completed').slice(0, _index).addClass('completed'); |
|
} |
|
|
|
$this.bootstrapWizard({ |
|
tabClass: "", |
|
onTabShow: function($tab, $navigation, index) |
|
{ |
|
var pct = $tabs.eq(index).position().left / $tabs.parent().width() * 100; |
|
|
|
$tabs.removeClass('completed').slice(0, index).addClass('completed'); |
|
$progress.css({width: pct + '%'}); |
|
}, |
|
|
|
onNext: checkFormWizardValidaion, |
|
onTabClick: checkFormWizardValidaion |
|
}); |
|
|
|
$this.data('bootstrapWizard').show( _index ); |
|
|
|
$this.find('.pager a').on('click', function(ev) |
|
{ |
|
ev.preventDefault(); |
|
}); |
|
}); |
|
} |
|
|
|
|
|
|
|
|
|
// Slider |
|
if($.isFunction($.fn.slider)) |
|
{ |
|
$(".slider").each(function(i, el) |
|
{ |
|
var $this = $(el), |
|
$label_1 = $('<span class="ui-label"></span>'), |
|
$label_2 = $label_1.clone(), |
|
|
|
orientation = attrDefault($this, 'vertical', 0) != 0 ? 'vertical' : 'horizontal', |
|
|
|
prefix = attrDefault($this, 'prefix', ''), |
|
postfix = attrDefault($this, 'postfix', ''), |
|
|
|
fill = attrDefault($this, 'fill', ''), |
|
$fill = $(fill), |
|
|
|
step = attrDefault($this, 'step', 1), |
|
value = attrDefault($this, 'value', 5), |
|
min = attrDefault($this, 'min', 0), |
|
max = attrDefault($this, 'max', 100), |
|
min_val = attrDefault($this, 'min-val', 10), |
|
max_val = attrDefault($this, 'max-val', 90), |
|
|
|
is_range = $this.is('[data-min-val]') || $this.is('[data-max-val]'), |
|
|
|
reps = 0; |
|
|
|
|
|
// Range Slider Options |
|
if(is_range) |
|
{ |
|
$this.slider({ |
|
range: true, |
|
orientation: orientation, |
|
min: min, |
|
max: max, |
|
values: [min_val, max_val], |
|
step: step, |
|
slide: function(e, ui) |
|
{ |
|
var min_val = (prefix ? prefix : '') + ui.values[0] + (postfix ? postfix : ''), |
|
max_val = (prefix ? prefix : '') + ui.values[1] + (postfix ? postfix : ''); |
|
|
|
$label_1.html( min_val ); |
|
$label_2.html( max_val ); |
|
|
|
if(fill) |
|
$fill.val(min_val + ',' + max_val); |
|
|
|
reps++; |
|
}, |
|
change: function(ev, ui) |
|
{ |
|
if(reps == 1) |
|
{ |
|
var min_val = (prefix ? prefix : '') + ui.values[0] + (postfix ? postfix : ''), |
|
max_val = (prefix ? prefix : '') + ui.values[1] + (postfix ? postfix : ''); |
|
|
|
$label_1.html( min_val ); |
|
$label_2.html( max_val ); |
|
|
|
if(fill) |
|
$fill.val(min_val + ',' + max_val); |
|
} |
|
|
|
reps = 0; |
|
} |
|
}); |
|
|
|
var $handles = $this.find('.ui-slider-handle'); |
|
|
|
$label_1.html((prefix ? prefix : '') + min_val + (postfix ? postfix : '')); |
|
$handles.first().append( $label_1 ); |
|
|
|
$label_2.html((prefix ? prefix : '') + max_val+ (postfix ? postfix : '')); |
|
$handles.last().append( $label_2 ); |
|
} |
|
// Normal Slider |
|
else |
|
{ |
|
|
|
$this.slider({ |
|
range: attrDefault($this, 'basic', 0) ? false : "min", |
|
orientation: orientation, |
|
min: min, |
|
max: max, |
|
value: value, |
|
step: step, |
|
slide: function(ev, ui) |
|
{ |
|
var val = (prefix ? prefix : '') + ui.value + (postfix ? postfix : ''); |
|
|
|
$label_1.html( val ); |
|
|
|
|
|
if(fill) |
|
$fill.val(val); |
|
|
|
reps++; |
|
}, |
|
change: function(ev, ui) |
|
{ |
|
if(reps == 1) |
|
{ |
|
var val = (prefix ? prefix : '') + ui.value + (postfix ? postfix : ''); |
|
|
|
$label_1.html( val ); |
|
|
|
if(fill) |
|
$fill.val(val); |
|
} |
|
|
|
reps = 0; |
|
} |
|
}); |
|
|
|
var $handles = $this.find('.ui-slider-handle'); |
|
//$fill = $('<div class="ui-fill"></div>'); |
|
|
|
$label_1.html((prefix ? prefix : '') + value + (postfix ? postfix : '')); |
|
$handles.html( $label_1 ); |
|
|
|
//$handles.parent().prepend( $fill ); |
|
|
|
//$fill.width($handles.get(0).style.left); |
|
} |
|
|
|
}) |
|
} |
|
|
|
|
|
|
|
|
|
// jQuery Knob |
|
if($.isFunction($.fn.knob)) |
|
{ |
|
$(".knob").knob({ |
|
change: function (value) { |
|
}, |
|
release: function (value) { |
|
}, |
|
cancel: function () { |
|
}, |
|
draw: function () { |
|
|
|
if (this.$.data('skin') == 'tron') { |
|
|
|
var a = this.angle(this.cv) // Angle |
|
, |
|
sa = this.startAngle // Previous start angle |
|
, |
|
sat = this.startAngle // Start angle |
|
, |
|
ea // Previous end angle |
|
, eat = sat + a // End angle |
|
, |
|
r = 1; |
|
|
|
this.g.lineWidth = this.lineWidth; |
|
|
|
this.o.cursor && (sat = eat - 0.3) && (eat = eat + 0.3); |
|
|
|
if (this.o.displayPrevious) { |
|
ea = this.startAngle + this.angle(this.v); |
|
this.o.cursor && (sa = ea - 0.3) && (ea = ea + 0.3); |
|
this.g.beginPath(); |
|
this.g.strokeStyle = this.pColor; |
|
this.g.arc(this.xy, this.xy, this.radius - this.lineWidth, sa, ea, false); |
|
this.g.stroke(); |
|
} |
|
|
|
this.g.beginPath(); |
|
this.g.strokeStyle = r ? this.o.fgColor : this.fgColor; |
|
this.g.arc(this.xy, this.xy, this.radius - this.lineWidth, sat, eat, false); |
|
this.g.stroke(); |
|
|
|
this.g.lineWidth = 2; |
|
this.g.beginPath(); |
|
this.g.strokeStyle = this.o.fgColor; |
|
this.g.arc(this.xy, this.xy, this.radius - this.lineWidth + 1 + this.lineWidth * 2 / 3, 0, 2 * Math.PI, false); |
|
this.g.stroke(); |
|
|
|
return false; |
|
} |
|
} |
|
}); |
|
} |
|
|
|
|
|
|
|
|
|
// Wysiwyg Editor |
|
if($.isFunction($.fn.wysihtml5)) |
|
{ |
|
$(".wysihtml5").each(function(i, el) |
|
{ |
|
var $this = $(el), |
|
stylesheets = attrDefault($this, 'stylesheet-url', '') |
|
|
|
$(".wysihtml5").wysihtml5({ |
|
size: 'white', |
|
stylesheets: stylesheets.split(','), |
|
"html": attrDefault($this, 'html', true), |
|
"color": attrDefault($this, 'colors', true), |
|
}); |
|
}); |
|
} |
|
|
|
|
|
|
|
|
|
// CKeditor WYSIWYG |
|
if($.isFunction($.fn.ckeditor)) |
|
{ |
|
$(".ckeditor").ckeditor({ |
|
contentsLangDirection: rtl() ? 'rtl' : 'ltr' |
|
}); |
|
} |
|
|
|
|
|
|
|
// Dropzone is prezent |
|
if(typeof Dropzone != 'undefined') |
|
{ |
|
Dropzone.autoDiscover = false; |
|
|
|
$(".dropzone[action]").each(function(i, el) |
|
{ |
|
$(el).dropzone(); |
|
}); |
|
} |
|
|
|
|
|
|
|
|
|
// Tocify Table |
|
if($.isFunction($.fn.tocify) && $("#toc").length) |
|
{ |
|
$("#toc").tocify({ |
|
context: '.tocify-content', |
|
selectors: "h2,h3,h4,h5" |
|
}); |
|
|
|
|
|
var $this = $(".tocify"), |
|
watcher = scrollMonitor.create($this.get(0)); |
|
|
|
$this.width( $this.parent().width() ); |
|
|
|
watcher.lock(); |
|
|
|
watcher.stateChange(function() |
|
{ |
|
$($this.get(0)).toggleClass('fixed', this.isAboveViewport) |
|
}); |
|
} |
|
|
|
|
|
|
|
// Login Form Label Focusing |
|
$(".login-form .form-group:has(label)").each(function(i, el) |
|
{ |
|
var $this = $(el), |
|
$label = $this.find('label'), |
|
$input = $this.find('.form-control'); |
|
|
|
$input.on('focus', function() |
|
{ |
|
$this.addClass('is-focused'); |
|
}); |
|
|
|
$input.on('keydown', function() |
|
{ |
|
$this.addClass('is-focused'); |
|
}); |
|
|
|
$input.on('blur', function() |
|
{ |
|
$this.removeClass('is-focused'); |
|
|
|
if($input.val().trim().length > 0) |
|
{ |
|
$this.addClass('is-focused'); |
|
} |
|
}); |
|
|
|
$label.on('click', function() |
|
{ |
|
$input.focus(); |
|
}); |
|
|
|
if($input.val().trim().length > 0) |
|
{ |
|
$this.addClass('is-focused'); |
|
} |
|
}); |
|
|
|
}); |
|
|
|
|
|
// Enable/Disable Resizable Event |
|
var wid = 0; |
|
|
|
$(window).resize(function() { |
|
clearTimeout(wid); |
|
wid = setTimeout(trigger_resizable, 200); |
|
}); |
|
|
|
|
|
})(jQuery, window); |
|
|
|
|
|
|
|
// Sideber Menu Setup function |
|
var sm_duration = .2, |
|
sm_transition_delay = 150; |
|
|
|
function setup_sidebar_menu() |
|
{ |
|
if(public_vars.$sidebarMenu.length) |
|
{ |
|
var $items_with_subs = public_vars.$sidebarMenu.find('li:has(> ul)'), |
|
toggle_others = public_vars.$sidebarMenu.hasClass('toggle-others'); |
|
|
|
$items_with_subs.filter('.active').addClass('expanded'); |
|
|
|
// On larger screens collapse sidebar when the window is tablet screen |
|
if(is('largescreen') && public_vars.$sidebarMenu.hasClass('collapsed') == false) |
|
{ |
|
$(window).on('resize', function() |
|
{ |
|
if(is('tabletscreen')) |
|
{ |
|
public_vars.$sidebarMenu.addClass('collapsed'); |
|
ps_destroy(); |
|
} |
|
else |
|
if(is('largescreen')) |
|
{ |
|
public_vars.$sidebarMenu.removeClass('collapsed'); |
|
ps_init(); |
|
} |
|
}); |
|
} |
|
|
|
$items_with_subs.each(function(i, el) |
|
{ |
|
var $li = jQuery(el), |
|
$a = $li.children('a'), |
|
$sub = $li.children('ul'); |
|
|
|
$li.addClass('has-sub'); |
|
|
|
$a.on('click', function(ev) |
|
{ |
|
ev.preventDefault(); |
|
|
|
if(toggle_others) |
|
{ |
|
sidebar_menu_close_items_siblings($li); |
|
} |
|
|
|
if($li.hasClass('expanded') || $li.hasClass('opened')) |
|
sidebar_menu_item_collapse($li, $sub); |
|
else |
|
sidebar_menu_item_expand($li, $sub); |
|
}); |
|
}); |
|
} |
|
} |
|
|
|
function sidebar_menu_item_expand($li, $sub) |
|
{ |
|
if($li.data('is-busy') || ($li.parent('.main-menu').length && public_vars.$sidebarMenu.hasClass('collapsed'))) |
|
return; |
|
|
|
$li.addClass('expanded').data('is-busy', true); |
|
$sub.show(); |
|
|
|
var $sub_items = $sub.children(), |
|
sub_height = $sub.outerHeight(), |
|
|
|
win_y = jQuery(window).height(), |
|
total_height = $li.outerHeight(), |
|
current_y = public_vars.$sidebarMenu.scrollTop(), |
|
item_max_y = $li.position().top + current_y, |
|
fit_to_viewpport = public_vars.$sidebarMenu.hasClass('fit-in-viewport'); |
|
|
|
$sub_items.addClass('is-hidden'); |
|
$sub.height(0); |
|
|
|
|
|
TweenMax.to($sub, sm_duration, {css: {height: sub_height}, onUpdate: ps_update, onComplete: function(){ |
|
$sub.height(''); |
|
}}); |
|
|
|
var interval_1 = $li.data('sub_i_1'), |
|
interval_2 = $li.data('sub_i_2'); |
|
|
|
window.clearTimeout(interval_1); |
|
|
|
interval_1 = setTimeout(function() |
|
{ |
|
$sub_items.each(function(i, el) |
|
{ |
|
var $sub_item = jQuery(el); |
|
|
|
$sub_item.addClass('is-shown'); |
|
}); |
|
|
|
var finish_on = sm_transition_delay * $sub_items.length, |
|
t_duration = parseFloat($sub_items.eq(0).css('transition-duration')), |
|
t_delay = parseFloat($sub_items.last().css('transition-delay')); |
|
|
|
if(t_duration && t_delay) |
|
{ |
|
finish_on = (t_duration + t_delay) * 1000; |
|
} |
|
|
|
// In the end |
|
window.clearTimeout(interval_2); |
|
|
|
interval_2 = setTimeout(function() |
|
{ |
|
$sub_items.removeClass('is-hidden is-shown'); |
|
|
|
}, finish_on); |
|
|
|
|
|
$li.data('is-busy', false); |
|
|
|
}, 0); |
|
|
|
$li.data('sub_i_1', interval_1), |
|
$li.data('sub_i_2', interval_2); |
|
} |
|
|
|
function sidebar_menu_item_collapse($li, $sub) |
|
{ |
|
if($li.data('is-busy')) |
|
return; |
|
|
|
var $sub_items = $sub.children(); |
|
|
|
$li.removeClass('expanded').data('is-busy', true); |
|
$sub_items.addClass('hidden-item'); |
|
|
|
TweenMax.to($sub, sm_duration, {css: {height: 0}, onUpdate: ps_update, onComplete: function() |
|
{ |
|
$li.data('is-busy', false).removeClass('opened'); |
|
|
|
$sub.attr('style', '').hide(); |
|
$sub_items.removeClass('hidden-item'); |
|
|
|
$li.find('li.expanded ul').attr('style', '').hide().parent().removeClass('expanded'); |
|
|
|
ps_update(true); |
|
}}); |
|
} |
|
|
|
function sidebar_menu_close_items_siblings($li) |
|
{ |
|
$li.siblings().not($li).filter('.expanded, .opened').each(function(i, el) |
|
{ |
|
var $_li = jQuery(el), |
|
$_sub = $_li.children('ul'); |
|
|
|
sidebar_menu_item_collapse($_li, $_sub); |
|
}); |
|
} |
|
|
|
|
|
// Horizontal Menu |
|
function setup_horizontal_menu() |
|
{ |
|
if(public_vars.$horizontalMenu.length) |
|
{ |
|
var $items_with_subs = public_vars.$horizontalMenu.find('li:has(> ul)'), |
|
click_to_expand = public_vars.$horizontalMenu.hasClass('click-to-expand'); |
|
|
|
if(click_to_expand) |
|
{ |
|
public_vars.$mainContent.add( public_vars.$sidebarMenu ).on('click', function(ev) |
|
{ |
|
$items_with_subs.removeClass('hover'); |
|
}); |
|
} |
|
|
|
$items_with_subs.each(function(i, el) |
|
{ |
|
var $li = jQuery(el), |
|
$a = $li.children('a'), |
|
$sub = $li.children('ul'), |
|
is_root_element = $li.parent().is('.navbar-nav'); |
|
|
|
$li.addClass('has-sub'); |
|
|
|
// Mobile Only |
|
$a.on('click', function(ev) |
|
{ |
|
if(isxs()) |
|
{ |
|
ev.preventDefault(); |
|
|
|
// Automatically will toggle other menu items in mobile view |
|
if(true) |
|
{ |
|
sidebar_menu_close_items_siblings($li); |
|
} |
|
|
|
if($li.hasClass('expanded') || $li.hasClass('opened')) |
|
sidebar_menu_item_collapse($li, $sub); |
|
else |
|
sidebar_menu_item_expand($li, $sub); |
|
} |
|
}); |
|
|
|
// Click To Expand |
|
if(click_to_expand) |
|
{ |
|
$a.on('click', function(ev) |
|
{ |
|
ev.preventDefault(); |
|
|
|
if(isxs()) |
|
return; |
|
|
|
// For parents only |
|
if(is_root_element) |
|
{ |
|
$items_with_subs.filter(function(i, el){ return jQuery(el).parent().is('.navbar-nav'); }).not($li).removeClass('hover'); |
|
$li.toggleClass('hover'); |
|
} |
|
// Sub menus |
|
else |
|
{ |
|
var sub_height; |
|
|
|
// To Expand |
|
if($li.hasClass('expanded') == false) |
|
{ |
|
$li.addClass('expanded'); |
|
$sub.addClass('is-visible'); |
|
|
|
sub_height = $sub.outerHeight(); |
|
|
|
$sub.height(0); |
|
|
|
TweenLite.to($sub, .15, {css: {height: sub_height}, ease: Sine.easeInOut, onComplete: function(){ $sub.attr('style', ''); }}); |
|
|
|
// Hide Existing in the list |
|
$li.siblings().find('> ul.is-visible').not($sub).each(function(i, el) |
|
{ |
|
var $el = jQuery(el); |
|
|
|
sub_height = $el.outerHeight(); |
|
|
|
$el.removeClass('is-visible').height(sub_height); |
|
$el.parent().removeClass('expanded'); |
|
|
|
TweenLite.to($el, .15, {css: {height: 0}, onComplete: function(){ $el.attr('style', ''); }}); |
|
}); |
|
} |
|
// To Collapse |
|
else |
|
{ |
|
sub_height = $sub.outerHeight(); |
|
|
|
$li.removeClass('expanded'); |
|
$sub.removeClass('is-visible').height(sub_height); |
|
TweenLite.to($sub, .15, {css: {height: 0}, onComplete: function(){ $sub.attr('style', ''); }}); |
|
} |
|
} |
|
}); |
|
} |
|
// Hover To Expand |
|
else |
|
{ |
|
$li.hoverIntent({ |
|
over: function() |
|
{ |
|
if(isxs()) |
|
return; |
|
|
|
if(is_root_element) |
|
{ |
|
$li.addClass('hover'); |
|
} |
|
else |
|
{ |
|
$sub.addClass('is-visible'); |
|
sub_height = $sub.outerHeight(); |
|
|
|
$sub.height(0); |
|
|
|
TweenLite.to($sub, .25, {css: {height: sub_height}, ease: Sine.easeInOut, onComplete: function(){ $sub.attr('style', ''); }}); |
|
} |
|
}, |
|
out: function() |
|
{ |
|
if(isxs()) |
|
return; |
|
|
|
if(is_root_element) |
|
{ |
|
$li.removeClass('hover'); |
|
} |
|
else |
|
{ |
|
sub_height = $sub.outerHeight(); |
|
|
|
$li.removeClass('expanded'); |
|
$sub.removeClass('is-visible').height(sub_height); |
|
TweenLite.to($sub, .25, {css: {height: 0}, onComplete: function(){ $sub.attr('style', ''); }}); |
|
} |
|
}, |
|
timeout: 200, |
|
interval: is_root_element ? 10 : 100 |
|
}); |
|
} |
|
}); |
|
} |
|
} |
|
|
|
|
|
function stickFooterToBottom() |
|
{ |
|
public_vars.$mainFooter.add( public_vars.$mainContent ).add( public_vars.$sidebarMenu ).attr('style', ''); |
|
|
|
if(isxs()) |
|
return false; |
|
|
|
if(public_vars.$mainFooter.hasClass('sticky')) |
|
{ |
|
var win_height = jQuery(window).height(), |
|
footer_height = public_vars.$mainFooter.outerHeight(true), |
|
main_content_height = public_vars.$mainFooter.position().top + footer_height, |
|
main_content_height_only = main_content_height - footer_height, |
|
extra_height = public_vars.$horizontalNavbar.outerHeight(); |
|
|
|
|
|
if(win_height > main_content_height - parseInt(public_vars.$mainFooter.css('marginTop'), 10)) |
|
{ |
|
public_vars.$mainFooter.css({ |
|
marginTop: win_height - main_content_height - extra_height |
|
}); |
|
} |
|
} |
|
} |
|
|
|
|
|
// Perfect scroll bar functions by Arlind Nushi |
|
function ps_update(destroy_init) |
|
{ |
|
if(isxs()) |
|
return; |
|
|
|
if(jQuery.isFunction(jQuery.fn.perfectScrollbar)) |
|
{ |
|
if(public_vars.$sidebarMenu.hasClass('collapsed')) |
|
{ |
|
return; |
|
} |
|
|
|
public_vars.$sidebarMenu.find('.sidebar-menu-inner').perfectScrollbar('update'); |
|
|
|
if(destroy_init) |
|
{ |
|
ps_destroy(); |
|
ps_init(); |
|
} |
|
} |
|
} |
|
|
|
|
|
function ps_init() |
|
{ |
|
if(isxs()) |
|
return; |
|
|
|
if(jQuery.isFunction(jQuery.fn.perfectScrollbar)) |
|
{ |
|
if(public_vars.$sidebarMenu.hasClass('collapsed') || ! public_vars.$sidebarMenu.hasClass('fixed')) |
|
{ |
|
return; |
|
} |
|
|
|
public_vars.$sidebarMenu.find('.sidebar-menu-inner').perfectScrollbar({ |
|
wheelSpeed: 1, |
|
wheelPropagation: public_vars.wheelPropagation |
|
}); |
|
} |
|
} |
|
|
|
function ps_destroy() |
|
{ |
|
if(jQuery.isFunction(jQuery.fn.perfectScrollbar)) |
|
{ |
|
public_vars.$sidebarMenu.find('.sidebar-menu-inner').perfectScrollbar('destroy'); |
|
} |
|
} |
|
|
|
|
|
|
|
// Radio and Check box replacement by Arlind Nushi |
|
function cbr_replace() |
|
{ |
|
var $inputs = jQuery('input[type="checkbox"].cbr, input[type="radio"].cbr').filter(':not(.cbr-done)'), |
|
$wrapper = '<div class="cbr-replaced"><div class="cbr-input"></div><div class="cbr-state"><span></span></div></div>'; |
|
|
|
$inputs.each(function(i, el) |
|
{ |
|
var $el = jQuery(el), |
|
is_radio = $el.is(':radio'), |
|
is_checkbox = $el.is(':checkbox'), |
|
is_disabled = $el.is(':disabled'), |
|
styles = ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'purple', 'blue', 'red', 'gray', 'pink', 'yellow', 'orange', 'turquoise']; |
|
|
|
if( ! is_radio && ! is_checkbox) |
|
return; |
|
|
|
$el.after( $wrapper ); |
|
$el.addClass('cbr-done'); |
|
|
|
var $wrp = $el.next(); |
|
$wrp.find('.cbr-input').append( $el ); |
|
|
|
if(is_radio) |
|
$wrp.addClass('cbr-radio'); |
|
|
|
if(is_disabled) |
|
$wrp.addClass('cbr-disabled'); |
|
|
|
if($el.is(':checked')) |
|
{ |
|
$wrp.addClass('cbr-checked'); |
|
} |
|
|
|
|
|
// Style apply |
|
jQuery.each(styles, function(key, val) |
|
{ |
|
var cbr_class = 'cbr-' + val; |
|
|
|
if( $el.hasClass(cbr_class)) |
|
{ |
|
$wrp.addClass(cbr_class); |
|
$el.removeClass(cbr_class); |
|
} |
|
}); |
|
|
|
|
|
// Events |
|
$wrp.on('click', function(ev) |
|
{ |
|
if(is_radio && $el.prop('checked') || $wrp.parent().is('label')) |
|
return; |
|
|
|
if(jQuery(ev.target).is($el) == false) |
|
{ |
|
$el.prop('checked', ! $el.is(':checked')); |
|
$el.trigger('change'); |
|
} |
|
}); |
|
|
|
$el.on('change', function(ev) |
|
{ |
|
$wrp.removeClass('cbr-checked'); |
|
|
|
if($el.is(':checked')) |
|
$wrp.addClass('cbr-checked'); |
|
|
|
cbr_recheck(); |
|
}); |
|
}); |
|
} |
|
|
|
|
|
function cbr_recheck() |
|
{ |
|
var $inputs = jQuery("input.cbr-done"); |
|
|
|
$inputs.each(function(i, el) |
|
{ |
|
var $el = jQuery(el), |
|
is_radio = $el.is(':radio'), |
|
is_checkbox = $el.is(':checkbox'), |
|
is_disabled = $el.is(':disabled'), |
|
$wrp = $el.closest('.cbr-replaced'); |
|
|
|
if(is_disabled) |
|
$wrp.addClass('cbr-disabled'); |
|
|
|
if(is_radio && ! $el.prop('checked') && $wrp.hasClass('cbr-checked')) |
|
{ |
|
$wrp.removeClass('cbr-checked'); |
|
} |
|
}); |
|
} |
|
|
|
|
|
// Element Attribute Helper |
|
function attrDefault($el, data_var, default_val) |
|
{ |
|
if(typeof $el.data(data_var) != 'undefined') |
|
{ |
|
return $el.data(data_var); |
|
} |
|
|
|
return default_val; |
|
} |
|
|
|
|
|
// Test function |
|
function callback_test() |
|
{ |
|
alert("Callback function executed! No. of arguments: " + arguments.length + "\n\nSee console log for outputed of the arguments."); |
|
|
|
console.log(arguments); |
|
} |
|
|
|
|
|
// Date Formatter |
|
function date(format, timestamp) { |
|
// discuss at: http://phpjs.org/functions/date/ |
|
// original by: Carlos R. L. Rodrigues (http://www.jsfromhell.com) |
|
// original by: gettimeofday |
|
// parts by: Peter-Paul Koch (http://www.quirksmode.org/js/beat.html) |
|
// improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) |
|
// improved by: MeEtc (http://yass.meetcweb.com) |
|
// improved by: Brad Touesnard |
|
// improved by: Tim Wiel |
|
// improved by: Bryan Elliott |
|
// improved by: David Randall |
|
// improved by: Theriault |
|
// improved by: Theriault |
|
// improved by: Brett Zamir (http://brett-zamir.me) |
|
// improved by: Theriault |
|
// improved by: Thomas Beaucourt (http://www.webapp.fr) |
|
// improved by: JT |
|
// improved by: Theriault |
|
// improved by: Rafał Kukawski (http://blog.kukawski.pl) |
|
// improved by: Theriault |
|
// input by: Brett Zamir (http://brett-zamir.me) |
|
// input by: majak |
|
// input by: Alex |
|
// input by: Martin |
|
// input by: Alex Wilson |
|
// input by: Haravikk |
|
// bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) |
|
// bugfixed by: majak |
|
// bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) |
|
// bugfixed by: Brett Zamir (http://brett-zamir.me) |
|
// bugfixed by: omid (http://phpjs.org/functions/380:380#comment_137122) |
|
// bugfixed by: Chris (http://www.devotis.nl/) |
|
// note: Uses global: php_js to store the default timezone |
|
// note: Although the function potentially allows timezone info (see notes), it currently does not set |
|
// note: per a timezone specified by date_default_timezone_set(). Implementers might use |
|
// note: this.php_js.currentTimezoneOffset and this.php_js.currentTimezoneDST set by that function |
|
// note: in order to adjust the dates in this function (or our other date functions!) accordingly |
|
// example 1: date('H:m:s \\m \\i\\s \\m\\o\\n\\t\\h', 1062402400); |
|
// returns 1: '09:09:40 m is month' |
|
// example 2: date('F j, Y, g:i a', 1062462400); |
|
// returns 2: 'September 2, 2003, 2:26 am' |
|
// example 3: date('Y W o', 1062462400); |
|
// returns 3: '2003 36 2003' |
|
// example 4: x = date('Y m d', (new Date()).getTime()/1000); |
|
// example 4: (x+'').length == 10 // 2009 01 09 |
|
// returns 4: true |
|
// example 5: date('W', 1104534000); |
|
// returns 5: '53' |
|
// example 6: date('B t', 1104534000); |
|
// returns 6: '999 31' |
|
// example 7: date('W U', 1293750000.82); // 2010-12-31 |
|
// returns 7: '52 1293750000' |
|
// example 8: date('W', 1293836400); // 2011-01-01 |
|
// returns 8: '52' |
|
// example 9: date('W Y-m-d', 1293974054); // 2011-01-02 |
|
// returns 9: '52 2011-01-02' |
|
|
|
var that = this; |
|
var jsdate, f; |
|
// Keep this here (works, but for code commented-out below for file size reasons) |
|
// var tal= []; |
|
var txt_words = [ |
|
'Sun', 'Mon', 'Tues', 'Wednes', 'Thurs', 'Fri', 'Satur', |
|
'January', 'February', 'March', 'April', 'May', 'June', |
|
'July', 'August', 'September', 'October', 'November', 'December' |
|
]; |
|
// trailing backslash -> (dropped) |
|
// a backslash followed by any character (including backslash) -> the character |
|
// empty string -> empty string |
|
var formatChr = /\\?(.?)/gi; |
|
var formatChrCb = function (t, s) { |
|
return f[t] ? f[t]() : s; |
|
}; |
|
var _pad = function (n, c) { |
|
n = String(n); |
|
while (n.length < c) { |
|
n = '0' + n; |
|
} |
|
return n; |
|
}; |
|
f = { |
|
// Day |
|
d: function () { |
|
// Day of month w/leading 0; 01..31 |
|
return _pad(f.j(), 2); |
|
}, |
|
D: function () { |
|
// Shorthand day name; Mon...Sun |
|
return f.l() |
|
.slice(0, 3); |
|
}, |
|
j: function () { |
|
// Day of month; 1..31 |
|
return jsdate.getDate(); |
|
}, |
|
l: function () { |
|
// Full day name; Monday...Sunday |
|
return txt_words[f.w()] + 'day'; |
|
}, |
|
N: function () { |
|
// ISO-8601 day of week; 1[Mon]..7[Sun] |
|
return f.w() || 7; |
|
}, |
|
S: function () { |
|
// Ordinal suffix for day of month; st, nd, rd, th |
|
var j = f.j(); |
|
var i = j % 10; |
|
if (i <= 3 && parseInt((j % 100) / 10, 10) == 1) { |
|
i = 0; |
|
} |
|
return ['st', 'nd', 'rd'][i - 1] || 'th'; |
|
}, |
|
w: function () { |
|
// Day of week; 0[Sun]..6[Sat] |
|
return jsdate.getDay(); |
|
}, |
|
z: function () { |
|
// Day of year; 0..365 |
|
var a = new Date(f.Y(), f.n() - 1, f.j()); |
|
var b = new Date(f.Y(), 0, 1); |
|
return Math.round((a - b) / 864e5); |
|
}, |
|
|
|
// Week |
|
W: function () { |
|
// ISO-8601 week number |
|
var a = new Date(f.Y(), f.n() - 1, f.j() - f.N() + 3); |
|
var b = new Date(a.getFullYear(), 0, 4); |
|
return _pad(1 + Math.round((a - b) / 864e5 / 7), 2); |
|
}, |
|
|
|
// Month |
|
F: function () { |
|
// Full month name; January...December |
|
return txt_words[6 + f.n()]; |
|
}, |
|
m: function () { |
|
// Month w/leading 0; 01...12 |
|
return _pad(f.n(), 2); |
|
}, |
|
M: function () { |
|
// Shorthand month name; Jan...Dec |
|
return f.F() |
|
.slice(0, 3); |
|
}, |
|
n: function () { |
|
// Month; 1...12 |
|
return jsdate.getMonth() + 1; |
|
}, |
|
t: function () { |
|
// Days in month; 28...31 |
|
return (new Date(f.Y(), f.n(), 0)) |
|
.getDate(); |
|
}, |
|
|
|
// Year |
|
L: function () { |
|
// Is leap year?; 0 or 1 |
|
var j = f.Y(); |
|
return j % 4 === 0 & j % 100 !== 0 | j % 400 === 0; |
|
}, |
|
o: function () { |
|
// ISO-8601 year |
|
var n = f.n(); |
|
var W = f.W(); |
|
var Y = f.Y(); |
|
return Y + (n === 12 && W < 9 ? 1 : n === 1 && W > 9 ? -1 : 0); |
|
}, |
|
Y: function () { |
|
// Full year; e.g. 1980...2010 |
|
return jsdate.getFullYear(); |
|
}, |
|
y: function () { |
|
// Last two digits of year; 00...99 |
|
return f.Y() |
|
.toString() |
|
.slice(-2); |
|
}, |
|
|
|
// Time |
|
a: function () { |
|
// am or pm |
|
return jsdate.getHours() > 11 ? 'pm' : 'am'; |
|
}, |
|
A: function () { |
|
// AM or PM |
|
return f.a() |
|
.toUpperCase(); |
|
}, |
|
B: function () { |
|
// Swatch Internet time; 000..999 |
|
var H = jsdate.getUTCHours() * 36e2; |
|
// Hours |
|
var i = jsdate.getUTCMinutes() * 60; |
|
// Minutes |
|
// Seconds |
|
var s = jsdate.getUTCSeconds(); |
|
return _pad(Math.floor((H + i + s + 36e2) / 86.4) % 1e3, 3); |
|
}, |
|
g: function () { |
|
// 12-Hours; 1..12 |
|
return f.G() % 12 || 12; |
|
}, |
|
G: function () { |
|
// 24-Hours; 0..23 |
|
return jsdate.getHours(); |
|
}, |
|
h: function () { |
|
// 12-Hours w/leading 0; 01..12 |
|
return _pad(f.g(), 2); |
|
}, |
|
H: function () { |
|
// 24-Hours w/leading 0; 00..23 |
|
return _pad(f.G(), 2); |
|
}, |
|
i: function () { |
|
// Minutes w/leading 0; 00..59 |
|
return _pad(jsdate.getMinutes(), 2); |
|
}, |
|
s: function () { |
|
// Seconds w/leading 0; 00..59 |
|
return _pad(jsdate.getSeconds(), 2); |
|
}, |
|
u: function () { |
|
// Microseconds; 000000-999000 |
|
return _pad(jsdate.getMilliseconds() * 1000, 6); |
|
}, |
|
|
|
// Timezone |
|
e: function () { |
|
// Timezone identifier; e.g. Atlantic/Azores, ... |
|
// The following works, but requires inclusion of the very large |
|
// timezone_abbreviations_list() function. |
|
/* return that.date_default_timezone_get(); |
|
*/ |
|
throw 'Not supported (see source code of date() for timezone on how to add support)'; |
|
}, |
|
I: function () { |
|
// DST observed?; 0 or 1 |
|
// Compares Jan 1 minus Jan 1 UTC to Jul 1 minus Jul 1 UTC. |
|
// If they are not equal, then DST is observed. |
|
var a = new Date(f.Y(), 0); |
|
// Jan 1 |
|
var c = Date.UTC(f.Y(), 0); |
|
// Jan 1 UTC |
|
var b = new Date(f.Y(), 6); |
|
// Jul 1 |
|
// Jul 1 UTC |
|
var d = Date.UTC(f.Y(), 6); |
|
return ((a - c) !== (b - d)) ? 1 : 0; |
|
}, |
|
O: function () { |
|
// Difference to GMT in hour format; e.g. +0200 |
|
var tzo = jsdate.getTimezoneOffset(); |
|
var a = Math.abs(tzo); |
|
return (tzo > 0 ? '-' : '+') + _pad(Math.floor(a / 60) * 100 + a % 60, 4); |
|
}, |
|
P: function () { |
|
// Difference to GMT w/colon; e.g. +02:00 |
|
var O = f.O(); |
|
return (O.substr(0, 3) + ':' + O.substr(3, 2)); |
|
}, |
|
T: function () { |
|
// Timezone abbreviation; e.g. EST, MDT, ... |
|
// The following works, but requires inclusion of the very |
|
// large timezone_abbreviations_list() function. |
|
/* var abbr, i, os, _default; |
|
if (!tal.length) { |
|
tal = that.timezone_abbreviations_list(); |
|
} |
|
if (that.php_js && that.php_js.default_timezone) { |
|
_default = that.php_js.default_timezone; |
|
for (abbr in tal) { |
|
for (i = 0; i < tal[abbr].length; i++) { |
|
if (tal[abbr][i].timezone_id === _default) { |
|
return abbr.toUpperCase(); |
|
} |
|
} |
|
} |
|
} |
|
for (abbr in tal) { |
|
for (i = 0; i < tal[abbr].length; i++) { |
|
os = -jsdate.getTimezoneOffset() * 60; |
|
if (tal[abbr][i].offset === os) { |
|
return abbr.toUpperCase(); |
|
} |
|
} |
|
} |
|
*/ |
|
return 'UTC'; |
|
}, |
|
Z: function () { |
|
// Timezone offset in seconds (-43200...50400) |
|
return -jsdate.getTimezoneOffset() * 60; |
|
}, |
|
|
|
// Full Date/Time |
|
c: function () { |
|
// ISO-8601 date. |
|
return 'Y-m-d\\TH:i:sP'.replace(formatChr, formatChrCb); |
|
}, |
|
r: function () { |
|
// RFC 2822 |
|
return 'D, d M Y H:i:s O'.replace(formatChr, formatChrCb); |
|
}, |
|
U: function () { |
|
// Seconds since UNIX epoch |
|
return jsdate / 1000 | 0; |
|
} |
|
}; |
|
|
|
this.date = function (format, timestamp) { |
|
that = this; |
|
jsdate = (timestamp === undefined ? new Date() : // Not provided |
|
(timestamp instanceof Date) ? new Date(timestamp) : // JS Date() |
|
new Date(timestamp * 1000) // UNIX timestamp (auto-convert to int) |
|
); |
|
return format.replace(formatChr, formatChrCb); |
|
}; |
|
return this.date(format, timestamp); |
|
} |