// title and copyright notice go here // API // These are the functions you will call to use the NewsScroller from your web page // NewsScroller_Initialize // Parameters: // elmDivForNews: object reference to a DIV element that will be used to display the news // Return: // returns a NewsScroller object, with supporting properties and methods function NewsScroller () { if (window.NewsScrollerInstance != null) { window.alert("Only one NewsScroller control is allowed on a page."); return; } window.NewsScrollerInstance = this; this.LoadXML = NewsScroller_LoadXML; this.AddNewsItem = NewsScroller_AddNewsItem; this.Clear = NewsScroller_Clear; this.StartScrolling = NewsScroller_StartScrolling; this.StopScrolling = NewsScroller_StopScrolling; this.Render = NewsScroller_Render; // public properties this.className = ""; this.itemNormalClassName = ""; this.scrollRate = 60; this.scrollStep = 1; this.scrollPause = 2000; // internal use this.RenderChildren = NewsScroller_RenderChildren; this.renderedControl = ""; this.itemsText = new Array(); this.itemsLink = new Array(); this.itemCount = 0; this.scrollEnabled = false; } function NewsScroller_LoadXML (sXmlID) { this.Clear(); var elmXml = document.getElementById(sXmlID); var xDoc = elmXml.XMLDocument; var xItems = xDoc.selectNodes("/Items/Item"); for (var iNode = 0; iNode < xItems.length; iNode++) { var xItem = xItems[iNode]; var xText = xItem.selectSingleNode("Text"); var xLink = xItem.selectSingleNode("Link"); this.AddNewsItem(xText.text, xLink.text); } var elmControl = document.getElementById(this.renderedControl); this.RenderChildren(this.renderedControl); } function NewsScroller_AddNewsItem (strText, strLink) { this.itemsText[this.itemCount] = strText; this.itemsLink[this.itemCount] = strLink; this.itemCount++; } function NewsScroller_Clear () { this.StopScrolling (); var elmControl = document.getElementById(this.renderedControl); while (elmControl.childNodes.length > 0) elmControl.removeChild(elmControl.childNodes[0]); this.itemsText = new Array(); this.itemsLink = new Array(); this.itemCount = 0; } function NewsScroller_StartScrolling () { if (this.itemCount > 0) { var sControlName = this.renderedControl; if (sControlName == null) { window.alert ("You must render a control before you can start scrolling it."); return; } var elmControl = document.getElementById(sControlName); var elmItem0 = document.getElementById("floatingNews0"); if (this.itemCount > 1) { var elmItem1 = document.getElementById(sControlName + "1"); this.cySeparator = (elmItem1.offsetTop - elmItem0.offsetTop) - elmItem0.offsetHeight; } else { this.cySeparator = 0; } if (this.ScrollTimerID == null) this.ScrollTimerID = window.setInterval(NewsScroller_ScrollNews, this.scrollRate); } } function NewsScroller_StopScrolling () { window.clearInterval(this.ScrollTimerID); this.ScrollTimerID = null; } function NewsScroller_Render(sControlID) { if (sControlID.length == 0) { window.alert("You must provide a unique ID for the rendered control."); return; } var elmControl = document.getElementById(sControlID); if (elmControl != null) { window.alert("A NewsScroller with this ID has already been rendered. Please use a unique ID."); return; } this.renderedControl = sControlID; //
document.write(""); //
document.write(""); this.RenderChildren(sControlID); var dtNow = new Date(); var dtResume = new Date(dtNow.getFullYear(), dtNow.getMonth(), dtNow.getDate(), dtNow.getHours(), dtNow.getMinutes(), dtNow.getSeconds(), this.scrollPause); elmControl = document.getElementById(sControlID); elmControl.ResumeDateTime = dtResume; } // Supporting functions function NewsScroller_RenderChildren() { var sControlID = this.renderedControl; elmControl = document.getElementById(sControlID); //
elmDiv = document.createElement("div"); elmDiv.style.position = "absolute"; elmDiv.style.left = "0px"; elmDiv.style.width = "100%"; elmDiv.style.height = "100%"; elmDiv.style.overflow = "hidden"; elmControl.appendChild(elmDiv); for (var nItem = 0; nItem < this.itemCount; nItem++) { var sItemName = sControlID + nItem.toString(); var elmP = document.createElement("p"); elmP.id = sItemName; elmP.style.position = "relative"; elmP.style.top = "0px"; elmP.style.width = "100%"; elmP.className = this.itemNormalClassName; elmDiv.appendChild(elmP); var elmA = document.createElement("a"); elmA.className = this.itemNormalClassName; elmA.href = this.itemsLink[nItem]; elmP.appendChild(elmA); var tn = document.createTextNode(this.itemsText[nItem]); elmA.appendChild(tn); } } function NewsScroller_ScrollNews() { var ns = window.NewsScrollerInstance; var sControlName = ns.renderedControl; if (sControlName.length == 0) { window.alert ("Do not call ScrollNews directly. Use the Start method of the NewsScroller object."); return; } var elmControl = document.getElementById(sControlName); if (new Date() >= elmControl.ResumeDateTime) { // see whether any item is about to reach the top, var cyOffset = 0; for (var nItem = 0; nItem < ns.itemCount; nItem++) { var sItemName = sControlName + nItem.toString(); var elmItem = document.getElementById(sItemName); if ((elmItem.offsetTop > 0) && ((elmItem.offsetTop - ns.scrollStep) <= 0)) { // the top of this item has reached the top of the control, // so pause scrolling for the whole control var dtNow = new Date(); var dtResume = new Date(dtNow.getFullYear(), dtNow.getMonth(), dtNow.getDate(), dtNow.getHours(), dtNow.getMinutes(), dtNow.getSeconds(), ns.scrollPause); elmControl.ResumeDateTime = dtResume; cyOffset = elmItem.offsetTop; } } if (cyOffset > 0) { // control is just now paused, so scroll all items up // in order to put the top item flush with the top of the control for (var nItem = 0; nItem < ns.itemCount; nItem++) { var sItemName = sControlName + nItem.toString(); var elmItem = document.getElementById(sItemName); elmItem.style.pixelTop = elmItem.style.pixelTop - cyOffset; } } else { // the control is not paused, so scroll every item up by one step for (var nItem = 0; nItem < ns.itemCount; nItem++) { var sItemName = sControlName + nItem.toString(); var elmItem = document.getElementById(sItemName); elmItem.style.pixelTop -= ns.scrollStep; } } // see whether any items have scrolled off the top for (var nItem = 0; nItem < ns.itemCount; nItem++) { var sItemName = sControlName + nItem.toString(); var elmItem = document.getElementById(sItemName); if ((elmItem.offsetTop + elmItem.offsetHeight) <= 0) { // the bottom of this item has scrolled beyond the top of the control, // so move it to the bottom of the control if (ns.itemCount > 1) { var sBottomItemName; if (nItem == 0) sBottomItemName = sControlName + (ns.itemCount - 1).toString(); else sBottomItemName = sControlName + (nItem - 1).toString(); var elmBottomItem = document.getElementById(sBottomItemName); elmItem.style.pixelTop = (elmBottomItem.offsetTop + elmBottomItem.offsetHeight + ns.cySeparator) - (elmItem.offsetTop - elmItem.style.pixelTop); } else { elmItem.style.pixelTop = elmItem.parentElement.offsetHeight; } } } } }