/*! * B-JUI v1.2 (http://b-jui.com) * Git@OSC (http://git.oschina.net/xknaan/B-JUI) * Copyright 2014 K'naan (xknaan@163.com). * Licensed under Apache (http://www.apache.org/licenses/LICENSE-2.0) */ /* ======================================================================== * B-JUI: bjui-taskbar.js v1.2 * reference: bjui-dialog.js * @author K'naan (xknaan@163.com) * -- Modified from dwz.taskBar.js (author:Roger Wu) * http://git.oschina.net/xknaan/B-JUI/blob/master/BJUI/js/bjui-taskbar.js * ======================================================================== * Copyright 2014 K'naan. * Licensed under Apache (http://www.apache.org/licenses/LICENSE-2.0) * ======================================================================== */ +function ($) { 'use strict'; // TASKBAR GLOBAL ELEMENTS // ====================== var $resizable var $taskBar, $taskBox, $taskList, $prevBtn, $nextBtn, taskDisabled, taskSelected, taskMargin $(function() { var INIT_TASKBAR = function() { $resizable = $('#bjui-resizable') $taskBar = $(FRAG.taskbar) $taskBox = $taskBar.find('.taskbarContent') $taskList = $taskBox.find('> ul') $prevBtn = $taskBar.find('.taskbarLeft') $nextBtn = $taskBar.find('.taskbarRight') taskDisabled = 'disabled' taskSelected = 'selected' taskMargin = 'taskbarMargin' $('body').append('').append($taskBar) //events $prevBtn.click(function(e) { $(this).taskbar('scrollLeft') }) $nextBtn.click(function(e) { $(this).taskbar('scrollRight') }) } INIT_TASKBAR() }) // TASKBAR CLASS DEFINITION // ====================== var Taskbar = function(element, options) { this.$element = $(element) this.$task = null this.options = options this.tools = this.TOOLS() } Taskbar.DEFAULTS = { id: undefined, title: undefined } Taskbar.prototype.init = function() { var that = this var $task = $taskList.find('#'+ this.options.id) this.show() if (!$task.length) { var taskFrag = '
  • #title#
  • '; $task = $(taskFrag.replace('#taskid#', this.options.id).replace('#title#', this.options.title)) $task.appendTo($taskList) } else { $task.find('> div > span.title').html(this.options.title) } this.contextmenu($task) this.switchTask($task) this.tools.scrollTask($task) //events $task.click(function(e) { if ($(e.target).closest('div').hasClass('close') || $(e.target).hasClass('close')) { $task.dialog('close', that.options.id) } else { var $dialog = $('body').data(that.options.id) if ($task.hasClass('selected')) { $dialog.find('.dialogHeader a.minimize').trigger('click') } else { if ($dialog.is(':hidden')) { that.restoreDialog($dialog) } else { $dialog.trigger('click') $task.addClass(taskSelected) } } that.scrollCurrent($task) } return false }) } Taskbar.prototype.TOOLS = function() { var that = this var tools = { scrollCurrent: function() { var iW = this.tasksW(this.getTasks()) if (iW > this.getTaskBarW()) { var $tools = this var lTask = $taskList.find('> li:last-child') var left = this.getTaskBarW() - lTask.position().left - lTask.outerWidth(true) $taskList.animate({left: left}, 200, function() { $tools.ctrlScrollBtn() }) } else { this.ctrlScrollBtn() } }, getTaskBarW: function() { return $taskBox.width()- ($prevBtn.is(':hidden') ? $prevBtn.width() + 2 : 0) - ($nextBtn.is(':hidden') ? $nextBtn.width() + 2 : 0) }, scrollTask: function($task) { var $tools = this if ($task.position().left + this.getLeft() + $task.outerWidth() > this.getBarWidth()) { var left = this.getTaskBarW() - $task.position().left - $task.outerWidth(true) - 2 $taskList.animate({left:left}, 200, function() { $tools.ctrlScrollBtn() }) } else if ($task.position().left + this.getLeft() < 0) { var left = this.getLeft() - ($task.position().left + this.getLeft()) $taskList.animate({left:left}, 200, function() { $tools.ctrlScrollBtn() }) } }, ctrlScrollBtn: function() { var iW = this.tasksW(this.getTasks()) if (this.getTaskBarW() > iW) { $taskBox.removeClass(taskMargin) $nextBtn.hide() $prevBtn.hide() if (this.getTasks().eq(0).length) this.scrollTask(this.getTasks().eq(0)) } else { $taskBox.addClass(taskMargin) $nextBtn.show().removeClass(taskDisabled) $prevBtn.show().removeClass(taskDisabled) if (this.getLeft() >= 0) $prevBtn.addClass(taskDisabled) if (this.getLeft() <= this.getTaskBarW() - iW) $nextBtn.addClass(taskDisabled) } }, getLeft: function(){ return $taskList.position().left }, visibleStart: function() { var iLeft = this.getLeft() var jTasks = this.getTasks() for (var i = 0; i < jTasks.size(); i++) { if (jTasks.eq(i).position().left + jTasks.eq(i).outerWidth(true) + iLeft >= 0) return jTasks.eq(i) } return jTasks.eq(0) }, visibleEnd: function() { var iLeft = this.getLeft() var jTasks = this.getTasks() for (var i = 0; i < jTasks.size(); i++) { if (jTasks.eq(i).position().left + jTasks.eq(i).outerWidth(true) + iLeft > this.getBarWidth()) return jTasks.eq(i) } return jTasks.eq(jTasks.size() - 1) }, getTasks: function() { return $taskList.find('> li') }, tasksW: function(jTasks) { var iW = 0 jTasks.each(function() { iW += $(this).outerWidth(true) }) return iW }, getBarWidth: function() { return $taskBar.innerWidth() }, getCurrent: function() { return $taskList.find('li.'+ taskSelected) } } return tools } Taskbar.prototype.contextmenu = function($obj) { var that = this $obj.contextmenu({ id: 'dialogCM', bindings: { reload: function(t) { t.dialog('refresh', that.options.id) }, closeCurrent: function(t, m) { var $obj = t.isTag('li') ? t : that.tools.getCurrent() $obj.find('.close').trigger('click') }, closeOther: function(t, m){ var $tasks = $taskList.find('> li').not(t) $tasks.each(function(i) { $(this).find('.close').trigger('click') }) }, closeAll: function(t, m) { var $tasks = that.tools.getTasks() $tasks.each(function(i) { $(this).find('.close').trigger('click') }) } }, ctrSub: function(t, m) { var mCur = m.find('[rel="closeCurrent"]') var mOther = m.find('[rel="closeOther"]') if (!that.tools.getCurrent().length) { mCur.addClass(taskDisabled) mOther.addClass(taskDisabled) } else { if (that.tools.getTasks().size() == 1) mOther.addClass(taskDisabled) } } }) } Taskbar.prototype.closeDialog = function(task) { var $task = (typeof task == 'string') ? this.getTask(task) : task if (!$task || !$task.length) return $task.remove() if (this.tools.getTasks().size() == 0) { this.hide() } this.tools.scrollCurrent() this.$element.removeData('bjui.taskbar') } Taskbar.prototype.minimize = function(dialog) { var that = this var $dialog = (typeof dialog == 'string') ? $('body').data('dialog') : dialog var $task = this.getTask($dialog.data('options').id) $resizable.css({ top: $dialog.css('top'), left: $dialog.css('left'), height: $dialog.css('height'), width: $dialog.css('width') }).show().animate({top:$(window).height() - 60, left:$task.position().left, width:$task.outerWidth(), height:$task.outerHeight()}, 250, function() { $(this).hide() that.inactive($task) }) } /** * @param {Object} id or dialog */ Taskbar.prototype.restoreDialog = function($dialog) { var $task = this.getTask($dialog.data('options').id) $resizable.css({top:$(window).height() - 60, left:$task.position().left, height:$task.outerHeight(), width:$task.outerWidth()}) .show() .animate({top:$dialog.css('top'), left:$dialog.css('left'), width:$dialog.css('width'), height:$dialog.css('height')}, 250, function() { $(this).hide() $dialog.show() }) this.switchTask($task) } /** * @param {Object} id */ Taskbar.prototype.inactive = function(task) { var $task = (typeof task == 'string') ? this.getTask(task) : task $task.removeClass(taskSelected) } Taskbar.prototype.scrollLeft = function() { var $task = this.tools.visibleStart() this.tools.scrollTask($task) } Taskbar.prototype.scrollRight = function() { var $task = this.tools.visibleEnd() this.tools.scrollTask($task) } Taskbar.prototype.scrollCurrent = function($task) { this.tools.scrollTask($task) } /** * @param {Object} id or $task */ Taskbar.prototype.switchTask = function(task) { this.tools.getCurrent().removeClass(taskSelected) var $task = (typeof task == 'string') ? this.getTask(task) : task $task.addClass(taskSelected) } Taskbar.prototype.getTask = function(id) { return $taskList.find('#'+ id) } Taskbar.prototype.changeTitle = function(id, title) { var $task = this.getTask(id) if ($task && title) $task.find('.title').html(title) } Taskbar.prototype.show = function() { if ($taskBar.is(':hidden')) $taskBar.show().animate({bottom:0}, 500) } Taskbar.prototype.hide = function() { if ($taskBar.is(':visible')) $taskBar.animate({bottom:-50}, 500, function() { $taskBar.hide() }) } // TASKBAR PLUGIN DEFINITION // ======================= function Plugin(option) { var args = arguments var property = option return this.each(function () { var $this = $(this) var options = $.extend({}, Taskbar.DEFAULTS, $this.data(), typeof option == 'object' && option) var data = $this.data('bjui.taskbar') if (!data) $this.data('bjui.taskbar', (data = new Taskbar(this, options))) else if (data.options.id != options.id) $this.data('bjui.taskbar', (data = new Taskbar(this, options))) if (typeof property == 'string' && $.isFunction(data[property])) { [].shift.apply(args) if (!args) data[property]() else data[property].apply(data, args) } else { data.init() } }) } var old = $.fn.taskbar $.fn.taskbar = Plugin $.fn.taskbar.Constructor = Taskbar // TASKBAR NO CONFLICT // ================= $.fn.taskbar.noConflict = function () { $.fn.taskbar = old return this } }(jQuery);