601 lines
13 KiB
JavaScript
Executable File
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("«", 1, this.LeftArrowClass);
|
|
|
|
var rightArrow = this.CreateArrow("»", -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(" "));
|
|
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
|