Newer
Older
scp.js
osTicket SCP
Copyright (c) osTicket.com
function checkbox_checker(formObj, min, max) {
var max = max || 0;
var min = min || 1;
var checked=$('input:checkbox:checked', formObj).length;
var action= action?action:"process";
if (max>0 && checked > max ){
msg=__("You're limited to only {0} selections.\n") .replace('{0}', max);
msg=msg + __("You have made {0} selections.\n").replace('{0}', checked);
msg=msg + __("Please remove {0} selection(s).").replace('{0}', checked-max);
$.sysAlert( __('Alert'),
__("Please make at least {0} selections. {1} checked so far.")
.replace('{0}', min)
.replace('{1}', checked)
);
$("input[autofocus]:visible:enabled:first").each(function() {
if ($(this).val())
$(this).blur();
});
$('table.list input:checkbox').bind('click, change', function() {
$(this)
.parents("tr:first")
.toggleClass("highlight", this.checked);
});
$('table.list input:checkbox:checked').trigger('change');
$('#selectAll').click(function(e) {
e.preventDefault();
var target = $(this).attr('href').substr(1, $(this).attr('href').length);
$(this).closest('form')
.find('input:enabled:checkbox.'+target)
.prop('checked', true)
.trigger('change');
return false;
});
$('#selectNone').click(function(e) {
e.preventDefault();
var target = $(this).attr('href').substr(1, $(this).attr('href').length);
$(this).closest('form')
.find('input:enabled:checkbox.'+target)
.prop('checked', false)
.trigger('change');
return false;
});
$('#selectToggle').click(function(e) {
e.preventDefault();
var target = $(this).attr('href').substr(1, $(this).attr('href').length);
$(this).closest('form')
.find('input:enabled:checkbox.'+target)
.each(function() {
$(this)
.prop('checked', !$(this).is(':checked'))
.trigger('change');
});
return false;
});
Nathan Febuary
committed
$('#actions:submit, #actions :submit.button:not(.no-confirm), #actions .confirm').bind('click', function(e) {
if ($(this).data('formId'))
formObj = $('#' + $(this).data('formId'));
else
formObj = $(this).closest('form');
if($('.dialog#confirm-action p#'+name+'-confirm').length === 0) {
Michael
committed
alert('Unknown action '+name+' - Get technical help!');
} else if(checkbox_checker(formObj, 1)) {
$('.dialog#confirm-action').undelegate('.confirm');
$('.dialog#confirm-action').delegate('input.confirm', 'click.confirm', function(e) {
e.preventDefault();
$('.dialog#confirm-action').hide();
$('input#action', formObj).val(action);
formObj.submit();
return false;
});
$('.dialog#confirm-action .confirm-action').hide();
$('.dialog#confirm-action p#'+name+'-confirm')
.show()
.parent('div').show().trigger('click');
$('a.confirm-action').click(function(e) {
$dialog = $('.dialog#confirm-action');
if ($($(this).attr('href')+'-confirm', $dialog).length) {
e.preventDefault();
var action = $(this).attr('href').substr(1, $(this).attr('href').length);
$('input#action', $dialog).val(action);
$('.confirm-action', $dialog).hide();
$('p'+$(this).attr('href')+'-confirm', $dialog)
.show()
.parent('div').show().trigger('click');
return false;
}
});
var warnOnLeave = function (el) {
var fObj = el.closest('form');
if(!fObj.data('changed')){
fObj.data('changed', true);
Nathan Febuary
committed
$('input[type=submit], button[type=submit]', fObj).addClass('save pending');
$(window).bind('beforeunload', function(e) {
return __('Are you sure you want to leave? Any changes or info you\'ve entered will be discarded!');
});
$(document).on('pjax:beforeSend.changed', function(e) {
return confirm(__('Are you sure you want to leave? Any changes or info you\'ve entered will be discarded!'));
$("form.save").on('change', ':input[name], :button[name]', function() {
if (!$(this).is('.nowarn')) warnOnLeave($(this));
$("form.save").on('click', ':input[type=reset], :button[type=reset]', function() {
var fObj = $(this).closest('form');
if(fObj.data('changed')){
Nathan Febuary
committed
$('input[type=submit], button[type=submit]', fObj).removeClass('save pending');
$('label', fObj).removeAttr('style');
$('label', fObj).removeClass('strike');
fObj.data('changed', false);
$(window).unbind('beforeunload');
$(window).unbind('beforeunload');
// Disable staff-side Post Reply/Open buttons to help prevent
// duplicate POST
var form = $(this);
$(this).find('input[type="submit"]').each(function (index) {
// Clone original input
$(this).clone(false).removeAttr('id').prop('disabled', true).insertBefore($(this));
// Hide original input and add it to top of form
$(this).hide();
form.prepend($(this));
});
return true;
});
$('select#tpl_options').change(function() {
var $this = $(this), form = $this.closest('form');
if ($this.val() % 1 !== 0) {
$('[name="a"]', form).val('implement');
$this.attr('name', 'code_name');
}
form.submit();
$(document).on('click', ".clearrule",function() {
$(this).closest("tr").find(":input").val('');
return false;
});
//Canned attachments.
$('.canned_attachments, .faq_attachments').delegate('input:checkbox', 'click', function(e) {
if(!$(this).is(':checked') && confirm(__("Are you sure you want to remove this attachment?"))==true) {
elem.parent().addClass('strike');
} else {
elem.attr('checked', 'checked');
elem.parent().removeClass('strike');
}
});
$('form select#cannedResp').select2({width: '350px'});
$('form select#cannedResp').on('select2:opening', function (e) {
var redactor = $('.richtext', $(this).closest('form')).data('redactor');
if (redactor)
redactor.selection.save();
});
$('form select#cannedResp').change(function() {
var fObj = $(this).closest('form');
var cid = $(this).val();
var tid = $(':input[name=id]',fObj).val();
$(this).find('option:first').attr('selected', 'selected').parent('select');
var $url = 'ajax.php/kb/canned-response/'+cid+'.json';
if (tid)
$url = 'ajax.php/tickets/'+tid+'/canned-resp/'+cid+'.json';
dataType: 'json',
cache: false,
success: function(canned){
//Canned response.
var box = $('#response',fObj),
redactor = box.data('redactor');
if (redactor) {
redactor.selection.restore();
redactor.insert.html(canned.response);
box.val(box.val() + canned.response);
redactor.observe.load();
var ca = $('.attachments', fObj);
if(canned.files && ca.length) {
var fdb = ca.find('.dropzone').data('dropbox');
fdb.addNode(j);
});
}
}
})
.done(function() { })
.fail(function() { });
/* Get config settings from the backend */
getConfig().then(function(c) {
$('.dp').datepicker({
numberOfMonths: 2,
showButtonPanel: true,
buttonImage: './images/cal.png',
showOn:'both',
dateFormat: $.translate_format(c.date_format||'m/d/Y')
source: function (typeahead, query) {
if (last_req) last_req.abort();
var url = $el.data('url')+'?q='+encodeURIComponent(query);
dataType: 'json',
success: function (data) {
typeahead.process(data);
}
});
},
onselect: function (obj) {
var $el = this.$element;
var form = $el.closest('form');
form.find('input[name=search-type]').val('typeahead');
if (obj.id) {
form.append($('<input type="hidden" name="number">').val(obj.id))
}
$('.email.typeahead').typeahead({
source: function (typeahead, query) {
if(query.length > 2) {
if (last_req) last_req.abort();
last_req = $.ajax({
url: "ajax.php/users?q="+query,
dataType: 'json',
success: function (data) {
typeahead.process(data);
}
});
}
},
onselect: function (obj) {
var fObj=$('.email.typeahead').closest('form');
$('.auto.name', fObj).val(obj.name);
$('.staff-username.typeahead').typeahead({
source: function (typeahead, query) {
if(query.length > 2) {
if (last_req) last_req.abort();
last_req = $.ajax({
url: "ajax.php/users/staff?q="+query,
dataType: 'json',
success: function (data) {
typeahead.process(data);
}
});
}
},
onselect: function (obj) {
var fObj=$('.staff-username.typeahead').closest('form');
$.each(['first','last','email','phone','mobile'], function(i,k) {
if (obj[k]) $('.auto.'+k, fObj).val(obj[k]);
});
},
property: "username"
});
Peter Rotich
committed
//Dialog
$('.dialog').resize(function() {
var w = $(window), $this=$(this);
$this.css({
left : (w.width() - $this.outerWidth()) / 2
});
$this.hasClass('draggable') && $this.draggable({handle:'.drag-handle'});
Peter Rotich
committed
});
$('.dialog').each(function() {
$this=$(this);
$this.resize();
$this.hasClass('draggable') && $this.draggable({handle:'.drag-handle'});
$('.dialog').delegate('input.close, a.close', 'click', function(e) {
Peter Rotich
committed
e.preventDefault();
var $dialog = $(this).parents('div.dialog');
$dialog.off('blur.redactor');
$dialog
.hide()
.removeAttr('style');
Peter Rotich
committed
return false;
});
$("#loading").css({
top : ($(window).height() / 3),
left : ($(window).width() - $("#loading").outerWidth()) / 2
});
// Return a helper with preserved width of cells
var fixHelper = function(e, ui) {
ui.children().each(function() {
$(this).width($(this).width());
});
return ui;
};
// Sortable tables for dynamic forms objects
$('.sortable-rows').sortable({
'helper': fixHelper,
var attr = ui.item.parent('tbody').data('sort'),
offset = parseInt($('#sort-offset').val(), 10) || 0;
$('input[name^='+attr+']', ui.item.parent('tbody')).each(function(i, el) {
},
'cancel': ':input,button,div[contenteditable=true]'
// Scroll to a stop or top on scroll-up click
$(document).off('click.scroll-up');
$(document).on('click.scroll-up', 'a.scroll-up', function() {
$stop = $(this).data('stop');
$('html, body').animate({scrollTop: ($stop ? $stop : 0)}, 'fast');
return false;
});
// Make translatable fields translatable
$('input[data-translate-tag]').translatable();
if (window.location.hash) {
$('ul.tabs li a[href="' + window.location.hash + '"]').trigger('click');
}
// Make sticky bars float on scroll
// Thanks, https://stackoverflow.com/a/17166225/1025836
$('div.sticky.bar:not(.stop)').each(function() {
var $that = $(this),
placeholder = $('<div class="sticky placeholder">').insertBefore($that),
offset = $that.offset(),
top = offset.top - parseFloat($that.css('marginTop').replace(/auto/, 100)),
stop = $('div.sticky.bar.stop').filter(':visible'),
stopAt,
visible = false;
// Append scroll-up icon and set stop point for this sticky
$('.content', $that)
.append($('<a class="only sticky scroll-up" href="#" data-stop='
+ (placeholder.offset().top-75) +' ><i class="icon-chevron-up icon-large"></i></a>'));
if (stop.length) {
var onmove = function() {
// Recalc when pictures pop in
stopAt = stop.offset().top;
};
$('#ticket_thread .thread-body img').each(function() {
this.onload = onmove;
});
onmove();
}
// Drop the sticky bar on PJAX navigation
$(document).on('pjax:start', function() {
placeholder.removeAttr('style');
$that.stop().removeClass('fixed');
$(window).off('.sticky');
});
$that.find('.content').width($that.width());
$(window).on('scroll.sticky', function (event) {
// what the y position of the scroll is
var y = $(this).scrollTop();
// whether that's below the form
if (y >= top && (!stopAt || stopAt > y)) {
// if so, add the fixed class
if (!visible) {
visible = true;
setTimeout(function() {
$that.addClass('fixed').css('top', '-'+$that.height()+'px')
.animate({top:0}, {easing: 'swing', duration:'fast'});
placeholder.height($that.height());
$that.find('[data-dropdown]').dropdown('hide');
}, 1);
}
} else {
// otherwise remove it
if (visible) {
visible = false;
setTimeout(function() {
placeholder.removeAttr('style');
$that.find('[data-dropdown]').dropdown('hide');
$that.stop().removeClass('fixed');
}, 1);
}
}
});
});
$('div.tab_content[id] div.error:not(:empty)').each(function() {
var div = $(this).closest('.tab_content');
$('a[href^=#'+div.attr('id')+']').parent().addClass('error');
});
$('[data-toggle="tooltip"]').tooltip()
$('[data-toggle="tooltip"]').on('click', function() {
$(this).tooltip('hide');
});
$('.attached.input input[autofocus]').parent().addClass('focus')
$('.attached.input input')
.on('focus', function() { $(this).parent().addClass('focus'); })
.on('blur', function() { $(this).parent().removeClass('focus'); })
// whenever we hover over a menu item that has a submenu
$('.subQ').on('mouseover', function() {
var $menuItem = $(this),
$submenuWrapper = $('> .subMenuQ', $menuItem);
// grab the menu item's position relative to its positioned parent
var menuItemPos = $menuItem.position();
// place the submenu in the correct position relevant to the menu item
$submenuWrapper.css({
top: menuItemPos.top - 1,
left: menuItemPos.left + Math.round($menuItem.outerWidth())
});
});
// Ensure the "new ticket" link is never in the drop-down menu
$('#new-ticket').parent('li').addClass('primary-only');
$('#customQ_nav').overflowmenu({
guessHeight: false,
// items: 'li.top-queue',
change: function( e, ui ) {
var handle = ui.container.find('.jb-overflowmenu-menu-secondary-handle');
handle.toggle( ui.secondary.children().length > 0 );
}
});
// Auto fetch queue counts
$(function() {
var fired = false;
if (fired) return;
fired = true;
$.ajax({
url: 'ajax.php/queue/counts',
dataType: 'json',
success: function(json) {
var $e = $(e);
$e.text(json['q' + $e.data('queueId')]);
$(e).parents().find('#queue-count-bucket').show();
$(document).on('pjax:end', scp_prep);
// Reformat dates
$('.dp', $(this)).each(function(i, e) {
var $e = $(e),
d = $e.datepicker('getDate');
var day = ('0'+d.getDate()).substr(-2),
month = ('0'+(d.getMonth()+1)).substr(-2),
year = d.getFullYear();
$e.val(year+'-'+month+'-'+day);
$e.data('fixed', true);
$e.on('change', function() { $(this).data('fixed', false); });
};
$(document).on('submit', 'form', fixupDatePickers);
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
/************ global inits *****************/
//Add CSRF token to the ajax requests.
// Many thanks to https://docs.djangoproject.com/en/dev/ref/contrib/csrf/ + jared.
$(document).ajaxSend(function(event, xhr, settings) {
function sameOrigin(url) {
// url could be relative or scheme relative or absolute
var host = document.location.host; // host + port
var protocol = document.location.protocol;
var sr_origin = '//' + host;
var origin = protocol + sr_origin;
// Allow absolute or scheme relative URLs to same origin
return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
(url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
// or any other URL that isn't scheme relative or absolute i.e
// relative.
!(/^(\/\/|http:|https:).*/.test(url));
}
function safeMethod(method) {
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
xhr.setRequestHeader("X-CSRFToken", $("meta[name=csrf_token]").attr("content"));
}
});
/* Get config settings from the backend */
jQuery.fn.exists = function() { return this.length>0; };
$.translate_format = function(str) {
var translation = {
'DD': 'oo',
'D': 'o',
'EEEE': 'DD',
'EEE': 'D',
'MMMM': '||', // Double replace necessary
'MMM': '|',
'MM': 'mm',
'M': 'm',
'||': 'MM',
'|': 'M',
'yyyy': '`',
'yyy': '`',
'yy': 'y',
};
// Change PHP formats to datepicker ones
$.each(translation, function(php, jqdp) {
str = str.replace(php, jqdp);
return str;
};
$(document).keydown(function(e) {
if (e.keyCode == 27 && !$('#overlay').is(':hidden')) {
$('div.dialog').hide();
e.preventDefault();
return false;
$(document).on('focus', 'form.spellcheck textarea, form.spellcheck input[type=text]', function() {
var $this = $(this);
if ($this.attr('lang') !== undefined)
return;
var lang = $(this).closest('[lang]').attr('lang');
if (lang)
$(this).attr({'spellcheck':'true', 'lang': lang});
});
$(document).on('click', '.thread-entry-group a', function() {
var inner = $(this).parent().find('.thread-entry-group-inner');
if (inner.is(':visible'))
inner.slideUp();
else
inner.slideDown();
return false;
});
$.toggleOverlay = function (show) {
if (typeof(show) === 'undefined') {
return $.toggleOverlay(!$('#overlay').is(':visible'));
}
if (show) {
$('#overlay').stop().hide().fadeIn();
$('body').css('overflow', 'hidden');
}
else {
$('#overlay').stop().fadeOut();
$('body').css('overflow', 'auto');
}
};
Nathan Febuary
committed
//modal---------//
$.dialog = function (url, codes, cb, options) {
options = options||{};
if (codes && !$.isArray(codes))
codes = [codes];
var $popup = $('.dialog#popup');
$popup.attr('class',
function(pos, classes) {
return classes.replace(/\bsize-\S+/g, '');
});
$popup.addClass(options.size ? ('size-'+options.size) : 'size-normal');
$('div.body', $popup).empty().hide();
$('div#popup-loading', $popup).show()
.find('h1').css({'margin-top':function() { return $popup.height()/3-$(this).height()/3}});
$('div.body', $popup).load(url, options.data, function () {
$('div#popup-loading', $popup).hide();
$('div.body', $popup).slideDown({
duration: 300,
queue: false,
complete: function() {
if (options.onshow) options.onshow();
$(this).removeAttr('style');
}
$("input[autofocus]:visible:enabled:first", $popup).focus();
$(document).on('click.dialog',
'#popup input[type=submit], #popup button[type=submit]',
function(e) { submit_button = $(this); });
$(document).on('submit.dialog', '.dialog#popup form', function(e) {
e.preventDefault();
var $form = $(this),
data = $form.serialize();
if (submit_button) {
data += '&' + escape(submit_button.attr('name')) + '='
+ escape(submit_button.attr('value'));
}
$('div#popup-loading', $popup).show()
.find('h1').css({'margin-top':function() { return $popup.height()/3-$(this).height()/3}});
$.ajax({
type: $form.attr('method'),
url: 'ajax.php/'+$form.attr('action').substr(1),
cache: false,
success: function(resp, status, xhr) {
if (xhr && xhr.status && codes
&& $.inArray(xhr.status, codes) != -1) {
if (cb && (false === cb(xhr, resp)))
// Don't fire event if callback returns false
return;
var done = $.Event('dialog:close');
$popup.trigger(done, [resp, status, xhr]);
try {
var json = $.parseJSON(resp);
if (json.redirect) return window.location.href = json.redirect;
}
catch (e) { }
$('div.body', $popup).html(resp);
if ($('#msg_error, .error-banner', $popup).length) {
$popup.effect('shake');
}
$('#msg_notice, #msg_error', $popup).delay(5000).slideUp();
$('div.tab_content[id] div.error:not(:empty)', $popup).each(function() {
var div = $(this).closest('.tab_content');
$('a[href^=#'+div.attr('id')+']').parent().addClass('error');
});
.done(function() {
$('div#popup-loading', $popup).hide();
})
.fail(function() { });
return false;
});
if (options.onload) { options.onload(); }
};
$(document).on('click', 'a[data-dialog]', function(event) {
event.preventDefault();
event.stopImmediatePropagation();
var link = $(this);
$.dialog($(this).data('dialog'), 201, function(xhr, json) {
try {
json = JSON.parse(json);
} catch (e) {}
if (link.attr('href').length > 1) {
// Replace {xx} expressions with data from JSON
if (typeof json === 'object')
link.attr('href',
link.attr('href').replace(/\{([^}]+)\}/, function($0, $1) { return json[$1]; }));
$.pjax.click(event, '#pjax-container');
}
else $.pjax.reload('#pjax-container');
});
return false;
});
$.sysAlert = function (title, msg, cb) {
var $dialog = $('.dialog#alert');
if ($dialog.length) {
$('#title', $dialog).html(title);
$('#body', $dialog).html(msg);
$dialog.resize().show();
if (cb)
$dialog.find('input.ok.close').click(cb);
$.confirm = function(message, title, options) {
title = title || __('Please Confirm');
var D = $.Deferred(),
$popup = $('.dialog#popup'),
hide = function() {
$popup.hide();
};
$('div#popup-loading', $popup).hide();
var body = $('div.body', $popup).empty()
.append($('<h3></h3>').text(title))
.append($('<a class="close" href="#"><i class="icon-remove-circle"></i></a>'))
.append($('<hr/>'))
.append($('<p class="confirm-action"></p>')
.text(message)
).append($('<div></div>')
.append($('<b>').text(__('Please confirm to continue.')))
);
if (Object.keys(options).length)
body.append('<hr>');
$.each(options, function(k, v) {
body.append($('<div>')
.html(' '+v)
.prepend($('<input type="checkbox">')
.attr('name', k)
)
);
});
body.append($('<hr style="margin-top:1em"/>'))
.append($('<p class="full-width"></p>')
.append($('<span class="buttons pull-left"></span>')
.append($('<input type="button" class="close"/>')
.attr('value', __('Cancel'))
)).append($('<span class="buttons pull-right"></span>')
.append($('<input type="button"/>')
.attr('value', __('OK'))
.click(function() { hide(); D.resolve(body.find('input').serializeArray()); })
))).append($('<div class="clear"></div>'));
return D.promise();
};
$.dialog(url, 201, function (xhr, user) {
if ($.type(user) == 'string')
user = $.parseJSON(user);
if (cb) return cb(user);
}, {
onshow: function() { $('#user-search').focus(); }
});
};
$.orgLookup = function (url, cb) {
$.dialog(url, 201, function (xhr, org) {
if ($.type(org) == 'string')
org = $.parseJSON(user);
if (cb) cb(org);
}, {
onshow: function() { $('#org-search').focus(); }
});
};
+function($) {
var MessageBar = function() {
this.defaults = {
avatar: 'oscar-boy',
bar: '<div class="message bar"></div>',
button: '<button type="button" class="inline button"></button>',
buttonClass: '',
buttonText: __('OK'),
classes: '',
dismissible: true,
};
this.show = function(title, message, options) {
this.hide();
options = $.extend({}, this.defaults, options);
var bar = this.bar = $(options.bar).addClass(options.classes)
.append($('<div class="title"></div>').html(title))
.append($('<div class="body"></div>').html(message))
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
.addClass(options.position);
if (options.avatar)
bar.prepend($('<div class="avatar pull-left" title="Oscar"></div>')
.addClass(options.avatar));
if (options.onok || options.dismissible) {
bar
.prepend($('<div><div class="valign-helper"></div></div>')
// FIXME: This is not compatible with .rtl
.css({position: 'absolute', top: 0, bottom: 0, right: 0, margin: '0 15px'})
.append($(options.button)
.text(options.buttonText)
.click(this.dismiss.bind(this))
.addClass(options.buttonClass)
)
);
}
this.visible = true;
this.options = options;
$('body').append(bar);
this.height = bar.height();
// Slight slide in
if (options.position == 'bottom') {
bar.css('bottom', -this.height/2).animate({'bottom': 0});
}
// Otherwise assume TOP positioning
else {
var hovering = false,
y = $(window).scrollTop(),
targetY = (y < this.height) ? -this.height - 10 + y : 0;
bar.css('top', -this.height/2).animate({'top': targetY});
// Plop out on mouse hover
bar.hover(function() {
if (!hovering && this.visible && bar.css('top') != '0') {
bar.stop().animate({'margin-top': -parseInt(bar.css('top'), 10)}, 400, 'easeOutBounce');
hovering = true;
}
}.bind(this), function() {
if (this.visible && hovering) {
bar.stop().animate({'margin-top': 0});
hovering = false;
}
}.bind(this));
}
return bar;
};
this.scroll = function(event) {
// Shade on scroll to top
if (!this.visible || this.options.position != 'top')
return;
var y = $(window).scrollTop();
if (y < this.height) {
this.bar.css({top: -this.height -10 + y});
this.shading = true;
}
else if (this.bar.css('top') != '0') {
if (this.shading) {
this.bar.stop().animate({top: 0});
this.shading = false;
}
}
};
this.dismiss = function(event) {
if (this.options.onok) {
this.bar.find('button').replaceWith(
$('<i class="icon-spinner icon-spin icon-large"></i>')
);
if (this.options.onok(event) === false)
return;
}
this.hide();
};
this.hide = function() {
if (!this.bar || !this.visible)
return;
var bar = this.bar.removeAttr('style');
var dir = this.options.position == 'bottom' ? 'down' : 'up';
// NOTE: destroy() is not called here because a new bar might be
// created before the animation finishes
bar.hide("slide", { direction: dir }, 400, function() { bar.remove(); });
this.visible = false;
};
this.destroy = function() {
if (!this.bar || !this.visible)
return;
this.bar.remove();
this.visible = false;
};
// Destroy on away navigation
$(document).on('pjax:start.messageBar', this.destroy.bind(this));
$(window).on('scroll.messageBar', this.scroll.bind(this));
};
$.messageBar = new MessageBar();
}(window.jQuery);
$(document).on('click.tab', 'ul.tabs > li > a', function(e) {
e.preventDefault();
var $this = $(this),
$ul = $(this).closest('ul'),
$container = $('#'+$ul.attr('id')+'_container');
if (!$container.length)
$container = $ul.parent();
var $tab = $($this.attr('href'), $container);
if (!$tab.length && $(this).data('url').length > 1) {
var url = $this.data('url');
if (url.charAt(0) == '#')
url = 'ajax.php/' + url.substr(1);
$tab = $('<div>')
.addClass('tab_content')