doubango/schemas/OMNA Schema-based Namespace.../Scroll.js

601 lines
13 KiB
JavaScript
Executable File

if (typeof window.RadControlsNamespace == "undefined")
{
window.RadControlsNamespace = {};
}
RadControlsNamespace.ScrollButtonsPosition = {Left : 0, Middle : 1, Right : 2 };
RadControlsNamespace.Scroll = function (element, vertical, scrollOptionsObject)
{
this.Owner = scrollOptionsObject;
this.Element = element;
this.IsVertical = vertical;
this.ScrollButtonsPosition = scrollOptionsObject.ScrollButtonsPosition;
this.ScrollPosition = scrollOptionsObject.ScrollPosition;
this.PerTabScrolling = scrollOptionsObject.PerTabScrolling;
this.ScrollOnHover = false;
this.WrapNeeded = false;
this.LeaveGapsForArrows = true;
this.LeftArrowClass = "leftArrow";
this.LeftArrowClassDisabled = "leftArrowDisabled";
this.RightArrowClass = "rightArrow";
this.RightArrowClassDisabled = "rightArrowDisabled";
this.Initialized = false;
};
RadControlsNamespace.Scroll.Create = function (element, vertical, scrollOptionsObject)
{
return new RadControlsNamespace.Scroll(element, vertical, scrollOptionsObject);
}
RadControlsNamespace.Scroll.prototype.Initialize = function ()
{
if (this.Initialized)
{
this.ApplyOverflow();
this.CalculateMinMaxPosition();
this.EvaluateArrowStatus();
return false;
}
if (
(this.Element.offsetWidth == 0 && !this.IsVertical)
||
(this.Element.offsetHeight == 0 && this.IsVertical)
)
{
return false;
}
this.Initialized = true;
this.ScrollAmount = 2;
this.Direction = 0;
if (this.WrapNeeded)
{
var scrollWrap = this.CreateScrollWrap();
}
this.ApplyOverflow();
this.Element.style.position = "relative";
this.AttachArrows();
this.CalculateMinMaxPosition();
if (this.PerTabScrolling)
{
this.CalculateInitialTab();
}
this.AttachScrollMethods();
this.EvaluateArrowStatus();
this.AttachEventHandlers();
this.ScrollTo(this.ScrollPosition);
this.ApplyOverflow();
return scrollWrap;
};
RadControlsNamespace.Scroll.prototype.ApplyOverflow = function ()
{
if (RadControlsNamespace.Browser.IsIE)
{
this.Element.parentNode.style.overflow = "visible";
if (this.IsVertical)
{
this.Element.parentNode.style.overflowX = "";
this.Element.parentNode.style.overflowY = "hidden";
}
else
{
this.Element.parentNode.style.overflowX = "hidden";
this.Element.parentNode.style.overflowY = "hidden";
}
}
else
{
this.Element.parentNode.style.overflow = "hidden";
}
if (!this.ScrollNeeded())
{
this.Element.parentNode.style.overflow = "visible";
this.Element.parentNode.style.overflowX = "visible";
this.Element.parentNode.style.overflowY = "visible";
}
}
RadControlsNamespace.Scroll.prototype.ResizeHandler = function ()
{
if (this.Disposed)
{
return;
}
if (!this.Initialized)
{
this.Initialize();
}
if (!this.Initialized)
{
return;
}
if (!this.Element.offsetHeight || !this.Element.offsetWidth)
{
return;
}
this.CalculateMinMaxPosition();
if (this.Element.offsetWidth < this.Element.parentNode.offsetWidth)
{
this.ScrollTo(0);
}
var stylePosition = parseInt(this.IsVertical ? this.Element.style.top : this.Element.style.left);
if (isNaN(stylePosition))
{
stylePosition = 0;
}
var instance = this;
/*
this.intervalPointer = setTimeout(function ()
{
if (instance.Disposed)
{
return;
}
instance.ApplyOverflow();
instance.ScrollTo(stylePosition);
instance.EvaluateArrowStatus();
}, 100);*/
}
RadControlsNamespace.Scroll.prototype.AttachEventHandlers = function ()
{
var element = this.Element;
var instance = this;
this.resizeClosure = function()
{
instance.ResizeHandler();
}
if (window.addEventListener)
{
window.addEventListener("resize", this.resizeClosure, false);
}
else
{
window.attachEvent("onresize", this.resizeClosure);
}
}
RadControlsNamespace.Scroll.prototype.Dispose = function()
{
this.Disposed = true;
this.Element = null;
clearTimeout(this.intervalPointer);
if (window.removeEventListener)
{
window.removeEventListener("resize", this.resizeClosure, false);
}
else
{
window.detachEvent("onresize", this.resizeClosure);
}
}
RadControlsNamespace.Scroll.prototype.AttachArrows = function ()
{
// arrow creations
var leftArrow = this.CreateArrow("&laquo;", 1, this.LeftArrowClass);
var rightArrow = this.CreateArrow("&raquo;", -1, this.RightArrowClass);
this.LeftArrow = leftArrow;
this.RightArrow = rightArrow;
if (this.IsVertical)
{
leftArrow.style.left = "0px";
rightArrow.style.left = "0px";
if (this.ScrollButtonsPosition == RadControlsNamespace.ScrollButtonsPosition.Middle)
{
leftArrow.style.top = "0px";
rightArrow.style.bottom = "0px";
}
else if (this.ScrollButtonsPosition == RadControlsNamespace.ScrollButtonsPosition.Left)
{
leftArrow.style.top = "0px";
rightArrow.style.top = leftArrow.offsetHeight + "px";
}
else
{
rightArrow.style.bottom = "0px";
leftArrow.style.bottom = leftArrow.offsetHeight + "px";
}
}
else
{
leftArrow.style.top = "0px";
rightArrow.style.top = "0px";
if (this.ScrollButtonsPosition == RadControlsNamespace.ScrollButtonsPosition.Middle)
{
leftArrow.style.left = "-1px";
rightArrow.style.right = "-1px";
}
else if (this.ScrollButtonsPosition == RadControlsNamespace.ScrollButtonsPosition.Left)
{
leftArrow.style.left = "-1px";
rightArrow.style.left = (leftArrow.offsetWidth -1) + "px";
}
else
{
rightArrow.style.right = "-1px";
leftArrow.style.right = (rightArrow.offsetWidth - 1) + "px";
}
}
}
RadControlsNamespace.Scroll.prototype.CreateArrow = function(arrowText, scrollDirection, cssClass)
{
var arrow = document.createElement('a');
arrow.href = "#";
arrow.className = cssClass;
arrow.style.zIndex = "2000";
arrow.appendChild(document.createTextNode("&nbsp;"));
this.Element.parentNode.appendChild(arrow);
var instance = this;
arrow.ScrollDirection = scrollDirection;
if (this.ScrollOnHover)
{
arrow.onmousedown = function ()
{
if (this.disabled)
{
return false;
}
instance.ScrollAmount = 3;
return true;
}
arrow.onmouseup = function ()
{
instance.ScrollAmount = 1;
}
arrow.onmouseover = function ()
{
if (this.disabled)
{
return false;
}
instance.ScrollAmount = 1;
instance.Scroll(this.ScrollDirection);
return true;
}
arrow.onmouseout = function ()
{
instance.scrollAmount = 0;
instance.Stop();
return false;
}
}
else
{
arrow.onmousedown = function ()
{
instance.Scroll(this.ScrollDirection);
}
arrow.onmouseup = function ()
{
instance.Stop();
}
}
arrow.onclick = function ()
{
return false;
}
return arrow;
}
RadControlsNamespace.Scroll.prototype.SetHeight = function (value)
{
if (parseInt(value) == 0)
{
return;
}
this.Element.parentNode.style.height = value;
this.Initialize();
}
RadControlsNamespace.Scroll.prototype.SetWidth = function (value)
{
if (parseInt(value) == 0)
{
return;
}
this.Element.parentNode.style.width = value;
this.Initialize();
}
RadControlsNamespace.Scroll.prototype.CreateScrollWrap = function ()
{
var scrollWrap = document.createElement('div');
var originalContainer = this.Element.parentNode;
scrollWrap.appendChild(this.Element);
scrollWrap.style.position = "relative";
scrollWrap.align = "left"; // WTF??
originalContainer.appendChild(scrollWrap);
if (this.IsVertical)
{
scrollWrap.style.styleFloat = "left";
scrollWrap.style.cssFloat = "left";
this.Element.style.display = "none";
scrollWrap.style.height = scrollWrap.parentNode.parentNode.offsetHeight + "px";
this.Element.style.display = "block";
}
else
{
var realWidth = 0;
for (var i = 0; i < this.Element.childNodes.length; i ++)
{
var node = this.Element.childNodes[i];
if (!node.tagName) continue;
realWidth += node.offsetWidth;
}
this.Element.style.width = (realWidth + 3) + "px";
}
return scrollWrap;
};
RadControlsNamespace.Scroll.prototype.CalculateMinMaxPosition = function ()
{
if (!this.Initialized)
{
return;
}
if (this.IsVertical)
{
var scrollSize = this.Element.parentNode.offsetHeight - this.Element.offsetHeight;
var leftSize = this.LeftArrow.offsetHeight;
var rightSize = this.RightArrow.offsetHeight;
}
else
{
var scrollSize = this.Element.parentNode.offsetWidth - this.Element.offsetWidth;
var leftSize = this.LeftArrow.offsetWidth;
var rightSize = this.RightArrow.offsetWidth;
}
if (!this.LeaveGapsForArrows)
{
leftSize = 0;
rightSize = 0;
}
this.MaxScrollPosition = 0;
this.MinScrollPosition = scrollSize - rightSize - leftSize;
if (this.ScrollButtonsPosition ==
RadControlsNamespace.ScrollButtonsPosition.Middle)
{
this.Offset = leftSize;
}
else if (this.ScrollButtonsPosition ==
RadControlsNamespace.ScrollButtonsPosition.Left)
{
this.Offset = leftSize + rightSize;
}
else
{
this.Offset = 0;
}
}
RadControlsNamespace.Scroll.prototype.CalculateInitialTab = function ()
{
// calculate the selected tab
var lis = this.Element.getElementsByTagName('li');
if (lis.length > 0)
{
var i = 0;
while (this.ScrollPosition < - (this.IsVertical ? lis[i].offsetTop : lis[i].offsetLeft))
{
i ++;
}
this.CurrentTab = i;
}
}
RadControlsNamespace.Scroll.prototype.AttachScrollMethods = function ()
{
if (this.PerTabScrolling)
{
this.Scroll = RadControlsNamespace.Scroll.StartPerTabScroll;
this.Stop = RadControlsNamespace.Scroll.StopPerTabScroll;
}
else
{
this.Scroll = RadControlsNamespace.Scroll.StartSmoothScroll;
this.Stop = RadControlsNamespace.Scroll.StopSmoothScroll;
}
};
RadControlsNamespace.Scroll.prototype.EvaluateArrowStatus = function ()
{
var rightEndReached = ! (this.ScrollPosition > this.MinScrollPosition);
var leftEndReached = ! (this.ScrollPosition < this.MaxScrollPosition);
this.RightArrow.disabled = rightEndReached;
this.LeftArrow.disabled = leftEndReached;
if (leftEndReached)
{
if (this.LeftArrow.className != this.LeftArrowClassDisabled)
{
this.LeftArrow.className = this.LeftArrowClassDisabled;
}
}
else
{
if (this.LeftArrow.className != this.LeftArrowClass)
{
this.LeftArrow.className = this.LeftArrowClass;
}
}
if (rightEndReached)
{
if (this.RightArrow.className != this.RightArrowClassDisabled)
{
this.RightArrow.className = this.RightArrowClassDisabled;
}
}
else
{
if (this.RightArrow.className != this.RightArrowClass)
{
this.RightArrow.className = this.RightArrowClass;
}
}
}
RadControlsNamespace.Scroll.StartSmoothScroll = function (direction)
{
this.Stop();
this.Direction = direction;
var instance = this;
var scrollActivity = function ()
{
instance.ScrollBy(instance.Direction * instance.ScrollAmount);
}
scrollActivity();
this.scrollInterval = setInterval(scrollActivity, 10);
};
RadControlsNamespace.Scroll.prototype.ScrollTo = function (position)
{
position = Math.max(position, this.MinScrollPosition);
position = Math.min(position, this.MaxScrollPosition);
position += this.Offset;
if (this.IsVertical)
{
this.Element.style.top = position + "px";
}
else
{
this.Element.style.left = position + "px";
}
this.Owner.ScrollPosition = this.ScrollPosition = position - this.Offset;
this.EvaluateArrowStatus();
}
RadControlsNamespace.Scroll.prototype.ScrollBy = function (amount)
{
var newScrollPosition = this.ScrollPosition;
this.ScrollTo(newScrollPosition + amount);
}
/*Static methods, transformed in the AttachScrollMethods */
RadControlsNamespace.Scroll.StartPerTabScroll = function (direction)
{
this.Stop();
var lis = this.Element.getElementsByTagName('li');
var nextTab = this.CurrentTab - direction;
if (nextTab < 0 || nextTab > lis.length)
{
return;
}
var dimDiv = direction == -1 ? this.CurrentTab : nextTab;
this.CurrentTab = nextTab;
if (this.IsVertical)
{
var newPosition = lis[dimDiv].offsetHeight;
}
else
{
var newPosition = lis[dimDiv].offsetWidth;
}
this.ScrollBy(newPosition * direction);
this.EvaluateArrowStatus();
};
RadControlsNamespace.Scroll.prototype.ScrollNeeded = function ()
{
return true;
if (this.IsVertical)
{
return this.Element.offsetHeight > this.Element.parentNode.offsetHeight;
}
return this.Element.offsetWidth > this.Element.parentNode.offsetWidth;
}
RadControlsNamespace.Scroll.StopSmoothScroll = function (direction)
{
if (this.OnScrollStop)
{
this.OnScrollStop();
}
clearInterval(this.scrollInterval);
};
RadControlsNamespace.Scroll.StopPerTabScroll = function (direction)
{
if (this.OnScrollStop)
{
this.OnScrollStop();
}
};
//BEGIN_ATLAS_NOTIFY
if (typeof(Sys) != "undefined")
{
if (Sys.Application != null && Sys.Application.notifyScriptLoaded != null)
{
Sys.Application.notifyScriptLoaded();
}
}
//END_ATLAS_NOTIFY