Files
tms/libraries/xajax/xajax_plugins/response/TabManager/TabManager_uncompressed.js
TMS eb299c9131 Initial commit: Kimai TMS
Kimai time management system (PHP 5.6 / MySQL) with custom extensions:
- Budget tracking (ki_budget)
- Change request form (ki_changerequest)
- Invoice generation (ki_invoice)
- Expense tracking (ki_expenses)
- Flexi time (ki_flexitime)
- Export, admin panel, timesheets, tasks, summary

Database: ~900K time entries, 2,000+ users, 439 projects.
Config: includes/autoconf.php — localhost/kimai/kimai
2026-06-18 21:20:26 +00:00

614 lines
15 KiB
JavaScript

// if xajax has not yet been initialized, wait a second and try again
// once xajax has been initialized, install the table command handlers.
installtabManager = function()
{
var xjxReady = false;
try
{
if (xajax)
xjxReady = true;
}
catch (e)
{
}
if (false == xjxReady)
{
setTimeout('installtabManager();', 1000);
return;
}
try
{
if (undefined == xajax.ext.tabManager)
xajax.ext.tabManager = {
};
xajax.ext.tabManager.instances = {
};
}
catch (e)
{
xajax.ext = {
};
xajax.ext.tabManager = {
};
xajax.ext.tabManager.instances = {
};
}
xajax.ext.tabPanel = function(config)
{
this.config = config;
this._parent = config._parent;
this.id = config.id;
var element = this;
this.events = {
};
this.tabWidth = 0;
if ('undefined' != typeof config.closeable)
{
this.closeable = config.closeable;
}
else
{
this.closeable = true;
}
var parPanel = this._parent.tabPanel;
this.tab_item = document.createElement('div');
this.tab_item.id = "tabPanel_" + this.id;
this.tab_item.className = "tabPanelItem";
this.tab_item.onclick = function()
{
element._parent.show(element.id);
return false;
};
var tab_item_left = document.createElement('div');
tab_item_left.className = 'tabLeft';
tab_item_left.innerHTML = ' ';
this.tab_item.appendChild(tab_item_left);
var tab_title = document.createElement('div');
tab_title.id = "tabPanelTitel_" + this.id;
tab_title.innerHTML = config.title;
tab_title.className = 'title';
this.tab_title = tab_title;
this.tab_item.appendChild(tab_title);
if (this.closeable)
{
var foo = this;
var tab_close = document.createElement('div');
tab_close.id = "tabPanelClose_" + this.id;
tab_close.innerHTML = " ";
tab_close.className = 'close';
tab_close.onclick = function()
{
foo.fire("close");
element._parent.closePanel(element.id);
return false;
}
this.tab_item.appendChild(tab_close);
}
var tab_item_right = document.createElement('div');
tab_item_right.className = 'tabRight';
tab_item_right.innerHTML = ' ';
this.tab_item.appendChild(tab_item_right);
var tab_clear = document.createElement('div');
tab_clear.style.clear = 'both';
this.tab_item.appendChild(tab_clear);
var tmp_width = $(parPanel).outerWidth();
//parPanel.style.width=(tmp_width+300)+"px";
parPanel.appendChild(this.tab_item);
var parContent = this._parent.tabContent;
this.tab_content = document.createElement('div');
this.tab_content.id = "tabContent_" + this.id;
this.tab_content.className = "tabPanelContent";
this.tab_content.innerHTML = config.content;
this.tab_content.style.display = 'none';
parContent.appendChild(this.tab_content);
//this.getWidth();
this.tabWidth = $(this.tab_item).outerWidth() + 2;
this.getWidth = function()
{
this.tabWidth = $(this.tab_item).outerWidth() + 2;
return this.tabWidth;
};
this.show = function()
{
this.tab_item.className = 'tabPanelItemActive';
this.tab_content.style.display = 'block';
this.fire("show");
};
this.hide = function()
{
this.tab_item.className = 'tabPanelItem';
this.tab_content.style.display = 'none';
this.fire("hide");
};
this.setTitle = function(title)
{
this.tab_title.innerHTML = title;
};
this.setContent = function(content)
{
this.tab_content.innerHTML = content;
};
this.destroy = function()
{
this.fire("destroy");
parPanel.removeChild(this.tab_item);
parContent.removeChild(this.tab_content);
};
this.fire = function(EventName)
{
if ('object' == typeof this.events[EventName])
{
for (a in this.events[EventName])
this.events[EventName][a]();
}
}
this.on = function(EventName, EventFunction, EventFunctionId)
{
if ('object' != typeof this.events[EventName])
this.events[EventName] = new Object();
if ('undefined' == typeof this.events[EventName][EventFunctionId])
this.events[EventName][EventFunctionId] = EventFunction;
}
};
/* ---------------------------------------------------------------------------------------------------------------------------- */
xajax.ext.tabManager.tabBar = function(config)
{
this.config = config;
this.tabBar = xajax.$(config.tabPanel);
this.tabContent = xajax.$(config.tabContent);
this.tabs = {
};
this.activeTab = null;
this.lastActiveTab = null;
this.interval = null;
this.maxWidth = $(this.tabBar).innerWidth();
this.tabWidth = 0;
this.tabHeight = $(this.tabBar).innerHeight();
var leftHandle = document.createElement('div');
leftHandle.className = "leftHandle";
var rightHandle = document.createElement('div');
rightHandle.className = "rightHandle";
var foo = this;
leftHandle.onmouseover = function()
{
foo.scroll(4);
}
rightHandle.onmouseover = function()
{
foo.scroll(-4);
}
leftHandle.onmouseout = function()
{
foo.scrollStop();
}
rightHandle.onmouseout = function()
{
foo.scrollStop();
}
leftHandle.style.display = 'none';
rightHandle.style.display = 'none';
this.leftHandle = leftHandle;
this.rightHandle = rightHandle;
var tabContainer = document.createElement('div');
tabContainer.id = "tabManager_Container_" + config.tabPanel;
tabContainer.style.position = "absolute";
tabContainer.style.top = "0px";
tabContainer.style.left = "0px";
tabContainer.style.right = "0px";
// possible IE abs pos fix
//tabContainer.style.width = this.maxWidth + "px";
tabContainer.style.height = this.tabHeight + "px";
tabContainer.style.overflow = "hidden";
var tabPanel = document.createElement('div');
tabPanel.style.position = "absolute";
tabPanel.style.height = this.tabHeight + "px";
this.tabBar.appendChild(leftHandle);
this.tabBar.appendChild(tabContainer);
this.tabBar.appendChild(rightHandle);
tabContainer.appendChild(tabPanel);
this.tabPanel = tabPanel;
this.tabContainer = tabContainer;
if ('undefined' != typeof config.cssClass)
{
this.tabPanel.className = this.tabBar.className + " " + config.cssClass;
}
this.addPanel = function(config)
{
if ('undefined' != typeof this.tabs[config.id])
{
if (config.hide)
return;
this.tabs[config.id].fire("destroy");
this.show(config.id);
return;
};
config._parent = this;
this.tabs[config.id] = new xajax.ext.tabPanel(config);
if (true != config.hide)
this.show(config.id);
this.tabWidth += this.tabs[config.id].getWidth();
// possible IE abs pos fix
//this.tabPanel.style.width=this.tabWidth+"px";
if (this.tabWidth > this.maxWidth)
{
this.leftHandle.style.display = 'block';
this.rightHandle.style.display = 'block';
var lspace = $(this.leftHandle).outerWidth() + 1;
var rspace = $(this.rightHandle).outerWidth() + 1;
this.tabContainer.style.left = lspace + "px";
this.tabContainer.style.right = rspace + "px";
}
};
this.show = function(id)
{
if ('undefined' == typeof this.tabs[id])
return;
if (null != this.activeTab)
this.activeTab.hide();
this.tabs[id].show();
this.lastActiveTab = this.activeTab;
this.activeTab = this.tabs[id];
var pos = $('#tabPanel_' + id).position();
var elm_left = pos.left;
var elm_max = pos.left + parseInt(this.tabs[id].tabWidth);
var container_width = $(this.tabContainer).innerWidth();
var panel_pos = $(this.tabPanel).position();
var scroll_left = panel_pos.left;
var visible_left = 0 - scroll_left;
var visible_right = visible_left + container_width;
if (elm_left < visible_left)
{
$(this.tabPanel).animate(
{
left: (0 - elm_left) + "px"
});
}
else if (elm_max > visible_right)
{
$(this.tabPanel).animate(
{
left: (container_width - elm_max - 22) + "px"
});
}
};
this.setContent = function(id, content)
{
if ('undefined' != typeof this.tabs[id])
return;
this.tabs[id].setContent(content);
};
this.setTitle = function(id, title)
{
if ('undefined' == typeof this.tabs[id])
return;
this.tabs[id].setTitle(title);
};
this.updateInnerWidth = function()
{
var tmpwidth = 0;
for (a in this.tabs)
{
tmpwidth += this.tabs[a].getWidth();
}
this.tabWidth = tmpwidth + 22;
};
this.closePanel = function(id)
{
if ('undefined' == typeof this.tabs[id])
return;
if (null != this.lastActiveTab)
{
if (this.activeTab.id == id)
this.show(this.lastActiveTab.id);
}
this.tabs[id].destroy();
delete (this.tabs[id]);
this.updateInnerWidth();
if (this.tabWidth < this.maxWidth)
{
this.leftHandle.style.display = 'none';
this.rightHandle.style.display = 'none';
this.tabContainer.style.left = "0px";
this.tabContainer.style.right = "0px";
// possible IE fix
//this.tabContainer.style.width = this.maxWidth + "px";
this.tabPanel.style.left = "0px";
}
};
this.on = function(EventName, id, EventFunction, EventFunctionId)
{
this.tabs[id].on(EventName, EventFunction, EventFunctionId);
}
this.scroll = function(value)
{
if (null != this.interval)
return;
var tab = this;
var i = value;
this.interval = setInterval(function()
{
var lspace = $(tab.leftHandle).innerWidth() + 1;
var rspace = $(tab.rightHandle).innerWidth() + 1;
var sLeft = tab.tabPanel.style.left;
var iLeft = sLeft.replace("px", "");
if ("" == iLeft)
iLeft = 0;
iLeft = parseInt(iLeft);
iLeft += i;
var iMin = tab.maxWidth - tab.tabWidth - rspace - lspace;
if ((iLeft > 0) || ((iLeft < iMin) && (i < 0)))
{
tab.scrollStop();
return;
}
tab.tabPanel.style.left = iLeft + "px";
}, 25);
}
this.scrollStop = function()
{
if (null == this.interval)
return;
clearInterval(this.interval);
this.interval = null;
}
this.destroy = function()
{
for (a in this.tabs)
{
this.tabs[a].destroy();
delete (this.tabs[a]);
}
};
};
/* ------------------------------------------------------------------------------------------------------------------------------ */
xajax.ext.tabManager.create = function(id, config)
{
if ("undefined" == typeof xajax.ext.tabManager.instances[id])
{
try
{
xajax.ext.tabManager.instances[id] = new xajax.ext.tabManager.tabBar(config);
}
catch (ex)
{
}
}
}
/* ------------------------------------------------------------------------------------------------------------------------------ */
xajax.ext.tabManager.addPanel = function(id, config)
{
try
{
xajax.ext.tabManager.instances[id].addPanel(config);
}
catch (ex)
{
}
}
/* ------------------------------------------------------------------------------------------------------------------------------ */
xajax.ext.tabManager.showPanel = function(id, sPanel)
{
try
{
xajax.ext.tabManager.instances[id].show(sPanel);
}
catch (ex)
{
}
}
/* ------------------------------------------------------------------------------------------------------------------------------ */
xajax.ext.tabManager.setTitle = function(id, sPanel, title)
{
try
{
xajax.ext.tabManager.instances[id].setTitle(sPanel, title);
}
catch (ex)
{
}
}
/* ------------------------------------------------------------------------------------------------------------------------------ */
xajax.ext.tabManager.on = function(id, sEventName, sTarget, sEventFunc, sEventId)
{
xajax.ext.tabManager.instances[id].on(sEventName, sTarget, sEventFunc, sEventId);
}
/* ------------------------------------------------------------------------------------------------------------------------------ */
xajax.ext.tabManager.closePanel = function(id, sPanel)
{
xajax.ext.tabManager.instances[id].closePanel(sPanel);
}
/* ------------------------------------------------------------------------------------------------------------------------------ */
xajax.ext.tabManager.destroy = function(id)
{
xajax.ext.tabManager.instances[id].destroy();
delete (xajax.ext.tabManager.instances[id]);
}
/* ------------------------------------------------------------------------------------------------------------------------------ */
xajax.command.handler.register('tm_create', function(args)
{
args.cmdFullName = 'ext.tabManager.create';
xajax.ext.tabManager.create(args.id, args.data);
return true;
});
/* ------------------------------------------------------------------------------------------------------------------------------ */
xajax.command.handler.register('tm_at', function(args)
{
args.cmdFullName = 'ext.tabManager.addPanel';
xajax.ext.tabManager.addPanel(args.id, args.data);
return true;
});
/* ------------------------------------------------------------------------------------------------------------------------------ */
xajax.command.handler.register('tm_on', function(args)
{
try
{
args.cmdFullName = 'ext.tabManager.on';
eval("var sEvent = " + args.data.e + ";");
xajax.ext.tabManager.on(args.id, args.data.n, args.data.p, sEvent, args.data.key);
}
catch (ex)
{
//console.log(ex);
}
return true;
});
/* ------------------------------------------------------------------------------------------------------------------------------ */
xajax.command.handler.register('tm_cl', function(args)
{
try
{
args.cmdFullName = 'ext.tabManager.closePanel';
xajax.ext.tabManager.closePanel(args.id, args.data);
}
catch (ex)
{
debugObj(ex);
}
return true;
});
/* ------------------------------------------------------------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------------------------------------------------------------ */
xajax.command.handler.register('tm_sp', function(args)
{
args.cmdFullName = 'ext.tabManager.showPanel';
xajax.ext.tabManager.showPanel(args.id, args.data);
return true;
});
/* ------------------------------------------------------------------------------------------------------------------------------ */
xajax.command.handler.register('tm_st', function(args)
{
try
{
args.cmdFullName = 'ext.tabManager.setTitle';
xajax.ext.tabManager.setTitle(args.id, args.data.panel, args.data.title);
}
catch (ex)
{
//console.log(ex);
}
return true;
});
/* ------------------------------------------------------------------------------------------------------------------------------ */
xajax.command.handler.register('tm_de', function(args)
{
try
{
args.cmdFullName = 'ext.tabManager.destroy';
xajax.ext.tabManager.destroy(args.id);
}
catch (ex)
{
debugObj(ex);
}
return true;
});
/* ------------------------------------------------------------------------------------------------------------------------------ */
}
installtabManager();