App-SocialCalc-Multiplayer
view release on metacpan or search on metacpan
socialcalc/socialcalctableeditor.js view on Meta::CPAN
draginfo.draggingElement = null;
return false;
}
//
// DragFunctionStart(event, draginfo, dobj)
//
SocialCalc.DragFunctionStart = function(event, draginfo, dobj) {
var val;
var element = dobj.functionobj.positionobj || dobj.element;
val = element.style.top.match(/\d*/);
draginfo.offsetY = (val ? val[0]-0 : 0) - draginfo.clientY;
val = element.style.left.match(/\d*/);
draginfo.offsetX = (val ? val[0]-0 : 0) - draginfo.clientX;
}
//
// DragFunctionPosition(event, draginfo, dobj)
//
SocialCalc.DragFunctionPosition = function(event, draginfo, dobj) {
var element = dobj.functionobj.positionobj || dobj.element;
if (dobj.vertical) element.style.top = (draginfo.clientY + draginfo.offsetY)+"px";
if (dobj.horizontal) element.style.left = (draginfo.clientX + draginfo.offsetX)+"px";
}
// *************************************
//
// Tooltip functions:
//
// *************************************
SocialCalc.TooltipInfo = {
// There is only one of these -- no "new" is done.
// Only one tooltip operation can be active at a time.
// The registeredElements array is used to identify items.
// One item for each element with a tooltip, each an object with:
// .element, .tiptext, .functionobj
// Currently .functionobj can only contain .offsetx and .offsety.
// If present they are used instead of the default ones.
registeredElements: [],
registered: false, // if true, an event handler has been registered for this functionality
// Items used during hover over an element
tooltipElement: null, // item being processed (.element is the actual element)
timer: null, // timer object waiting to see if holding over element
popupElement: null, // tooltip element being displayed
clientX: 0, // modifyable version to restrict movement
clientY: 0,
offsetX: SocialCalc.Constants.TooltipOffsetX, // modifyable version to allow positioning
offsetY: SocialCalc.Constants.TooltipOffsetY
}
//
// TooltipRegister(element, tiptext, functionobj) - make element have a tooltip
//
SocialCalc.TooltipRegister = function(element, tiptext, functionobj) {
var tooltipinfo = SocialCalc.TooltipInfo;
tooltipinfo.registeredElements.push(
{element: element, tiptext: tiptext, functionobj: functionobj}
);
if (tooltipinfo.registered) return; // only need to add event listener once
if (document.addEventListener) { // DOM Level 2 -- Firefox, et al
document.addEventListener("mousemove", SocialCalc.TooltipMouseMove, false);
}
else if (document.attachEvent) { // IE 5+
document.attachEvent("onmousemove", SocialCalc.TooltipMouseMove);
}
else { // don't handle this
throw SocialCalc.Constants.s_BrowserNotSupported;
}
tooltipinfo.registered = true; // remember
return;
}
//
// TooltipMouseMove(event)
//
SocialCalc.TooltipMouseMove = function(event) {
var e = event || window.event;
var tooltipinfo = SocialCalc.TooltipInfo;
tooltipinfo.viewport = SocialCalc.GetViewportInfo();
tooltipinfo.clientX = e.clientX + tooltipinfo.viewport.horizontalScroll;
tooltipinfo.clientY = e.clientY + tooltipinfo.viewport.verticalScroll;
var tobj = SocialCalc.LookupElement(e.target || e.srcElement, tooltipinfo.registeredElements);
if (tooltipinfo.timer) { // waiting to see if holding still: didn't hold still
window.clearTimeout(tooltipinfo.timer); // cancel timer
tooltipinfo.timer = null;
}
if (tooltipinfo.popupElement) { // currently displaying a tip: hide it
SocialCalc.TooltipHide();
}
tooltipinfo.tooltipElement = tobj || null;
if (!tobj || SocialCalc.ButtonInfo.buttonDown) return; // if not an object with a tip or a "button" is down, ignore
tooltipinfo.timer = window.setTimeout(SocialCalc.TooltipWaitDone, 700);
if (tooltipinfo.tooltipElement.element.addEventListener) { // Register event for mouse down which cancels tooltip stuff
tooltipinfo.tooltipElement.element.addEventListener("mousedown", SocialCalc.TooltipMouseDown, false);
}
else if (tooltipinfo.tooltipElement.element.attachEvent) { // IE
tooltipinfo.tooltipElement.element.attachEvent("onmousedown", SocialCalc.TooltipMouseDown);
}
return;
}
//
// TooltipMouseDown(event)
//
SocialCalc.TooltipMouseDown = function(event) {
var e = event || window.event;
var tooltipinfo = SocialCalc.TooltipInfo;
if (tooltipinfo.timer) {
window.clearTimeout(tooltipinfo.timer); // cancel timer
tooltipinfo.timer = null;
}
if (tooltipinfo.popupElement) { // currently displaying a tip: hide it
SocialCalc.TooltipHide();
}
if (tooltipinfo.tooltipElement) {
if (tooltipinfo.tooltipElement.element.removeEventListener) { // DOM Level 2 -- Firefox, et al
tooltipinfo.tooltipElement.element.removeEventListener("mousedown", SocialCalc.TooltipMouseDown, false);
}
else if (tooltipinfo.tooltipElement.element.attachEvent) { // IE 5+
tooltipinfo.tooltipElement.element.detachEvent("onmousedown", SocialCalc.TooltipMouseDown);
}
tooltipinfo.tooltipElement = null;
}
return;
}
//
// TooltipDisplay(tobj)
//
SocialCalc.TooltipDisplay = function(tobj) {
var tooltipinfo = SocialCalc.TooltipInfo;
var scc = SocialCalc.Constants;
var offsetX = (tobj.functionobj && ((typeof tobj.functionobj.offsetx) == "number")) ? tobj.functionobj.offsetx : tooltipinfo.offsetX;
var offsetY = (tobj.functionobj && ((typeof tobj.functionobj.offsety) == "number")) ? tobj.functionobj.offsety : tooltipinfo.offsetY;
tooltipinfo.popupElement = document.createElement("div");
if (scc.TDpopupElementClass) tooltipinfo.popupElement.className = scc.TDpopupElementClass;
SocialCalc.setStyles(tooltipinfo.popupElement, scc.TDpopupElementStyle);
tooltipinfo.popupElement.innerHTML = tobj.tiptext;
if (tooltipinfo.clientX > tooltipinfo.viewport.width/2) { // on right side of screen
tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY)+"px";
tooltipinfo.popupElement.style.right = (tooltipinfo.viewport.width - tooltipinfo.clientX + offsetX)+"px";
}
else { // on left side of screen
tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY)+"px";
tooltipinfo.popupElement.style.left = (tooltipinfo.clientX + offsetX)+"px";
}
if (tooltipinfo.clientY < 50) { // make sure fits on screen if nothing above grid
tooltipinfo.popupElement.style.bottom = (tooltipinfo.viewport.height - tooltipinfo.clientY + offsetY - 50)+"px";
}
document.body.appendChild(tooltipinfo.popupElement);
}
//
// TooltipHide()
//
SocialCalc.TooltipHide = function() {
var tooltipinfo = SocialCalc.TooltipInfo;
if (tooltipinfo.popupElement) {
tooltipinfo.popupElement.parentNode.removeChild(tooltipinfo.popupElement);
tooltipinfo.popupElement = null;
}
}
//
// TooltipWaitDone()
//
SocialCalc.TooltipWaitDone = function() {
var tooltipinfo = SocialCalc.TooltipInfo;
tooltipinfo.timer = null;
SocialCalc.TooltipDisplay(tooltipinfo.tooltipElement);
}
// *************************************
//
// Button functions:
//
// *************************************
SocialCalc.ButtonInfo = {
// There is only one of these -- no "new" is done.
// Only one button operation can be active at a time.
// The registeredElements array is used to identify items.
// One item for each clickable element, each an object with:
// .element, .normalstyle, .hoverstyle, .downstyle, .repeatinterval, .functionobj
//
// .functionobj is an object with optional function objects for:
// mouseover, mouseout, mousedown, repeatinterval, mouseup, disabled
registeredElements: [],
// Items used during hover over an element, clicking, repeating, etc.
buttonElement: null, // item being processed, hover or down (.element is the actual element)
doingHover: false, // true if mouse is over one of our elements
buttonDown: false, // true if button down and buttonElement not null
timer: null, // timer object for repeating
// Used while processing an event
horizontalScroll: 0,
verticalScroll: 0,
clientX: 0,
clientY: 0
}
//
// ButtonRegister(element, paramobj, functionobj) - make element clickable
//
// The arguments (other than element) may be null (meaning no change for style and no repeat)
// The paramobj has the optional normalstyle, hoverstyle, downstyle, repeatwait, repeatinterval settings
( run in 0.883 second using v1.01-cache-2.11-cpan-364913b4093 )