iray
New Member


Joined: Oct 30, 2004
Posts: 21
|
Posted:
Tue Nov 23, 2004 5:19 pm |
|
Hi! I am implementing sentinel to UNITED-NUKE as I tell to Bob. My whole system has concept to be W3C valid, but blocks of sentinel is'nt. So I maked-up very stable mod. I will be very happy, if you add this to next official Sentinel release (<marquee> isn't very cool...):
First, it is needed to put some code to head section. In UNITED-NUKE we have for this issue special iterface, but in PHP-Nuke it must be placed in custom_head.php on window.onload event, like this:
Code:
echo "<s_REMOVE_cript type=\"text/javas_REMOVE_cript\" src=\"includes/xbMarquee.js\"></sc_REMOVED_ript>\n";
$block_exist_res = $db->sql_fetchrow($db->sql_query("SELECT active FROM ".$prefix."_blocks WHERE blockfile='block-ScrollingSentinel.php'"));
$block_exist = $block_exist_res['active'];
if ($block_exist == "1") {
echo "var html = '';\n";
echo = "marquee.start();\n";
}
|
Next, I mod the block:
Code:
<?php
if (eregi(basename(__FILE__),$_SERVER['SC_REMOVE_RIPT_NAME'])) {
Header("Location: ../index.php");
die();
}
global $prefix, $db, $user, $admin, $ab_config;
$usemarquee = 1;
$scrolldirection = "Down";
$content = "";
$content .= "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n";
$content .= " <tr>\n";
$content .= " <td align=\"center\" valign=\"top\"> This is the list of Sentinel banned IP addresses. </td>\n";
$content .= "</tr>\n";
$content .= "<tr>\n";
$content .= " <td align=\"center\">\n";
$content .= " <hr>\n";
$content .= " </td>\n";
$content .= "</tr>\n";
$content .= "<tr>\n";
$content .= " <td align=\"left\">\n";
$content .= "<sc_REMOVE_ript type=\"text/javas_REMOVE_cript\">\n";
$content .= "<!--\n";
$content .= "html = '';\n";
$result = $db->sql_query("SELECT ip_addr, reason FROM ".$prefix."_nsnst_blocked_ips ORDER BY date DESC LIMIT 30");
while (list($ip_addr, $ip_reason) = $db->sql_fetchrow($result)) {
if((is_admin($admin) AND $ab_config['display_link']==1) OR ((is_user($user) OR is_admin($admin)) AND $ab_config['display_link']==2) OR $ab_config['display_link']==3) {
$lookupip = str_replace("*", "0", $ip_addr);
$content .= "html += '<b><big>·<\/big><\/b> <a href=\"".htmlspecialchars("".$ab_config['lookup_link']."$lookupip")."\" target=\"_blank\">$ip_addr<\/a>'\n";
} else {
$content .= "html += '<b><big>·<\/big><\/b> $ip_addr'\n";
}
if((is_admin($admin) AND $ab_config['display_reason']==1) OR ((is_user($user) OR is_admin($admin)) AND $ab_config['display_reason']==2) OR $ab_config['display_reason']==3) {
$result2 = $db->sql_query("SELECT reason FROM ".$prefix."_nsnst_blockers WHERE blocker='$ip_reason'");
list($reason) = $db->sql_fetchrow($result2);
$reason = str_replace("Abuse-","",$reason);
$content .= "html += ' - $reason'\n";
}
$content .= "html += '<br />'\n";
}
// 20 pixels high, 200 pixels wide,
//scrolls 3 pixels to left each 100 ms
$content .= "marquee = new xbMarquee('sentinel-marquee', 150, 100, 1, 75, '".strtolower($scrolldirection)."', 'scroll', html);\n";
$content .= "marquee.widthUnit = '%'\n";
$content .= "marquee.heightUnit = 'px'\n";
$content .= "marquee.onmouseover = function () { this.stop(); };\n";
$content .= "marquee.onmouseout = function () { this.start(); };\n";
$content .= "//-->\n";
$content .= "</sc_REMOVE_ript>\n";
$content .= " </td>\n";
$content .= "</tr>\n";
$content .= "<tr>\n";
$content .= " <td align=\"center\">\n";
$content .= " <hr>\n";
$content .= " </td>\n";
$content .= "</tr>\n";
$content .= "<tr>\n";
$content .= " <td align=\"center\"><a href=\"http://www.nukescripts.net\" target=\"_blank\">"._AB_NUKESENTINEL." ".$ab_config['version_number']."</a></td>\n";
$content .= "</tr>\n";
$content .= "</table>\n";
?>
|
Finally, there is a code of includes/xbMarquee.js:
Code:
/*
* xbMarquee.js
* $Revision: 1.2 $ $Date: 2003/02/07 16:04:20 $
*/
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Netscape code.
*
* The Initial Developer of the Original Code is
* Netscape Corporation.
* Portions created by the Initial Developer are Copyright (C) 2002
* the Initial Developer. All Rights Reserved.
*
* Contributor(s): Doron Rosenberg <doron@netscape.com>
* Bob Clary <bclary@netscape.com>
*
* ***** END LICENSE BLOCK ***** */
function xbMarquee(id, height, width, scrollAmount, scrollDelay, direction, behavior, html)
{
this.id = id;
this.scrollAmount = scrollAmount ? scrollAmount : 6;
this.scrollDelay = scrollDelay ? scrollDelay : 85;
this.direction = direction ? direction.toLowerCase() : 'left';
this.behavior = behavior ? behavior.toLowerCase() : 'scroll';
this.name = 'xbMarquee_' + (++xbMarquee._name);
this.runId = null;
this.html = html;
this.isHorizontal = ('up,down'.indexOf(this.direction) == -1);
if (typeof(height) == 'number')
{
this.height = height;
this.heightUnit = 'px';
}
else if (typeof(height) == 'string')
{
this.height = parseInt('0' + height, 10);
this.heightUnit = height.toLowerCase().replace(/^[0-9]+/, '');
}
else
{
this.height = 100;
this.heightUnit = 'px';
}
if (typeof(width) == 'number')
{
this.width = width;
this.widthUnit = 'px';
}
else if (typeof(width) == 'string')
{
this.width = parseInt('0' + width, 10);
this.widthUnit = width.toLowerCase().replace(/^[0-9]+/, '');
}
else
{
this.width = 100;
this.widthUnit = 'px';
}
// xbMarquee UI events
this.onmouseover = null;
this.onmouseout = null;
this.onclick = null;
// xbMarquee state events
this.onstart = null;
this.onbounce = null;
var markup = '';
if (document.layers)
{
markup = '<ilayer id="' + this.id + 'container" name="' + this.id + 'container" ' +
'height="' + height + '" ' +
'width="' + width + '" ' +
'clip="' + width + ', ' + height + '" ' +
'>' +
'<\/ilayer>';
}
else if (document.body && typeof(document.body.innerHTML) != 'string')
{
markup = '<div id="' + this.id + 'container" ' +
'style="position: relative; overflow: scroll; ' +
'height: ' + this.height + this.heightUnit + '; ' +
'width: ' + this.width + this.widthUnit + '; ' +
'clip: rect(0px, ' + this.width + this.widthUnit + ', ' + this.height + this.heightUnit + ', 0px); ' +
'">' +
'<div id="' + this.id + '" style="position:relative;' +
(this.isHorizontal ? 'width:0px;' : '') + // if we scroll horizontally, make the text container as small as possible
'">' +
(this.isHorizontal ? '<nobr>' : '') +
this.html +
(this.isHorizontal ? '<\/nobr>' : '') +
'<\/div>' +
'<\/div>';
}
else
{
markup = '<div id="' + this.id + 'container" ' +
'style="position: relative; overflow: hidden; ' +
'height: ' + this.height + this.heightUnit + '; ' +
'width: ' + this.width + this.widthUnit + '; ' +
'clip: rect(0px, ' + this.width + this.widthUnit + ', ' + this.height + this.heightUnit + ', 0px); ' +
'">' +
'<\/div>';
}
document.write(markup);
window[this.name] = this;
}
// Class Properties/Methods
xbMarquee._name = -1;
xbMarquee._getInnerSize = function(elm, propName)
{
var val = 0;
if (document.layers)
{
// navigator 4
val = elm.document[propName];
}
else if (elm.style && typeof(elm.style[propName]) == 'number')
{
// opera
// bug in Opera 6 width/offsetWidth. Use clientWidth
if (propName == 'width' && typeof(elm.clientWidth) == 'number')
val = elm.clientWidth;
else
val = elm.style[propName];
}
else
{
//mozilla and IE
switch (propName)
{
case 'height':
if (typeof(elm.offsetHeight) == 'number')
val = elm.offsetHeight;
break;
case 'width':
if (typeof(elm.offsetWidth) == 'number')
val = elm.offsetWidth;
break;
}
}
return val;
};
xbMarquee.getElm = function(id)
{
var elm = null;
if (document.getElementById)
{
elm = document.getElementById(id);
}
else
{
elm = document.all[id];
}
return elm;
}
xbMarquee.dispatchUIEvent = function (event, marqueeName, eventName)
{
var marquee = window[marqueeName];
var eventAttr = 'on' + eventName;
if (!marquee)
{
return false;
}
if (!event && window.event)
{
event = window.event;
}
switch (eventName)
{
case 'mouseover':
case 'mouseout':
case 'click':
if (marquee[eventAttr])
return marquee['on' + eventName](event);
}
return false;
};
xbMarquee.createDispatchEventAttr = function (marqueeName, eventName)
{
return 'on' + eventName + '="xbMarquee.dispatchUIEvent(event, \'' + marqueeName + '\', \'' + eventName + '\')" ';
};
// Instance properties/methods
xbMarquee.prototype.start = function ()
{
var markup = '';
this.stop();
if (!this.dirsign)
{
if (!document.layers)
{
this.containerDiv = xbMarquee.getElm(this.id + 'container');
if (typeof(this.containerDiv.innerHTML) != 'string')
{
return;
}
// adjust the container size before inner div is filled in
// so IE will not hork the size of percentage units
var parentNode = null;
if (this.containerDiv.parentNode)
parentNode = this.containerDiv.parentNode;
else if (this.containerDiv.parentElement)
parentNode = this.containerDiv.parentElement;
if (parentNode &&
typeof(parentNode.offsetHeight) == 'number' &&
typeof(parentNode.offsetWidth) == 'number')
{
if (this.heightUnit == '%')
{
this.containerDiv.style.height =
parentNode.offsetHeight * (this.height/100) + 'px';
}
if (this.widthUnit == '%')
{
this.containerDiv.style.width =
parentNode.offsetWidth * (this.width/100) + 'px';
}
}
markup += '<div id="' + this.id + '" ' +
'style="position:relative; visibility: hidden;' +
(this.isHorizontal ? 'width:0px;' : '') + // if we scroll horizontally, make the text container as small as possible
'" ' +
xbMarquee.createDispatchEventAttr(this.name, 'mouseover') +
xbMarquee.createDispatchEventAttr(this.name, 'mouseout') +
xbMarquee.createDispatchEventAttr(this.name, 'click') +
'>' +
(this.isHorizontal ? '<nobr>' : '') +
this.html +
(this.isHorizontal ? '<\/nobr>' : '') +
'<\/div>';
this.containerDiv.innerHTML = markup;
this.div = xbMarquee.getElm(this.id);
this.styleObj = this.div.style;
}
else /* if (document.layers) */
{
this.containerDiv = document.layers[this.id + 'container'];
markup =
'<layer id="' + this.id + '" name="' + this.id + '" top="0" left="0" ' +
xbMarquee.createDispatchEventAttr(this.name, 'mouseover') +
xbMarquee.createDispatchEventAttr(this.name, 'mouseout') +
xbMarquee.createDispatchEventAttr(this.name, 'click') +
'>' +
(this.isHorizontal ? '<nobr>' : '') +
this.html +
(this.isHorizontal ? '<\/nobr>' : '') +
'<\/layer>';
this.containerDiv.document.write(markup);
this.containerDiv.document.close();
this.div = this.containerDiv.document.layers[this.id];
this.styleObj = this.div;
}
// Start must not run until the page load event has fired
// due to Internet Explorer not setting the height and width of
// the dynamically written content until then
switch (this.direction)
{
case 'down':
this.dirsign = 1;
this.startAt = -xbMarquee._getInnerSize(this.div, 'height');
this._setTop(this.startAt);
if (this.heightUnit == '%')
this.stopAt = this.height * xbMarquee._getInnerSize(this.containerDiv, 'height') / 100;
else
this.stopAt = this.height;
break;
case 'up':
this.dirsign = -1;
if (this.heightUnit == '%')
this.startAt = this.height * xbMarquee._getInnerSize(this.containerDiv, 'height') / 100;
else
this.startAt = this.height;
this._setTop(this.startAt);
this.stopAt = -xbMarquee._getInnerSize(this.div, 'height');
break;
case 'right':
this.dirsign = 1;
this.startAt = -xbMarquee._getInnerSize(this.div, 'width');
this._setLeft(this.startAt);
if (this.widthUnit == '%')
this.stopAt = this.width * xbMarquee._getInnerSize(this.containerDiv, 'width') / 100;
else
this.stopAt = this.width;
break;
case 'left':
default:
this.dirsign = -1;
if (this.widthUnit == '%')
this.startAt = this.width * xbMarquee._getInnerSize(this.containerDiv, 'width') / 100;
else
this.startAt = this.width
this._setLeft(this.startAt);
this.stopAt = -xbMarquee._getInnerSize(this.div,'width');
break;
}
this.newPosition = this.startAt;
this.styleObj.visibility = 'visible';
}
this.newPosition += this.dirsign * this.scrollAmount;
if ( (this.dirsign == 1 && this.newPosition > this.stopAt) ||
(this.dirsign == -1 && this.newPosition < this.stopAt) )
{
if (this.behavior == 'alternate')
{
if (this.onbounce)
{
// fire bounce when alternate changes directions
this.onbounce();
}
this.dirsign = -this.dirsign;
var temp = this.stopAt;
this.stopAt = this.startAt;
this.startAt = temp;
}
else
{
// fire start when position is a start
if (this.onstart)
{
this.onstart();
}
this.newPosition = this.startAt;
}
}
switch(this.direction)
{
case 'up':
case 'down':
this._setTop(this.newPosition);
break;
case 'left':
case 'right':
default:
this._setLeft(this.newPosition);
break;
}
this.runId = setTimeout(this.name + '.start()', this.scrollDelay);
};
xbMarquee.prototype.stop = function ()
{
if (this.runId)
clearTimeout(this.runId);
this.runId = null;
};
xbMarquee.prototype.setInnerHTML = function (html)
{
if (typeof(this.div.innerHTML) != 'string')
{
return;
}
var running = false;
if (this.runId)
{
running = true;
this.stop();
}
this.html = html;
this.dirsign = null;
if (running)
{
this.start();
}
};
// fixes standards mode in gecko
// since units are required
if (document.layers)
{
xbMarquee.prototype._setLeft = function (left)
{
this.styleObj.left = left;
};
xbMarquee.prototype._setTop = function (top)
{
this.styleObj.top = top;
};
}
else
{
xbMarquee.prototype._setLeft = function (left)
{
this.styleObj.left = left + 'px';
};
xbMarquee.prototype._setTop = function (top)
{
this.styleObj.top = top + 'px';
};
}
|
I check this with W3C validator and everything was fine If you have any question about this, so ask me. I try to explain you anything
Don't forget to remove _REMOVE_ - I was catched by Sentinel for several times when I was posting this mod.... |
|
|