[prev in list] [next in list] [prev in thread] [next in thread] 

List:       helix-server-cvs
Subject:    [Server-cvs] admin/web/build/server BigInt.js, 1.1,
From:       dcollins () helixcommunity ! org
Date:       2007-05-25 19:33:51
Message-ID: 200705252134.l4PLYO1r008078 () mailer ! progressive-comp ! com
[Download RAW message or body]

Update of /cvsroot/server/admin/web/build/server
In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv2829/server

Added Files:
	BigInt.js add_redirect.html adduser.html browse_content.html 
	browsers.html cdistpulldown.html client.js config_alias.html 
	config_altserv.html config_binding.html 
	config_broad_archive.html config_broad_real.html 
	config_broad_redun.html config_broad_rtp.html 
	config_broad_wm.html config_cc.html config_cdist.html 
	config_clog.html config_content_browsing.html 
	config_delivery.html config_getdata.nc.sjs config_isp.html 
	config_localFS.html config_logging.html config_mc_bc.html 
	config_mc_sap.html config_mc_scale.html config_mc_wm.html 
	config_mimetypes.html config_pc_cache.html 
	config_pending.nc.html config_ports.html config_qos.html 
	config_rate.html config_results.nc.html config_sec_ac.html 
	config_sec_db.html config_sec_rules.html config_sec_uauth.html 
	config_setid.html config_shutdown.html config_snmp.html 
	config_spl_dist.html config_spl_recv.html config_viewsrc.html 
	cookies.js datachannel.html datachn.js dialog.js editsel.js 
	edituser.html edituserperm.html enumlist.js enumproplist.js 
	getusers.html grantuser.html header.html help.js index.html 
	ip.js license.html main.css main_ie_mac.css main_nav4_mac.css 
	main_nav4_x.css mongraph.nc.html port.js proplist.js 
	propview.js propview_enum.js propview_noedit.js 
	propview_nolist.js qstr.js regpick.html regpick_list.js 
	regpick_main.html regpick_toc.html regtree_nav.css 
	regtree_w3c.css regview.html regview.js regview_header.html 
	regview_main.html regview_toc.html removeuser.html results.js 
	revokealluser.html revokeuser.html samples.html serve_me.html 
	server.inc string.js test.html toc.html toc.js toc_nav.css 
	toc_w3c.css tree.js welcome.html xblib.js 
Log Message:
Synopsis
========
Helix Server Commercial Source Licensing feature.

Branches: HEAD
Reviewed by: server-dev


Description
===========
Changes to implement the CSL feature.  These are being bubbled
from the SERVER_BORABORA branch to the head.  Additionally, 
recent HEAD changes are also picked up and moved for files
moving within the various code repositories.

Your .buildrc now needs the following:
AddBIFPath('server-restricted', '[helix]server-restricted/build/BIF')


Files Affected
==============

Far too many to list.


Testing Performed
=================
Unit Tests:
- none

Integration Tests:
- Server and proxy uptime tests on multiple platforms by dev and QA.
- Server and proxy BVT testing by QA.
- Server and proxy feature testing by dev and QA.

Leak Tests:
- Uptimes showed leaks were similar to the pre-CSL HEAD.

Performance Tests:
- none

Platforms Tested: linux-rhel4-i686, sunos-5.10-sparc-server, win32-i386-vc7
Build verified: linux-rhel4-i686, sunos-5.10-sparc-server, win32-i386-vc7


QA Hints
===============

None at this time.




--- NEW FILE: config_rate.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Rate Management</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "43";
</SCRIPT>

<SCRIPT SRC="propview_nolist.js"></SCRIPT>
<SCRIPT SRC="servvar.get.html?serverData=config.MediaDelivery.UserAgentProfiles.Default.Transport"></SCRIPT>


<SCRIPT>
var propSet = 
[
	new PropObj( 'RtcpRRRatio', "200",	 false, true,  0, 10000, "int", 	"RtcpRRRatio" ),
	new PropObj( 'RtcpRSRatio', "100",	 false, true,  0, 10000, "int", 	"RtcpRSRatio" ),
	new PropObj( 'CongestionControl.MaxBurst', "3",	false, true,  0, 1024, "int", \
"MaxBurst" ),  new PropObj( 'CongestionControl.MaxRateScalar', "110",	false, true,  \
101, null, "int", "Excess Available Bandwidth Percentage" ),  new PropObj( \
'CongestionControl.ChannelRate', "24000",	false, true,  0, "", "int", "MaxRate" ) ];

function RateMgrPropView ()
{
	this.base = PropListView ;
	this.base( "Rate Management", propList, 
		"config.MediaDelivery.UserAgentProfiles.Default.Transport.", 
		"servvar", "theForm" );
}
RateMgrPropView.prototype = new PropListView ;

RateMgrPropView.prototype.postValidate = function ()
{
	return true;
}

var propList = new PropList( "Rate Management", serverData, propSet );
var propView = new RateMgrPropView();

var theForm ;
function onLoad ()
{
	theForm = document.theForm;

	propView.onLoad( window );
}
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">TRANSPORT SETTINGS</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
The rate control feature allows the server to adjust the delivery rate
based upon periodic status reports received from media players. These 
reports allow the server to compensate for fluctuating throughput
conditions that may occur due to network congestion. These fields affect
the default rate control settings within the configuration file.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Rate Management</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Player Report Bandwidth Percentage</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="input" MAXLENGTH="255" NAME="RtcpRRRatio" SIZE="6" TYPE="text" \
VALUE=""><SPAN CLASS="units"><BR>(as a precentage of average bit rate, scaled by \
10000)</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Server Report Bandwidth Percentage</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="input" MAXLENGTH="255" NAME="RtcpRSRatio" SIZE="6" TYPE="text" \
VALUE=""><SPAN CLASS="units"><BR>(as a precentage of average bit rate, scaled by \
10000)</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Maximum Report Packet Number</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="input" MAXLENGTH="255" NAME="CongestionControl.MaxBurst" SIZE="6" \
TYPE="text" VALUE=""><SPAN CLASS="units"><BR>(number of packets to send in each \
scheduling window, 0 - 1024)</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Excess Available Bandwidth Percentage</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="input" MAXLENGTH="255" NAME="CongestionControl.MaxRateScalar" \
SIZE="6" TYPE="text" VALUE=""><SPAN CLASS="units"><BR>(as a percentage of the media \
rate e.g. 125%)</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Maximum Bandwidth Per Connection</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="input" MAXLENGTH="255" NAME="CongestionControl.ChannelRate" SIZE="6" \
TYPE="text" VALUE=""><SPAN CLASS="units"><BR>(Specific maximum rate for congestion \
control, in bps)</SPAN>  </td>
	</tr>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: editsel.js ---

function EditSelect2 ( oWin, selectCtrl, editCtrl, oCallback /*instance of \
NestedPropListView */ ) {
	if ( ! oWin )	// probably being called to setup prototype chain
		return this ;

	this.m_oWin = oWin;

	if ( ! (selectCtrl && editCtrl) )
		return null ;

	this.selectCtrl = selectCtrl ;
	this.editCtrl = editCtrl ;
	this.uniqOnly = true ;
	this.m_oCallback = oCallback;
	this.m_itemName = "" ;

	this.m_inSelChangeHandler = false ;

	this.m_syncTextAndValue = true ;

	// default regular expression for validating list names
	this.m_reIllegalChars = /[\."]/ ;

	this.hookEventHandlers();

	this.m_curIndex = -1;
	this.m_lastText = "" ;

	this.m_propChangeSyncTimeoutID = null;

	this.sync();

	return this ;
}

EditSelect2.prototype.hookEventHandlers = function ()
{
	//because of Mozilla Bug 49980 (as of 4/11/01) we can't use anonymous functions
	//as event handlers - so we assign the instance method call generated by
	// getInstanceEventHandler() to a variable of parent window...
	this.m_oWin._ES_onSelChange = getInstanceEventHandler( this, "onSelChange" );
	//... and then hook it in as the ctrl's change handler
	this.origOnSelChangeHandler = addEvent( this.selectCtrl, "change", 
		this.m_oWin._ES_onSelChange );

	this.m_oWin._ES_onEditChange = getInstanceEventHandler( this, "onEditChange" );
	this.origOnEditChangeHandler = addEvent( this.editCtrl, "change", 
		this.m_oWin._ES_onEditChange );

	this.m_oWin._ES_onEditKeyUp = getInstanceEventHandler( this, "onKeyUp" );
	this.origOnKeyUpHandler = addEvent( this.editCtrl, "keyup", 
		this.m_oWin._ES_onEditKeyUp );

	this.m_oWin._ES_onEditKeyPress = getInstanceEventHandler( this, "onKeyPress" );
	this.origOnKeyPressHandler = addEvent( this.editCtrl, "keypress", 
		this.m_oWin._ES_onEditKeyPress );

	if ( isIE5Up )
	{
		this.m_oWin._ES_onEditPropertyChange = getInstanceEventHandler( this, \
"onEditPropertyChange" );  this.origOnEditPropertyChangeHandler = addEvent( \
this.editCtrl, "propertychange",   this.m_oWin._ES_onEditPropertyChange );

		// handle crashing rentrance bug in 5.0 but using a timeout and a global func
		if ( ! isIE5_5 )
		{
			// ...set up the timeout handler
			this.m_oWin._doESSyncTextChange = getInstanceEventHandler( this, "syncTextChange" \
);  }
	}
	/*
	// chain onchange handlers for the select control and edit controls
	this.origOnSelChangeHandler = this.selectCtrl.onchange ;
	this.selectCtrl.onchange = this.getInstanceEventHandler( "onSelChange" );

	// chain onchange handlers for the select control and edit controls
	this.origOnEditChangeHandler = 	this.editCtrl.onchange ;
	this.editCtrl.onchange = this.getInstanceEventHandler( "onEditChange" );

	// chain onkeyUp handler for the edit control
	this.origOnKeyUpHandler = this.editCtrl.onkeyup ;
	this.editCtrl.onkeyup = this.getInstanceEventHandler( "onKeyUp" );

	this.origOnKeyPressHandler = this.editCtrl.onkeypress ;
	this.editCtrl.onkeypress = this.getInstanceEventHandler( "onKeyPress" );

	if ( isIE5Up )
	{
		// when AutoComplete is used to enter/complete a text entry, onpropertychange is \
fired  this.origOnEditPropertyChangeHandler = this.editCtrl.onpropertychange ;
		this.editCtrl.onpropertychange = this.getInstanceEventHandler( \
"onEditPropertyChange" );  }
	*/
}

// gets an instance method closure you can assign to an event handler
/*
EditSelect2.prototype.getInstanceEventHandler = function ( handlerName )
{
	function getInstanceMethodClosure( obj )
	{
		// Nav passes the event obj to the handler, pass it along to the real handler
		return function(evt)
		{
			return obj[ handlerName ](evt);		
		}
	}
	
	return getInstanceMethodClosure( this );

}	// getInstanceEventHandler
*/

EditSelect2.prototype.clear = function ()
{
	// empty the select list and edit control
	this.selectCtrl.options.length = 0;
	setCtrlValue( this.editCtrl, "", true );

	// reset state variables
	this.m_lastText = "" ;
	this.m_curIndex = -1;
	
}	// clear

EditSelect2.prototype.itemName = function ()
{
	if ( arguments.length )
	{
		this.m_itemName = arguments[ 0 ];
	}

	return this.m_itemName ;
	
}	// itemName

// sets/gets the regular exp used to validate each char entered into the edit window
EditSelect2.prototype.reIllegalChars = function ()
{
	if ( arguments.length )
	{
		this.reIllegalChars = arguments[ 0 ];
	}

	return this.reIllegalChars ;
	
}	// itemName

EditSelect2.prototype.sync = function ()
{
	this.m_curIndex = this.selectCtrl.selectedIndex ;

	if ( (this.selectCtrl.options.length == 0) || (this.m_curIndex < 0) )
	{
		this.m_curIndex = -1 ;
		this.m_lastText = "";
	}
	else
	{
		this.m_lastText = getCtrlValue( this.selectCtrl, true );
	}
	setCtrlValue( this.editCtrl, this.m_lastText, true );
}

EditSelect2.prototype.resetItemText = function ( fSelect )
{
	if ( (this.selectCtrl.options.length == 0) || (this.m_curIndex < 0) )
	{
		return ;
	}
	
	var s = getCtrlDefValue( this.editCtrl );
	this.selectCtrl.options[ this.m_curIndex ].text = s ;

	if ( this.m_syncTextAndValue )
		this.selectCtrl.options[ this.m_curIndex ].value = s ;

	this.m_lastText = s;
	setCtrlValue( this.editCtrl, s );
	this.editCtrl.focus();
	if ( fSelect )
		this.editCtrl.select();
}

EditSelect2.prototype.isDirty = function ()
{
	return isCtrlDirty( this.editCtrl );
}

EditSelect2.prototype.validateChars = function ( s )
{
	if ( this.m_reIllegalChars )
	{
		var pos = s.search( this.m_reIllegalChars );
		if ( pos != -1 )
		{
			var illegalChar = s.charAt( pos );
			var errMsg = 
				( this.m_itemName ?
				"A " + this.m_itemName + " may not contain the '" + 
				illegalChar + "' character." 
				:
				"A list item may not contain the '" + illegalChar + 
				"' character." );

			return rejectInput( this.editCtrl, errMsg, true );
		}
	}

	return true ;
}

EditSelect2.prototype.validate = function ()
{
	var s = getCtrlValue( this.editCtrl );
	
	// check for empty string
	if ( "" == s )
	{
		var errMsg = 
			( this.m_itemName ?
			"A " + this.m_itemName + " is required." 
			:
			"This field is required." );
		return rejectInput( this.editCtrl, errMsg );
	}

	if ( ! this.validateChars( s ) )
	{
		return false ;
	}

	if ( this.uniqOnly )
	{
		for ( var i = 0; i < this.selectCtrl.length; i++ )
		{
			// don't compare the current item to itself
			if ( (i != this.m_curIndex) && (s == this.selectCtrl.options[ i ].text) )
			{
				if ( this.m_itemName )
				{
					var errMsg = 
						( this.m_itemName ?
						"'" + s + "' is already being used as a " + 
						this.m_itemName + ". " + this.m_itemName + 
						"s must be unique."
						:
						"'" + s + 
						"' is already a list item. List items must be unique." );
					return rejectInput( this.editCtrl, errMsg );
				}
			}
		}
	}

	return true ;
}

EditSelect2.prototype.replace = function ()
{
	var selX = this.selectCtrl.selectedIndex ;
	if ( selX == -1 )
	{
		alert( 'Use the "Add New" button first.' );
		return false ;
	}

	var s = getCtrlValue( this.editCtrl );
	if ( (selX != -1) &&
		 (s != "") && 
	     (s != getCtrlValue( this.selectCtrl )) )
	{
		if ( this.validate() )
		{
			this.selectCtrl.options[ selX ].text = s ;
			if ( this.m_syncTextAndValue )
				this.selectCtrl.options[ selX ].value = s ;
	
			return true ;
		}
	}
	
	return false ;
}

EditSelect2.prototype.onSelChange = function ()
{
	var fValidChg = true ;

	// confirm actual change in the selected index
	if ( this.selectCtrl.selectedIndex == this.m_curIndex )
		return true ;

	this.m_inSelChangeHandler = true;

	fValidChg = this.doRenameCheck();
	if ( fValidChg )
	{
		if ( ! this.m_oCallback )
		{
			this.sync();
		}
		else
		{
			fValidChg = this.m_oCallback.onESSelChange( this );
			if ( fValidChg )
				this.sync();
		}								   
	}
			
	if ( ! fValidChg )
	{
		// rollback the list change
		this.selectCtrl.selectedIndex = this.m_curIndex ;
	}
	else
	{
		this.m_curIndex = this.selectCtrl.selectedIndex ;
		if ( this.origOnSelChangeHandler )
		{
			this.origOnSelChangeHandler();
		}
	}

	this.m_inSelChangeHandler = false;

	return fValidChg ;
}

EditSelect2.prototype.onKeyPress = function ( evt )
{
	
	// validate each character entered
	if ( this.m_reIllegalChars )
	{
		var keyCode ;
		if ( isIE )
		{
			evt = this.m_oWin.event ;
			keyCode = evt.keyCode ;
		}
		else if ( isNav )
		{
			keyCode = evt.which ;
		}
		if ( ! this.validateChars( String.fromCharCode( keyCode ) ) )
		{
			return false ;
		}
	}

	if ( this.origOnKeyPressHandler )
	{
		return this.origOnKeyPressHandler( evt );
	}
	
	return true ;
}

EditSelect2.prototype.onKeyUp = function ( e )
{

	this.syncTextChange();
	if ( this.origOnKeyUpHandler )
	{
		return this.origOnKeyUpHandler();
	}
	
	return true ;
}

var inPChg = 0;
EditSelect2.prototype.onEditPropertyChange = function ()
{
	if ( this.m_inSelChangeHandler ) return true;

	if ( this.m_oWin && this.m_oWin.event && 
		 ("value" == this.m_oWin.event.propertyName) )
	{

		if ( isIE5_5 )
		{
			this.syncTextChange();
		}
		else	// handle crashing rentrance bug in 5.0
		{
			if ( ! this.m_propChangeSyncTimeoutID )
			{
				this.m_propChangeSyncTimeoutID = this.m_oWin.setTimeout( "_doESSyncTextChange()", \
200 );  }
		}
	}
	
	if ( this.origOnEditPropertyChange )
	{
		return this.origOnEditPropertyChange();
	}
	return true ;
}

EditSelect2.prototype.onEditChange = function ()
{
	
	this.syncTextChange();
	if ( this.origOnEditChange )
	{
		return this.origOnEditChange();
	}
	
	return true ;
}

EditSelect2.prototype.syncTextChange = function ()
{
	var newText = getCtrlValue( this.editCtrl );

	// update the list with the new item text
	if ( (this.m_curIndex >= 0) && (this.selectCtrl.options[ this.m_curIndex ]) )
	{
		var opt = this.selectCtrl.options[ this.m_curIndex ];
		if ( opt && (opt.text != newText) )
		{
			// Watch out for Mozilla Bug #63681: will cause the select box to GROW \
(horizontally)!!!  // Watch out for Mozilla Bug #65996: Will cause the select box to \
flicker  // TODO workaround for #63681 - limit size of display text
			opt.text = newText ;
			if ( this.m_syncTextAndValue )
				opt.value = newText ;
		}
	}
	else if ( newText && (newText != this.m_lastText) && 
			  (0 == this.selectCtrl.options.length) )
	{
		if ( this.validate() )
		{
			if ( this.m_oCallback )
			{
				this.m_oCallback.onESAddNew( this );
				// callback is responsible for adding new SELECT OPTION
			}								   
		}
	}

	if ( this.m_propChangeSyncTimeoutID )
		this.m_propChangeSyncTimeoutID = null;

	this.m_lastText = newText ;
}

EditSelect2.prototype.doRenameCheck = function ()
{
	if ( ! isCtrlDirty( this.editCtrl ) )
	{
		return true ;
	}

	var fValidChg = true ;

	// there's a change, validate the new text...
	var newText = getCtrlValue( this.editCtrl );
	if ( ! this.validate() )
	{
		// undo the text change 
		this.resetItemText( true );
		return false ;
	}

	if ( this.m_oCallback && 
		 (! this.m_oCallback.onESRename( getCtrlDefValue( this.editCtrl ), newText )) )
	{
		// undo the text change ????
		this.resetItemText( true );
		return false ;
	}

	// the parent object has accepted the change so update the edit controls default \
value  this.editCtrl.defaultValue = newText;

	return true ;
}

EditSelect2.prototype.getEditText = function ()		
{
	return getCtrlValue( this.editCtrl );
}

EditSelect2.prototype.getItemText = function ( index )
{
	if ( index == null )
	{
		index = this.selectCtrl.selectedIndex ;
	}

	if ( index < 0 )
	{
		return "";
	}
	return this.selectCtrl.options[ index ].text ;
}

EditSelect2.prototype.getItemValue = function ( index )
{
	if ( index == null )
	{
		index = this.selectCtrl.selectedIndex ;
	}

	if ( index < 0 )
	{
		return "";
	}
	return this.selectCtrl.options[ index ].value ;
}

EditSelect2.prototype.addUntitled = function ( defTitle, noIncrement, titlePostFix, \
displayText ) {
	if ( defTitle == null ) defTitle = "Untitled" ;
	
	if ( ! noIncrement )
	{
		var max = 0 ;
		if ( titlePostFix == null ) 
			titlePostFix = "" ;

		// loop through the list looking for elements with the form 
		// <defTitle>[0-9]+

		var tempA = null ;
		var regExp = new RegExp( "^" + escRegExMetaChars( defTitle ) + "(\\d+)" + 
								   escRegExMetaChars( titlePostFix ) + "$", "i" );

		for ( var i = 0; i < this.selectCtrl.length; i++ )
		{
			tempA = this.selectCtrl.options[ i ].value.match( regExp );
			if ( tempA && parseInt( tempA[ 1 ] ) > max ) max = parseInt( tempA[ 1 ] );
		}

		defTitle += this.getNextUntitledIncrement( max ) + titlePostFix ; 
	}

	if ( !displayText ) 
		displayText = defTitle ;

	// add to list and select
	this.addOption( displayText, defTitle );

	return defTitle ;
}

EditSelect2.prototype.getIncrementedDisplayText = function ( defTextPrefix, \
incAmount, defTextPostfix ) {
	if ( isNaN( parseInt( incAmount ) ) )
		incAmount = 1;

	if ( defTextPostfix == null ) 
		defTextPostfix = "" ;

	// loop through the list looking for elements with the form 
	// <defTextPrefix>[0-9]+
	var tempA = null ;
	var regExp = new RegExp( "^" + escRegExMetaChars( defTextPrefix ) + "(\\d+)" + 
							       escRegExMetaChars( defTextPostfix ) + "$", "i" );

	var max = 0 ;
	for ( var i = 0; i < this.selectCtrl.length; i++ )
	{
		tempA = this.selectCtrl.options[ i ].text.match( regExp );
		if ( tempA && parseInt( tempA[ 1 ] ) > max ) max = parseInt( tempA[ 1 ] );
	}

	return defTextPrefix + (max + incAmount) + defTextPostfix ; 
}

EditSelect2.prototype.getNextUntitledIncrement = function ( curMax )
{
	return curMax + 1 ;
}

EditSelect2.prototype.remove = function ()
{
	selectDel( this.selectCtrl );
	this.sync();

	return true ;
}

EditSelect2.prototype.count = function ()
{
	return ( this.selectCtrl ? this.selectCtrl.length : 0 );
}

EditSelect2.prototype.addOption = function ( sText, 
											sValue /* optional, uses sText if missing*/, 
											fNoEditFocus /* optional, gives edit ctrl focus by default */ )
{
	// add to list and select
	var len	= this.selectCtrl.length ;

	if ( (sValue == "") || (sValue == null) )
	{
		sValue = sText ;
	}

	selAddOption( this.selectCtrl, sText, sValue, true );
	this.sync();

	// automatically set the focus to the edit ctrl and select the text
	// unless overridden
	if( ! fNoEditFocus )
	{
		this.editCtrl.focus();
		this.editCtrl.select();
	}

}	// addOption

--- NEW FILE: revokeuser.html ---

<HTML>
<HEAD>

<TITLE>Revoke User Permission</TITLE> 

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="dialog.js"></SCRIPT>
<SCRIPT SRC="qstr.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
	document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else
{
	document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
</SCRIPT>

<SCRIPT language="javascript">
var qStr = new QStrParser();
var protectedPath = qStr.getParam( "ProtectedVirtualPath" );

function onLoad ()
{
	setCtrlValue( theForm.url, protectedPath + "/" );
}

function ValidateURL ( url )
{
	var urltype = getCtrlValue( theForm.urltype );
	if ( urltype == 0 )
	{
		if ( url.charAt( url.length-1 ) == '/' )
		{
			return rejectInput( theForm.url, "File paths cannot have a trailing '/'." );
		}
		else
		{
			return true;
		}
	}
	else
	{
		if (url.charAt(url.length-1) != '/')
		{
			return rejectInput( theForm.url, "Directory paths must have a trailing '/'." );
		}
		else
		{
			return true;
		}
	}
	return false;
}

function validate () 
{
    if ( getCtrlValue( theForm.username ) == "" )
		return rejectInput( theForm.username, "A User name is required." );

	var url = getCtrlValue( theForm.url );
	if ( ! ValidateURL( url ) )
	{
		return false;
	}

	submitString = "" ;
	submitString += buildParam( "DatabaseID", qStr.getParam( "DatabaseID" ) );
	submitString += buildParam( "name", getCtrlValue( theForm.username ) );

	var test = url.substr( 0, protectedPath.length );
	if ( test == protectedPath )
	{
		submitString += buildParam( "url", url );
	}
	else 
	{
		return rejectInput( theForm.url, "The path entered does not belong to this Rule." \
);  }

	return true ;
}

function doSubmit () 
{
	raSubmitChanges( "auth.revokeuser.html", submitString, "Revoke User Permission" );
}
</SCRIPT>
</HEAD>

<SCRIPT>
onLoadHookFunc = onLoad;
</SCRIPT>

<BODY 
	CLASS="popup"	
	onload="_onLoadDefault();"
	onunload="_onUnLoadDefault();"
> 
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule" height="7" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule">&nbsp;</SPAN>
	</TD>
</TR>
<TR>
   <TD align="left" valign="middle" bgcolor="#FFFFFF" height="49">
      <img src="images/popup_header.gif"  BORDER="0" HSPACE="0" VSPACE="0">
   </TD>
   <TD align="right" valign="middle" bgcolor="#FFFFFF" height="49">
		<img src="images/popup_logo.gif"  BORDER="0" HSPACE="20" VSPACE="0">      
   </TD>
</TR>
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule2" height="9" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule2">&nbsp;</SPAN>
   </TD>
</TR>
</TABLE>
<DIV CLASS="popupPad">

<form 
	name="theForm" 
	method="POST" 
	action="javascript:doSubmit();" 
	onsubmit="return validate();" 
	onreset="doDlgClose(0); return false;"
> 
<table border="0" cellspacing="0" cellpadding="0" width="400" style="width:400;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Revoke Permission</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="118" align="right"><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="400">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			Rule
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<SPAN class="readOnlyValue"><SCRIPT>document.write( qStr.getParam( "descr" ).ent() \
);</SCRIPT></SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">User Name</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="longInput" MAXLENGTH="14" NAME="username" SIZE="19" TYPE="text" \
VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Path Type</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<select CLASS="longInput" NAME="urltype" SIZE="1" WIDTH="100">
	            <OPTION value="0">File</OPTION>
	            <OPTION value="1">Directory</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Path</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="url" SIZE="19" TYPE="text" \
VALUE=""><SPAN CLASS="unitsOffset"><SCRIPT>document.write( 'The path must begin with \
"' + protectedPath.ent() + '/" and end with a forward slash or a filename (when Path \
Type is set to "File").');</SCRIPT></SPAN>  </td>
	</tr>

<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="400">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR><TD colspan="2" bgcolor="#E6E6E6" align="right" valign="middle" NOWRAP>
   <input type="image" src="images/okay.gif" alt="Apply changes made to this page" \
name="Apply changes made to this page" value="Apply" border="0">&nbsp;<A \
HREF="javascript://" onclick="window.close()"><img src="images/cancel.gif"  \
ALT="Close this window without applying changes" BORDER="0" HSPACE="0" \
VSPACE="0"></A></TD> </TR>
</TABLE>
</DIV>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_setid.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>User/Group Name</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "21";
</SCRIPT>

<SCRIPT SRC="propview_nolist.js"></SCRIPT>
<SCRIPT SRC="servvar.get.html?serverData=config,1&diffConfig=diffconfig"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
var propSet = 
[
	new PropObj( 'User', "%-1", false, true, null, null, "uid" ), 
	new PropObj( 'Group',  "%-1", false, true, null, null, "uid" ), 
];

var propList = new PropList( "UID", serverData, propSet );
var propView = new PropListView( "User/Group ID", propList, "config.", "configvar", \
"theForm" );

var theForm ;

function onLoad ()
{
	theForm = document.theForm ;
	checkForPendingChanges( diffConfig );
	propView.onLoad( window );
}
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">SERVER SETUP</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
Set UNIX-based User and Group alphanumeric names below. These two variables 
determine which user or group the server runs as. You must be logged in as 
superuser for the changes to take effect.
<br>
<br>
The %-1 prefix is simply a placeholder. Replace this default value with the 
User or Group Name under which this server should be running.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>User/Group Name</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="25%">
			<span class="offsetLabel">User Name</span>
		</td>
		<TD class="input" valign="top" align="left" width="75%">
			<input CLASS="input" MAXLENGTH="255" NAME="User" SIZE="12" TYPE="text" VALUE="">
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="25%">
			<span class="offsetLabel">Group Name</span>
		</td>
		<TD class="input" valign="top" align="left" width="75%">
			<input CLASS="input" MAXLENGTH="255" NAME="Group" SIZE="12" TYPE="text" VALUE="">
		</td>
	</tr>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" VALIGN="middle" width="100%" class="body" \
                ALIGN="left">
      <FONT color="red">*A server restart is required to effect changes applied to \
this page.</FONT>  </TD>
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_content_browsing.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Content Browsing</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "5";
</SCRIPT>

<SCRIPT SRC="enumproplist.js"></SCRIPT>
<SCRIPT SRC="propview_nolist.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?serverData=config.ContentBrowsing&fs=config.FSMount"></SCRIPT>


<SCRIPT LANGUAGE="javascript">
/*

<!-- C O N T E N T  B R O W S I N G -->
<List Name="ContentBrowsing">
    <List Name="BrowsableMountPoints">
        <Var Mount_1="/"/>
        <Var Mount_2="/mountpoint1/"/>
    </List>
    <List Name="IndexExtensions">
        <Var Ext_1="smi"/>
        <Var Ext_3="smil"/>
        <Var Ext_2="txt"/>
    </List>
</List>

*/

var fsLocal = [];
function findLocalFSCallback ( a, prop, curDepth )
{
	var list = a[ prop ];

	// check for a content mountpoint
	if ( ! ( isObj( list ) &&
			 list[ "MountPoint" ] &&
			 list[ "ShortName" ] &&
			 list[ "ShortName" ].bSearch( /pn-local|pn-network/i ) ) )
		return ;

	// check for adminfs related mount point (don't want these)
	if ( list[ "BaseMountPoint" ] ||
		 list[ "MountPoint" ].bSearch( /admin/i ) )
		 return ;

	// it's a keeper
	fsLocal[ prop ] = list;
}
enumPropArray( fs, findLocalFSCallback, 1 );

var propSet = 
[
   ,new EnumPropListSel( "BrowsableMountPoints", null, "Mount_", 1, "theList" )
   ,new EnumPropListText( "IndexExtensions", null, "Ext_", 1, "theEdit", ",", \
/\s*,\s*/ ) ];

var propList = new PropList( "Content Browsing", serverData, propSet );
var subListExtensions = propList.subList( "IndexExtensions" );
var subListMountPoints = propList.subList( "BrowsableMountPoints" );

function BrowsePropView ()
{
	this.base = PropListView ;
	this.base( "Content Browsing", propList, "config.ContentBrowsing.",
			   "servvar", "theForm" );
}
BrowsePropView.prototype = new PropListView ;

BrowsePropView.prototype.postIsDirty = function ()
{
	return (subListExtensions.isFormDirty( theForm ) ||
		   subListMountPoints.isFormDirty( theForm ) );
}

BrowsePropView.prototype.postValidate = function ()
{
	subListExtensions.validate( theForm );
	subListMountPoints.validate( theForm );

	var exts = subListExtensions.getValuesArray( theForm );
	for ( var extEnum in exts )
	{
		var ext = exts[ extEnum ];
		if ( ! subListExtensions.ext_validate( ext ) )
		{
			return rejectInput( theForm.theEdit, "'" + ext + "' is an invalid extension." );
		}
	}

	this.m_submitString += subListExtensions.buildParamString( \
"config.ContentBrowsing.IndexExtensions." );  this.m_submitString += \
subListMountPoints.buildParamString( "config.ContentBrowsing.BrowsableMountPoints." \
);

	return true;
}

BrowsePropView.prototype.postSubmit = function ()
{
	subListExtensions.commit();
	subListMountPoints.commit();
}

BrowsePropView.prototype.resultsCallback = function ( results )
{
	var res;
    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];
        res.title = propName.rightProp();

		var a = propName.split( "." );
		if ( a && a[ 4 ] )
   			res.title = a[ 3 ].ent().span("body") + '<br>' + a[ 4 ];
	}

}	// resultsCallback

var propView = new BrowsePropView();

var theForm ;

function onLoad ()
{
	theForm = document.theForm ;

	fillMountPointSelectList();

	propView.onLoad( window );

	subListExtensions.fillForm( theForm );
	subListMountPoints.fillForm( theForm );

}	// onLoad ()

function fillMountPointSelectList ()
{
	var listCtrl = theForm.MPList;

	listCtrl.options.length = 0;

	selAddOption( listCtrl, "Add a Mount Point to the Browsable List", "" );
	for ( var desc in fsLocal )
	{
		selAddOption( listCtrl, fsLocal[ desc ][ 'MountPoint' ] );
	}

}	// fillMountPointSelectList

function addMP ()
{
	// make sure the selection isn't the propmpt text
	var ctrl = theForm.MPList;

	if ( 0 == ctrl.selectedIndex )
		return ;

	var mp = getCtrlValue( ctrl );
	if ( mp )
	{
		subListMountPoints.addPropValue( theForm, mp );
	}

	// reset the selection to the first item in the output type list - the prompt text
	selectFirst( ctrl );
	
}	// addMP

function removeMountPoint ()
{
	var ctrl = theForm.theList;

	var mp = getCtrlValue( ctrl );
	if ( ! mp ) return ;

	if ( confirm( "Remove '" + mp + "'?" ) )
	{
		subListMountPoints.removeCurSelValue();
	}

}	// removeMountPoint ()
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">CONTENT MANAGEMENT</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
Content Access allows you to swiftly browse, play media, and view the
source of content stored in directories. Set the mount points and
extensions below that browsers will be allowed to access. Authenticated
directories still require that the user enter a password.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Content Browsing</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<tr>
	<TD class="input" valign="top" width="100%">
		<TABLE CLASS="PROPLIST_LABEL" width="458" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Browsable Mount \
Points</TD>  <TD NOWRAP align="right"><A href="javascript://" \
onclick="removeMountPoint()"><IMG src="images/delete_g.gif" HSPACE=1 ALT="Remove \
Current Mount Point" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theList" SIZE="5" WIDTH="458">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( \
"<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );  \
}  </SCRIPT>
		</SELECT></FONT></DIV>

		<SCRIPT>if ( isNav4 ){document.write( '<FONT class="input">' );}</SCRIPT>
		<SCRIPT>if (isMoz5) document.write('<BR>');</SCRIPT>

		<select CLASS="longInput" NAME="MPList" ONCHANGE="addMP();" SIZE="1" WIDTH="458">
		    <OPTION value="                             ">                             \
</OPTION>  <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		</SELECT>

		<SCRIPT>if ( isNav4 ){document.write( '</FONT>' );}</SCRIPT>
	</TD>
</TR>
<tr>
	<TD class="input" valign="top" width="100%">
		Extensions to Browse
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theEdit" SIZE="36" TYPE="text" \
VALUE="">  <SPAN CLASS="Units">
			To indicate all extensions, accept the default asterisk (*) setting.
			If adding extensions, separate them with a comma.
		</SPAN>
		<BR><BR>
		<A CLASS="linkText" TARGET="ContentBrowser" HREF="browse_content.html">Browse \
Content</a>  </TD>
</TR>

<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: regtree_nav.css ---

BODY
{
	background-color:	#336699;
    padding:		0;
	margin: 		0;
}
DIV
{
	width: 200;
	color:			#FFFFFF;
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	font-size:      9pt;
	position:		absolute;
	visibility:		hidden;
	text-indent: -14;
}
A
{
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	font-size:      9pt;
	color:			#FFFFFF;
}
A:link {text-decoration: none;}
A:visited {text-decoration: none;}

.l0 {left: 10; text-indent: -14; padding-left: 14; font-weight: bold}
.l1 {left: 24; text-indent: -14; padding-left: 14}
.l2 {left: 38; text-indent: -14; padding-left: 14}
.l3 {left: 52; text-indent: -14; padding-left: 14}
.l4 {left: 66; text-indent: -14; padding-left: 14}
.l5 {left: 80; text-indent: -14; padding-left: 14}
.l6 {left: 94; text-indent: -14; padding-left: 14}
.l7 {left: 108; text-indent: -14; padding-left: 14}
.l8 {left: 122; text-indent: -14; padding-left: 14}
.l9 {left: 136; text-indent: -14; padding-left: 14}

--- NEW FILE: xblib.js ---

var isXblibInit = false ;

var isOther = true;	// miscellaneous non-supported browsers

var isNav = false;
var isNav4 = false;
var isNav6 = false ;
var isIE = false ;
var isIE4 = false ;
var isIE5 = false ;
var isIE5Up = false ;
var isIE5_5 = false ;
var isW3C = false ;
var isWin = false;
var isMac = false;
var isX11 = false;
var isMoz5 = false;

var docAll = null;

var verMajor = 0;
var verMinor = 0;

var getElem = function(){}

xblibInit();

function xblibInit ()
{
	docAll = document;

	var ver = navigator.appVersion.toLowerCase();
	var agt = navigator.userAgent.toLowerCase(); 

	isWin = (-1 != ver.indexOf( "win" ) ); 
	isMac = (-1 != ver.indexOf( "mac" ) ); 
	isX11 = (-1 != ver.indexOf( "x11" ) ); 

	var pos = ver.indexOf( "msie" );
	if ( -1 == pos )
	{
		isNav = true;
		verMajor = parseInt( ver ); 
		verMinor = parseFloat( ver ); 
	}
	else
	{
		verMajor = parseInt( ver.slice( pos + 4 ) ); 
		verMinor = parseFloat( ver.slice( pos + 4 ) ); 
	}

	if ( document.layers )
	{
		// check for releases prior to 4.06 - they stink!
		isNav4 = ( verMinor >= 4.06 );
		isOther = !isNav4;
	}
	else
	{
		if ( document.all )
		{
			isIE = true ;
			isIE4 = true ;
			isOther = false;
			docAll = document.all ;
		}

		if ( document.getElementById )
		{
			isIE4 = false ;
			isIE5Up = (isIE && (verMajor >= 5));
			isIE5_5 = (isIE && (verMinor >= 5.5));
			isIE5 = (isIE && (verMinor < 5.5));
			isMoz5 = (!isIE);
			isW3C = true ;
			isOther = false;
			docAll = document;
			isNav6 = (-1 != agt.indexOf( "gecko" ) );
		}
	}

	// assign the correct function to the getElem function pointer var
	getElem = (isIE ? (isMac ? getElemIEMac : getElemIE) : isNav4 ? getElemNav4 : \
getElemNav6);

	isXblibInit = true ;
}

function isObj ( objToTest )
{
	return ( (objToTest != null) &&
			 (typeof(objToTest) == "object") );
}

function addEvent ( obj, evType, fn, useCapture, Nav4EventCode )
{
	if (obj.addEventListener)	// Nav6
	{
		obj.addEventListener( evType, fn, useCapture );
	}
	else if (obj.attachEvent)	// IE 5+
	{
		obj.attachEvent( "on" + evType, fn );
	}
	// IE4, Nav4 - multiple event handlers not supported - use event chaining if
	// multiple events need to be supported
	else
	{
		var origHandler = obj[ "on" + evType ];
		obj[ "on" + evType ] = fn ;
		if ( isNav4 && useCapture && obj.captureEvents && Nav4EventCode )
		{
			obj.captureEvents( eval(Nav4EventCode) );
		}
		return origHandler ;
	}

	return null;
}

function removeEvent ( obj, evType, fn, useCapture, Nav4EventCode, oldHandler )
{
	if (obj.addEventListener)	// Nav6
	{
		obj.removeEventListener( evType, fn, useCapture );
	}
	else if (obj.detachEvent)	// IE 5+
	{
		obj.detachEvent( "on" + evType, fn );
		//obj[ "on" + evType ] = oldHandler ;
	}
	// IE4, Nav4 - multiple event handlers not supported - replace current handler
	// with 'oldHandler' param
	else
	{
		obj[ "on" + evType ] = oldHandler ;
		if ( isNav4 && useCapture && obj.relaseEvents && Nav4EventCode )
		{
			obj.releaseEvents( eval(Nav4EventCode) );
		}
	}
}

function cancelEvent ( e )
{
	if ( ! e ) return false ;
	
	if ( isIE )
	{
		e.cancelBubble = true;
		e.returnValue = false;
	}
	if ( e.cancelable )	e.cancelBubble = true;
	if ( e.stopPropagation ) e.stopPropagation();
	if ( e.preventDefault ) e.preventDefault();

	// for convenience the caller can end it's event handler by 
	// using the return	value of this function, i.e.:
	// return cancelEvent();
	return false ;
}

function getInstanceEventHandler ( obj, handlerName )
{
	function _getInstanceMethodClosure( _obj )
	{
		// Nav passes the event obj to the handler, pass it along to the real handler
		return function(evt)
		{
			return _obj[ handlerName ](evt);		
		}
	}
	
	return _getInstanceMethodClosure( obj );

}	// getInstanceEventHandler

// given and elements ID, return a ref to the corrosponding DOM obj
function getElemIE ( elem, doc ) 
{
	if (! doc ) doc = document;
	return doc.all[ elem ];
}
function getElemIEMac ( elem, doc ) 
{
	if (! doc ) doc = document;
	if ( elem == "" ) return null; // else MacIE 5.0 will barf
	return doc.all[ elem ];
}

function getElemNav4 ( elemName, doc ) 
{
	function _searchElem( _doc )
	{
		// look for a layer
		var elem = _doc.layers[ elemName ];

		if ( isObj( elem ) )
		{
			return elem ;
		}

		// look for a form or a form field
		for ( var x = 0; x < _doc.forms.length; x++ )
		{
			if ( _doc.forms[ x ].name == elemName )
			{
				return _doc.forms[ x ] ;
			}

			// look for a form field
			elem = _doc.forms[ x ][ elemName ];
			if ( isObj( elem ) )
			{
				return elem ;
			}
		}

		// look for an anchor
		for ( var x = 0; x < _doc.anchors.length; x++ )
		{
			if ( _doc.anchors[ x ].name == elemName )
			{
				return _doc.anchors[ x ] ;
			}
		}

		// look for an image
		for ( var x = 0; x < _doc.images.length; x++ )
		{
			if ( _doc.images[ x ].name == elemName )
			{
				return _doc.images[ x ] ;
			}
		}

		// recurse down through the layers
		for ( x = 0; x < _doc.layers.length; x++ )
		{
			elem = _searchElem( _doc.layers[ x ].document );
			if ( isObj( elem ) )
			{
				return elem ;
			}
		}

		return elem ;
	}

	if (! doc ) doc = document;
	return _searchElem( doc );
}

function getElemNav6 ( elemNameOrID, doc ) 
{
	if (! doc ) doc = document;
	var elem = doc.getElementById( elemNameOrID );
	if ( elem ) return elem;
	
	elem = doc.getElementsByName( elemNameOrID );
	if ( elem[0] ) return elem[0];

	return null ;
}

function getChild ( obj, childIndex )
{
	if ( obj.childNodes )
	{
		return obj.childNodes[ childIndex ];
	}
	if ( obj.children )
	{
		return obj.children[ childIndex ];
	}
	else	// not supported
	{
		return null ;	
	}
}

// examine the obj and the ancestors of obj until 
// we find a parent element with the tag tagName
function getParentByTagName ( obj, tagName )
{
	// Nav4 does not support either parent or tagName properties 
	if ( isNav4 ) return obj;
	
	var parentObj = obj;
	while ( parentObj )
	{
		if ( tagName == parentObj.tagName )
		{
			return parentObj ;
		}
		
		parentObj = parentObj.parentNode ? parentObj.parentNode : parentObj.parentElement ;
	}

	return null ;

}	// getParentByTagName

function isElemInView ( elem, win )
{
	if ( ! win ) win = window ;
	if ( isNav4 )
	{
		return (elem.top >= win.pageYOffset) &&
		      ((elem.top + elem.clip.height) <=
		       (win.innerHeight + win.pageYOffset));
	}
	else if ( isIE )
	{
		return (elem.offsetTop >= win.document.body.scrollTop) &&
		       (elem.offsetTop < (win.document.body.scrollTop + \
win.document.body.offsetHeight));  }
	else if( isMoz5 )
	{
		return (elem.offsetTop >= win.scrollX) &&
		       (elem.offsetTop < (win.scrollX + win.innerHeight));
	}

}	// isElemInView

function scrollVertToElem ( elem, win )
{
	if ( !win ) win = window ;
	if ( isNav4 )
	{
		if ( (elem.top < win.pageYOffset) || 
		     ((elem.top + elem.clip.height) > 
		      (win.innerHeight + win.pageYOffset)) )
		{
			win.scroll( 0, elem.top );
		}
	}
	else if ( isIE )
	{
		elem.scrollIntoView();
	}
	else
	{
		win.scrollTo( 0, elem.offsetTop );
	}
	
}	// scrollVertToElem

function getTags ( parentObj, tagName )
{
	return (isIE4 ? parentObj.tags( tagName ) : 
			isW3C ?  parentObj.getElementsByTagName( tagName ) : null ); 
}

function setVisibility ( elem, fShow )
{
	var applyToObj = (isNav4 ? elem : elem.style);
	if ( applyToObj )
	{
		applyToObj.visibility = (fShow ? "visible" : "hidden");
	}
	
}	// 

function setDisplay ( elem, fShow )
{
	if ( ! elem ) return;

	if ( isNav4 )
	{
		// display not supported in javascript
		return setVisibility( elem, fShow );
	}
	else
	{
		elem.style.display = (fShow ? "block" : "none");
		elem.style.visibility = (fShow ? "visible" : "hidden");
	}
	
}	// 

// returns an array [left,top] of the absolute position of element elem
// needs work for elems locatated within absolutly positioned elements
function findElemPos ( elem )
{
	var curLeft = 0, curTop = 0;

	if ( elem )
	{
		if ( isNav4 )
		{
			curLeft = elem.x;
			curTop = elem.y;
		}
		else
		{
			curLeft += parseInt( elem.offsetLeft );
			curTop += parseInt( elem.offsetTop );
			/*
			if (window.opera)
			{
				while (obj.tagName != 'HTML')
				{
					obj = obj.parentNode;
					curtop += obj.offsetTop
					curleft += obj.offsetLeft
				}
			}
			else*/ if ( document.all )
			{
				elem = ( isIE4 ? elem.parentElement : elem.parentNode );
				while (elem && elem.tagName != 'HTML')
				{
					// special case for elements located within a table
					if ( elem.tagName && elem.tagName.indexOf( 'T' ) == 0 )
					{
						curLeft += parseInt( elem.offsetLeft );
						curTop += parseInt( elem.offsetTop );
					}
					elem = ( isIE4 ? elem.parentElement : elem.parentNode );
				}
			}
		}
	}

	return [curLeft, curTop];
}

// useful for finding the absolute position of an element especially those nested in
// a table (cell)
// returns an object with x & y properties
function getAbsDim ( elem )
{
	for (var lx = 0, ly = 0; elem != null; 
			lx += elem.offsetLeft, ly += elem.offsetTop, elem = elem.offsetParent );

	return { x:lx, y:ly }
}


--- NEW FILE: string.js ---

// string functions

String.prototype.trim = function ( )
{
	var s = this.replace( this.trim.leftTrimRE, '' );
	    s = s.replace( this.trim.rightTrimRE, '' );

	return s ;

}	// trim
String.prototype.trim.leftTrimRE = /^\s*/ ;
String.prototype.trim.rightTrimRE = /\s*$/ ;

// pad a string to length len with the leading padChar chars (or " " if padChar 
// is not specified)
String.prototype.pad = function ( len, padChar )
{
	if ( len <= 0 )
	{
    	return this;
	}
    
    if ( isBlank( padChar ) )
    {
    	padChar = " ";
    }
    
	return padChar.dup( len - this.length ) + this;

}	// pad

String.prototype.leftProp = function ( n )
{
	var pos = this.indexOf( "." );
    if ( pos == -1 ) return this ;
	
	if ( ! n || n == 1 )	
	{
		return this.substr( 0, pos );
	}
	var a = this.split( '.' );
	return a.slice( 0, n ).join( '.' );
}

String.prototype.rightProp = function ( n )
{
    if ( this.indexOf( "." ) == -1 ) return this ;

	if ( ! n || n == 1 )	
	{
		return this.substr( this.lastIndexOf( "." ) + 1 );
	}
	else
	{
		var a = this.split( "." ); 
		if ( n < 0 )
			return a.slice( Math.abs( n ) ).join( "." );
		else
			return a.slice( a.length - n ).join( "." );
	}
}

function entityRE( srchStr, replStr )
{
	this.re = new RegExp();
	this.re.compile( srchStr, "g" );

	this.replStr = replStr ;
}	

entityTable = new Array
(
	new entityRE( "&", "&amp;" ),
	new entityRE( "<", "&lt;" ),
	new entityRE( ">", "&gt;" )
);

function ent ( s )
{
	for ( var x = 0; x < entityTable.length ; x++ )
	{
		s = s.replace( entityTable[ x ].re, entityTable[ x ].replStr );
	}

	return s ;

}	// ent

// method version of ent
String.prototype.ent = function ()
{
	return ent( this );

}	// ent 

// add a span method to the builtin string object
String.prototype.span = function ( _class )	// class is optional
{
	if ( _class )
		return "<span class='" + _class + "'>" + this + "</span>" ;
	else
		return "<span>" + this + "</span>" ;
}

// add a duplicate method to the builtin string object
String.prototype.dup = function ( _count )
{
	var dupStr = "" ;
	for ( var x = 0; x < _count; x++ )
	{
		dupStr += this ;
	}
	return dupStr ;
}

function qEsc( s )
{
	if ( typeof( s ) == "string" )
	{
		s = s.replace( /\\{1}/g, "\\\\" );
		s = s.replace( /\r/g, "\\r" );
		s = s.replace( /\n/g, "\\n" );
		s = s.replace( /'/g, "\\'" );
	}
	return s ;
}

function qqEsc( s )
{
	if ( typeof( s ) == "string" )
	{
		s = s.replace( /\\{1}/g, "\\\\" );
		s = s.replace( /\r/g, "\\r" );
		s = s.replace( /\n/g, "\\n" );
		s = s.replace( /"/g, '\\"' );
	}
	return s ;
}

function qVar ( s )
{
	return "'" + qEsc( s ) + "'" ;
}
	
function qqVar ( s )
{
	return '"' + qqEsc( s ) + '"' ; 
}

String.prototype.pluralize = function ( count, pluralForm )
{
	if ( count == null || count == "" ) count = 0 ;

	if ( count == 1 )
		return this ;
	else
		return ( pluralForm ? pluralForm : this + 's' );
}

function getMachineName ( host )
{
	return isIPAddr( host ) ? host : host.split( '.' )[ 0 ];
}

String.prototype.bSearch = function ( searchRegExp )
{
	return ( -1 != this.search( searchRegExp ) );
}

function escRegExMetaChars ( s )
{
	return s.replace( /([\\\/\*\.\^\+\$\?\[\]\(\)])/g, "\\$1" );

}	// escRegExMetaChars

function escapePlus ( s )
{
	if ( s == null ) return "";
	
	return escape(s).replace( /\+/, "%2B" );
	
}	// escapePlus


--- NEW FILE: removeuser.html ---

<HTML>
<HEAD>

<TITLE>Remove a User from Realm</TITLE> 

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="dialog.js"></SCRIPT>
<SCRIPT SRC="qstr.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
	document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else
{
	document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
</SCRIPT>

<SCRIPT>
var realm = document.location.search.slice( 1 );
var submitString = "" ;

function validate () 
{
	if ( "" == getCtrlValue( theForm.username ) )
	{
		return rejectInput( theForm.username, "A User Name is required." );
	}

	submitString = buildParam( "name", theForm.username.value );
	submitString += buildParam( "realm", realm );

	return true ;
}

function doSubmit () 
{

	raSubmitChanges( "auth.removeuser.html", submitString, "Remove User" );
}

function onLoad ()
{

}	// onLoad
</SCRIPT>

</HEAD>

<SCRIPT>
onLoadHookFunc = onLoad;
</SCRIPT>

<BODY 
	CLASS="popup"	
	onload="_onLoadDefault();"
	onunload="_onUnLoadDefault();"
> 
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule" height="7" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule">&nbsp;</SPAN>
	</TD>
</TR>
<TR>
   <TD align="left" valign="middle" bgcolor="#FFFFFF" height="49">
      <img src="images/popup_header.gif"  BORDER="0" HSPACE="0" VSPACE="0">
   </TD>
   <TD align="right" valign="middle" bgcolor="#FFFFFF" height="49">
		<img src="images/popup_logo.gif"  BORDER="0" HSPACE="20" VSPACE="0">      
   </TD>
</TR>
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule2" height="9" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule2">&nbsp;</SPAN>
   </TD>
</TR>
</TABLE>
<DIV class="popupPad">

<form 
	name="theForm" 
	method="POST" 
	action="javascript:doSubmit();" 
	onsubmit="return validate();" 
	onreset="doDlgClose(0); return false;"
> 
<table border="0" cellspacing="0" cellpadding="0" width="400" style="width:400;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Remove User</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="118" align="right"><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="400">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			Realm
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<SPAN class="readOnlyValue"><SCRIPT>document.write( realm );</SCRIPT></SPAN>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">User Name</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="longInput" MAXLENGTH="14" NAME="username" SIZE="19" TYPE="text" \
VALUE="">  </td>
	</tr>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="400">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR><TD colspan="2" bgcolor="#E6E6E6" align="right" valign="middle" NOWRAP>
   <input type="image" src="images/okay.gif" alt="Apply changes made to this page" \
name="Apply changes made to this page" value="Apply" border="0">&nbsp;<A \
HREF="javascript://" onclick="window.close()"><img src="images/cancel.gif"  \
ALT="Close this window without applying changes" BORDER="0" HSPACE="0" \
VSPACE="0"></A></TD> </TR>
</TABLE>
</DIV>

</FORM>
<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: main_nav4_mac.css ---

BODY
{
	background-color: #FFFFFF;
	font-family:      Verdana, Arial, Helvetica, sans-serif;
}

BODY.CONFIG
{
	padding-left:	30 ;
}

BODY.POPUP
{
	padding:		  0;
	margin:			  0;
}
DIV.popupPad
{
	padding-right:	0px;
	padding-bottom:	0px;
	padding-top:	16;
	padding-left:	30;
}

/* gives a little space after the tab header */
TABLE.formTable
{
	margin-top:	1px;
}

A
{ 
	font-size:        11pt;
	font-weight:      500;
	color:            #0033FF;
	text-Decoration:	underline ;
}

FORM
{
	margin:		0;
	padding: 	0;
}

TABLE
{
	margin:		0 ;
}
TD
{ 
	font-family:      Verdana, Arial, Helvetica, sans-serif;
}
TD.body
{ 
  font-size:        11pt;
  font-weight:      normal;
  font-style:       Normal;
  color:            #333350;
  text-indent:      0pt;
}
TD.title2, .title2
{ 
  font-size:        12pt;
  font-weight:      600;																						 
  color:            #336699;
  background-Color: #E6E6E6;
}
TD.input

{ 
  font-size:        12pt;
  font-weight:      500;
  color:            #336699;
  background-Color: #E6E6E6;
  font-family:      Verdana, Arial, Helvetica, sans-serif;
}

SPAN.input, SPAN.FormHeader
{ 
  font-size:        12pt;
  font-weight:      500;
  font-family:      Verdana, Arial, Helvetica, sans-serif;
  color:            #336699;
  background-Color: #E6E6E6;
}
SPAN.FormHeader
{
	font-weight:	600;
}

.units, .unitsOffset
{ 
  font-size:        11pt;
  color:            #666666;
}

.unitsOffset
{
	position:	relative;
	top:		0;
}

.offset
{
	position:	relative;
	top:		0;
}
SELECT, INPUT, TEXTAREA, SPAN.readOnlyValue, FONT.input
{ 
  font-family:      Verdana, Arial, Helvetica, sans-serif;
  font-size:        12pt;
  font-weight:      500;
  color:            black;
}
.body
{ 
	font-family:      Verdana, Arial, Helvetica, sans-serif;
	font-size:        11pt;
	font-weight:      normal;
	font-style:       Normal;
	color:            #333350;
	text-indent:      0pt;
}
.stronger
{ 
  font-size:        11pt;
  font-weight:      600;
  font-style:       Normal;
  color:            #474770;
}
.longInput
{
	width: 100% ;
}

.medInput
{
	width: 50% ;
}

.threeQInput
{
	width: 75% ;
}
.offsetLabel
{
	position:relative;
	top:	0;
}
.offsetLabelSelect
{
	position:relative;
	top:	0;
}

/* used on HELP, SAMPLES, & CONFIGURE pages */
.PARA
{
	margin-left: 20;
	margin-bottom: 12;
	font-size:        12pt;
}

.PARAHEAD
{
	font-size: 		  large;
	font-weight:      600;
	font-style:       Normal;
	color:            #336699;
}
/* new stuff */

.bodyText, .bodyTextBold
{
	font-family:      Verdana, Arial, Helvetica, sans-serif;
	font-size:        12pt;
	font-weight:      500;
	font-style:       Normal;
	color:            #666666;
	text-indent:      0;
}

.bodyTextBold
{
	font-weight:      600;
}

TD.bodyText A
{ 
	font-size:        12pt;
}
.headline
{ 
	font-family:      Verdana, Arial, Helvetica, sans-serif;
	font-size: 		  large;
	font-weight:      500;
	font-style:       Normal;
	color:            #336699;
	text-indent:      2em;
	letter-spacing:	  3pt;

	/* to squeeze the headline and headline rule together */
	position:		  relative;	
	top:			  5;
}
.headlineRule
{ 
	font-size:        4pt;
	background-color: #336699;
}

.headerRule
{ 
	font-size:        4pt;
	background-color: #336699;
}

.headerRule2
{ 
	font-size:        4pt;
	background-color: #336699;
}
.linkText, .linkTextSmall
{
	font-size: 		12pt;
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	color:			#FF6600;
	letter-spacing:	normal;
	TEXT-DECORATION: none;
}

.linkTextSmall
{
	font-size: 		11pt;
}

A:hover    
{
	TEXT-DECORATION: underline;
}

.TabText
{
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	font-size: 		14pt;
	color:          #336699;
	font-weight:	600;
}

.popupTableHeader, .popupTitle
{
	background-color: #999999;
	color:			  white;
	font-family:	Tahoma, Arial, Helvetica, sans-serif;
	font-size:		12pt;
	font-weight:	bold;
}

.popupTitle
{
	background-color: 	#FFFFFF;
	color:			  	#336699;
	font-size: 		13pt;
}

TD.odd, TD.even
{
	font-size:        12pt;
	font-weight:      500;
	color:            #336699;
	background-Color: #FFFFFF;
}

TD.even
{
	background-Color: #E6E6E6;
}

.grey,SPAN.body
{
	color:            #666666;
	font-size:        12pt;
}
.PROPLIST_LABEL
{width:100%;}
.absolute
{ 
	position:absolute; 
	visibility:hidden; 
	z-index:10;
}
/* header frame specific */

.headerServerLabel, .headerServerName
{
	text-indent: 	12px;
	font-size: 		10pt;
	font-family:	Verdana, Arial, Helvetica, sans-serif;
	color:			white;
	letter-spacing:	normal;
}

.headerServerName
{
	text-indent: 	0;
	font-weight:	600;
}
/* about page specific */

.labelOdd, .valueOdd, .labelEven, .valueEven
{
  font-size:        12pt;
  font-weight:      500;
  color:            #336699;
  background-Color: #FFFFFF;
}

.labelEven, .valueEven
{
  background-Color: #E6E6E6;
}

.valueEven, .valueOdd
{
	color:            #666666;
}

.licenseTitle
{ 
  font-size: 		12pt;
  font-weight:      bold;
  color:            #666666;
  background-Color: #FFFFFF;
}

.trademarkBorder
{
	width:					550px;

	padding-top:			0px;
	padding-bottom:			0px;
	padding-left:			0px;
	padding-right:			0px;

	margin-top:				10px;
	margin-bottom:			0px;
	margin-left:			0px;
	margin-right:			0px;

	border-color:			#E6E6E6;

	border-top-width:		2px;
	border-bottom-width:	2px;
	border-left-width:		0px;
	border-right-width:		0px;

	border-top-style:		solid;
	border-bottom-style:	solid;
	border-left-style:		none;
	border-right-style:		none;
}



--- NEW FILE: regtree_w3c.css ---
BODY
{
    padding:		0;
	margin: 		0;
}
DIV
{
	width:			100%;
	display:		none;
	visibility:		visible;
	position:		static;
	text-indent:	0;
}
IMG{clear:left;align:top;}

A:hover    
{
	TEXT-DECORATION: none;
	color: #FF9900
}

.l0 {margin-left: 08; display:block;}
.l1 {margin-left: 22;}
.l2 {margin-left: 36;}
.l3 {margin-left: 50;}
.l4 {margin-left: 62;}
.l5 {margin-left: 76;}
.l6 {margin-left: 80;}
.l7 {margin-left: 94;}
.l8 {margin-left: 108;}
.l9 {margin-left: 122;}

--- NEW FILE: BigInt.js ---
////////////////////////////////////////////////////////////////////////////////////////
 // Big Integer Library v. 3.04
// (c)2000, 2001, 2002, 2003 Leemon Baird
// www.leemon.com
//
// I retain the copyright to this code, but you may redistribute 
// or use it for any purpose.  If you use this code, please leave 
// an acknowledgement and pointer to my home page in the comments.
// I make no claims about whether it works correctly, so use it 
// at your own risk.
//
// This code defines a bigInt library for arbitrary-precision integers.
// A bigInt is an array of integers storing the value in bpe-bit chunks, 
// little endian (buff[0] is the least significant word).
// Negative bigInts are stored two's complement.
// Some functions assume their parameters have at least one leading zero element.
// The results of all these functions are undefined in case of overflow, 
// so the caller must make sure overflow won't happen.
// For each function where the first parameter x is modified, that same 
[...1210 lines suppressed...]
    t=x[i];

    //do sa=(sa+x[i]*y+ui*n)/b   where b=2**bpe
    for (j=1;j<ky;j++) { 
      c+=sa[j]+t*y[j]+ui*n[j];
      sa[j-1]=c & mask;
      c>>=bpe;
    }    
    for (;j<kn;j++) { 
      c+=sa[j]+ui*n[j];
      sa[j-1]=c & mask;
      c>>=bpe;
    }    
    sa[j-1]=c & mask;
  }

  if (!greater(n,sa))
    sub(sa,n);
  copy(x,sa);
}

--- NEW FILE: config_isp.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>ISP Hosting</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "34";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="enumproplist.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?fs=config.FSMount&ispList=config.ISPHosting&diffConfig=diffconfig"></SCRIPT>


<SCRIPT LANGUAGE="javascript">
var fsLocal = [];
function findLocalFSCallback ( a, prop, curDepth )
{
	var list = a[ prop ];

	// check for a content mountpoint
	if ( ! ( isObj( list ) &&
			 list[ "MountPoint" ] &&
			 list[ "ShortName" ] &&
			 list[ "ShortName" ].bSearch( /pn-local|pn-network/i ) ) )
		return ;

	// check for adminfs related mount point (don't want these)
	if ( list[ "BaseMountPoint" ] ||
		 list[ "MountPoint" ].bSearch( /admin/i ) )
		 return ;

	// it's a keeper
	fsLocal[ prop ] = list;
}
enumPropArray( fs, findLocalFSCallback, 1 );

var theForm = null ;
var tocFrame = findFrame( "TOC" );

// config_localFS.nc.sjs creates mountPoints array and inits with live server data

var propSetTransMount = 
[
	new PropObj( 'MountPoint', "", false,true, null, null, "mountpoint", "Mount Point" \
),   new PropObj( 'UserPath',   "", false,true, null, null, "physpath", 	 "User Path" \
) ];

var propSet = 
[
	new PropList( 'TranslationMounts', null, null, propSetTransMount )
   ,new EnumPropListSel( "UserLists", null, "File_", 1, "theUserList" )
];

var propList = new PropList( "ISP Hosting", ispList, propSet );
var subListTransMounts = propList.subList( "TranslationMounts" );
var subListUserFiles = propList.subList( "UserLists" );

function UserListPropView ()
{
	this.base = NestedPropListView ;
	this.base( "User File Lists", subListUserFiles, "User List File", 
				"config.ISPHosting.UserLists.", "configvar", 
				"theForm", "theUserList", "theUserEdit" );

	this.m_itemDefValue = "/userfile";
}
UserListPropView.prototype = new NestedPropListView ;

UserListPropView.prototype.postOnLoad = function ( fValidate )
{
	this.m_oES.sync();
	this.m_oES.m_reIllegalChars = /["<>~\*\?|]/;

}	// postOnLoad

UserListPropView.prototype.preValidateSubList = function ()
{

	if ( ! propList.physpath_validate( getCtrlValue( theForm.theUserEdit ) ) )
		return rejectInput( theForm.theUserEdit, propList.errMsg );
	else
		return true ;
}

UserListPropView.prototype.onESRename = function ( oldSubListName, newSubListName )
{
	if ( ! this.m_bLoaded ) return ;

	// no validation here - validate during preValidateSubList

	this.m_subListParent.renameSubList( oldSubListName, newSubListName );
	this.m_curSubListName = newSubListName ;
	this.onSubListChangeNotify( "rename", oldSubListName, newSubListName );

	return true ;

}	// onESRename ()

UserListPropView.prototype.removeSubList = function ()
{
	if ( ! this.m_bLoaded ) return ;

	if ( ! this.m_curSubListName )
	{
		return;
	}
		
	// in case the sublist was renamed
	if ( ! this.m_oES.doRenameCheck() )
		return ;

	
	
    if ( this.confirmRemoveSubList( this.m_curSubListName ) )
	{
		var deletedSubListName = this.m_curSubListName;
		// mark as 'deleted'
		this.m_oES.remove();
		this.onSubListChangeNotify( "delete", deletedSubListName );
		this.fillFormFromSubList( false );
	}

}	// removeSubList ()

// define a subclass of NestedPropListView that will handle the main prop set \
("enabled" var) // and the Alternates sublist. This class will encapsulate a propView \
to handle the // Rules sublist
function ISPPropView ()
{
	this.base = NestedPropListView ;
	this.base( "ISP Hosting", propList, "Translation Mount", 
				"config.ISPHosting.", "configvar",
				"theForm", "theList", "theEdit" );

	this.m_subListParent = subListTransMounts;

	this.propViewUserFiles = new UserListPropView();
}
ISPPropView.prototype = new NestedPropListView ;

ISPPropView.prototype.preValidate = function ()
{

	return ( this.propViewUserFiles.validate( true ) );
}

ISPPropView.prototype.postIsDirty = function ()
{
	return this.propViewUserFiles.isDirty();
}

ISPPropView.prototype.resultsCallback = function ( results )
{
	// tweak the title by splitting, formatting the results property (the thing that we \
modified)  var res, a;
    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];
		a = propName.split( "." );
		if ( a[4] )
        	res.title = a[3].ent().span("body") + '<br>' + a[4] ;
	}
}

var propView = new ISPPropView();

function fillMountPointSelectList ()
{
	var listCtrl = theForm.MountPoint;

	listCtrl.options.length = 0;

	selAddOption( listCtrl, "Pick a Mount Point", "" );
	for ( var desc in fsLocal )
	{
		selAddOption( listCtrl, fsLocal[ desc ][ 'MountPoint' ] );
	}

}	// fillMountPointSelectList

function onLoad ()
{
	theForm = document.theForm ;
	fillMountPointSelectList();

	propView.onLoad( window );
	propView.propViewUserFiles.onLoad( window, true );

}   // onLoad 
</SCRIPT>

</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">CONTENT MANAGEMENT</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
ISP Hosting provides a way to allot connections
to users. If you are an Internet Service Provider (ISP), you can host
streaming media on behalf of your customers. The four components of the ISP hosting \
feature are: <ol>
<li>User list files, which describe user account structure, and stream
settings available to each account. 
<li>The server configuration file, which gives the actual location of the
users' media files. 
<li>Directories where the media files are stored. 
<li>URLs, used by RealPlayer, that point to the media files. 
</ul>
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>ISP Hosting</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<tr>
	<TD class="input" valign="top" width="45%">
		<TABLE CLASS="PROPLIST_LABEL" width="203" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Translation Mounts</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Translation Mount" BORDER=0></A><A href="javascript://" \
onclick="propView.removeSubList()"><IMG src="images/delete_g.gif" HSPACE=1 \
ALT="Remove Current Translation Mount" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theList" SIZE="9" WIDTH="203">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="55%">
		Edit Translation Mount Description
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theEdit" SIZE="19" TYPE="text" \
VALUE="">

		<BR>

		Mount Point
		<BR>
		<select CLASS="longInput" NAME="MountPoint" SIZE="1" WIDTH="249">
		    <OPTION value="                             ">                             \
</OPTION>  <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		</SELECT>

		<SPAN CLASS="units">
			<A class="linkTextSmall" \
HREF="javascript:tocFrame.gotoPage('config_localFS.html')">Create</a>  mount point \
for ISP content.  </SPAN>
		<BR>
		<BR>
        User Path
        <BR>
        <input CLASS="longInput" MAXLENGTH="255" NAME="UserPath" SIZE="19" \
TYPE="text" VALUE="">  </TD>
</TR>
<tr </tr>
<tr>
	<TD class="input" valign="top" width="45%">
		<TABLE CLASS="PROPLIST_LABEL" width="203" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">User List File Names</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.propViewUserFiles.createSubList()"><IMG src="images/add_g.gif" \
HSPACE=1 ALT="Add New File Name" BORDER=0></A><A href="javascript://" \
onclick="propView.propViewUserFiles.removeSubList()"><IMG src="images/delete_g.gif" \
HSPACE=1 ALT="Remove Current File Name" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theUserList" SIZE="4" WIDTH="203">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="55%">
		Edit User List File Name
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theUserEdit" SIZE="19" TYPE="text" \
VALUE="">  </TD>
</TR>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" VALIGN="middle" width="100%" class="body" \
                ALIGN="left">
      <FONT color="red">*A server restart is required to effect changes applied to \
this page.</FONT>  </TD>
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: dialog.js ---

/* Globals */

var theForm ;
var gParams = window.opener.dlgParams ;
var onLoadHookFunc = null;

function _onLoadDefault ()
{
	theForm = document.theForm;

	if ( gParams ) gParams.isOpen = true ;

	focusFirstElement();

	if ( isNav ) document.captureEvents( Event.KEYDOWN );
	document.onkeydown = _onKeyDefault ;

	if ( onLoadHookFunc ) onLoadHookFunc();
}	

function _onUnLoadDefault ()
{
	if ( gParams ) 
	{
		gParams.isOpen = false ;
		if ( gParams.bCloseOpenerOnClose && window.opener )
		{
			window.opener.close();
		}
	}
}	

// handle ESCape key: simulate Cancel button
// handle ENTER/RETURN key: simulate OK button
// NOTE: Nav doesn't seem to capture the ESC key
function _onKeyDefault ( evt )
{
	var keyCode = ( isIE ) ? event.keyCode : evt.which

	switch ( keyCode )
	{
		case 27:	// ESCape
			theForm.onreset();
			return false ;

		case 13:	// ENTER
			if ( isNav )
			{
				if ( theForm.onsubmit() )
					theForm.submit();
				return false ;
			}
	}
	return true ;
}

function doDlgClose ( fOK )
{
	if ( fOK && (gParams.OKHandler != null) )
		gParams.OKHandler( formToObject( theForm, gParams.userParams ) );

	window.close();

	return true;
}

function formToObject ( f, obj )
{
	if ( ! f ) return obj ;
	if ( ! obj ) obj = new Object();

	var ctrl ;
	for ( var i = 0; i < f.elements.length; i++ )
	{
		ctrl = f.elements[ i ];
		switch( ctrl.type )
		{
			case "submit":
			case "reset":
				break ;

			default :
				obj[ ctrl.name ] = getCtrlValue( ctrl );
				break ;
		}
	}

	return obj ;	
}

function focusFirstElement ()
{
	if ( ! theForm ) return ;
	
	for ( var i = 0 ; i < theForm.elements.length ; i++ )
	{
		var ctrl = theForm.elements[ i ];
		switch( ctrl.type )
		{
			case "text" :
			case "textarea" :
			case "password" :
			case "select-one" :
			case "select-multiple" :
			case "checkbox":
			case "radio":
			case "submit":
			case "reset":
				if ( isIE && ( ctrl.readOnly || ctrl.disabled ) )
					break ;

				ctrl.focus();	
				return ;

			default:
				break ;

		}	// swtich( ctrl.type )
	}
}

--- NEW FILE: getusers.html ---

<HTML>
<HEAD>

<TITLE>Browse Users in Realm</TITLE> 

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="dialog.js"></SCRIPT>
<SCRIPT SRC="qstr.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
	document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else
{
	document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
</SCRIPT>

</server>

<SCRIPT LANGUAGE="javascript">
var realm = document.location.search.slice( 1 );
if ( realm )
	document.write( "<" + "SCRIPT SRC='auth.userlist.nc.js?realm=" + realm + "'></" + \
"SCRIPT>" ); </SCRIPT>

<SCRIPT LANGUAGE="javascript">
function getUsers()
{
	var users = "";
	
	function _nextUser ( a, prop, curDepth )
	{
		if( curDepth == 0 )
		{
			users += "<option value='" + prop + "'>" + prop;
		}
	}
	
	if ( userlistfromserver )
		enumPropArray( userlistfromserver, _nextUser, 1 );

	return users;
}

function onLoad ()
{

}	// onLoad
</SCRIPT>
</HEAD>

<SCRIPT>
onLoadHookFunc = onLoad;
</SCRIPT>

<BODY 
	CLASS="popup"	
	onload="_onLoadDefault();"
	onunload="_onUnLoadDefault();"
> 
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule" height="7" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule">&nbsp;</SPAN>
	</TD>
</TR>
<TR>
   <TD align="left" valign="middle" bgcolor="#FFFFFF" height="49">
      <img src="images/popup_header.gif"  BORDER="0" HSPACE="0" VSPACE="0">
   </TD>
   <TD align="right" valign="middle" bgcolor="#FFFFFF" height="49">
		<img src="images/popup_logo.gif"  BORDER="0" HSPACE="20" VSPACE="0">      
   </TD>
</TR>
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule2" height="9" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule2">&nbsp;</SPAN>
   </TD>
</TR>
</TABLE>
<DIV CLASS="popupPad">

<form 
	name="theForm" 
	method="POST" 
	action="javascript:doDlgClose(1);" 
	onsubmit="return true;" 
	onreset="doDlgClose(0); return false;"
> 
<table border="0" cellspacing="0" cellpadding="0" width="400" style="width:400;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" \
NOWRAP><SCRIPT>document.write(realm)</SCRIPT></TD> <TD bgcolor="#FFFFFF" \
width="20"><img src="images/diagonal.gif"></TD> <TD bgcolor="#FFFFFF" width="118" \
align="right"><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="400">
<TR>
	<TD class="input" width="50%">
		Users<br>
		<select class="longInput" name="DB" MULTIPLE size="11" width="150">
			<SCRIPT LANGUAGE="javascript">
				document.write( getUsers() );
			</SCRIPT>
		</select>
	 </TD>
	<TD class="input" width="50%">
		&nbsp;
	</TD>
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="400">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR><TD bgcolor="#E6E6E6" align="right" valign="middle" NOWRAP>
   <input type="image" src="images/close.gif" alt="Close Window" name="Close Window" \
value="Close" align="top" border="0"> </TD></TR>
</TABLE>
</DIV>

</FORM>
<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: regpick_list.js ---

//<SCRIPT>

var r =
{
	"BroadcastDistribution" :
	{
		"Statistics.*" :
		{
			 "FECPacketsSent" : ""
			,"MCCount" : ""
			,"Name" : ""
			,"PacketCount" : ""
			,"PacketsLostBeforeTransport" : ""
			,"PullCount" : ""
			,"PushCount" : ""
			,"RelayCount" : ""
			,"ResendsHonored" : ""
			,"ResendsRequested" : ""
			,"TCPCount" : ""
			,"TotalBroadcasts" : ""
			,"UDPCount" : ""
			,"Count" : ""
		}
	}

	,"BroadcastReceiver" :
	{
		"Statistics.*" :
		{
			 "DuplicatePackets" : ""
			,"FECPacketsReceived" : ""
			,"FECPacketsUsed" : ""
			,"LatePackets" : ""
			,"Name" : ""
			,"PacketCount" : ""
			,"PacketsLostBeforeTransport" : ""
			,"PacketsLostInTransport" : ""
			,"ResendsRequested" : ""
			,"Count" : ""
		}
	}

	,"Client.*" :
	{
		 "CBID": ""
		,"ClientID": ""
		,"CompanyID": ""
		,"ConnId": ""
		,"ControlBytesSent": ""
		,"GUID": ""
		,"IPAddress": ""
		,"IsCloaked": ""
		,"IsRDT": ""
		,"Language": ""
		,"PlayerStartTime": ""
		,"Port": ""
		,"Protocol": ""
		,"ReasonForTermination": ""
		,"RequestMethod": ""
		,"StartTime": ""
		,"StreamSelectionInfo": ""
		,"User-Agent": ""
		,"Version": ""

		,"Session.*" :
		{
			 "ASMSubscribes": ""
			,"ASMUnsubscribes": ""
			,"AvgBitrate": ""
			,"BytesSent": ""
			,"Duration": ""
			,"DurationSeconds": ""
			,"EstimatedPlayerBufferOverruns": ""
			,"EstimatedPlayerBufferUnderruns": ""
			,"FailedResends": ""
			,"FileSize": ""
			,"InterfaceAddress": ""
			,"IsMulticastUsed": ""
			,"IsRAStreamFound": ""
			,"IsREStreamFound": ""
			,"IsRIStreamFound": ""
			,"IsRVStreamFound": ""
			,"IsUDP": ""
			,"LogStats": ""
			,"PacketLoss": ""
			,"PacketsSent": ""
			,"PlayerRequestedURL": ""
			,"PlayTime": ""
			,"ProxyConnectionType": ""
			,"ReceivedThroughput": ""
			,"RRFrequency": ""
			,"RTT": ""
			,"SendingTime": ""
			,"SessionID": ""
			,"SessionStartTime": ""
			,"Status": ""
			,"SuccessfulResends": ""
			,"TotalBitrateAdaptations": ""
			,"TotalDownshifts": ""
			,"TotalUpshifts": ""
			,"TxRateRange": ""
			,"URL": ""
		}
	}

	,"ConfigLog.*" :
	{
		"Entry" : ""
	}

	,"LiveArchiving" :
	{
		 "NumArchivers" : ""
		,"TotalArchiverCount" : ""

		,"Archiver.*" :
		{
			 "Filename" : ""
			,"PercentDone" : ""
			,"Status" : ""
		}
	}

	,"LiveConnections" :
	{
		 "Count" : ""
		,"Index" : ""
	}

	,"LiveConnections.*" :
	{
		 "Address" : ""
		,"Bandwidth" : ""
		,"BroadcastRelayParameters" : ""
		,"ClientsLeaving" : ""
		,"ClientsLeavingDueToClientError" : ""
		,"ClientsLeavingDueToServerError" : ""
		,"ClientRequests" : ""
		,"ConnectionType" : ""
		,"FileName" : ""
		,"IsEncoded" : ""
		,"IsRedundant" : ""
		,"LongName" : ""
		,"MountPoint" : ""
		,"NumPlayers" : ""
		,"Port" : ""
		,"SuccessfulClientRequests" : ""
		,"UnsuccessfulClientRequests" : ""
	}

	,"Monitors" :
	{
		"Count" : ""
	}

	,"Proxy" :
	{
		"BlockCacheGatewayBW" :
		{
			 "Read" : ""
			,"Total" : ""
			,"Write" : ""
		}
	}

	,"Server" :
	{
		 "BandwidthOutput" : ""
		,"BandwidthOutputPerPlayer" : ""
		,"BandwidthUsage" : ""
		,"BytesInUse" : ""
		,"BytesMemoryUsage" : ""
		,"ClientCount" : ""
		,"CloakedClientCount" : ""
		,"FileObjectCount" : ""
		,"HTTPClientCount" : ""
		,"Last10SecondsBytesServed" : ""
		,"Last10SecondsBytesServedPerPlayer" : ""
		,"Last10SecondsENoBufs" : ""
		,"Last10SecondsForcedSelects" : ""
		,"Last10SecondsMainLoopIters" : ""
		,"Last10SecondsMemoryOps" : ""
		,"Last10SecondsMutexCollisions" : ""
		,"Last10SecondsNewClients" : ""
		,"Last10SecondsOtherUDPErrors" : ""
		,"Last10SecondsOverloads" : ""
		,"Last10SecondsPackets" : ""
		,"Last10SecondsSchedulerItems" : ""
		,"Last10SecondsSchedulerItemsWithMutex" : ""
		,"LastRegistryIDUsed" : ""
		,"LoadState" : ""
		,"MidBoxCount" : ""
		,"MMSClientCount" : ""
		,"MulticastTransportCount" : ""
		,"PercentCPUUsage" : ""
		,"RTSPAttemptedStreamed" : ""
		,"RTSPClientCount" : ""
		,"TotalCAs" : ""
		,"TCPTransportCount" : ""
		,"UDPTransportCount" : ""
		,"Uptime" : ""
		,"platform" : ""
		,"version" : ""

		,"Allow" :
		{
			"Announce" :
			{
				 "X-MEIPort" : ""
				,"X-SplitterPort" : ""
				,"x-real-bcng-port" : ""
			}
		}

		,"ContentDistribution" :
		{
			"Statistics" :
			{
				 "All" : ""
				,"CacheReadAveragePercent" : ""
				,"CacheReadBPS" : ""
				,"CacheReadBytes" : ""
				,"CacheReadCurrentPercent" : ""
				,"CacheReadTotalBytes" : ""
				,"ExportBPS" : ""
				,"ExportBytes" : ""
				,"ExportTotalBytes" : ""
				,"FastFileReadAveragePercent" : ""
				,"FastFileReadBPS" : ""
				,"FastFileReadBytes" : ""
				,"FastFileReadCurrentPercent" : ""
				,"FastFileReadTotalBytes" : ""
				,"ImportAveragePercent" : ""
				,"ImportBPS" : ""
				,"ImportBytes" : ""
				,"ImportCurrentPercent" : ""
				,"ImportTotalBytes" : ""
				,"LocalReadAveragePercent" : ""
				,"LocalReadBPS" : ""
				,"LocalReadBytes" : ""
				,"LocalReadCurrentPercent" : ""
				,"LocalReadTotalBytes" : ""
				,"MEIConnectionsActive" : ""
				,"MEIConnectionsTotal" : ""
				,"MIIConnectionsActive" : ""
				,"MIIConnectionsTotal" : ""
			}
		}

		,"Errors" :
		{
			 "LastEmerg" : ""
			,"LastAlert" : ""
			,"LastCrit" : ""
			,"LastErr" : ""
			,"LastWarning" : ""
			,"LastNotice" : ""
			,"LastInfo" : ""
			,"LastDebug" : ""
		}

		,"StreamType" :
		{
			"Ad Serving" :
			{
				 "Connections" : ""
				,"Delta" : ""
				,"MaxLicenses" : ""
				,"Trigger" : ""
			}

			,"Commerce" :
			{
				 "Connections" : ""
				,"Delta" : ""
				,"MaxLicenses" : ""
				,"Trigger" : ""
			}

			,"General" :
			{
				 "Delta" : ""
				,"MaxLicenses" : ""
			}
		}
	}

	,"Splitters" :
	{
		 "Count" : ""
		,"Index" : ""
	}

	,"GLOBALS" :
	{
		 "Quot" : "Double Quote (\")"
		,"Date" : "Date (MM/DD/YY)"
		,"Time" : "Time of day by local time zone (HH:MM:SS)"
		,"GMTime" : "Greenwich Mean Time (HH:MM:SS)"
		,"TZDiff" : "Local Time Zone Difference (for PST this would be '-0800')"
		,"Hour" : "Hour of the day by local time zone (HH)"
		,"Min" : "Minute of the day (MM)"
		,"Sec" : "Second of the day (SS)"
	}
};

//</SCRIPT>


--- NEW FILE: ip.js ---

// IP Address checking stuff
// requires client.js and BigInt.js

//<SCRIPT>

function IPAddress ( sIPAddress )
{
	this.sAddress = sIPAddress;
    this.sAddressNoPrefix = sIPAddress;

	this.isValid = false;
	this.errMsg = "";
    
	this.isIPv6 = false;
	this.isIPv4 = false;
	this.isIPv4Compat = false; //IPv4 address embedded in an IPv6 address
    this.prefix = "";
    this.isMulticast = false;
    this.isUnicast = false;
    this.isLoopback = false;	// 127.0.0.1 or 0:0:0:0:0:0:0:1 or ::1
    this.isUnspecified = false;	// 0.0.0.0 or ::
    
    this.address32 = 0; 		//IPv4 address as 32bit integer 		
    this.address128 = int2bigInt( 0, 128, 1 );	//IPv6 address as 128 bit "Big \
Integer" (see BigInt.js)

    this.isValid = this.validate();

	if ( (!this.isValid) && isBlank(this.errMsg) )
	{
    	// set a generic error msg
        if ( -1 == sIPAddress.indexOf( ":" ) )
        {
		    this.errMsg = "Invalid IP Address.";
        }
        else
        {
		    this.errMsg = "Invalid IPv6 Address.";
        }
	}
	    
    return this;
    	
}	// 

IPAddress.prototype.toString = function ()
{
	return this.sAddress ;
	//return this.sAddress + "[" + (this.address128 ? bigsInt2str(this.address128,16) : \
"INVALID") + "]"; }

IPAddress.prototype.isGreater = function ( IPAddressToCompare )
{
	if ( !(this.isValid && IPAddressToCompare.isValid) )
	{
    	return true ;
	}
	
	return greater( this.address128, IPAddressToCompare.address128 );
}

IPAddress.prototype.equals = function ( IPAddressToCompare )
{
	if ( !(this.isValid && IPAddressToCompare.isValid) )
	{
    	return false ;
	}
	
	return equals( this.address128, IPAddressToCompare.address128 );
}

IPAddress.prototype.isInRange = function ( IPAddressToCompare )
{
	if ( !(this.isValid && IPAddressToCompare.isValid) )
	{
    	return true ;
	}
	
	return greater( this.address128, IPAddressToCompare.address128 );
}

IPAddress.prototype.validate = function ()
{
	function ipv4Address2Int ( ip )
	{
		var octets	= ip.split('.');

		// assure we've got at least 4 octets
		octets.push( 0, 0, 0, 0 );
		
		// use eval() so that the "+" operands are treated as ints not strings
		return eval(octets[0] * 16777216) + eval(octets[1] * 65536) + 
        	   eval(octets[2] * 256)      + eval(octets[3]);

	}	// 
	    
    function _validateIPv4Address ( ip )
    {
    	//validate basic IPv4 address form
		if ( ! ip.bSearch( /^(\d{1,3}\.){3}\d{1,3}$/ ) )
		{
			return false ;
		}
		
		var tmpA = ip.split( "." );
        var isFirstOctetZero = ( parseInt( tmpA[ 0 ] ) == 0 );

		for ( var i = 0; i < tmpA.length; i++ )
		{
			var n = parseInt( tmpA[ i ] );
			if ( isNaN( n ) || (n < 0) || (n > 255) )
			{
        		
				return false ;
			}
            if ( isFirstOctetZero && (n > 0))
            {
        		
            	return false;
            }
		}
        
        return true;
	}

	function _IPv4Address2Prefix ( ip )
	{
    	var n = ipv4Address2Int( ip );
	    var strBinary = "";
	    var remainder = n;

	    while ( remainder >= 2 )
	    {
	        strBinary += remainder % 2;
	        remainder = Math.floor( remainder / 2 );
	    }
		strBinary += remainder;
		    
		// out binary str is in reverse order, we don't care,
		// we just want the number of consecutive 1's at the end
		var aMatch = strBinary.match( /1+$/ );
	 	return ( aMatch ? aMatch[ 0 ].length : 0 );
	}
    
    
	var ip = this.sAddress;
	if ( isBlank( ip ) )
	{
    	this.errMsg = "Empty IP Address.";
		return false;
	}
    
    //strip off, save prefix
    var pos = ip.search( /\/\d+$/ );
    if ( pos != -1 )
    {
        this.prefix = parseInt(ip.slice( pos + 1 ));
        ip = ip.slice( 0, pos );
        this.sAddressNoPrefix = ip;
    }
    // check for IPv4 address:address prefix notation (i.e. \
"183.34.5.3:255.255.255.0")  else if ( ip.bSearch( \
/^(\d{1,3}\.){3}\d{1,3}\:(\d{1,3}\.){3}\d{1,3}$/ ) )  {
    	var aParts = ip.split( ":" );
        ip = aParts[ 0 ];
    	if ( ! _validateIPv4Address( aParts[ 1 ] ) )
    	{
        	
			return false;
    	}
    	else
    	{
	        this.prefix = _IPv4Address2Prefix( aParts[ 1 ] );
    	}
        this.sAddressNoPrefix = ip;
    }
    
	// check for IPv4 (no ":")
    if ( -1 == ip.indexOf( ":" ) )
    {
    	if ( ! _validateIPv4Address( ip ) )
    	{
			return false;
    	}
		this.address32 = ipv4Address2Int( ip );
		this.isIPv4 = true;
        
		// convert to 128 bit big int
		this.address128 = str2bigInt( this.address32.toString(), 10, 128, 0 );
    }
    else
    {
        // check for an IPv4 compatible or IPv4 mapped IPv6 address: 
        // ::10.10.10.10 or 0:0:0:0:0:FFFF:10.10.10.10 or equiivalnt variation
		var aMatchResults = ip.match( /\:((\d{1,3}\.){3}\d{1,3})$/, "" );
        if ( aMatchResults && aMatchResults[ 0 ])
        {
        	var sIPv4 = aMatchResults[ 0 ].slice( 1 );
	    	if ( ! _validateIPv4Address( sIPv4 ) )
	    	{
            	
				return false;
	    	}
    		this.address32 = ipv4Address2Int( sIPv4 );
            
            //replace the IPv4 address with 32 bits worth of zero's
            ip = ip.replace( /\:((\d{1,3}\.){3}\d{1,3})$/, ":0000:0000" );
            
	       	this.isIPv4Compat = true; //IPv4 address embedded in an IPv6
        }
        
		// hex digits and colons only at this point
        if ( ! ip.bSearch( /^[A-F\d\:]+$/i ) )
    	{
           	
			return false;
    	}

		// check for a "compressed" address: '::' used to represent contiguous 
        // 16-bits worth of zero's  in ::2324:2424 or FF:DC02:34::1234
		var parts = ip.split( "::" );
		if (parts.length > 2)
		{
           	
        	return false ;	// too many of these: "::"
		}
		else if (parts.length == 1)
		{
        	//alert(ip);
	    	// no 'compression', check address form

        	if ( this.isIPv4Compat )
        	{
            	//should be 0000:0:0:0:0:0 or 0000:0:0:0:0:FFFF
		        if ( ! ip.bSearch( /^(0{1,4}\:){5}(0{1,4}|FFFF)$/i ) )
	            {
            		
	            	return false;
	            }
        	}
            else
			{
		        if ( ! ip.bSearch( /^([A-F\d]{1,4}\:){7}[A-F\d]{1,4}$/i ) )
	            {
            		
	            	return false;
	            }
            }
	    }
		else if (parts.length == 2)
	    {
            var aTemp = ip.split( /\:+/ );
            
            // check for too many pieces
            if ( this.isIPv4Compat && (aTemp.length > 5) )
            {
            	
            	return false;
            }
            if ( (! this.isIPv4Compat) && (aTemp.length > 7) )
            {
            	
            	return false;
            }
            
            // check each piece
			for (var x = 0; x < aTemp.length; x++)
			{
            	if ( ! isBlank( aTemp[x] ) &&
            		   (!aTemp[x].bSearch( /^[A-F\d]{1,4}$/i )) )
	            {
                	
	            	return false;
	            }
            }
        }
		this.isIPv6 = true;
    }
    											
    // now convert into a big int
    if ( ! this.isIPv4 )
    {
		//"uncompress" the address 
        if ( ip.bSearch( /\:\:/ ) )
        {
        	if ( ip == "::" )
        	{
            	ip = "0000:0000:0000:0000:0000:0000:0000:0000";
        	}
        	else
            {
	        	// how many "0000" pieces are missing?
		        var nPieces = ip.match( /[A-F\d]+/ig ).length;

	            // insert them
		        var sReplacement = ":" + "0000:".dup( 8 - nPieces );
		        ip = ip.replace( /\:\:/, sReplacement );

	            //we may have extra ":" as a result, remove them
		        ip = ip.replace( /^\:/, "" );
		        ip = ip.replace( /\:$/, "" );
		        ip = ip.replace( /\:\:/, ":" );
            }
    	}
            
		// pad out 16 bit piece with leading zeros
		var aPieces = ip.split( ":" );
        if ( ! aPieces )
        {
        	
            return false;
        }
        
		for (x = 0; x < aPieces.length; x++)
		{
			aPieces[ x ] = aPieces[ x ].pad( 4, "0" );
		}

		// convert to 128 bit big int
		this.address128 = str2bigInt( aPieces.join(""), 16, 128, 0 );

		// IPv6 portion of IPv4 compatible address mut be 0 or FFFF00000000
        if ( this.isIPv4Compat && 
        	(!(equals(this.address128, str2bigInt( "FFFF00000000", 16, 128, 0 )) || 
            	isZero(this.address128))))
       	{
        	
        	return false;
        }
        
        // add in the 32bit IPv4 address
		add(this.address128, str2bigInt( this.address32.toString(), 10, 128, 0 ) );
	}
    
    this.isUnspecified = isZero(this.address128);
    if ( this.isUnspecified )
    {
    	this.errMsg = "Invalid IP Address: zero is not a valid address." ;
    	return false ;
    }

    if ( (this.prefix > 32) && (this.isIPv4 || this.isIPv4Compat) )
    {
    	this.errMsg = "Invalid Netmask: An IPv4 address requires a netmask of 32 bits or \
less."  return false ;
    }
    else if ( this.prefix > 128 )
    {
    	this.errMsg = "Invalid Netmask: prefixes must 128 (bits) or less."
    	return false ;
    }

    if ( this.isIPv4 )
    {
		this.isMulticast = ((this.address32 >= 3758096384) && 
        					(this.address32 <  4026531840));
    }
    else
    {
    	this.isMulticast = ip.bSearch( /^FF/i );
    }
    
	return true ;
}

function IPAddressAllowZero ( sIPAddress )
{
	this.base = IPAddress ;
	this.base( sIPAddress );

	// accept "ANY" Or 0.0.0.0 or some IPv6-ish form of ::0
 	this.isValid = ( this.isValid || this.isUnspecified );
                     
    if ( this.isValid )
    {
    	this.errMsg = "";
    }
    
    return this;
    	
}	// 
IPAddressAllowZero.prototype = new IPAddress ;

// allow 0.0.0.0 or ::0 or "any"
function IPAddressAllowAny ( sIPAddress )
{
	this.base = IPAddressAllowZero ;
	this.base( sIPAddress );

	// accept "ANY" Or 0.0.0.0 or some IPv6-ish form of ::0
 	this.isValid = ( this.isValid || 
    				 (sIPAddress && sIPAddress.toLowerCase() == "any") );
    if ( this.isValid )
    {
    	this.errMsg = "";
		if ( sIPAddress.toLowerCase() == "any" )
		{
	    	this.isUnspecified = true;
		}
    }
	                     
    return this;
    	
}	// 
IPAddressAllowAny.prototype = new IPAddressAllowZero ;

function getIPAddrErr ( addr, wantMulticast )
{
	var errMsg = "";
	
    // TODO: use sprintf
	var invalidMulticastErrMsg = 
    	"'" + addr + "' is an invalid Multicast IP Address. Multicast Addresses must be \
in the range " +   "224.0.0.0 to 239.255.255.255" ;
        
	var invalidErrMsg = 
		"'" + addr + "' is an invalid IP Address. IP Addresses must be in the form \
[1-255].[0-255].[0-255].[0-255]";

    var ipAddr = new IPAddress( addr );
    
    if ( wantMulticast && ((!ipAddr.isValid) ||(!ipAddr.isMulticast)) )
    {
    	errMsg = ( ipAddr.errMsg ? ipAddr.errMsg : invalidMulticastErrMsg );
    }
    else if ( !ipAddr.isValid )
    {
    	errMsg = ( ipAddr.errMsg ? ipAddr.errMsg : invalidErrMsg );
    }

	return errMsg;
}

// ip address range constructor,
function IPRange( sIPAddressRange, isMulticast )
{
	this.errMsg = "";
    this.isValid = false;
    this.addressLow = null;
    this.addressHigh = null;

	var addrs = sIPAddressRange.split( "-" );
	if ( (!addrs) || (addrs.length != 2) )
    {
		this.errMsg = "IP Address Ranges must be of the form [IPv4/6 Address]-[IPv4/6 \
Address].";  return this;
	}
	
    var addr1 = new IPAddress( addrs[ 0 ] );
    var addr2 = new IPAddress( addrs[ 1 ] );
    
    this.isValid = (addr1.isValid && addr2.isValid);
    if (!this.isValid)
    {
    	//this.errMsg = (addr1.isValid ? addr2.errMsg : addr1.errMsg);
		this.errMsg = 
        	"IP Address Ranges must be of the form \
[0-255].[0-255].[0-255].[0-255]-[0-255].[0-255].[0-255].[0-255].";  return this;
    }
    
    // TODO are both addresses of the same type (multicast,IPv4/6, etc)?
    
    //rearrange if neccesary
	if ( addr1.isGreater( addr2 ) )
	{
		this.addressLow  = addr2;
		this.addressHigh = addr1;
	} 
	else
	{
		this.addressLow	 = addr1;
		this.addressHigh = addr2;
	}
    
	this.isMulticast = (this.addressLow.isMulticast && this.addressHigh.isMulticast);
    this.isValid = true;
		
	return this;
}

IPRange.prototype.toString = function ( )
{
	return this.addressLow.toString() + '-' + this.addressHigh.toString();
}

IPRange.prototype.addressInRange = function ( IPAddressToTest )
{
	return ((IPAddressToTest.isGreater( this.addressLow ) && 
    		 this.addressHigh.isGreater( IPAddressToTest )) ||
            (this.addressLow.equals( IPAddressToTest ) ||
    		 this.addressHigh.equals( IPAddressToTest )) );
}

IPRange.prototype.isOverlap = function ( rangeToTest )
{
	return (this.addressInRange( rangeToTest.addressLow ) || 
    		this.addressInRange( rangeToTest.addressHigh ) );
}

IPRange.prototype.isSubset = function ( range )
{
	return (this.addressInRange( range.addressLow ) && 
    	    this.addressInRange( range.addressHigh ));
}

function AddressRangeCtrl ( name, minRange, isRequired, isNotMulticast )
{
	this.m_name = (name ? name : "AddressRange");
	this.m_minRange = (minRange != null ? minRange : 0);
	this.m_isRequired = (isRequired != null ? isRequired : true);
	this.m_isMulticast = ( isNotMulticast ? false : true );

	this.m_addr1 = this.m_name + "1";
	this.m_addr2 = this.m_name + "2";
}

AddressRangeCtrl.prototype.fillForm = function ( oForm )
{
	if ( oForm && 
		 oForm[ this.m_name ] && 
		 oForm[ this.m_addr1 ] && 
		 oForm[ this.m_addr2 ] )
	{
		// split AddressRange into lower and upper display fields
		var aTemp = getCtrlValue( oForm[ this.m_name ] ).split( /\s*-\s*/ );
		setCtrlValue( oForm[ this.m_addr1 ], (aTemp[0] ? aTemp[0] : ""), true );
		setCtrlValue( oForm[ this.m_addr2 ], (aTemp[1] ? aTemp[1] : ""), true );
	}	
}

AddressRangeCtrl.prototype.validate = function ( oForm )
{
	if ( oForm && 
		 oForm[ this.m_name ] && 
		 oForm[ this.m_addr1 ] && 
		 oForm[ this.m_addr2 ] )
	{
		var addr1 = getCtrlValue( oForm[ this.m_addr1 ] );
		var addr2 = getCtrlValue( oForm[ this.m_addr2 ] );

		// both pieces missing?
		if ( isBlank( addr1 ) && isBlank( addr2 ) )
		{
			if ( this.m_isRequired )
			{
				return rejectInput( oForm[ this.m_addr1 ], 
					"An Address Range is required." );
			}
			else
			{
				setCtrlValue( oForm[ this.m_name ], "" );
				return true;
			}
		}

		// one piece missing?
		if ( isBlank( addr1 ) || isBlank( addr2 ) )
		{
			if ( 0 != this.m_minRange )
			{
				return rejectInput( oForm[ this.m_addr1 ], 
					"Invalid address range. The address range must span at least " +
					 (this.m_minRange+1) + " address".pluralize(this.m_minRange+1) + "." );
			}

			if ( isBlank( addr1 ) )
			{
				addr1 = addr2;
			}
			else
			{
				addr2 = addr1;
			}
			setCtrlValue( oForm[ this.m_addr1 ], addr1 );
			setCtrlValue( oForm[ this.m_addr2 ], addr1 );
		}

		var err = getIPAddrErr( addr1, this.m_isMulticast );
		if ( err )
			return rejectInput( oForm[ this.m_addr1 ], err );

		err = getIPAddrErr( addr2, this.m_isMulticast );
		if ( err )
			return rejectInput( oForm[ this.m_addr2 ], err );

		// convert to IPAddress objects and compare 
		var oAddr1 = new IPAddress( addr1 );
		var oAddr2 = new IPAddress( addr2 );

		if ( oAddr1.addr > oAddr2.addr )
		{
			// user must be lesydexic, give em a break
			var tmp = addr1;
			addr1 = addr2;
			addr2 = tmp;

			setCtrlValue( oForm[ this.m_addr1 ], addr1 );
			setCtrlValue( oForm[ this.m_addr2 ], addr2 );
		}

		if ( Math.abs(oAddr1.addr - oAddr2.addr) < this.m_minRange )
		{
			return rejectInput( oForm[ this.m_addr1 ], 
				"Invalid address range. The Address range must span at least " +
				 (this.m_minRange+1) + " address".pluralize(this.m_minRange+1) + "." );
		}

		// combine into AddressRange field
		setCtrlValue( oForm[ this.m_name ], addr1 + "-" + addr2, true );

		return true ;
	}
}

function intToIPAddress ( nAddress, bWantIPv6 )
{
	if ( (!bWantIPv6) && (nAddress <= 0xFFFFFFFF) )
	{
    	// convert into IPv4 8bit octets
        
		var str = "";
		for ( var i = 0; i < 4; i++ )
		{
			str += ( nAddress & ( 255 << ( 3 - i ) * 8 ) ) >>> ( 3 - i ) * 8;
			str += '.';
		}

		// return string without the trailing '.'
		return str.substr(0 , str.length - 1 );
	}
    else
    {
    	//convert address into a binary string using BigInt functions (see BigInt.js)
	    sAddressBinary = bigInt2str( str2bigInt( nAddress.toString(10), 10, 128, 1 ), 2 \
);  
	    //pad with leading zero's up to 128 "bits"
	    sAddressBinary = sAddressBinary.pad( 128, "0" );
	    
		//store as (8) 16 bit hexidecimal chunks (with no leading zeros)
	    var aChunks = [];
		for ( var i = 0; i < 8; i++ )
		{							
	    	var nChunk = parseInt( sAddressBinary.substr( i * 16, 16 ), 2 );
			aChunks.push( nChunk.toString( 16 ) );         
		}

		// join with ":" into an IPv6 string
	    var sIPv6Address = aChunks.join(":");
        
        //optional "compression"
        //replace largest contiguous 16 bit chunks of zero's with "::"
        var longestMatchLen = 0;
        var longestMatch = "";
        var pattern = /(0:)+/g;
	    sIPv6Address += ":";	//makes it easier for pattern matches
        while ( (result = pattern.exec( sIPv6Address )) != null )
        {
        	if ( result[0].length > longestMatchLen )
        	{
            	longestMatchLen = result[0].length;
            	longestMatch = result[0];
        	}
        }
        if ( longestMatch )
        {
        	sIPv6Address = sIPv6Address.replace( longestMatch, ":" );
        }
		
		//fixup
        //if address begins or ends with a single ":", remove it/them
       	sIPv6Address = sIPv6Address.replace( /^\:([^\:])/, "$1" );
       	sIPv6Address = sIPv6Address.replace( /([^\:])\:$/, "$1" );

	    return sIPv6Address;
    }
}

//</SCRIPT>


--- NEW FILE: config_getdata.nc.sjs ---
<server language="JavaScript">
// BEGININC
<!--#INCLUDE file="server.inc" -->
// ENDINC

var clearPasswords = false ;
var dataRequests = new Array();
var qStr = RMAGetPropertyValue( "headers.url" );
if ( qStr )
{
	qStr = qStr.slice( qStr.indexOf( '?' ) + 1 );
	//dbgAlert( qStr );

	var param, arrayName, serverProp ;
	var tmp = qStr.split( "&" );
	for ( var i = 0; i < tmp.length; i++ )
	{
		param = tmp[ i ].split( "=" );

		// param[ 0 ] is the name of the client-side array the user wants the 
		// param[ 1 ] is the name of the server property/list the client wants 
		// the registry values for (stuffed into the client side array)
		arrayName = unescape( param[ 0 ] );
		serverProp = unescape( param[ 1 ] );

		// look for special case requests first
		// is the calling page asking whether there are pending changes for this page \
(contextID)?  if ( arrayName == "contextID" )
		{
			emitVarDecl( "pendingChanges", (RMAGetFirstProperty( "contextconfig." + serverProp \
+ ".config" ) ? true : false), 1 );  }
		else if ( arrayName == "timeoutParam" ) 
		{
			clearPasswords = true ;
		}
		else if ( arrayName == "AllPorts" )
		{
			emitPorts();
		}
		else
		{
			if ( arrayName && serverProp )
			{
				// the serverProp string may contain multiple, comma-separated property names
				serverProp = serverProp.split( /\s*,\s*/ ); //serverProp is now an array of \
property names

				// data to be stored in, the user may pass multiple arrayname=serverprop pairs
				// where the arrayname is repeated

				if ( dataRequests[ arrayName ] == null )
					dataRequests[ arrayName ] = new Array();

				for ( var x = 0; x < serverProp.length; x++ )
				{
					if ( serverProp[ x ] )
						dataRequests[ arrayName ].push( serverProp[ x ] );
				}
			}
		}
	}
}

for ( var arrayName in dataRequests )
{
	//dbgAlert( arrayName );
	emitVarDecl( arrayName, "new Array()", 1 );

	//dbgAlert( dataRequests[ arrayName ] );
	for ( var i = 0; i < dataRequests[ arrayName ].length; i++ )
	{
		serverProp = dataRequests[ arrayName ][ i ];

		//assum "config." prefix
		//if serverProp does not begin with "config." AND is not one of the 
		//other common registry roots, then append "config." to the property Name
		if ( -1 == serverProp.leftProp().search( \
/config|server|headers|license|results|DistributedLicensing/ ) )  {
			serverProp = "config." + serverProp ;
		}

		if ( RMAGetFirstProperty( serverProp ) || ( RMAGetPropertyValue( serverProp ) != \
null ) )  {
			if ( ! RMAGetFirstProperty( serverProp ) )
			{
				emitArrayProp( arrayName, serverProp.rightProp( -1 ), RMAGetPropertyValue( \
serverProp ) );  }
			else
			{
				emitPropsToJSArray( serverProp, arrayName, 0, 0, clearPasswords );
			}
		}
	}
}

function emitPorts ()
{
	// for reference, display all the other ports being used
	allPorts = new Array();

	var portNo ;
	function findPortsCallback( prop, val, curDepth )
	{
		// filter out ports that are used for allowances or that refer to ports
		// on other servers
		if ( prop.bSearch( \
/BroadcastDistribution\.Destinations|AccessControl|ProxyRoutingTable|WebServerPort|SplitterSourceList|LicensePublishers|Windows \
Media Live Broadcast Source/i ) )  return ;

		portNo = parseInt( val );
		if ( (prop.rightProp().toLowerCase() != "transport") && 
			 (! isNaN( portNo )) && (portNo > 0) )
		{
			//trim off "config."
			allPorts[ prop.rightProp( -1 ) ] = val ;
		}
	}

	// enumerate through all the config. registry properties named *Port

	findSubProp( "config", ".*(Port|PortRange)", findPortsCallback );

	emitServArrayToClientArray( allPorts, "allPorts" );
}
</server>


--- NEW FILE: proplist.js ---

//<SCRIPT>

function PropObj 
(
	name,		// required, property name, usually the rightmost property in a property path
	defValue,	// optional, default value for the property, default = ""
	readOnly,	// optional, readonly, value cannot be edited, default == false 
	required,	// optional, does the property require a value (i.e. value != "")
	min,		// optional, the minimum value for the property (for numeric properties only), \
default == null  max,		// optional, the maximum value for the property (for numeric \
properties only), default == null  rule,		// optional, name of rule to use to \
validate the property's value before submittal  label,		// optional, a more friendly \
name then the name attribute  restart		// optional, does the server require a restart \
when this property is changed? )
{
	if ( ! name ) return null ;

	this.name 		= name ;
[...1439 lines suppressed...]

}	// PropList.prototype.setFormDefaults ()

PropList.prototype.resetToDefaults = function ( form )
{
	var ctrl, prop ;
	for ( var propName in this.m_props )
	{
		prop = this.m_props[ propName ];
		ctrl = ( prop ? prop.getCtrl( form ) : null );
		if ( ctrl && (prop.defValue != "") )
	    {
			setCtrlValue( ctrl, prop.defValue );
	    }

	}	//for propName in m_props

}	// PropList.prototype.resetToDefaults ()

//</SCRIPT>

--- NEW FILE: regview.js ---

var	imgOpenSrc = "images/minus_tree.gif" ;
var	imgCloseSrc = "images/plus_tree.gif" ;
var	imgLeafSrc  = "images/solid_tree.gif" ;

function initTOCFrame ()
{
	//create the TOCTree (the constructor will save a ref to the obj in \
window.TheTOCTree)  
	var tree = new REGTree( window, top.frames.DUMP );

	tree.m_bSyncTOCWithContent = false ;

	tree.m_hiColor = "black";
	tree.m_hiBGColor = "#FFE3B7";
	tree.m_bHiliteCurLink = true ;

	if ( isIE )
	{
		tree.m_basePath = "";
	}

	tree.m_imgOpenSrc  = imgOpenSrc ;
	tree.m_imgCloseSrc = imgCloseSrc ;
	tree.m_imgLeafSrc  = imgLeafSrc ;

	// various magic numbers for Nav4
	if ( isNav4 )
	{
		tree.m_nYOffset = 10 ;		// the Y pos for the first TOC link - we have to absolutly \
position it in Nav4

		// in Nav4 we can't read a folder's className attribute so we have to infer its \
level in the  // hierarchy by comparing its "left" attribute to the following:
		tree.m_nIndentDelta = 14 ;	// no. of pixels each class is indented - should match \
stylesheet  tree.m_nXOffset = 10;		// no. of pixels root level folder is indented - \
should match stylesheet

		var div = getElem( "THEHILITE" );
		if ( div )
		{
		   div.visibility = "hidden" ;
		}
	}

	tree.initialize();

	// check for a starting path stored in the top window
	var folderId = 0;
	if ( top.curPath() && (null != pathMap[ top.curPath() ]) )
	{
		folderId = pathMap[ top.curPath() ];
		tree.tf( folderId );
		tree.si( folderId );
	}

	// hook up the DUMP frame's click event
	//addEvent( top.frames.DUMP.document, "click", 
	  //	onDumpWinClick, true, "Event.CLICK" );

	top.frames.DUMP.TheTOCTree = TheTOCTree;

	// set title to folder's registry path on mouseover

}	// onLoad ()

function onDumpWinClick ( e )
{
	return TheTOCTree.onDocClick( e ? e : top.frames.DUMP.event );

}	// 

/*
	registry data functions
*/

function _enumPropArray ( a, callback, maxDepth, fNoPath, fListsOnly, fDepthLast )
{
	if ( ! ( a && callback ) ) return ;

	// default maxDepth is zero, i.e. full recursion
	if ( _enumPropArray.arguments.length < 3 ) maxDepth = 0 ;

	function _enumProps( a, curDepth, curPath )
	{
		var newPath = "";
		if ( maxDepth && ( curDepth >= maxDepth ) ) return ;
		if ( fDepthLast )	// loop through the list, call the callback but don't recurse
		{
			for ( var x in a )
			{
				
				if ( fNoPath )
				{
					newPath = "";
				}
				else
				{	
					if ( ! curPath )
						newPath = x.toString();
					else if ( "/" == curPath.charAt( curPath.length - 1 ) )
						newPath = curPath + x.toString();
					else
						newPath = curPath + "." + x.toString();
				}
				// if callback returns a non-zero value that's a signal to abort the enumeration
			    if( callback( a, x, curDepth, newPath ) )
			    	return ;
			}
		}
		for ( var x in a )
		{
			
			if ( ! fNoPath )
			{	
				// add the current subprop to the path...
				curPath += (curPath ? "." : "") + x.toString();
			}

			// if callback returns a non-zero value that's a signal to abort the enumeration
			if ( ! fDepthLast ) // already called callback above
			{
		    	if ( callback( a, x, curDepth, fNoPath ? null : curPath ) )
				{
		    		return ;
				}
			}
			if ( isObj( a[ x ] ) )
			{
				curDepth++ ;
				_enumProps( a[ x ], curDepth, curPath ) 
				curDepth-- ;

				if ( ! fNoPath )
				{
					// ...and then remove current subprop from the path...
					curPath = curDepth ? curPath.leftProp( -1 ) : "" ;
				}
			}
			else if ( fListsOnly || fDepthLast ) //assume array is sorted so that all lists \
are grouped at the beginning  {
				break ;
			}
		}
	}

	_enumProps( a, 0, "" );
}

function sortCaseInsensitive ( a, b )
{
	if (a == null) return -1;
	if (b == null) return 1;

	if( (parseInt(a) == a) && 
	    (parseInt(b) == b) )
	{
	 	return ( parseInt(a) < parseInt(b) ? -1 : 1 );
	}
	else if( (typeof(a) == "number") && 
	    	 (typeof(b) == "number") )
	{
	 	return ( a < b ? -1 : 1 );
	}
	else
	{
		return ( a.toString().toLowerCase() < b.toString().toLowerCase() ? -1 : 1 );
	}
}

// sorts the array into something useful
// lists first, variables next
// alphabetical within each group
function _sortArray ( a, level )
{
	var a2 = new Array();
	var aVars = new Array();
	var aLists = new Array();

	for ( var prop in a )
	{
		if ( isObj( a[ prop ] ) )
		{
			aLists[ aLists.length ] = prop ;
		}
		else
		{
			aVars[ aVars.length ] = prop ;
		}
	}

	if ( isNav4 )
	{
		// nav4 crashes when given a sort func
		aLists.sort();
		aVars.sort();
	}
	else
	{
		aLists.sort( sortCaseInsensitive );
		aVars.sort( sortCaseInsensitive );
	}

	for ( var i = 0; i < aLists.length; i++ )
	{
		
		a2[ aLists[ i ] ] = _sortArray( a[ aLists[ i ] ], level + 1 );
	}

	for ( i = 0; i < aVars.length; i++ )
	{
		a2[ aVars[ i ] ] = a[ aVars[ i ] ];
	}

	return a2 ;
}

regData = new Array();

function hasChildFolder ( a )
{
	var hasChildren = false ;
	function _lookAhead ( a2, prop2 )
	{
		if ( isObj( a2[ prop2 ] ) )
		{
			hasChildren = true ;
			return 1 ;
		}
	}
	_enumPropArray( a, _lookAhead, 1, true, true );

	return hasChildren;
}

var linkMap = new Array();
var pathMap = new Array();
var IDToPathMap = new Array();

function updateIndexes ( aRef, path, divID )
{
	linkMap[ divID ] = aRef ;
	pathMap[ path ] = divID  ;
	IDToPathMap[ divID ] = path;

}	// updateIndexes

function writeTOC ()
{
	var divID = 0 ;

	var classAttrStart = ' class="l' ;
	var divTagStart = '<DIV id="z' ; // can't use a number or '_' to begin layer id
	var imgTagStart = '<IMG BORDER=0 SRC="' ;
	var toggleLinkTagStart = '<A href="javascript://" onclick="TheTOCTree.tf(' ;
	var showLinkTagStart   = '<A HREF="javascript://" onclick="TheTOCTree.si(' ;
	var divTagEnd = '</A></DIV>' ;

	function _TOCcallback ( a, prop, curDepth, path )
	{
		if ( isObj( a[ prop ] ) )
		{
			var classAttr = classAttrStart + curDepth + '"' ;
			var divNameAttr = divTagStart + divID + '"' ;

			var imgTag ;
			if ( hasChildFolder( a[ prop ] ) )
				imgTag= toggleLinkTagStart + divID + ');">' + imgTagStart + imgCloseSrc + \
'"></A>' ;  else
				imgTag= "<A>" + imgTagStart + imgLeafSrc + '"></A>' ;

			// save reference to server data
			updateIndexes( a[ prop ], path, divID );

			document.write( divNameAttr + classAttr + '>' + imgTag + showLinkTagStart + divID \
+ ')">' + prop.toString().ent() + divTagEnd );  
			divID++ ;
		}

		return false;
	}

	//var root = location.hostname ;

	if ( (!top.curPath()) || (top.curPath() == "REG_ROOT") )
	{
		//regData[ root ] = _sortArray( d, 0 );
		
		regData = _sortArray( d, 0 );
		
	}
	else
	{
		// create/initialize an array hierarchy that leads to the
		// desired subtree
		var tempA = top.curPath().split( "." );
		var evalStr = "";
		//var pathStr = "regData['" + root + "']";
		var pathStr = "regData";
		for ( var i = 0; i < tempA.length; i++ )
		{
			evalStr += pathStr + "['" + tempA[ i ] + "']=[];\n";
			pathStr += "['" + tempA[ i ] + "']";
		}
		evalStr += pathStr + "=_sortArray( d, 0 );\n";

		//regData[ root ] = [];
		eval( evalStr );
	}
	
	delete d ;

	_enumPropArray( regData, _TOCcallback, 0, false, true );

}	// writeTOC

var lastSearchHitPath = "" ;
function searchData ( target, searchType, fNext, fRegEx )
{
	if ( ! fNext )
	{
		lastSearchHitPath = "" ;
	}
	else
	{
		if ( ! lastSearchHitPath )
			fNext = false ;
	}

	var fHit = false ;

	var regEx ;
	if ( fRegEx )
		regEx = new RegExp( target, "i" );
	else
		target = target.toLowerCase();

	var isVar = true ;
	var foundStartPath = ! fNext ;
	function _searchCallback ( a, prop, curDepth, path )
	{
		if ( fHit ) return 1 ;

		
		var fPos = -1 ;
		isVar = !( a[ prop ] && typeof( a[ prop ] ) == "object" );
		
		if ( !foundStartPath )
		{
			foundStartPath = ( path == lastSearchHitPath );
		}
		else
		{
			if ( searchType >= 0 )
			{
				if ( fRegEx )
					fPos = prop.toString().search( regEx );
				else
					fPos = prop.toString().toLowerCase().indexOf( target );
			}
			if ( isVar && (fPos == -1) && (searchType <= 0) )
			{
				if ( fRegEx )
					fPos = a[ prop ].toString().search( regEx );
				else
					fPos = a[ prop ].toString().toLowerCase().indexOf( target );
			}
		}

		if ( fPos != -1 )
		{
			lastSearchHitPath = path ;
			fHit = true ;

			return 1;
		}
	}

	_enumPropArray( regData, _searchCallback, 0, false, false, true );

	if ( ! fHit )
	{
		lastSearchHitPath = "" ;
	}

	return ;
}

function search ( target, searchType, fNext, fRegEx )
{
	searchData( target, searchType, fNext, fRegEx );
	if ( ! lastSearchHitPath )
	{
		var msg = "No " + (fNext ? "more " : "" ) + "items found matching '"+ target + "'" \
;  alert( msg );
		return false ;
	}
	else
	{
		// display the parent folder
		var folderID = pathMap[ lastSearchHitPath.leftProp( -1 ) ];
		TheTOCTree.si( folderID, lastSearchHitPath.rightProp( 1 ) );

		if ( ! isNav4 )
		{
			TheTOCTree.hiliteItem( lastSearchHitPath.rightProp( 1 ) );
		}

		return true ;
	}

}	// search

/*

	REGTree class methods

*/

function REGTree ( winTOC, winContent )
{
	this.base = TOCTree ;
	this.base( winTOC, winContent );
	this.m_curItem = "" ;
}
REGTree.prototype = new TOCTree ;

REGTree.tableTag = 
	'<TABLE width="600" ID="theTable" CELLSPACING="0" CELLPADDING="4"' + 
	( !isIE ? ' BORDER="0">' : ' RULES="GROUPS" BORDER="1" FRAME="void">' );

REGTree.tableHeaderRow = 
	'<THEAD><TR><TH WIDTH="200">Name</TH><TH WIDTH="300">Value</TH><TH \
WIDTH="100">Type</TH></TR></THEAD>' ;

REGTree.CAPTION_BGCOLOR = "#BBBBBB" ;
REGTree.EVEN_BGCOLOR = "white" ;
REGTree.ODD_BGCOLOR = "#CCCCCC" ;
REGTree.HILITE_BGCOLOR = "#00CCFF" ;

REGTree.prototype.si = function ( id, propToHilite )
{
	if ( ! this.m_bInitialized ) return ;

	if ( (!propToHilite) && (this.m_curFolderID == id) ) return ;

	var folder = getElem( "z" + id );
	if ( ! folder ) 
	{
		return ;
	}

	this.exposeFolder( folder );
	this.hiliteFolder( folder );
	this.m_curFolderID = id ;

	top.curPath( IDToPathMap[ id ] );
	//var displayPath = makeDisplayPath( top.curPath() );
	if ( ! isNav4 )
		top.document.title = top.curPath();

	var sRows = "" ;
	var rowCounter = 0 ;
	var hiliteRow = 0 ;
	function _callback ( a, prop, curDepth )
	{
		var bgColorAttr = ' BGCOLOR="' ;
		if ( (!isNav4) || (prop != propToHilite) )
		{
			bgColorAttr += ( (rowCounter % 2) ? REGTree.EVEN_BGCOLOR : REGTree.ODD_BGCOLOR ) + \
'"' ;  }
		else
		{
			bgColorAttr += REGTree.HILITE_BGCOLOR + '"' ;
			hiliteRow = rowCounter ;
		}

		if ( a[ prop ] && typeof( a[ prop ] ) == "object" )
		{
			id++ ;
			if ( curDepth == 0 )
			{
				sRows += '<TR' + bgColorAttr + '><TD><A HREF="javascript://" \
onclick="TheTOCTree.si(' + id + ');">' + prop.toString().ent() + \
'</A></TD><TD>&nbsp;</TD><TD>List</TD></TR>' ;  }
		}
		else if ( curDepth == 0 )
		{
			sRows += '<TR' + bgColorAttr + '><TD>' + prop.toString().ent() + '</TD><TD>' + a[ \
prop ].toString().ent() +   '</TD><TD>Variable</TD></TR>' ;
		}
		if ( curDepth == 0 ) rowCounter++ ;
		return 0;
	}
	_enumPropArray( linkMap[ id ], _callback, 0, true );

	var captionTag = ( !isNav4 ?
			'<CAPTION>contents of ' + top.curPath() + '</CAPTION>' : 
			'<TR BGCOLOR="' + REGTree.CAPTION_BGCOLOR + '"><TD colspan="3" align="left" \
valign="top">contents of ' + location + "/" + top.curPath() + "</TD></TR>" );  
	var itemsHTML = 
			REGTree.tableTag + 
			captionTag + 
			REGTree.tableHeaderRow +
			sRows + 
			'</TABLE>' ;

	if ( ! isNav4 )
	{
		getElem( "DATA_DIV", top.DUMP.document ).innerHTML = itemsHTML ;
	}
	else	// Nav4
	{
		var doc = top.DUMP.document.layers[ 0 ].document ;
		doc.open();
		doc.write( itemsHTML );
		doc.close();

		//guesstimate new height of window 
		// 24 is the estimated row height, 3 accounts for the caption and header rows plus \
a buffer row  top.DUMP.window.height = top.DUMP.document.height = ((rowCounter + 3) * \
24);

		if ( hiliteRow )
		{
			
			top.DUMP.window.scroll( 0, ((hiliteRow + 3) * 24) );
		}
	}

	return false;

}	// si

REGTree.prototype.hiliteItem = function ( prop )
{
	// loop through the rows, skipping the header row
	var theTable = getElem( "theTable", top.frames.DUMP.document );
	for ( var i = 1; i < theTable.rows.length; i++ )
	{
		var row = theTable.rows[ i ];
		// prop will be the text of the first cell
		if ( this.m_curItem && this.m_curItem == prop )
		{
			row.style.backgroundColor = "" ;
		}
		
		if ( -1 != row.cells[ 0 ].innerHTML.indexOf( prop ) )
		{
			row.style.backgroundColor = REGTree.HILITE_BGCOLOR ;
			if ( ! isElemInView( row, top.frames.DUMP ) )
			{
				scrollVertToElem( row, top.frames.DUMP );
			}

			break ;
		}
	}

	this.m_curItem = prop ;

}	// hiliteItem


--- NEW FILE: help.js ---

/* 	token passed from the 		:  
   	admin system, usually the	:	  Manual filename and anchor that best helps the user \
  page name from where the    :	  Use the empty string ("") to indicate that there
   	docs were summoned -		:	  is no help available on that topic. All files are
   	the 'context' in 			:	  assumed to live in htmfiles/
   	'context sensitive'		    :

	sorted & grouped according to the Server 9 TOC for ease of maintanence
*/

var helpWinName = 'helpMe' ;
var helpWinOptions = \
'toolbar=yes,status=no,scrollbars=yes,resizable=yes,menubar=yes,width=800,height='; \
helpWinOptions += parseInt(screen.availHeight * .8);

function launchHome ( fileName, options )
{
	// opens external content in seperate window
	_openDialog( fileName, "realHome", options ? options : helpWinOptions );
}

var adminLinkMap = 
{
	"header"					: "intro.htm"
	,"welcome"					: "install.htm"
	,"config_ports"				: "ports"
	,"config_binding"			: "ipaddr"
	,"config_mimetypes"			: "mime_types"
	,"config_cc"				: "connections"
	,"config_altserv"			: "redundant_servers"
	,"config_localFS"			: "add_point"
	,"config_alias"				: "create_alias"
	,"config_delivery"			: "http_delivery"
	,"config_pc_cache"			: "proxy_restrict"
	,"config_setid"				: "unix_user"

	,"config_sec_ac"			: "a_acontrol"
	,"config_sec_db"			: "new_db"
	,"config_sec_uauth"	   		: "passwords"
	,"config_sec_rules"	   		: "commerce_rules"
	,"adduser"	 		  		: "adduser"
	,"edituser"	 		  		: "edituser"
	,"removeuser"	 	  		: "removeuser"
	,"getusers"	 		  		: "getusers"
	,"grantuser"	 		  	: "grantuser"
	,"edituserperm"	 		  	: "edituserperm"
	,"revokeuser"	 	  		: "revokeuser"
	,"revokealluser"	 		: "revokealluser"
	,"add_redirect"	 		  	: "add_redirect"
	
	,"mongraph"					: "server_monitor"
	,"mongraph_ntperfmon"		: "NT_performance"
	,"config_logging"			: "access_read"
	,"config_logging_error"		: "error_read"
	,"config_clog"				: "create_template"

	,"config_broad_real"		: "broadcast_real"
	,"config_broad_rtp"			: "rtp_encode"
	,"config_broad_wm"			: "brdcst_wmt"
	,"config_broad_wm_asxgen"  	: "asxgen"
	,"config_broad_archive"		: "archive_setup"
	,"config_broad_redun"		: "redundant_setup"

	,"config_spl_dist"			: "transmitter"
	,"config_spl_recv"			: "receiver"
	,"config_mc_scale"			: "scalable"
	,"config_mc_bc"				: "bchannel"
	,"config_mc_wm"				: "wmpcast"
	,"config_mc_sap"			: "sap_announce"

	,"config_cdist"				: "content_subscribe"
	,"config_isp"				: "setup"
	,"config_content_browsing"	: "browse"
	,"config_viewsrc"	   		: "view_change"

	,"config_qos"				: "differentiated_services"
	,"config_rate"				: "rate_control"
	,"config_shutdown"			: "delayed_shutdown"
	,"config_snmp"				: "SNMP_plugin"

};

function getHelpTopicForPage ( page )
{
	var topic = "";

	// look in the linkmap for physical link associated with startPage
	if ( adminLinkMap && adminLinkMap[ page ] )
	{
		 topic = adminLinkMap[ page ];
	}
	else if ( page )
	{
    	topic = page;
	}
	else
	{
    	topic = "" ;
	}

	return topic;
}

function contextHelp ( page )
{
	var docPath = "Docs/home.html?context=serverAdmin&topic=";

	//if no helplink just use the current filename minus path & extension
	// i.e. admin/config_ports.html => config_ports
	if ( ! page )
	{
		var curLocation = location.pathname;
		var pos = curLocation.lastIndexOf( '/' );
		if ( pos != -1 )
			curLocation = curLocation.slice( pos + 1 );

		pos = curLocation.indexOf( '.' );
		if ( pos == -1 ) 
			pos = curLocation.indexOf( '#' );
		if ( pos == -1 ) 
			pos = curLocation.indexOf( '?' );
		if ( pos != -1 ) 
			curLocation = curLocation.slice( 0, pos );

		page = curLocation;
	}

	var topic = getHelpTopicForPage( page );
	if ( topic )
		docPath += escape( topic );

	// if our help window is already open, just switch to it and navigate 
	// to the bookmark
	var win = top.helpWin ;
	if ( win && (! win.closed) && (!docPath.bSearch( /^http/i )) )
	{
		
		if (win.frames &&
			win.frames[0] && 
			win.frames[0].WWHFrame &&
			win.frames[0].WWHFrame.WWHHelp )
		{
			top.helpWin.frames[0].WWHFrame.WWHHelp.fShowTopic("serverAdmin", topic);
		}
		else
		{
			win.location = docPath;
		}
		win.focus();
	}
	else	// open help win and load help frameset, pass helpLink in querystring
	{
		
		launchHelp( docPath );
	}

}	// contextHelp ()

function launchHelp ( fileName, options )
{
	// stuff window ref in topmost parent window
	top.helpWin = _openDialog( fileName, helpWinName, options ? options : helpWinOptions \
); }


--- NEW FILE: config_sec_uauth.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Authentication</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "20";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?serverData=config.AuthenticationRealms&dbList=config.Databases"></SCRIPT>


<SCRIPT LANGUAGE="javascript">
var NTLM_AUTH = 'Authenticator';
var BASIC_AUTH = 'BasicAuthenticator';
var RN5_AUTH = 'RN5Authenticator';
var DIGEST_AUTH = 'DigestAuthenticator';

var typePropSets = [];
typePropSets[ BASIC_AUTH ] =
[			//	 prop Name		def.			RO		req.   min/max		Realm		label	
			//------------------------------------------------------------------------------------
  new PropObj( 'PluginID',	"rn-auth-basic",false,	true,  null,null,	'shortname', \
'Authentication Protocol' ),  new PropObj( 'DatabaseID',	"", 			false,	true,  \
null,null,	'', 'Database' ) ];

typePropSets[ RN5_AUTH ] =
[
	new PropObj( 'PluginID',	"rn-auth-rn5",false,	true,  null,null,	'shortname', \
'Authentication Protocol' ),  new PropObj( 'DatabaseID',	"", 			false,	true,  \
null,null,	'', 'Database' ) ];

typePropSets[ DIGEST_AUTH ] =
[
	new PropObj( 'PluginID',	"rn-auth-digest",false,	true,  null,null,	'shortname', \
'Authentication Protocol' ),  new PropObj( 'DatabaseID',	"", 			 false,	true,  \
null,null,	'', 'Database' ) ];

typePropSets[ 'Authenticator' ] =
[
	new PropObj( 'PluginID',	"rn-auth-sspi",false,	true,  null,null,	'shortname', \
'Authentication Protocol' ),  new PropObj( 'Provider',	"NTLM",				false,	true ),
	new PropObj( 'Group',		"",				false,	false )
];

var propSetRealm =
[
	new PropObj( 'Realm',		"",				false,	true )
];
var propList = new PropList( "AuthenticationRealms", serverData, null, propSetRealm \
);

// create Authenticator sublists manually
for ( var subListName in propList.subLists() )
{
	for ( var type in typePropSets )
	{
		if ( serverData[ subListName ] && 
			 isObj( serverData[ subListName ][ type ] ) )
		{
			var subListAuth = new PropList( type, serverData[ subListName ][ type ], \
typePropSets[ type ] );  propList.subList( subListName ).addSubList( subListAuth );
			break; //there can only be one authenticator sub list
		}
	}
}

function RealmPropView ()
{
	this.base = NestedPropListView ;
	this.base( "Authenication Realms", propList, "Realm", 
				"config.AuthenticationRealms.", "servvar",
				"theForm", "theList", "theEdit" );
}
RealmPropView.prototype = new NestedPropListView ;

RealmPropView.prototype.onFormKeyOrClick = function ( evt )
{
	if ( ! this.m_bLoaded ) return ;

	// if we've already set the time then ignore
	if ( this.m_bDoDirtyCheck && (!this.m_hDirtyCheckTimerID) )
	{
	
		// unlike the base class we'll ignore the parent form of the event target since it 
		// could be one of four (just make sure the event target is a member of a form

		var srcElem = ( isIE ? this.m_oWin.event.srcElement : evt.target );

		if ( srcElem.form )

		{
			
			this.m_hDirtyCheckTimerID = this.m_oWin.setTimeout( "_doDirtyChk()", \
NestedPropListView.DIRTY_CHECK_SUPRESS_TIME );  }
	}

	var evtType = ( evt ? evt.type : this.m_oWin.event.type );
	if ( this.m_origClickHandler && (evtType == "click") )
	{
		return this.m_origClickHandler( evt );
	}
	else if ( this.m_origKeyUpHandler )
	{
		return this.m_origKeyUpHandler( evt );
	}

	if ( isNav4 )
	  	this.m_oDoc.routeEvent( evt );

	return true ;

}	// onFormKeyOrClick

//override this function so we can check all the auxilliary forms
RealmPropView.prototype.isDirty = function ()
{
	if ( ! this.m_bLoaded ) return ;

	if ( this.m_bDoDirtyCheck ) 
	{
		// proplist has no form members (all the properties are in sublists
		/*
		if ( this.m_propList.isFormDirty( this.getForm() ) )
		{
			return true ;
		}
		*/

		var subList = this.getSubList();
		if ( subList )
		{
			if ( subList.isFormDirty( theForm ) )
			{
				return true ;
			}

			for ( var type in typePropSets )
			{
				var subListAuth = subList.subList( type );
				if ( subListAuth )
				{
					if ( subListAuth.isFormDirty( eval( "form" + type ) ) )
					{
						return true ;
					}
				}
			}
		}

		if ( this.m_propList.isDirty() )
		{
			return true ;
		}
	}

	return false;
}

RealmPropView.prototype.postFillFormFromSubList = function ( fValidate )
{

	var subList = this.getSubList( this.m_curSubListName );
	if ( subList )
	{
		for ( var type in typePropSets )
		{
			var subListAuth = subList.subList( type );
			if ( subListAuth && (subListAuth.m_status != "deleted") )
			{
				setCtrlValue( theForm._Type, type );
				subListAuth.fillForm( eval( "form" + type ) );
				onProtocolChg( type );

				if ( isNav6 && ("Authenticator" != type) )
				{
					
					var db = subListAuth.prop( "DatabaseID" ).getValue();
					setTimeout("setCtrlValue( form" + type + ".DatabaseID, " + qVar( db ) + ",1)", \
100 );  }
				break;
			}
		}
	}

	return true;

}	// postFillFormFromSubList ()

RealmPropView.prototype.onSubListChangeNotify = function ( action, subListName )
{

	if ( "add" == action )
	{
		var subList = this.getSubList( subListName );
		if ( subList )
		{
			var subListAuth = new PropList( BASIC_AUTH, [], typePropSets[ BASIC_AUTH ] );
			subList.addSubList( subListAuth, "added" );
			clearForm( formBasicAuthenticator );
			subListAuth.fillForm( formBasicAuthenticator );
			setCtrlValue( theForm._Type, "BasicAuthenticator" );
			setCtrlValue( formBasicAuthenticator.DatabaseID, "" );
			onProtocolChg();
		}
	}
	if ( "delete" == action )
	{
		for ( var type in typePropSets )
		{
			clearForm( eval( "form" + type ) );
		}
	}

	if ( this.m_bDoDirtyCheck )
		this.showDirtyFlag( this.isDirty() );

}	// onSubListChangeNotify

RealmPropView.prototype.preValidateSubList = function ()
{

	return true ;
}

RealmPropView.prototype.postValidateSubList = function ( subListName )
{

	var type = getCtrlValue( theForm._Type );

	var subList = this.m_subListParent.subList( subListName );
	if ( subList )
	{
		var subListAuth = subList.subList( type );
		var f = getElem( "FORM_" + type );
		if ( subListAuth && f )
		{
			var ctrl = subListAuth.validate( f );
			if ( ctrl )
			{
				return rejectInput( ctrl, subListAuth.errMsg );
			}
		}
	}

	return true;

}	// postValidateSubList ()

RealmPropView.prototype.resultsCallback = function ( results )
{
	// tweak the title by splitting, formatting the results property (the thing that we \
modified)  var res, a;
    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];
		a = propName.split( "." );

		if ( a[5] )	// omit "*Authenticator" sublist name
        	res.title = a[3].ent().span( "body" ) + '<br>' + a[5] ;
		else if ( a[4] )
        	res.title = a[3].ent().span( "body" ) + '<br>' + a[4] ;
		else
        	res.title = a[3].ent().span( "body" );

	}
}

var propView = new RealmPropView();

var theForm ;
var formBasicAuthenticator;
var formRN5Authenticator;
var formDigestAuthenticator;
var formAuthenticator;

var curType = ""; //track the last authentication type selected in the _TYpe select \
ctrl

function onLoad () 
{
	theForm = document.theForm ;

	if ( ! isXblibInit ) xblibInit();

	anchorForms();

	formBasicAuthenticator = getElem( "FORM_BasicAuthenticator" );
	formRN5Authenticator = getElem( "FORM_RN5Authenticator" );
    formDigestAuthenticator = getElem( "FORM_DigestAuthenticator" );
	formAuthenticator = getElem( "FORM_Authenticator" );

	clearForm( formBasicAuthenticator );
	clearForm( formRN5Authenticator );
	clearForm( formDigestAuthenticator );
	clearForm( formAuthenticator );

	fillSelectCtrls();

	propView.onLoad( window );

	theList = theForm.AuthenticationRealms ;

}	// onLoad

function anchorForms ()
{
	var anchor;
	var anchorX;
	var anchorY;
	var tableWidth = 230;

	if ( isNav4 )
	{
		
		anchorX = document.anchors["ANCHOR_FORMS_NAV4_X"].x - 4;
		anchorY = document.anchors["ANCHOR_FORMS_NAV4_Y"].y;
	}
	else
	{
		var anchor = getElem( "ANCHOR_FORMS_IE" );

		var anchorDim = getAbsDim( anchor );

		anchorY = anchorDim.y + anchor.offsetHeight ;
		anchorX = anchorDim.x ;

		// find the anchor's parent TD cell - we need it's width
		parentTD = getParentByTagName( anchor, "TD" );

		// find the parent TD cell's parent TABLE - we need it's padding
		parentTable = getParentByTagName( parentTD, "TABLE" );

		if ( parentTD && parentTable )
		{
			tableWidth = parentTD.offsetWidth - 
						 parseInt( parentTable.cellPadding * 1.5 );
		}
	}

	if ( ! anchorY )
	{
		return;
	}

	if ( isIE && isMac )
	{
		anchorX += macIE_FormOffsetX ;
		anchorY += macIE_FormOffsetY ;
	}

	for ( var type in typePropSets )
	{
		var l = getElem( "LAYER_" + type );
		if ( l )
		{
			if ( isNav4 )
			{
				l.top  = anchorY;
				l.left = anchorX;
			}
			else
			{
				l.style.display = "block";

				var oTable = getElem( "TABLE_" + type );
				if ( oTable )
				{
					l.style.top  = anchorY ;
					l.style.left = anchorX - oTable.cellPadding ; 

					//set the width
					oTable.style.width = tableWidth;
				}
			}
		}
	}
	
}	// anchorForms ()

function fillSelectCtrls ()
{
	var selCtrl1 = formBasicAuthenticator.DatabaseID;
	var selCtrl2 = formRN5Authenticator.DatabaseID;
	var selCtrl3 = formDigestAuthenticator.DatabaseID;

	// first clear out the dummy data needed for Netscape bug
	selCtrl1.options.length = 0 ;
	selAddOption( selCtrl1, "Select a Database", "" );
	selCtrl2.options.length = 0 ;
	selAddOption( selCtrl2, "Select a Database", "" );
	selCtrl3.options.length = 0 ;
	selAddOption( selCtrl3, "Select a Database", "" );

	var aTmp = new Array();
	function _callbackDBList ( array, prop, curDepth )
	{
		aTmp[ aTmp.length ] = prop ;
	}
	enumPropArray( dbList, _callbackDBList, 1 ); 

	aTmp.sort();
	for ( var i = 0; i < aTmp.length; i++ )
	{
		selAddOption( selCtrl1, aTmp[ i ] );
		selAddOption( selCtrl2, aTmp[ i ] );
		selAddOption( selCtrl3, aTmp[ i ] );
	}

}	// fillSelectCtrls

function onProtocolChg ( type )
{
	var oldType = "";
	if ( ! type ) 
	{
		type = getCtrlValue( theForm._Type );
		oldType = curType;
	}

	// make sure the current realm has a sublist of the appropriate type
	var subList = propView.getSubList();
	if ( subList )
	{
		if ( oldType ) 
		{
			var subListAuth = subList.subList( oldType );
			if ( subListAuth )
			{
				if ( subListAuth.m_status == "added" )
				{
					subList.delSubList( subListAuth );
				}
				else
				{
					subListAuth.m_status = "deleted" ;
				}
			}
		}

		var subListAuth = subList.subList( type );
		if ( ! subListAuth )
		{
			subListAuth = new PropList( type, [], typePropSets[ type ] );
			subList.addSubList( subListAuth, "added" );
			subListAuth.fillForm( eval( "form" + type ) );
		}
	}

	if ( curType )
	{
		setDisplay( getElem( "LAYER_" + curType ), false );
		curType = "";
	}
	if ( type )
	{
		setDisplay( getElem( "LAYER_" + type ), true );
		curType = type;
	}
}

function userDialog ( dialog )
{
	var RealmID = getCtrlValue( theForm.Realm );
    if ( ! RealmID )
	{
		rejectInput( theForm.Realm, "A RealmID is required." );
		return;
	}

	var subList = propView.getSubList();
	if ( subList && (subList.m_status == "added") )
	{
        alert( 'You must first add the selected realm first via the "Apply" button.' \
);  return ;
	}

	if ( getCtrlValue( theForm._Type ) == NTLM_AUTH )
	{
        alert( 'Windows NT LAN Manager users must be managed using tools supplied by \
Windows NT.' );  return ;
	}

    var Url = dialog + "?" + escapePlus( RealmID ); 
	var dlgParams = new Object();
    raDialog( Url, dlgParams );

}	// userDialog
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">SECURITY</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
A Realm contains information about the type of authentication protocol and the 
database where authenticated user names are stored. The server has 
three methods of authenticating the identity of visitors: Basic; RealSystem 5.0; 
or Windows NT LAN Manager. Each Realm can use only one authentication method.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Authentication</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<tr>
	<TD class="input" valign="top" width="50%">
		<TABLE CLASS="PROPLIST_LABEL" width="226" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Authentication \
Realms</TD>  <TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Realm" BORDER=0></A><A href="javascript://" onclick="propView.removeSubList()"><IMG \
src="images/delete_g.gif" HSPACE=1 ALT="Remove Current Realm" BORDER=0></A><A \
href="javascript://" onclick="propView.copySubList()"><IMG src="images/copy_g.gif" \
HSPACE=1 ALT="Copy Current Realm" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theList" SIZE="12" WIDTH="226">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>

		<br>
		<SPAN class="FormHeader">User Management</SPAN>
		<br>
		&nbsp;<A CLASS="linkText" HREF="Javascript:userDialog( 'adduser.html' )">Add a User \
to Realm</a><BR>  &nbsp;<A CLASS="linkText" HREF="Javascript:userDialog( \
'removeuser.html' )">Remove a User from Realm</a><BR>  &nbsp;<A CLASS="linkText" \
HREF="Javascript:userDialog( 'edituser.html' )">Change User Password</a><BR>  \
&nbsp;<A CLASS="linkText" HREF="Javascript:userDialog( 'getusers.html' )">Browse \
Users in Realm</a><BR>  </TD>
	<TD class="input" valign="top" width="50%">
		<A NAME="ANCHOR_FORMS_NAV4_X"></A>
		Edit Realm Description
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theEdit" SIZE="18" TYPE="text" \
VALUE="">

		Realm ID
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Realm" SIZE="18" TYPE="text" \
VALUE="">

		Authentication Protocol
		<BR>
		<select CLASS="longInput" NAME="_Type" ONCHANGE="onProtocolChg()" SIZE="1" \
WIDTH="226">  <OPTION value="BasicAuthenticator">Basic</OPTION>
		    <OPTION value="RN5Authenticator">RealSystem 5.0</OPTION>
		    <OPTION value="DigestAuthenticator">Digest</OPTION>
		    <OPTION value="Authenticator">Windows NT LAN Manager</OPTION>
		</SELECT>

		<DIV ID="ANCHOR_FORMS_IE" class="Units">
			The Basic, RealSystem 5.0, and Digest authentication protocols require a user 
			database; Windows NT Lan Manager authentication requires a Provider 
			and optionally, a Group name.
		</DIV>

		<BR>
		<A NAME="ANCHOR_FORMS_NAV4_Y"></A>
		<BR>
		<BR>
		<BR>
		<BR>
	</td>
</tr>

<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>

<SPAN class="absolute" ID="LAYER_BasicAuthenticator">
<FORM NAME="FORM_BasicAuthenticator">
<INPUT type="HIDDEN" name="PluginID">
<table ID="TABLE_BasicAuthenticator" cellspacing="0" cellpadding="2" width="228">
<tr>
	<TD class="input" valign="top" width="100%">
		Database
		<BR>
		<select CLASS="longInput" NAME="DatabaseID" SIZE="1" WIDTH="226">
		    <OPTION value="                             ">                             \
</OPTION>  <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		</SELECT>
	</TD>
</TR>
</TABLE>
</FORM>
</SPAN>

<SPAN class="absolute" ID="LAYER_RN5Authenticator">
<FORM NAME="FORM_RN5Authenticator">
<INPUT type="HIDDEN" name="PluginID">
<table ID="TABLE_RN5Authenticator" cellspacing="0" cellpadding="2" width="228">
<tr>
	<TD class="input" valign="top" width="100%">
		Database
		<BR>
		<select CLASS="longInput" NAME="DatabaseID" SIZE="1" WIDTH="226">
		    <OPTION value="                             ">                             \
</OPTION>  <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		</SELECT>
	</TD>
</TR>
</TABLE>
</FORM>
</SPAN>

<SPAN class="absolute" ID="LAYER_DigestAuthenticator">
<FORM NAME="FORM_DigestAuthenticator">
<INPUT type="HIDDEN" name="PluginID">
<table ID="TABLE_DigestAuthenticator" cellspacing="0" cellpadding="2" width="228">
<tr>
	<TD class="input" valign="top" width="100%">
		Database
		<BR>
		<select CLASS="longInput" NAME="DatabaseID" SIZE="1" WIDTH="226">
		    <OPTION value="                             ">                             \
</OPTION>  <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		</SELECT>
	</TD>
</TR>
</TABLE>
</FORM>
</SPAN>

<SPAN class="absolute" ID="LAYER_Authenticator">
<FORM NAME="FORM_Authenticator">
<INPUT type="HIDDEN" name="PluginID">
<table ID="TABLE_Authenticator" cellspacing="0" cellpadding="2" width="228">
<tr>
	<TD class="input" valign="top" width="100%">
		Provider
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Provider" SIZE="18" TYPE="text" \
VALUE="">  Group (optional)
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Group" SIZE="18" TYPE="text" \
VALUE="">  </TD>
</TR>
</TABLE>
</FORM>
</SPAN>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>

</BODY>
</HTML>

--- NEW FILE: config_qos.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Differentiated Services</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "42";
</SCRIPT>

<SCRIPT SRC="propview_nolist.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?serverData=config.DiffServ"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
var protocols = ["Media", "Control"];

var propList = new PropList
(
	"Quality of Service", serverData, 
	[
		new PropObj( 'Media',   "0", false, true, null, null, "int", "Media DSCP" ),
		new PropObj( 'Control', "0", false, true, null, null, "int", "Control DSCP" )
	]
);

function CCPropView ()
{
	this.base = PropListView ;
	this.base( "Quality of Service", propList, "config.DiffServ.", "configvar", \
"theForm" ); }
CCPropView.prototype = new PropListView ;

CCPropView.prototype.preValidate = function ()
{
	
    for (var i = 0; i < protocols.length; i++)
    {
    	if ( isObj( theForm[protocols[ i ] + "_Precedence"] ) )
        {
			var n = 0;

			//OR the bits together
			n = getCtrlValue( theForm[protocols[ i ] + "_Precedence"] ) << 5;
			n |= getCtrlValue( theForm[protocols[ i ] + "_Delay"] ) << 4;
			n |= getCtrlValue( theForm[protocols[ i ] + "_Throughput"] ) << 3;
			n |= getCtrlValue( theForm[protocols[ i ] + "_Reliability"] ) << 2;

			setCtrlValue( theForm[protocols[ i ]], n );
        }
    }
    
	return true;
}

CCPropView.prototype.postIsDirty = function ()
{

    for (var i = 0; i < protocols.length; i++)
    {
    	if ( isObj( theForm[protocols[ i ] + "_Precedence"] ) &&
        	 (isCtrlDirty( theForm[protocols[ i ] + "_Precedence"] ) ||
			  isCtrlDirty( theForm[protocols[ i ] + "_Delay"] ) ||
			  isCtrlDirty( theForm[protocols[ i ] + "_Throughput"] ) ||
			  isCtrlDirty( theForm[protocols[ i ] + "_Reliability"] )) )
        {
             return true;
        }
    }

	return false;
}

CCPropView.prototype.resultsCallback = function ( results )
{
	var res, a;
    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];
        res.title = propName.rightProp();

		a = propName.split( "." );
		if ( a[3] )
        	res.title = a[2].ent().span("body") + '<br>' + a[3];
	}
}

var propView = new CCPropView();
var theForm ;

function onLoad ()
{
	theForm = document.theForm ;
	propView.onLoad( window );

    for (var i = 0; i < protocols.length; i++)
    {
    	if ( isObj( theForm[protocols[ i ] + "_Precedence"] ) )
        {
			var n = getCtrlValue( theForm[protocols[ i ]] );
			n = n >> 2;	// first two Least Significant bits are unused 
			
			//parse the bits
			setCtrlValue( theForm[protocols[ i ] + "_Reliability"], (n & 1), true );
			n = n >> 1;
			setCtrlValue( theForm[protocols[ i ] + "_Throughput"], (n & 1), true );
			n = n >> 1;
			setCtrlValue( theForm[protocols[ i ] + "_Delay"], (n & 1), true );
			n = n >> 1;
			setCtrlValue( theForm[protocols[ i ] + "_Precedence"], (n & 7), true );
        }
    }
}
</SCRIPT>

</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">TRANSPORT SETTINGS</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
Using differentiated services, you can assign priorities to the IP
packets that carry streaming media data. These priority values can
affect how the packets are forwarded through the network by routers that
support differentiated services. Separate fields assign priorities to
media packet formats (RDT and RTP) and to the RTSP control protocol. The
IP packets for other protocols, such as HTTP and MMS, are not affected.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Differentiated Services</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<INPUT TYPE="HIDDEN" NAME="Media">
<INPUT TYPE="HIDDEN" NAME="Control">
<TR>
	<TD class="input" COLSPAN="4">
    	Streaming Protocols (RDT & RTP)
	</TD>
</TR>
<TR>
	<TD class="input" WIDTH="160">
    	Precedence
<BR>
<select CLASS="longInput" NAME="Media_Precedence" SIZE="1" WIDTH="160">
    <OPTION value="0">Routine</OPTION>
    <OPTION value="1">Priority</OPTION>
    <OPTION value="2">Immediate</OPTION>
    <OPTION value="3">Flash</OPTION>
    <OPTION value="4">Flash Override</OPTION>
    <OPTION value="5">CRITIC/ECP</OPTION>
    <OPTION value="6">Internetwork Control</OPTION>
    <OPTION value="7">Network Control</OPTION>
</SELECT>
	</TD>
	<TD class="input" WIDTH="80">
		Delay
<BR>
<select CLASS="longInput" NAME="Media_Delay" SIZE="1" WIDTH="80">
    <OPTION value="0">Normal</OPTION>
    <OPTION value="1">Low</OPTION>
</SELECT>
	</TD>
	<TD class="input" WIDTH="80">
		Throughput
<BR>
<select CLASS="longInput" NAME="Media_Throughput" SIZE="1" WIDTH="80">
    <OPTION value="0">Normal</OPTION>
    <OPTION value="1">High</OPTION>
</SELECT>
	</TD>
	<TD class="input" WIDTH="80">
		Reliability
<BR>
<select CLASS="longInput" NAME="Media_Reliability" SIZE="1" WIDTH="80">
    <OPTION value="0">Normal</OPTION>
    <OPTION value="1">Minimum</OPTION>
</SELECT>
	</TD>
</TR>
<tr </tr>
<TR>
	<TD class="input" COLSPAN="4">
    	Control Protocols (RTSP)
	</TD>
</TR>
<TR>
	<TD class="input" WIDTH="160">
    	Precedence
<BR>
<select CLASS="longInput" NAME="Control_Precedence" SIZE="1" WIDTH="160">
    <OPTION value="0">Routine</OPTION>
    <OPTION value="1">Priority</OPTION>
    <OPTION value="2">Immediate</OPTION>
    <OPTION value="3">Flash</OPTION>
    <OPTION value="4">Flash Override</OPTION>
    <OPTION value="5">CRITIC/ECP</OPTION>
    <OPTION value="6">Internetwork Control</OPTION>
    <OPTION value="7">Network Control</OPTION>
</SELECT>
	</TD>
	<TD class="input" WIDTH="80">
		Delay
<BR>
<select CLASS="longInput" NAME="Control_Delay" SIZE="1" WIDTH="80">
    <OPTION value="0">Normal</OPTION>
    <OPTION value="1">Low</OPTION>
</SELECT>
	</TD>
	<TD class="input" WIDTH="80">
		Throughput
<BR>
<select CLASS="longInput" NAME="Control_Throughput" SIZE="1" WIDTH="80">
    <OPTION value="0">Normal</OPTION>
    <OPTION value="1">High</OPTION>
</SELECT>
	</TD>
	<TD class="input" WIDTH="80">
		Reliability
<BR>
<select CLASS="longInput" NAME="Control_Reliability" SIZE="1" WIDTH="80">
    <OPTION value="0">Normal</OPTION>
    <OPTION value="1">Minimum</OPTION>
</SELECT>
	</TD>
</TR>
<tr </tr>
</table>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<TR>
	   <TD colspan="2" bgcolor="#E6E6E6" VALIGN="middle" width="100%" class="body" \
                ALIGN="left">
	      <FONT color="red">*A server restart is required to effect changes applied to \
this page.</FONT>  </TD>
	</TR>
	<SCRIPT>
	if ( ! isNav4 )
	{
		document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' );  }
	else
	{
		document.write( "<TR </TR>" );
	}
	</SCRIPT>
	<TR>
	   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
	      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
	</TR>
	</TABLE>
</TABLE>
</FORM>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_shutdown.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Delayed Shutdown</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "44";
</SCRIPT>

<SCRIPT SRC="propview_nolist.js"></SCRIPT>
<SCRIPT SRC="servvar.get.html?serverData=config.ServerShutdown"></SCRIPT>

<SCRIPT>
var propSet = 
[
    new PropObj( 'DelayedShutdownEnabled', 		"0", false, true,  0, 1, "int", "Delayed \
Shutdown Enabled" )  ,new PropObj( 'ClientDisconnectInterval', 	"30", false, true,  \
0, 10000, "int", "Player Disconnect Interval" )  ,new PropObj( 'ShutdownProceedTime', \
"30", false, true,  0, 10000, "int", "Shutdown Proceed Time" )  ,new PropObj( \
'NewClientConnectionsAllowed', "0", false, true,  0, 1, "int", "Allow New Client \
Connections" )  ,new PropObj( 'LogPlayerTermination', 		"0", false, true,  0, 1, \
"int", "Log Player Termination Status" ) ];

function ShutdownPropView ()
{
	this.base = PropListView ;
	this.base( "Server Shutdown", propList, "config.ServerShutdown.", "servvar", 
    			"theForm" );
}
ShutdownPropView.prototype = new PropListView ;

var propList = new PropList( "Server Shutdown", serverData, propSet );
var propView = new ShutdownPropView();

var theForm ;
function onLoad ()
{
	theForm = document.theForm;
	propView.onLoad( window );
}
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">SERVER SETUP</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
<B>Player Disconnect Interval</B> is the amount of time that the server
will allow for client connections to terminate through natural means
(end of file, click stop, etc.) prior to server shutdown. At the end if
this period, the server will order all connected clients to terminate
connections.
<BR><BR>

<B>Shutdown Proceed Time</B> is the amount of time that the server will allow for
clients to terminate connections once the server has ordered them to do
so. At the end of this period, the server will proceed to shut down
regardless of client connection status. 

<BR><BR>

<B>Allow New Client Connections</B> allows for new client connections during
the Player Disconnect Interval. 

<BR><BR>

<B>Log Player Termination Status</B> specifies whether or not to log the 
termination status of each client (success or failure) to error.log.
</td></tr>
</TABLE>
<BR>

<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Delayed Shutdown</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="50%">
			<span class="offsetLabel">Enable Delayed Shutdown</span>
		</td>
		<TD class="input" valign="top" align="left" width="50%">
			<select CLASS="input" NAME="DelayedShutdownEnabled" SIZE="1" WIDTH="91">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="50%">
			<span class="offsetLabel">Player Disconnect Interval</span>
		</td>
		<TD class="input" valign="top" align="left" width="50%">
			<input CLASS="input" MAXLENGTH="255" NAME="ClientDisconnectInterval" SIZE="6" \
TYPE="text" VALUE=""><SPAN CLASS="unitsOffset">&nbsp;(secs)</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="50%">
			<span class="offsetLabel">Shutdown Proceed Time</span>
		</td>
		<TD class="input" valign="top" align="left" width="50%">
			<input CLASS="input" MAXLENGTH="255" NAME="ShutdownProceedTime" SIZE="6" \
TYPE="text" VALUE=""><SPAN CLASS="unitsOffset">&nbsp;(secs)</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="50%">
			<span class="offsetLabel">Log Player Termination Status</span>
		</td>
		<TD class="input" valign="top" align="left" width="50%">
			<select CLASS="input" NAME="LogPlayerTermination" SIZE="1" WIDTH="91">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="50%">
			Allow New Client Connections During Shutdown
		</td>
		<TD class="input" valign="top" align="left" width="50%">
			<select CLASS="input" NAME="NewClientConnectionsAllowed" SIZE="1" WIDTH="91">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT>
		</td>
	</tr>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_logging.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Basic Logging</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "8";
</SCRIPT>

<SCRIPT SRC="propview_nolist.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?serverData=config&platform=server.platform"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
var isNT = ( platform && (platform == "WinNT") );

/*
    <List Name="Standard Access Log">
         <Var Type="AccessLog"/>
         <Var Enabled="0"/>
         <!-- LoggingStyle is configurable only for the AccessLog template type -->
         <Var LoggingStyle="5"/>
         <List Name="Outputs">
             <List Name="AccessLog">
                 <Var LogRollSize="1"/>
                 <Var Filename="Logs/rmaccess.log"/>
                 <Var LogRollFrequency="10H"/>
                 <Var Type="File"/>
             </List>
         </List>
    </List>

    <!--               rmerror.log                  -->
    <List Name="Standard Error Log">
        <Var Type="ErrorLog"/>
        <Var Enabled="0"/>
        <List Name="Outputs">
            <List Name="ErrorLog">
                <Var LogRollSize="1"/>
                <Var Filename="Logs/rmerror.log"/>
                <Var LogRollFrequency="10H"/>
                <Var Type="File"/>
            </List>
        </List>
    </List>
*/

var propSet = 
[
	new PropObj( 'DisableClientGUID', "0", false, false, null, null, null, "Disable \
Client GUIDs" ),  new PropObj( 'EnableCookieBasedIDs', "0", false, false, null, null, \
null, "Enable Cookie Based IDs" ),  new PropObj( 'StatsMask',		"0", false, false, \
null, null, null, "Stats Mask" ),

	new PropObj( 'LoggingTemplates.Standard Access Log.Outputs.AccessLog.Filename', "", \
false, true,  null, null, "physpath", "Log Filename" ),  new PropObj( \
'LoggingTemplates.Standard Access Log.Outputs.AccessLog.LogRollFrequency', "", false, \
false, null, null, null, "Log Rolling Frequency" ),  new PropObj( \
'LoggingTemplates.Standard Access Log.Outputs.AccessLog.LogRollSize', "", false, \
false, 0,    null, "int", "Log Rolling Size" ),  new PropObj( \
'LoggingTemplates.Standard Access Log.LoggingStyle', "3", false, false, null, null, \
null, "Logging Style" ),

	new PropObj( 'LoggingTemplates.Standard Error Log.Outputs.ErrorLog.Filename', "", \
false, true,  null, null, "physpath",	"Log Filename" ),  new PropObj( \
'LoggingTemplates.Standard Error Log.Outputs.ErrorLog.LogRollFrequency', "",  false, \
false, null, null, null, 		"Error Log Rolling Frequency" ),  new PropObj( \
'LoggingTemplates.Standard Error Log.Outputs.ErrorLog.LogRollSize', "", false, false, \
0,    null, "int", 		"Error Log Rolling Size" ),

	(isNT ? 
	new PropObj( 'LogDetailLevel', "", false, false, 0, null, null, "NT Event Log \
Filter" ) : null ) ];

function LogPropView ()
{
	this.base = PropListView ;
	this.base( "Access & Error Logging", propList, "config.", "servvar", "theForm" );
}
LogPropView.prototype = new PropListView ;

LogPropView.prototype.postIsDirty = function ()
{

	return ( isCtrlDirty( theForm.interval ) || 
			 isCtrlDirty( theForm.period ) ||
			 isCtrlDirty( theForm.interval2 ) || 
			 isCtrlDirty( theForm.period2 ) );
}

LogPropView.prototype.preValidate = function ()
{

	// piece together LogRollFrequency from period and interval controls
	// and shove in the hidden LogRollFrequency field
	var interval = getCtrlValue( theForm.interval );
    if ( (interval == "") || 
		 (interval == "0") )
	{
		theForm["LoggingTemplates.Standard Access \
Log.Outputs.AccessLog.LogRollFrequency"].value = "" ;  }
	else
	{
		theForm["LoggingTemplates.Standard Access \
Log.Outputs.AccessLog.LogRollFrequency"].value =   interval + getCtrlValue( \
theForm.period );  }
	interval = getCtrlValue( theForm.interval2 );
    if ( (interval == "") || 
		 (interval == "0") )
	{
		theForm["LoggingTemplates.Standard Error \
Log.Outputs.ErrorLog.LogRollFrequency"].value = "" ;  }
	else
	{
		theForm["LoggingTemplates.Standard Error \
Log.Outputs.ErrorLog.LogRollFrequency"].value =   interval + getCtrlValue( \
theForm.period2 );  }

	var mask = 0;
	for ( var i = 0; i < 4; i ++ )
	{
		var x = parseInt( getCtrlValue( theForm[ "StatsMask_" + i ] ) );
		mask |= ( x << i );
	}

	setCtrlValue( theForm.StatsMask, mask );

	return true;
}

var propList = new PropList( "Access & Error Logging", serverData, propSet );
var propView = new LogPropView();

var theForm = null ;

function onLoad ()
{
	theForm = document.theForm;

	propView.onLoad( window );

	// split the LogRollFrequency value (hidden control) into period and interval parts
	
	var freq = getCtrlValue( theForm["LoggingTemplates.Standard Access \
Log.Outputs.AccessLog.LogRollFrequency"] );  if ( freq == "" ) freq = "0H";
	var aParts = freq.match( /([0-9]+)([HDWM])/i );
	if ( aParts && aParts.length >= 3 )
	{
		setCtrlValue( theForm.interval, aParts[ 1 ], true );
		setCtrlValue( theForm.period,   aParts[ 2 ].toUpperCase(), true );
	}
	// split the ErrorLogRollFrequency value (hidden control) into period and interval \
parts  freq = getCtrlValue( theForm["LoggingTemplates.Standard Error \
Log.Outputs.ErrorLog.LogRollFrequency"] );  if ( freq == "" ) freq = "0H";
	aParts = freq.match( /([0-9]+)([HDWM])/i );
	if ( aParts && aParts.length >= 3 )
	{
		setCtrlValue( theForm.interval2, aParts[ 1 ], true );
		setCtrlValue( theForm.period2,   aParts[ 2 ].toUpperCase(), true );
	}

	var mask = getCtrlValue( theForm.StatsMask );
	for ( var i = 0; i < 4; i ++ )
	{
		setCtrlValue( theForm[ "StatsMask_" + i ], mask & ( 1 << i ) );
	}
	
}	// onLoad
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">LOGGING & MONITORING</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
The server tracks information in the access and error logs about 
media files that have been requested, and errors that have occurred. You can also \
manage the tracking of Client GUIDs, the Globally Unique Identifier assigned to \
RealPlayers. </td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 

<input type="hidden" name="LoggingTemplates.Standard Access \
Log.Outputs.AccessLog.LogRollFrequency" value=""> <input type="hidden" \
name="LoggingTemplates.Standard Error Log.Outputs.ErrorLog.LogRollFrequency" \
value=""> <input type="hidden" name="StatsMask" value="">
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Access Logging</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="32%">
			<span class="offsetLabel">Logging Style</span>
		</td>
		<TD class="input" valign="top" align="left" width="68%">
			<select CLASS="input" NAME="LoggingTemplates.Standard Access Log.LoggingStyle" \
SIZE="1">  <OPTION value="0">0</OPTION>
	            <OPTION value="1">1</OPTION>
	            <OPTION value="2">2</OPTION>
	            <OPTION value="3">3</OPTION>
	            <OPTION value="4">4</OPTION>
	            <OPTION value="5">5</OPTION>
	            <OPTION value="6">6</OPTION>
	        </SELECT><SPAN CLASS="units"><BR>(gathers clip serving activity data)</SPAN>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="32%">
			<span class="offsetLabel">Disable Client GUIDs</span>
		</td>
		<TD class="input" valign="top" align="left" width="68%">
			<select CLASS="input" NAME="DisableClientGUID" SIZE="1">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT><SPAN CLASS="units"><BR>(gathers clients' unique \
identifiers)</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="32%">
			<span class="offsetLabel">Domain Cookie ID</span>
		</td>
		<TD class="input" valign="top" align="left" width="68%">
			<select CLASS="input" NAME="EnableCookieBasedIDs" SIZE="1">
	            <OPTION value="1">Enabled</OPTION>
	            <OPTION value="0">Disabled</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="32%">
			<span class="offsetLabel">Client Stats</span>
		</td>
		<TD class="input" valign="top" align="left" width="68%">
			<input name="StatsMask_0" type="checkbox"><SPAN class="unitsOffset">Type \
1&nbsp;</SPAN><input name="StatsMask_1" type="checkbox"><SPAN \
class="unitsOffset">Type 2&nbsp;</SPAN><input name="StatsMask_2" \
type="checkbox"><SPAN class="unitsOffset">Type 3&nbsp;</SPAN><input \
name="StatsMask_3" type="checkbox"><SPAN class="unitsOffset">Type 4</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="32%">
			<span class="offsetLabel">Log Rolling Frequency</span>
		</td>
		<TD class="input" valign="top" align="left" width="68%">
			<select class="input" name="interval">
	        <option DEFAULT  value="0">0</option>
	            <option  value="1">1</option>
	            <option  value="2">2</option>
	            <option  value="3">3</option>
	            <option  value="4">4</option>
	            <option  value="5">5</option>
	            <option  value="6">6</option>
	            <option  value="7">7</option>
	            <option  value="8">8</option>
	            <option  value="9">9</option>
	            <option  value="10">10</option>
	            <option  value="11">11</option>
	            <option  value="12">12</option>
	            <option  value="13">13</option>
	            <option  value="14">14</option>
	            <option  value="15">15</option>
	            <option  value="16">16</option>
	            <option  value="17">17</option>
	            <option  value="18">18</option>
	            <option  value="19">19</option>
	            <option  value="20">20</option>
	            <option  value="21">21</option>
	            <option  value="22">22</option>
	            <option  value="23">23</option>
	            <option  value="24">24</option>
	            <option  value="25">25</option>
	            <option  value="26">26</option>
	            <option  value="27">27</option>
	            <option  value="28">28</option>
	            <option  value="29">29</option>
	            <option  value="30">30</option>
	            <option  value="31">31</option>
	            <option  value="32">32</option>
	            <option  value="33">33</option>
	            <option  value="34">34</option>
	            <option  value="35">35</option>
	            <option  value="36">36</option>
	            <option  value="37">37</option>
	            <option  value="38">38</option>
	            <option  value="39">39</option>
	            <option  value="40">40</option>
	        </select>
	        <select class="input" name="period">
	                        <option value="H">Hours</option>
	                        <option value="D">Days</option>
	                        <option value="W">Weeks</option>
	                        <option value="M">Months</option>
	        			</select>&nbsp;<SPAN CLASS="unitsOffset">(set to zero to disable)</SPAN>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="32%">
			<span class="offsetLabel">Log Rolling Size</span>
		</td>
		<TD class="input" valign="top" align="left" width="68%">
			<SPAN CLASS="unitsOffset">When file reaches&nbsp;</SPAN><input type="text" \
class="input" name="LoggingTemplates.Standard Access \
Log.Outputs.AccessLog.LogRollSize" value="" size="3" maxlength=5>&nbsp;<SPAN \
CLASS="unitsOffset">MB</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="32%">
			<span class="offsetLabel">Access Log File</span>
		</td>
		<TD class="input" valign="top" align="left" width="68%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="LoggingTemplates.Standard Access \
Log.Outputs.AccessLog.Filename" SIZE="24" TYPE="text" VALUE="">  </td>
	</tr>
</TABLE>
<BR>
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Error Logging</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp('config_logging_error')">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="32%">
			<span class="offsetLabel">Log Rolling Frequency</span>
		</td>
		<TD class="input" valign="top" align="left" width="68%">
			<select class="input" name="interval2"><option DEFAULT  value="0">0</option>
	            <option  value="1">1</option>
	            <option  value="2">2</option>
	            <option  value="3">3</option>
	            <option  value="4">4</option>
	            <option  value="5">5</option>
	            <option  value="6">6</option>
	            <option  value="7">7</option>
	            <option  value="8">8</option>
	            <option  value="9">9</option>
	            <option  value="10">10</option>
	            <option  value="11">11</option>
	            <option  value="12">12</option>
	            <option  value="13">13</option>
	            <option  value="14">14</option>
	            <option  value="15">15</option>
	            <option  value="16">16</option>
	            <option  value="17">17</option>
	            <option  value="18">18</option>
	            <option  value="19">19</option>
	            <option  value="20">20</option>
	            <option  value="21">21</option>
	            <option  value="22">22</option>
	            <option  value="23">23</option>
	            <option  value="24">24</option>
	            <option  value="25">25</option>
	            <option  value="26">26</option>
	            <option  value="27">27</option>
	            <option  value="28">28</option>
	            <option  value="29">29</option>
	            <option  value="30">30</option>
	            <option  value="31">31</option>
	            <option  value="32">32</option>
	            <option  value="33">33</option>
	            <option  value="34">34</option>
	            <option  value="35">35</option>
	            <option  value="36">36</option>
	            <option  value="37">37</option>
	            <option  value="38">38</option>
	            <option  value="39">39</option>
	            <option  value="40">40</option>
	        </select><select class="input" name="period2">
	                        <option value="H">Hours
	                        <option value="D">Days
	                        <option value="W">Weeks
	                        <option value="M">Months
	        			</select>&nbsp;<SPAN CLASS="unitsOffset">(set to zero to disable)</SPAN>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="32%">
			<span class="offsetLabel">Log Rolling Size</span>
		</td>
		<TD class="input" valign="top" align="left" width="68%">
			<SPAN CLASS="unitsOffset">When file reaches&nbsp;</SPAN><input type="text" \
class="input" name="LoggingTemplates.Standard Error Log.Outputs.ErrorLog.LogRollSize" \
value="" size="3" maxlength=5>&nbsp;<SPAN CLASS="unitsOffset">MB</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="32%">
			<span class="offsetLabel">Error Log File</span>
		</td>
		<TD class="input" valign="top" align="left" width="68%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="LoggingTemplates.Standard Error \
Log.Outputs.ErrorLog.Filename" SIZE="24" TYPE="text" VALUE="">  </td>
	</tr>
	<SCRIPT>
	if ( isNT )
	{
		document.write( '<tr> <TD class="input" valign="top" align="RIGHT" width="32%"> \
<span class="offsetLabel">NT Event Log Filter</span> </td> <TD class="input" \
valign="top" align="left" width="68%"> <select class="input" name="LogDetailLevel"> \
<option value="">Default <option value="Emergency">Emergency <option \
value="Alert">Alert <option value="Critical">Critical <option value="Error">Error \
<option value="Warning">Warning <option value="Notice">Notice <option \
value="Info">Info <option value="Debug">Debug </select> </td> </tr> ' );  }	
	</SCRIPT>

<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: tree.js ---

// depends on xblib.js

function TOCTree ( winTOC, winContent )
{

	if ( !TOCTree.bInitialized )
		TOCTree.initTOCTreeClass();

	// only one TOCTree per window allowed
	if ( winTOC && winTOC.TheTOCTree )
	{
		return winTOC.TheTOCTree ;
	}

	this.m_winTOC = winTOC;
	this.m_winContent = winContent;
	this.m_docTOC = null;

[...1328 lines suppressed...]
	{
		return ( (folder.name != null) && 
			     (folder.name.charAt( 0 ) == "z") );
	}
	else
	{
		return ( folder.tagName && 
			    (folder.tagName == "DIV") &&
		        ("z" == folder.id.charAt(0)) );
	}

}	// isFolder

function getFolderLevel ( folder )
{
	return ( isNav4 ?
		folder.left :
		(folder.className ? parseInt( folder.className.slice(1) ) : 0) );
}


--- NEW FILE: cdistpulldown.html ---

<HTML>
<HEAD>

<TITLE>Get cache Content</TITLE> 

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="dialog.js"></SCRIPT>
<SCRIPT SRC="qstr.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
	document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else
{
	document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
</SCRIPT>

<SCRIPT>
var theForm = null;
var contextID;
function onLoad ()
{
	theForm = document.theForm ;
}

var submitString = "" ;
function validate ()
{
	submitString = "";

	var rootPath = "server.ContentSubscription.FilePullCommand."

	var aClips = getCtrlValue( theForm.ClipList ).split( /[\r\n]+/ );
	for ( var i = 0; i < aClips.length; i++ )
	{
		var sClip = aClips[ i ].trim();

		if ( "" != sClip )
		{
			submitString += buildParam( rootPath + (new Date().getTime() + i), sClip );
		}
	}

	if ( ! submitString )
	{
		return rejectInput( theForm.ClipList, "No clips were specified." );
	}
	
	return true ;
}

function doSubmit () 
{
	raSubmitChanges( "servvar.set.html", submitString, "Get Cache Content", \
resultsCallback ); }

function resultsCallback ( results )
{
	var res;
    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];
		res.title = res.newval;
		res.actionDisplay = "Pull Down Initiated";
	}
}
</SCRIPT>

</HEAD>

<SCRIPT>
onLoadHookFunc = onLoad;
</SCRIPT>

<BODY 
	CLASS="popup"	
	onload="_onLoadDefault();"
	onunload="_onUnLoadDefault();"
> 
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule" height="7" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule">&nbsp;</SPAN>
	</TD>
</TR>
<TR>
   <TD align="left" valign="middle" bgcolor="#FFFFFF" height="49">
      <img src="images/popup_header.gif"  BORDER="0" HSPACE="0" VSPACE="0">
   </TD>
   <TD align="right" valign="middle" bgcolor="#FFFFFF" height="49">
		<img src="images/popup_logo.gif"  BORDER="0" HSPACE="20" VSPACE="0">      
   </TD>
</TR>
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule2" height="9" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule2">&nbsp;</SPAN>
   </TD>
</TR>
</TABLE>
<DIV CLASS="popupPad">

<form 
	name="theForm" 
	method="POST" 
	action="javascript:doSubmit();" 
	onsubmit="return validate();" 
	onreset="doDlgClose(0); return false;"
> 
<table border="0" cellspacing="0" cellpadding="0" width="400" style="width:400;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Populate Cache</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="118" align="right"></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="400">
<TR><TD class="input" width="100%">
	Fetch These Clips
	<BR>
	<textarea CLASS="longInput" COLS="30" NAME="ClipList" ROWS="10" VALUE="" \
WRAP="off"></textarea><SPAN CLASS="units"><BR>one clip per line</SPAN> </TD></TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="400">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR><TD colspan="2" bgcolor="#E6E6E6" align="right" valign="middle" NOWRAP>
   <input type="image" src="images/okay.gif" alt="Apply changes made to this page" \
name="Apply changes made to this page" value="Apply" border="0">&nbsp;<A \
HREF="javascript://" onclick="window.close()"><img src="images/cancel.gif"  \
ALT="Close this window without applying changes" BORDER="0" HSPACE="0" \
VSPACE="0"></A></TD> </TR>
</TABLE>
</DIV>

</FORM>
<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_mc_scale.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Scalable Multicasting</TITLE>

<STYLE>
.address
{ 
  font-size:        8.5pt;
  font-weight:      500;
}
</STYLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "11";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="enumlist.js"></SCRIPT>
<SCRIPT SRC="port.js"></SCRIPT>
<SCRIPT SRC="servvar.get.html?serverData=config&diffconfig=diffconfig"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
var FS = "FSMount";
var FS_SCALE = "Scalable Multicast";
var MOUNT = "MountPoint";
var SNAME = "ShortName";

var propSetChannel =
[
	new PropObj( 'Enabled', 			"0",	false,	true,  null,null, 'int' ),
	new PropObj( 'AnnounceSap', 		"0",	false,	true,  null,null, 'int', 'Enable SAP' ),
	new PropObj( 'VirtualPath', 		"*", 	false,	true,  null,null, 'virpath', 'Virtual \
Path' ),  new PropObj( 'PortRange', 			"",		false,	false, null,null, \
'port_range',	'Port Range' ),  new PropObj( 'AddressRange', 		"",		false,	false, \
null,null, 'ip_range', 'Address Range' ),  new PropObj( 'TTL', 				"16",	false,	true, \
null,null, 'TTL', 'Time to Live' ),  new PropObj( 'Timeout', 			"30",	false,	false, \
null,null, 'int', "Timeout" ),  new PropObj( 'ReuseAddress', 		"1",	false,	true,  \
null,null, 'int', 'Reuse Address' ),  new PropObj( 'ShiftToUnicast', \
"0",	false,	true,  null,null, 'int', 'Shift To Unicast' ),  new PropObj( \
'AlternateURL', 		"",		false,	false, null,null, 'url', 'Alternate URL' ),  new \
PropObj( 'SendClientStatistics',"0",	false,	true,  null,null, 'int', 'Send Client \
Statistics' ),  new PropObj( 'WebServerAddress', 	"",		false,	false, null,null, \
'hostname', 'Web Server Address' ),  new PropObj( 'WebServerPort', \
"",		false,	false, null,null, 'port', 'Web Server Port' ),  new PropObj( \
'WebServerCGIPath', 	"",		false,	false, null,null, 'url', 'Web Server CGI Path' ) ];

var propSet =
[
	new PropObj( 'MountPoint', "/scalable/", false, true, null,null, 'mountpoint', \
"Mount Point", true ),  new PropObj( 'ShortName', "pn-scalable", true, true, \
null,null, '', "Short Name", true ),  new PropList( 'Sources', null, null, \
propSetChannel ) ];

var scaleData = [];
if ( serverData && 
	 serverData[FS] &&
	 serverData[FS][FS_SCALE] )
	scaleData = serverData[FS][FS_SCALE];

var propList = new PropList( "Scalable Multicast", scaleData, propSet );
var subListSources = propList.subList( "Sources" );

// define a subclass of NestedPropListView that will handle the main prop set \
("enabled" var) // and the publishers sublist. This class will encapsulate a propView \
to handle the // Rules sublist
function ScalePropView ()
{
	this.base = NestedPropListView ;
	this.base( "Channel", propList, "Channel", 
				"config.FSMount.Scalable Multicast.", "servvar",
				"theForm", "theList", "theEdit" );

	this.m_subListParent = subListSources;
}
ScalePropView.prototype = new NestedPropListView ;

ScalePropView.prototype.postFillFormFromSubList = function ( fValidate )
{

	thePortRange.fillForm( theForm );
	theAddressRange.fillForm( theForm );
	
	activateLink( "AlternateURL", "ALTURL_SPAN" );

	return true;

}	// postFillFormFromSubList ()

ScalePropView.prototype.onSubListChangeNotify = function ( action, subListName )
{

	if ( "delete" == action )
	{
		setCtrlValue( theForm.PortRange1, "" );
		setCtrlValue( theForm.PortRange2, "" );
		setCtrlValue( theForm.AddressRange1, "" );
		setCtrlValue( theForm.AddressRange2, "" );
	}

	if ( this.m_bDoDirtyCheck )
		this.showDirtyFlag( this.isDirty() );

}	// onSubListChangeNotify

ScalePropView.prototype.preValidateSubList = function ()
{

	if ( ! thePortRange.validate( theForm ) )
		return false ;

	if ( ! theAddressRange.validate( theForm ) )
		return false ;

	var subList = this.getSubList();
	if ( subList )
	{
		// if send stats is enabled then we require that the Web IP address
		// and port are present
		var reqWeb = ( getCtrlValue( theForm.SendClientStatistics ) != 0 );
		subList.prop( 'WebServerAddress' ).required = reqWeb ;
		subList.prop( 'WebServerPort' ).required = reqWeb ;
	}

	return true;

}	// preValidateSubList

ScalePropView.prototype.postValidateSubList = function ( subListName )
{

	if ( getCtrlValue( theForm.Enabled ) != '1' )
		return true ;

	var subList = this.getSubList();
	if ( ! subList ) return true ;

	// custom port range check
	if ( subList.m_status || subList.prop( "PortRange" ).isDirty() )
	{
		if ( ! checkPort( getCtrlValue( theForm.PortRange1 ), 
						  getCtrlValue( theForm.PortRange2 ) ) )
			return rejectInput( theForm.PortRange1, 
				"Invalid Port Range: The first port must be an even number and there must be an \
even number of ports (the port range is inclusive)." );

		var portRange = getCtrlValue( theForm.PortRange );
		var conflict = findPortConflictName( portRange );
		if ( conflict )
		{
			return rejectInput( theForm.PortRange1, 
				getConflictErrMsg( conflict, "Port Range" ) );
		}

		// check the port range against other channels
		function _checkPortConflict( otherSubList, prop )
		{
			// don't compare this sublist with itself
			if ( otherSubList == subList ) return;

			if ( isPortRangeOverlap( portRange, prop.getValue() ) )
			{
				conflict = otherSubList.toString();
				return 1;
			}
		}
		subListSources.propSearch( "PortRange", _checkPortConflict );

		if ( conflict )
		{
			return rejectInput( theForm.PortRange1, 
				"The '" + subListName + "' Port Range conflicts with the '" + conflict + "' Port \
Range." );  }
	}

	if ( subList.m_status || subList.prop( "AddressRange" ).isDirty() )
	{
	 	var thisRange = new IPRange( getCtrlValue( theForm.AddressRange ) );

		// check to make sure the address range doesn't 
		// overlap with the back channel multicasting address range
		if ( serverData && 
			 serverData["Multicast"] &&
			 serverData["Multicast"]["AddressRange"] )
		{
			var backChannelRange = new IPRange( serverData["Multicast"]["AddressRange"] );
			if ( (!backChannelRange.errMsg) && thisRange.isOverlap( backChannelRange ) )
			{
				return rejectInput( theForm.AddressRange1, 
					'The "'+ subListName + '" address range overlaps with the Back Channel \
                Multicasting address range (' +
					backChannelRange + '). Please select another address range, or change the Back \
Channel Multicasting address range to continue.');  }
		}

		// check against Windows Media Multicasting MultcastAddresses
		if ( serverData && 
			 serverData["Windows Media Multicast"] )
		{
			var conflict = "";
			var addr = null;
			function _checkAddressConflict ( a, propName, curDepth, curPath )
			{
				if ( isObj( a[ propName ] ) && 
					 (a[ propName ]["Disabled"] != 1) && 
					  a[ propName ]["MulticastAddress"] )
				{
					addr = new IPAddress( a[ propName ]["MulticastAddress"] );
					if ( thisRange.addressInRange( addr ) )
					{
						conflict = propName ;
						return 1; // abort search
					}
				}
			}
			enumPropArray( serverData["Windows Media Multicast"]["Channels"], 
							_checkAddressConflict, 1 );

			if ( conflict )
			{
				return rejectInput( theForm.AddressRange1, 
					'The "'+ subListName + '" address range overlaps with the Windows Media \
                Multicast "' +
					conflict + '" multicast address (' + addr + '). Please select another address \
range, or change the Windows Media Multicast settings to continue.');  }
		}

		// now loop through the other sublists and check against thier address ranges
		for ( var otherChn in subListSources.subLists() )
		{
			var otherSubList = subListSources.subList( otherChn );
			if ( otherSubList && 
				(otherSubList != subList) && 
				(otherSubList.m_status != "deleted") )
			{
				var tempRange = new IPRange( otherSubList.prop( "AddressRange" ).getValue() );
				var enabled = otherSubList.prop( "Enabled" ).getValue();
				if ( (enabled == "1") && tempRange && (!tempRange.errMsg) )
				{
					if ( thisRange.isOverlap( tempRange ) )
					{
						return rejectInput( theForm.AddressRange1,
							'The "'+ subListName + '" address range overlaps with the "' + otherChn + 
							'" address range (' + tempRange + 
							'). Please select another address range or disable either channel to \
continue.' );  }
				}
			}
		}
	}

	return true;

}	// postValidateSubList ()

ScalePropView.prototype.postValidate = function ()
{
	// make sure the mountpoint is unique among all mount points
    if ( propList && propList.prop( "MountPoint" ) )
    {
		var errMsg = 
	    	propList.prop( "MountPoint" ).getMountPointConflictErrMsg( serverData.FSMount \
);  if ( errMsg )
		{
			return rejectInput( theForm.MountPoint, errMsg );
		}
	}

	// walk through the propList to determine if we need to add the mountpoint to
	// the HTTPPostable list and/or Deliverable lists

	var setHTTPPostable = false;
	var subList ;
	for ( var subListName in subListSources.subLists() )
	{
		subList = subListSources.subList( subListName );

		// if the channel is enabled and SendClientStatistics is enabled then the 
		// scalable mountpoint must be available for HTTP Posting
		if ( subList && 
			(subList.prop( "SendClientStatistics" ).getValue() == "1" ) && 
			(subList.prop( "Enabled" ).getValue() == "1" ) )
		{
			setHTTPPostable = true ;
		}
	}	

	// make sure the scalable mount point is avaiable via HTTP (and lose the trailing \
slash):  var newDir, oldDir ;
	var prop = propList.prop( "MountPoint" );
	if ( ! prop )
	{
		oldDir = newDir = "/scalable" ;
	}
	else 
	{
		if ( ! prop.isDirty() )
		{
			oldDir = newDir = stripTrailingSlash( prop.getValue() );
		}
		else // mount point has been changed
		{
			oldDir = stripTrailingSlash( prop.value );
			newDir = stripTrailingSlash( prop.ctrlValue );
			
		}
	}

	if ( httpDelivEnum.replace( oldDir, newDir ) )
		this.m_submitString += httpDelivEnum.buildParamString();

	if ( httpPostEnum.replace( oldDir, (setHTTPPostable ? newDir : "") ) )
		submitString += httpPostEnum.buildParamString();

	return true;

}	// postValidate

ScalePropView.prototype.postSubmit = function ()
{
	httpDelivEnum.commit();
	httpPostEnum.commit();

}	// postSubmit

ScalePropView.prototype.resultsCallback = function ( results )
{
	var res, a;
    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];
		a = propName.split( "." );

		var part1 = 4 ;
		var part2 = 5 ;

		if ( a[4] && a[5] && a[6] && ( -1 != a[4].search( /^sources$/i ) ) )
		{
			part1 = 5 ;
			part2 = 6 ;
		}
		else if ( a[2] && a[3] && ( -1 != a[2].search( /^HTTP/i ) ) )
		{
			part1 = 2 ;
			part2 = 3 ;
		}

        if ( a[ part1 ] ) res.title = a[ part1 ].ent().span("body") + '<br>' ;
    	if ( a[ part2 ] ) res.title += a[ part2 ];
	}
}

initAllPortsList( serverData, FS_SCALE );
var propView = new ScalePropView();

var thePortRange = new PortRangeCtrl("PortRange", 1);
var theAddressRange = new AddressRangeCtrl();

var theForm = null ;

var httpDelivEnum = new EnumConfigList( serverData["HTTPDeliverable"], \
"config.HTTPDeliverable", "Path_" ); var httpPostEnum = new EnumConfigList( \
serverData["HTTPPostable"], "config.HTTPPostable", "Path_" );

var tocFrame = findFrame( "TOC" );

function onLoad ()
{
	theForm = document.theForm;
	checkForPendingChanges( diffconfig );

	if ( !isNav4 )
	{
		theForm.AddressRange1.size = 17;
		theForm.AddressRange2.size = 17;
	}

	propView.onLoad( window );

}	// onLoad ()

function stripTrailingSlash ( s )
{
	if ( ! s ) return "" ;
	return s.replace( /(.)\/$/, "$1" );
}

function checkPort ( port1, port2 )
{
	if( port1 % 2 != 0 || (port2 - port1 + 1)%2 != 0 || (port2 - port1) <= 0)
	{
		return(false);
	}
	return(true);
}
</SCRIPT>

</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">BROADCAST DISTRIBUTION</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
In scalable multicasting, there is no control channel between the player
and server. For this reason, the number of clients that could
potentially receive a scalable multicast event is unlimited. Use this type of 
multicasting when multicasting to a very large audience and your network is 
multicast enabled.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 

<input type="hidden" name="ShortName" value="">
<input type="hidden" name="AddressRange" value="">
<input type="hidden" name="PortRange" value="">
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Scalable Multicasting</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Mount Point<FONT color="red">*</FONT></span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="MountPoint" SIZE="21" TYPE="text" \
VALUE="">  </td>
	</tr>
<tr </tr>
<tr>
	<TD class="input" valign="top" width="40%">
		<TABLE CLASS="PROPLIST_LABEL" width="181" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Channels</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Channel" BORDER=0></A><A href="javascript://" onclick="propView.removeSubList()"><IMG \
src="images/delete_g.gif" HSPACE=1 ALT="Remove Current Channel" BORDER=0></A><A \
href="javascript://" onclick="propView.copySubList()"><IMG src="images/copy_g.gif" \
HSPACE=1 ALT="Copy Current Channel" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theList" SIZE="8" WIDTH="181">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>

		<BR>
		<SPAN CLASS="units"><A class="linkTextSmall" \
HREF="javascript:tocFrame.gotoPage('config_sec_rules.html')">Set up</A> \
authentication for a live channel.</SPAN>  </TD>
	<TD class="input" valign="top" width="60%">
		Edit Channel Description
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theEdit" SIZE="21" TYPE="text" \
VALUE="">

		Enable Channel
		<BR>
		<select CLASS="input" NAME="Enabled" SIZE="1" WIDTH="91">
		    <OPTION value="1">Yes</OPTION>
		    <OPTION value="0">No</OPTION>
		</SELECT>

		<BR>
		Enable SAP
		<BR>
		<select CLASS="input" NAME="AnnounceSap" SIZE="1" WIDTH="91">
		    <OPTION value="1">Yes</OPTION>
		    <OPTION value="0">No</OPTION>
		</SELECT>

		<BR>
			Path
			<BR>
			<input CLASS="longInput" MAXLENGTH="255" NAME="VirtualPath" SIZE="21" TYPE="text" \
VALUE="">

		Port Range
		<BR>
		<input type="text" class="input" name="PortRange1" size="6" maxlength="5"><SPAN \
class="unitsOffset">&nbsp;to&nbsp;</span><input type="text" class="input" \
name="PortRange2" size="6" maxlength="5">

		<BR>
		IP Address Range
		<BR>
		<input type="text" class="longInput" name="AddressRange1" size="8" \
maxlength="39"><SPAN class="unitsOffset"><BR>to<BR></span><input type="text" \
class="longInput" name="AddressRange2" size="8" maxlength="39">

		<SPAN class="units">
			IP Address Ranges for scalable multicasting channels must not
			overlap with the back-channel multicast IP Address Range, and 
			must be between 224.0.0.0 and 239.255.255.255.
			<BR>
			<BR>
		</SPAN>

		Time to Live
		<BR>
		<input CLASS="input" MAXLENGTH="255" NAME="TTL" SIZE="6" TYPE="text" VALUE=""><SPAN \
CLASS="unitsOffset">&nbsp;(measured in router hops)</SPAN>

		<BR>
		Timeout
		<BR>
		<input CLASS="input" MAXLENGTH="255" NAME="Timeout" SIZE="6" TYPE="text" \
VALUE=""><SPAN CLASS="unitsOffset">&nbsp;(in seconds)</SPAN>

		<BR>
		Reuse Address
		<BR>
		<select CLASS="input" NAME="ReuseAddress" SIZE="1" WIDTH="91">
		    <OPTION value="1">Yes</OPTION>
		    <OPTION value="0">No</OPTION>
		</SELECT>

		<BR>
		Shift to Unicast
		<BR>
		<select CLASS="input" NAME="ShiftToUnicast" SIZE="1" WIDTH="91">
		    <OPTION value="1">Yes</OPTION>
		    <OPTION value="0">No</OPTION>
		</SELECT>

		<BR>
		<SPAN ID='ALTURL_SPAN'>Alternate Unicast URL</SPAN><SCRIPT>if ( isNav4 \
){document.write( ' (<A CLASS="linkText" \
HREF="javascript:testURL(\'AlternateURL\')">Test URL</A>)' );}</SCRIPT>  <BR>
		<input CLASS="longInput" ID="AlternateURL" MAXLENGTH="255" NAME="AlternateURL" \
ONKEYUP="if (!isNav4) activateLink( this.name, 'ALTURL_SPAN' );" SIZE="21" \
TYPE="text" VALUE="">

		<BR>
		Send Client Statistics to Web Server
		<BR>
		<select CLASS="input" NAME="SendClientStatistics" SIZE="1" WIDTH="91">
		    <OPTION value="1">Yes</OPTION>
		    <OPTION value="0">No</OPTION>
		</SELECT>

		<BR>
		Web Server Host Name or IP Address
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="WebServerAddress" SIZE="21" \
TYPE="text" VALUE="">

		Web Server Port
		<BR>
		<input CLASS="input" MAXLENGTH="255" NAME="WebServerPort" SIZE="6" TYPE="text" \
VALUE="">

		<BR>
		Web Server CGI Path
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="WebServerCGIPath" SIZE="21" \
TYPE="text" VALUE="">  </TD>
</TR>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" VALIGN="middle" width="100%" class="body" \
                ALIGN="left">
      <FONT color="red">*A server restart is required to effect changes applied to \
this field.</FONT>  </TD>
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_delivery.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>HTTP Delivery</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "6";
</SCRIPT>

<SCRIPT SRC="enumproplist.js"></SCRIPT>
<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="servvar.get.html?serverData=config.HTTPDeliverable"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
function PathPropView ()
{
	this.base = NestedPropListView ;
	this.base( "HTTP Delivery Paths", propList, "Path", 
				"config.HTTPDeliverable.", "servvar", 
				"theForm", "theList", "theEdit" );

	this.m_itemDefValue = "/path";
	this.m_resultsTitleListIndex = 2;
	this.m_resultsTitlePropIndex = 3;
}
PathPropView.prototype = new NestedPropListView ;

PathPropView.prototype.preValidateSubList = function ()
{

	if ( ! propList.virdir_validate( getCtrlValue( theEdit ) ) )
		return rejectInput( theEdit, propList.errMsg );
	else
		return true ;
}

PathPropView.prototype.onESRename = function ( oldSubListName, newSubListName )
{
	if ( ! this.m_bLoaded ) return ;

	// no validation here - validate during preValidateSubList

	this.m_subListParent.renameSubList( oldSubListName, newSubListName );
	this.m_curSubListName = newSubListName ;
	this.onSubListChangeNotify( "rename", oldSubListName, newSubListName );

	return true ;

}	// onESRename ()

PathPropView.prototype.removeSubList = function ()
{
	if ( ! this.m_bLoaded ) return ;

	if ( ! this.m_curSubListName )
	{
		return;
	}
		
	// in case the sublist was renamed
	if ( ! this.m_oES.doRenameCheck() )
		return ;

	
	
    if ( this.confirmRemoveSubList( this.m_curSubListName ) )
	{
		var deletedSubListName = this.m_curSubListName;
		// mark as 'deleted'
		this.m_oES.remove();
		this.onSubListChangeNotify( "delete", deletedSubListName );
		this.fillFormFromSubList( false );
	}

}	// removeSubList ()

var theForm = null;
var theList = null;
var theEdit = null;

var propList = new EnumPropListSel( 'HTTP Delivery Paths', serverData, "Path_", 1, \
"theList" ) var propView = new PathPropView();

function onLoad ()
{
	theForm = document.theForm ;
	theList = theForm.theList ;
	theEdit = theForm.theEdit ;

	propView.onLoad( window );
	propView.m_oES.m_reIllegalChars = null;
	propView.m_oES.sync();

}	// onLoad
</SCRIPT>

</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">SERVER SETUP</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
Helix Server can serve HTML pages via HTTP, and includes a feature for 
restricting directories' content that can be served. The HTTPDeliverable 
list controls this feature. Each entry lists a virtual directory that the server
is permitted to serve via HTTP. Sub-directories are included.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>HTTP Delivery</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<tr>                               
	<TD class="input" valign="top" width="50%">
		<TABLE CLASS="PROPLIST_LABEL" width="226" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Paths</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Path" BORDER=0></A><A href="javascript://" onclick="propView.removeSubList()"><IMG \
src="images/delete_g.gif" HSPACE=1 ALT="Remove Current Path" BORDER=0></A></TD>  \
</TR></TABLE>  <DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  \
CLASS="longInput" NAME="theList" SIZE="8" WIDTH="226">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="50%">
		Edit Path
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theEdit" SIZE="18" TYPE="text" \
VALUE="">  </TD>
</TR>

<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: browse_content.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Browse Content</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "51";
</SCRIPT>

<STYLE>

TD
{ 
	font-family:      Verdana, Arial, Helvetica, sans-serif;
	font-size:        ;
	font-weight:      normal;
	font-style:       Normal;
	color:            #333350;
	text-indent:      0pt;
}

.linkText
{ 
	font-family:      Verdana, Arial, Helvetica, sans-serif;
	font-size:        ;
	font-weight:      500;
	color:            #0033FF;
	text-Decoration:	none ;
}

</STYLE>
<SCRIPT>
var bRoot = !unescape(location.search).bSearch( /\?\/.*/ );
document.write( '<' + 'SCRIPT SRC="browse.get.js' + location.search + '"><' + \
'/SCRIPT>' ); </SCRIPT>

<SCRIPT>
//globals
var curSortCol = "";
var bSortAsc = false;

function onLoad ()
{
	// set frameset title to reflect main frame title
	if ( (!isNav4) && Dir ) 
	{
		top.document.title += " " + Dir.path; 
	}
	//TODO use Cookie for initial sortCol/direction

	displayHeader();

	var dataY = 0;
	var header = getElem( "DIV_HEADER" );
	var data = getElem( "DIV_DATA" );
	if ( isNav4 && header && data)
	{
		data.top = header.top + header.clip.height;
	}
	else if ( header && data )
	{
		data.style.top = header.offsetTop + header.offsetHeight;
	}

    curSortCol = (bRoot ? "Mount Point" : "Name");
	displayData( curSortCol );
}

// RAMGEN Exceptions
var extToGenURL =
{
	'mov' : ""					// we don't generate 'ram-type' files for .mov playback
   ,'wma' : asxGenURLPrefix
   ,'wmv' : asxGenURLPrefix
   ,'asf' : asxGenURLPrefix
   ,'nsc' : asxGenURLPrefix
};

function getPlaybackURL ( p )
{
	var ext = "";

	//find the extension of file p
	var pos = p.lastIndexOf( '.' );
	if (pos != -1)
	{
		ext = p.substring( pos + 1 );
	}
	if ( !ext || (extToGenURL[ ext ] == ""))
	{
		return "";
	}
	else if ( extToGenURL[ ext ] )
	{
		return extToGenURL[ ext ] + p.replace( /^\//, "" );
	}
	else
	{
		return ramGenURLPrefix + p.replace( /^\//, "" );
	}
}

function padNumStr ( n )
{
	var s = n.toString();
	return " ".dup( 12 - s.length ) + s;
}

function header ( displayText, attribs )
{
	var sHTML = '<TD '; 
	if ( isNav4 )
	{
		sHTML += attribs;
	}
    sHTML += '><A HREF="javascript://" onclick="displayData(\'' + displayText + '\'); \
return false;">' + displayText + '</A></TH>';  return sHTML;
}

function pathFmt ( p )
{
	var href = "";
	var icon = ""
	if ( "FILE" != Dir.files[ p ].type )
	{
		href = location.href.replace( /\?.*$/, "" ) + "?" + escape( p );
		//icon = '<IMG SRC="folder.gif" BORDER="0">'
	}
	else
	{
		if ( viewSrcURLPrefix )
		{
			href = viewSrcURLPrefix + "?src=" + escape( p ) + 
				'" TARGET="VIEWSRC"';
	
			//icon = '<IMG SRC="images/viewsrc.gif" BORDER="0">'
		}
	}

	//lop off the path
	if (( "MP" != Dir.files[ p ].type ) && 
		( p != "/" ))
	{
		var pos = p.lastIndexOf( "/" );
		if ( pos != -1 )
		{
			p = p.substring( pos + 1 );
		}
	}

	var displayText = icon + p;
	if ( ! href )
	{
		return displayText;
	}
	else
	{
		return '<A CLASS="linkText" HREF="' + href + '">' + displayText + '</A>';
	}
}

function sizeFmt ( path )
{
	if ( "FILE" != Dir.files[ path ].type )
	{
		return "&nbsp;";
	}

	var n = Dir.files[ path ].size;

	// commify
	var s = String( n );

	
	s = s.replace( /(\d)(\d{3})$/, "$1,$2" );
	
	return s.replace( /(\d)(\d{3}),/g, "$1,$2," );
}

function timeFmt ( t )
{
	var d = new Date(t * 1000);
    var minutes = d.getMinutes();
    if (minutes < 10)
    {
    	minutes = "0" + minutes;
    }
    var hours = d.getHours();
    var amPm = (hours > 11 ? "PM" : "AM");
    hours %= 12;
	return d.getMonth()+1 + "/" + d.getDate() + "/" + d.getFullYear() + 
		"&nbsp;" + hours + ":" + minutes + "&nbsp;" + amPm;
}

function typeFmt ( p )
{
	var type = "";
	if ( "MP" == Dir.files[ p ].type )
	{
		type = "Mount Point" ;
	}
	else if ( "FILE" != Dir.files[ p ].type )
	{
		type = "Directory" ;
	}
	else
	{
		var href = getPlaybackURL( p );
		if ( ! href )
		{
			type = "File" ;
		}
		else
		{
			//type = '<A href="' + href  + '">File&nbsp;<IMG BORDER="0" \
SRC="images/realplay.gif"></A>';  type = '<A CLASS="linkText" href="' + href + \
'">File&nbsp;</A>';  }
	}
	return type;
}

function displayData ( sortCol )
{
    var sHTML = "";
	if ( bRoot )
	{
		sHTML = getMountPointsHTML( sortCol );
	}
	else
	{
		sHTML = getDirHTML( sortCol );
	}

    emitHTML( "DIV_DATA", sHTML );

	curSortCol = sortCol;
}

function getDirHTML ( sortCol )
{
	//TODO use Cookie if no sortCol

	var table = "<TABLE WIDTH='700'>";
    if ( !isNav4 )
    {
		table += '<COL WIDTH="300" ALIGN="LEFT">' ;
		table += '<COL WIDTH="100" ALIGN="RIGHT">' ;
		table += '<COL WIDTH="150" ALIGN="RIGHT">' ;
		table += '<COL WIDTH="150" ALIGN="LEFT">' ;
	}
    
	table += "<TR>";
	table += header( "Name", "WIDTH='200' ALIGN='LEFT'" );
	table += header( "Size", "WIDTH='60' ALIGN='RIGHT'" );
	table += header( "Modified", "WIDTH='60' ALIGN='RIGHT'" );
	table += header( "Type", "WIDTH='100' ALIGN='LEFT'" );
	table += "</TR>";

	var _sorted = [];

	//alert(1);
	if ( sortCol == "Name" )
	{	
		// put the directories in one bucket and the files in another
		var _files = [];

		for (var path in Dir.files)
		{
			if (Dir.files[ path ].type == "FILE")
				_files[ _files.length ] = path;
			else
				_sorted[ _sorted.length ] = path;
		}

		//now sort them:
		if ( isNav4 )
		{
			
			_sorted.sort();
			_files.sort();
		}
		else
		{
			_sorted.sort( sortCaseInsensitive );
			_files.sort( sortCaseInsensitive );
		}

		// and concat
		for ( var i = 0; i < _files.length; i++ )
		{
			_sorted[ _sorted.length ] = _files[ i ];
		}
	}
	else
	{
		for (var path in Dir.files)
		{
			if ( sortCol == "Size" )
			{
				_sorted[ _sorted.length ] = padNumStr( Dir.files[ path ].size )+ ":" + path;
			}
			else if ( sortCol == "Modified" )
			{
				_sorted[ _sorted.length ] = Dir.files[ path ].time + ":" + path;
			}
			else if ( sortCol == "Type" )
			{
				_sorted[ _sorted.length ] = Dir.files[ path ].type + ":" + path;
			}
		}
		if ( isNav4 )
		{
			
			_sorted.sort();
		}
		else
		{
			_sorted.sort( sortCaseInsensitive );
		}
	}
	//alert(2);

	if ( sortCol == curSortCol )
		bSortAsc = !bSortAsc;
	else
		bSortAsc = true;

	if (!bSortAsc)
		_sorted.reverse();
	
	for (var i = 0; i < _sorted.length; i++)
	{
		var path = _sorted[ i ];
		if ( "Name" != sortCol )
		{
			path = path.split( ":" )[ 1 ];
		}
		table += "<TR><TD>" + 
			pathFmt( path ) + "</TD><TD ALIGN='RIGHT'>" + 
			sizeFmt( path ) + "</TD><TD ALIGN='RIGHT'>" + 
			timeFmt( Dir.files[ path ].time ) + "</TD><TD>" + 
			typeFmt( path ) + "</TD></TR>";
	}

	table += "</TABLE>";
    
    return table;
}

function getMountPointsHTML ( sortCol )
{
/*	var table = "<TABLE WIDTH='700'>";
    if ( !isNav4 )
    {
		table += '<COL WIDTH="200" ALIGN="LEFT">' ;
		table += '<COL WIDTH="100" ALIGN="LEFT">' ;
		table += '<COL WIDTH="200" ALIGN="LEFT">' ;
		table += '<COL WIDTH="200" ALIGN="LEFT">' ;
	}
    
	table += "<TR>";
	table += header( "Mount Point", "WIDTH='200' ALIGN='LEFT'" );
	table += header( "Type", "WIDTH='100' ALIGN='LEFT'" );
	table += header( "Base Path", "WIDTH='200' ALIGN='LEFT'" );
	table += header( "Description", "WIDTH='200' ALIGN='LEFT'" );
	table += "</TR>";
  */
	var _sorted = [];

	for (var path in Dir.files)
	{
		if ( sortCol == "Mount Point" )
		{
			_sorted[ _sorted.length ] = path;
		}
		else if ( sortCol == "Base Path" )
		{
			_sorted[ _sorted.length ] = Dir.files[ path ].basePath + ":" + path;
		}
		else if ( sortCol == "Description" )
		{
			_sorted[ _sorted.length ] = Dir.files[ path ].description + ":" + path;
		}
		else if ( sortCol == "Type" )
		{
			_sorted[ _sorted.length ] = Dir.files[ path ].type + ":" + path;
		}
	}
	if ( isNav4 )
	{
		
		_sorted.sort();
	}
	else
	{
		_sorted.sort( sortCaseInsensitive );
	}

	if ( sortCol == curSortCol )
		bSortAsc = !bSortAsc;
	else
		bSortAsc = true;

	if (!bSortAsc)
		_sorted.reverse();
	
	var table = "<H3>Browseable Mount Points</H3>Click on a mount point to browse its \
contents.<BR><BR>" +  '<TABLE WIDTH="700">';

	for (var i = 0; i < _sorted.length; i++)
	{
		var path = _sorted[ i ];
		if ( "Mount Point" != sortCol )
		{
			path = path.split( ":" )[ 1 ];
		}
		table += "<TR><TD WIDTH='150'>Mount Point</TD><TD WIDTH='550'>" + 
			pathFmt( path ) + 
			"</TD></TR><TR><TD>Base Path</TD><TD>" + 
			Dir.files[ path ].basePath + "</TD></TR><TR><TD>Description</TD><TD>" + 
			Dir.files[ path ].description + "</TD></TR><TR><TD colspan=2><BR></TD></TR>";
	}

	table += "</TABLE>";

    return table;
}

function emitHTML ( sDivId, sHTML )
{
	var oDiv = getElem( sDivId );
    if ( !oDiv ) return;
    
	if ( ! isNav4 )
	{
		oDiv.innerHTML = sHTML ;
	}
	else	// Nav4
	{
		var doc = oDiv.document;
		if ( doc )
		{
			doc.open();
			doc.write( sHTML );
			doc.close();
		}
	}
}    

function displayHeader ()
{
	if ( ! Dir )
    {
    	return;
    }

	var sHTML = "";
	if ( !bRoot )
	{
		sHTML += 'Extensions: ' + Dir.extensions + '<BR>' ;
		sHTML += 'Current Directory: ' + Dir.path + '<BR>' ;

		//lop off the last subdir
		if ( "/" == location.href.charAt(location.href.length - 1) )
		{
			var href = unescape(location.href).replace( /\??\/[^\/]*$/, "" );
		}
		
		var parentHref = "";

		// if the qstr end in "?/" or "?" 
		if ( (location.search == "?/") ||
			 (location.search == "?") )
		{
			parentHref = location.href.replace( /\?\/?$/, "" );
		}
		else
		{
			parentHref = location.href.replace( /\/[^\/]*$/, "/" );
		}
        
		//sHTML += '<A HREF="' + parentHref + '"><IMG SRC="images/updir.gif" BORDER="0"> \
parent directory</A><BR>' ;  sHTML += '<BR><A CLASS="linkText" HREF="' + parentHref + \
'">up to parent directory</A><BR><BR>' ;  }
    else
    {
    }
   	
    emitHTML( "DIV_HEADER", sHTML );
}
</SCRIPT>

<STYLE>
BODY
{
	font-family:verdana;
	font-size:9pt;
}

TD, TH
{
	font-family:verdana;
	font-size:9pt;
	padding-right: 20px;
}
TABLE
{
	table-layout: fixed;
} 

.dynamic
{
	position: absolute;
}
</STYLE>

</HEAD>

<BODY onload="onLoad();">

<H2>Helix Server Content Browser</H2>

<DIV ID="DIV_HEADER" CLASS="dynamic"></DIV>

<DIV ID="DIV_DATA" CLASS="dynamic"></DIV>

</BODY>
</HTML>

--- NEW FILE: header.html ---

<HTML>
<HEAD>

<SCRIPT SRC="xblib.js"></SCRIPT>
         <SCRIPT SRC="string.js"></SCRIPT>
         <SCRIPT SRC="client.js"></SCRIPT>
         <SCRIPT SRC="results.js"></SCRIPT>
         <SCRIPT SRC="help.js"></SCRIPT>
         <SCRIPT>
         if ( isX11 )
         {
            document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" \
TYPE="text/css">' );  }
         else if ( isIE && isMac )
         {
            document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" \
TYPE="text/css">' );  }
         else if ( isNav4 && isMac )
         {
            document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" \
TYPE="text/css">' );  }
         else
         {
            document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' \
);  }
         var contextID = "0";
         </SCRIPT>

<STYLE TYPE='text/css'>

.headerServerLabel, .headerServerName
{
	text-indent: 	12px;
	font-size: 		10pt;
	font-family:	Verdana, Arial, Helvetica, sans-serif;
	color:			white;
	letter-spacing:	normal;
}

.headerServerName
{
	text-indent: 	0;
	font-weight:	600;
}

</STYLE>

<SCRIPT LANGUAGE="Javascript">
var isLoaded = false ;	// some "onclick" functions won't work until the page has \
finished loading

var hostname = location.hostname ;

function onLoad ()	
{
	isLoaded = true ;
	if ( top.pendingChanges )
	{
		restartImage();
	}

}	// onLoad ()

//Change images when server needs to be restarted
function restartImage ( mainFramePendImg, mainFramePendImgSpan )
{
	document.serverList.imgRestart.src = "images/restart_server_dk.gif" ;

	if ( document.images["imgPendChg"] )
	{
		document.images["imgPendChg"].src = "images/pending_changes_dk.gif" ;
		if ( ! isNav4 )
		{
			var imgSpan = getElem( "imgPendChgSpan" );
			if ( imgSpan )
			{
				imgSpan.style.visibility = "visible" ;
			}
		}
	}

	if ( mainFramePendImg )
	{
		mainFramePendImg.src = "images/pending_changes_dk.gif" ;
		if ( mainFramePendImgSpan )
		{
			if ( ! isNav4 )
			{
				mainFramePendImgSpan.style.visibility = "visible" ;
			}
		}
	}
}

// reload frameset, main frame will return to current page
// via the the cookie that is set/read in index.html/onUnload() &
// toc.html/onLoad()
function doReload ()
{
	top.location.href = 'index.html' ;
}

function startServer ( forceRestart )
{
	if ( ! isLoaded ) return ;
	
	function _restart ()
	{
	    if ( ! forceRestart )
		{
			var dataFrame = top.gDataChannel.frame();

			if (dataFrame.restartInProgress)
	        {
		    	alert("Helix Server restart already in progress.");
	            return;
	        }

		    var restartMsg = "" ;
			if ( dataFrame && ( dataFrame.ClientCount != null ) )
			{
				var count = dataFrame.ClientCount;

				if ( dataFrame.HTTPClientCount != null )
					count = Math.max( 0, count - dataFrame.HTTPClientCount );

				var encCount = ( dataFrame.EncoderCount == null ? 0 : dataFrame.EncoderCount );
		    	restartMsg = 
					"Restarting the Helix Server will terminate all current connections (" +
		    		"There " + "is".pluralize( count, "are" ) + " currently " + count + " client \
                connection".pluralize( count ) +
		    		" and " + encCount + " encoder connection".pluralize( encCount ) + ").";

			}
			else
			{
		    	restartMsg = 
		    		"Restarting the server will terminate all current connections (connection \
count is unavailable)." ;  }

		    forceRestart = window.confirm( restartMsg );
		}
		
	    if ( forceRestart )
	    {
			// reset the Restart image to the non-red versions
		    document.serverList.imgRestart.src = "images/restart_server_lt.gif";
			top.pendingChanges = false ;

			// turn off the pending changes "Warning Lamp"
		    document.serverList.imgPendChg.src = "images/spacer.gif";
			if ( ! isNav4 )
			{
				var imgSpan = getElem( "imgPendChgSpan" );
				if ( imgSpan )
				{
					imgSpan.style.visibility = "hidden" ;
				}
			}

			// restart the server (and display wait page)
			var restartURL = "server.restart.html?respage=serve_me.html" ;
			var frameMain = top.frames[ "Main" ];
			if ( frameMain )
			{
				if ( top.fMainFrameIsLocal ) 
		    		top.restartPage = frameMain.location.href ;

			    frameMain.location.href = restartURL ; 
			}
			else
			{
				top.restartPage = "" ;
			    top.location.href = restartURL ; 
			}
	    }
	}

	if ( forceRestart ) 
	{
		_restart( null );
	}
	else
	{

			var dataChnQStr = \
"ClientCount=Server.ClientCount&HTTPClientCount=Server.HTTPClientCount&EncoderCount=LiveConnections.Count&restartInProgress=Server.RestartInProgress" \
;

		// use the dataChannel to get the current client count for use in confirm() call
		top.gDataChannel.setDataReadyCallback( _restart );
		top.gDataChannel.go( dataChnQStr );
	}	
}

var tocFrame = top.frames[ "TOC" ];

var readmeLink = 'http://service.real.com/help/library/servers.html';
var supportLink = 'http://service.real.com/index.html';
</SCRIPT>

</HEAD>

<BODY 
	bgcolor="#336699"
	style="background-color: #336699"
	onload="onLoad();"
> 

<form name="serverList">
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<TR><TD align="left" valign="top" class="headerRule" height="7" width="100%" \
colspan="3">  <SPAN class="headerRule">&nbsp;</SPAN>
</TD></TR>
<TR>
<TD align="left" valign="bottom" bgcolor="#FFFFFF"><a href="http://realnetworks.com" \
target="_blank"><img src="images/rn_logo.gif"  ALT="RealNetworks" BORDER="0" \
HSPACE="8" VSPACE="8"></A></TD> <TD align="right" valign="bottom" bgcolor="#FFFFFF" \
NOWRAP><A href="javascript://" onclick="tocFrame.gotoPage(tocFrame.welcomePage)"><img \
src="images/header.gif"  BORDER="0" HSPACE="4" VSPACE="10"></A><BR><SPAN \
class="bodyText" STYLE="position:relative;top:-2;left:-4;color:#336699;"><A \
CLASS="linkText" HREF="Javascript://" onclick="contextHelp()">Help</A> | <A \
CLASS="linkText" HREF="Javascript://" \
onclick="Javascript:launchHome(readmeLink)">Readme</A> | <A CLASS="linkText" \
HREF="Javascript:launchHome(supportLink)">Tech Support</A> | <A CLASS="linkText" \
HREF="Javascript:launchAbout()">About</A> | <A CLASS="linkText" href="javascript://" \
onclick="tocFrame.gotoPage('samples.html')">Samples</A></SPAN></TD> <TD align="right" \
width="8" bgcolor="#FFFFFF">&nbsp;</TD> </TR>
<TR>
<TD align="left"  valign="middle" bgcolor="#336699" NOWRAP \
class="headerServerLabel">Active Server:&nbsp;<SPAN \
class="headerServerName"><SCRIPT>document.write( hostname.ent() \
)</SCRIPT></SPAN></TD> <TD align="right" valign="middle" bgcolor="#336699" \
NOWRAP><span ID="imgPendChgSpan" style="visibility:hidden"><a \
href="Javascript:displayChanges()"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="16" HSPACE="4" NAME="imgPendChg" VSPACE="6" WIDTH="102"></A></span><a \
href="Javascript:doReload()"><img src="images/reload_pages_lt.gif"  BORDER="0" \
HSPACE="4" VSPACE="6"></A><a href="Javascript://" onclick="startServer()"><img \
src="images/restart_server_lt.gif"  BORDER="0" HSPACE="4" NAME="imgRestart" \
VSPACE="6"></A></TD> <TD align="right" valign="middle" bgcolor="#336699">&nbsp;</TD>
</TR>
</TABLE>
</form>	
</body>
</html>


--- NEW FILE: edituserperm.html ---

<HTML>
<HEAD>

<TITLE>Edit Permission</TITLE> 

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="dialog.js"></SCRIPT>
<SCRIPT SRC="qstr.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
	document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else
{
	document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
</SCRIPT>

<SCRIPT

<SCRIPT>
var qStr = new QStrParser();
var protectedPath = qStr.getParam( "ProtectedVirtualPath" );

function validate ()
{
	var userName = getCtrlValue( theForm.username );
	if ( userName == "" )
		return rejectInput( theForm.username, "A User Name is required." );

	var url = getCtrlValue( theForm.url );
	if ( url == "" )
		return rejectInput( theForm.url, "A Path is required." );

	var urltype = getCtrlValue( theForm.urltype );
	if (urltype == 0)
	{
		if ( url.charAt( url.length - 1 ) == '/' )
		{
			return rejectInput( theForm.url, "File paths cannot have a trailing '/'." );
		}
	}
	else
	{
		if ( url.charAt( url.length - 1 ) != '/' )
		{
			return rejectInput( theForm.url, "Directory paths must have a trailing '/'." );
		}
	}

	var test = url.substr( 0, protectedPath.length );
	if ( test != protectedPath )
	{
		return rejectInput( theForm.url, "The path entered does not belong to this Rule." \
);  }

	submitString = buildParam( "name", userName );
	submitString += buildParam( "url", url );
	submitString += buildParam( "DatabaseID", qStr.getParam( "DatabaseID" ) );

	return true ;
}

function setDate ()
{
	if ( ! validate() )
		return ;

	var newDate = getCtrlValue( theForm.newDate );
	if ( -1 == newDate.search( /[0-9]{2}\/[0-9]{2}\/[0-9]{4}:[0-9]{2}:[0-9]{2}:[0-9]{2}/ \
) )  return rejectInput( theForm.newDate, "Invalid date format" );

	var dp = newDate.split( /[\/:]/ );
	if ( dp.length != 6 )
		return rejectInput( theForm.newDate, "Invalid date format" );

	// (mm/dd/yyyy:hh:mm:ss)
	var dateObj = new Date( dp[ 2 ], dp[ 0 ] - 1, dp[ 1 ], dp[ 3 ] - 1, dp[ 4 ] - 1, dp[ \
5 ] - 1 );  if ( isNaN( dateObj.valueOf() ) )
		return rejectInput( theForm.newDate, "Invalid date format" );

	// typo in adminfs looks for "data" param instead of "date", so we'll adjust here \
cause its easier  submitString += buildParam( "data", newDate );

	//alert( submitString ); return;
	raSubmitChanges( "auth.changedate.html", submitString, "Change Expiration Date" );
}

function setTime ()
{
	if ( ! validate() )
		return ;

	var secs = getCtrlValue( theForm.timeDelta );
	if ( ! ( secs >= 1 ) )
		return rejectInput( theForm.timeDelta, "Invalid number of seconds" );

	submitString += buildParam( "timedelta", secs );

	var url = "auth." + getCtrlValue( theForm.timeAction ) + ".html" ;
	raSubmitChanges( url, submitString, "Change Time" );
}

function onLoad () 
{
	setCtrlValue( theForm.url, protectedPath + "/" );

	if ( isIE )
	{
		theForm.timeDelta.size = 7 ;
		theForm.newDate.size = 21 ;
	}
}
</SCRIPT>

</HEAD>

<SCRIPT>
onLoadHookFunc = onLoad;
</SCRIPT>

<BODY 
	CLASS="popup"	
	onload="_onLoadDefault();"
	onunload="_onUnLoadDefault();"
> 
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule" height="7" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule">&nbsp;</SPAN>
	</TD>
</TR>
<TR>
   <TD align="left" valign="middle" bgcolor="#FFFFFF" height="49">
      <img src="images/popup_header.gif"  BORDER="0" HSPACE="0" VSPACE="0">
   </TD>
   <TD align="right" valign="middle" bgcolor="#FFFFFF" height="49">
		<img src="images/popup_logo.gif"  BORDER="0" HSPACE="20" VSPACE="0">      
   </TD>
</TR>
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule2" height="9" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule2">&nbsp;</SPAN>
   </TD>
</TR>
</TABLE>
<DIV CLASS="popupPad">

<FORM 
	name="theForm" 
	method="POST" 
	action="javascript:doDlgClose(0);"
	onreset="doDlgClose(0); return false;"
> 
<table border="0" cellspacing="0" cellpadding="0" width="400" style="width:400;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Edit Permission</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="118" align="right"><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="400">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			Rule
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<SPAN class="readOnlyValue"><SCRIPT>document.write( qStr.getParam( "descr" ).ent() \
);</SCRIPT></SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">User Name</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="longInput" MAXLENGTH="14" NAME="username" SIZE="19" TYPE="text" \
VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Path Type</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<select CLASS="longInput" NAME="urltype" SIZE="1" WIDTH="100">
	            <OPTION value="0">File</OPTION>
	            <OPTION value="1">Directory</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Path</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="url" SIZE="19" TYPE="text" \
VALUE=""><SPAN CLASS="unitsOffset"><SCRIPT>document.write( 'The path must begin with \
"' + protectedPath.ent() + '/" and end with a forward slash or a filename (when Path \
Type is set to "File").');</SCRIPT></SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">New Expiration Date<BR><SPAN \
class='units'>(mm/dd/yyyy:hh:mm:ss)</SPAN></span>  </td>
		<TD class="input" valign="top" align="left" width="60%">
			<input maxlength="20" value="" name="newDate" class="input" size="15" \
type="text"><BR><input class="input" type="button" name="btnSetDate" \
onclick="setDate()" style="width:122" value="   Set New Date    "><BR>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel"><span class="offsetLabel">Change Time<BR><SPAN \
class='units'>(seconds)</SPAN></span></span>  </td>
		<TD class="input" valign="top" align="left" width="60%">
			<SELECT class="input" name="timeAction">
	        								<OPTION value="addtime">Add
	        								<OPTION value="removetime">Subtract
	        							</SELECT>
	        							<input class="input" type="text" name="timeDelta" size="6">
	        							<BR>
	        							<input class="input" type="button" name="btnSetDate" \
onclick="setTime()" style="width:122" value="   Change Time   ">  </td>
	</tr>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="400">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR><TD bgcolor="#E6E6E6" align="right" valign="middle" NOWRAP>
   <input type="image" src="images/close.gif" alt="Close Window" name="Close Window" \
value="Close" align="top" border="0"> </TD></TR>
</TABLE>
</DIV>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>

--- NEW FILE: server.inc ---

// server side include file

<!--#INCLUDE file="string.js" -->

var UA = RMAGetPropertyValue( "headers.User-Agent" );
var isIE = UA.bSearch( /MSIE/i );
var isNav = ! isIE ;
var isWin = UA.bSearch( /Win/ );
var isMac = UA.bSearch( /Mac/ );

function propToVarName( s )
{
	s = s.replace( /\./g, "$" );
	return s.replace( / /g, "_" );
}

function enumProps ( rootProp, enumFunc, maxDepth )
{
	if ( ! ( rootProp && enumFunc ) ) return ;

	// default maxDepth is zero, i.e. full recursion
	if ( enumProps.arguments.length < 3 ) maxDepth = 0 ;

	function _enumProps( rootProp, curDepth)
	{
		if ( maxDepth && ( curDepth > maxDepth ) ) return ;

		// if enumFunc returns a non-zero value that's a signal to abort the
		// enumeration
	    if( enumFunc( rootProp, RMAGetPropertyValue( rootProp ), curDepth ) ) return ;
		
		curDepth++ ;

	    var x = -1 ;
	    var subProp ;

	    while ( ( subProp = RMAGetNthProperty( rootProp, ++x ) ) )
	    {
	        _enumProps( subProp, curDepth );
	    }
		curDepth-- ;
	}

	_enumProps( rootProp, 0 );
}

// enumerates all properties which contain a subproperty == subProp
// search is case insensitive
function findSubProp ( root, subProp, callback )
{
	var re = new RegExp( "\\." + subProp + "\\.", "i" );
	
	function _enumFunc( prop, val, curDepth )
	{
		if ( re.test( '.' + prop + '.' ) )
			return callback( prop, val, curDepth );
	}
	enumProps( root, _enumFunc, 0 );
}

// returns the firt property whose baseProp == subProp and 
// whose value == srchVal
// search is case insensitive
function findSubPropVal ( root, subProp, srchVal )
{
	var matchProp = "" ;
	subProp = subProp.toLowerCase();
	srchVal = srchVal.toLowerCase();
	
	function _enumFunc( prop, val, curDepth )
	{
		if ( ( prop.rightProp().toLowerCase() == subProp ) && 
			 ( val.toString().toLowerCase() == srchVal ) )
		{
			matchProp = prop ;
			return 1 ;
		}
	}
	enumProps( root, _enumFunc, 0 );
	return matchProp ;
}

function emitSetVar( varName, newVal, isConstant )
{
	var s = varName + "=" + (( newVal == null || newVal.toString() == "null" ) ? "null" \
: (isConstant ? newVal : qVar( newVal ))) + ";\n" ;  RMAOutput( s );
}
	
function emitVarDecl( varName /*, optional initVal, optional isConstant */ )
{
	var s = "var " + varName + " " ;

	if ( arguments.length > 1 )
	{
		var initVal = arguments[ 1 ];

		var isConstant = false ;
		if ( arguments.length > 2 ) 
			isConstant = arguments[ 2 ];
			
		s += "=" + ((initVal == null || initVal.toString() == "null") ? "null" : 
						(isConstant ? initVal : qVar(initVal)));
	}
	s += " ;\n" ;

	RMAOutput( s );
}
	
function emitArrayProp( arrayName, prop, val )
{
	var s = arrayName + "[" + qVar( prop ) + "]=" ;
	s += (( val == null ) ? val : qVar(val)) + ";\n" ;

	RMAOutput( s );
}
	
	
function emitPropsToJSArray( rootProp, arrayName, maxDepth, needScript, \
fSendClearPasswords ) {
	if ( ! rootProp ) return ;
	if ( ! arrayName ) arrayName = propToVarName( rootProp );

	var s = "" ;
	var reDot = new RegExp( "\\.", "g" );
	var reEmptyList1 = new RegExp( "\\.\\s*\\." );
	var reEmptyList2 = new RegExp( "\\.\\s*$" );
	
	function _enumFunc( prop, val, curDepth )
	{
		if ( maxDepth && ( curDepth > maxDepth ) ) return ;
		
		var arrayNameTmp = arrayName ;
		
		// check for empty list names and skip em' and all thier children!
		// ie: "config.rules..SomeRuleProperty", "config.rules.  .SomeRuleProperty", \
"config.rules."  if ( prop.bSearch( reEmptyList1 ) || 
		     prop.bSearch( reEmptyList2 ) )
			return ;

		//chop off rootProp
		var subArrays = prop.substr( rootProp.length + 1);
		
		if ( subArrays )
		{
			//prepare for quoting
			subArrays = qEsc( subArrays );

			// chop up into subarrays and quote 
			arrayNameTmp += "['" + subArrays.replace( reDot, "']['" ) + "']" ;
		}

		// if this property is a list of other properties then it's value 
		// is another array (but only if we can recurse futher (check curDepth)
		if ( RMAGetNthProperty( prop, 0 ) )
		{
			s += arrayNameTmp + "=new Array();\n" ;
		}
		else
		{
			//HACK don't send passwords down the wire
			if ( (!fSendClearPasswords) && (prop.rightProp().bSearch( /password/i )) ) 
			{
 				val = '********' ;
			}

			s += arrayNameTmp + "=" + (( val == null ) ? val : qVar(val)) + ";\n" ;
		}
	}
	
	enumProps( rootProp, _enumFunc, maxDepth );

	// if the no properties were found, we want an empty array instead of null
	if ( s == (arrayName + "=null;\n") )
		s = arrayName + "=new Array();\n" ;
	
	if ( needScript ) 
		s = "<script language='javascript'>\n" + s + "</script>\n";

	RMAOutput( s );
}

function emitServArrayToClientArray( array, clientArrayName, maxDepth, needScript )
{
	if ( ! clientArrayName ) return ;

	var s = "var " + clientArrayName + " = new Array();\n" ;
		
	function _enumServArray( a, arrayName, curDepth )
	{
		if ( maxDepth && ( curDepth >= maxDepth ) ) return ;

		for ( var i in a )
		{
			if ( (a[ i ] != null) && (typeof( a[ i ] ) == "object") )
			{
				var newName = arrayName + "[" + qVar( i ) + "]" ;
				s += newName + " = new Array();\n" ;
				_enumServArray( a[ i ], newName, curDepth + 1 );
			}
			else
			{
				s += arrayName + "[" + qVar( i ) + "] = " + 
					(( a[i] == null ) ? a[i] : qVar(a[i])) + ";\n" ;
			}
		}
	}
	
	if ( array )
		_enumServArray( array, clientArrayName, 0 );

	if ( needScript ) 
		s = "<script language='javascript'>\n" + s + "</script>\n";

	RMAOutput( s );
}

function emitFSMountListNames ()
{
	var aFSMountLists = new Array();
	function enumFSMountCallback ( prop, value, curDepth )
	{
		if ( curDepth == 1 )
			aFSMountLists[ prop.rightProp( -2 ) ] = RMAGetPropertyValue( prop + ".MountPoint" \
);	  }
	enumProps( "config.FSMount", enumFSMountCallback, 1 );
	emitServArrayToClientArray( aFSMountLists, "FSMountListNames", 0 );
}


--- NEW FILE: config_mc_wm.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Windows Media Multicasting</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "12";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="propview_enum.js"></SCRIPT>
<SCRIPT SRC="propview_noedit.js"></SCRIPT>
<SCRIPT SRC="port.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?configList=config&transList=WindowsMediaMulticast.Channels"></SCRIPT>


<SCRIPT LANGUAGE="javascript">
var propSetSources =
[
	 new PropObj( 'SourceName', "", false, true, null, null, 'path', 'Source Name' )
	,new PropObj( 'Filename', "", false, true, null, null, 'path', 'Windows Media File' \
)  ,new PropObj( 'LiveFilePath',"", false, true, null, null, '', 'Stream Source' )
];

var propSetChannel =
[
	 new PropObj( 'Disabled', 			"1",	false,	true,  null,null,	'int' )
	,new PropObj( 'MulticastAddress', 	"",		false,	true, null,null,	'ip', 	'Multicast \
Address' )  ,new PropObj( 'Port', 				"",		false,	true, null,null,	'port',	'Port' )
	,new PropObj( 'TTL', 				"16",	false,	true,  null,null,	'TTL',	  'Time to Live' )
	,new PropObj( 'Description',		"",		false,	false, null,null,	'string', 'Description' \
)  ,new PropObj( 'AlternateURL', 		"",		false,	false, null,null,	'url',	'Alternate \
Unicast URL' )  ,new PropObj( 'ClientStatisticsURL',"",		false,	false, \
null,null,	'url',	'Client Statistics URL' )  ,new PropList( 'Sources',  null, null, \
propSetSources ) ];

var propSetTransChannel =
[	
	new PropObj( '_Disabled', 			"1",	false,	true,  null,null,	'int' )
];

var propSetMain =
[
	new PropObj( 'NSCFilePath', "/foozle", false, true, null, null, 'path' )
   ,new PropList( 'Channels', null, null, propSetChannel )
];

var propSetMainTransChannel =
[
   new PropList( 'Channels', null, null, propSetTransChannel )
];

var WM_MC = "Windows Media Multicast";
var propList = null;
var subListChannels = null;
var propListTransChannels = null;
var propView = null;
var propViewTransChannel = null;

function init ()
{
	if ( ! configList )
		configList = [];

	initAllPortsList( configList, WM_MC );

	propList = new PropList( "Windows Media Multicasting", configList[WM_MC], \
propSetMain );  subListChannels = propList.subList( "Channels" );

	propListTransChannels = new PropList( "Windows Media Multicasting", \
configList[WM_MC], propSetMainTransChannel );

	propView = new ChnPropView();

	sortChannels();
}

//remove transmitting channels from propList and non-transmitting channels from \
propListTransChannels function sortChannels ()
{
	function _callback ( a, propName, curDepth, curPath )
	{
		var listToDeleteFrom ;
		if ( transList &&
			 transList[ propName ] && 
			 transList[ propName ]["Transmitting"] == "1" )
		{
			listToDeleteFrom = propList;
		}
		else
		{
			listToDeleteFrom = propListTransChannels;
		}

		var subList = listToDeleteFrom.subList("Channels").subList( propName );
		if ( subList )
		{
			listToDeleteFrom.subList("Channels").delSubList( subList );
		}
	}

	if ( configList[WM_MC] && configList[WM_MC]["Channels"] )
		enumPropArray( configList[WM_MC]["Channels"], _callback, 1 );
}

function SourcePropView ()
{
	this.base = NestedEnumPropListView ;
	this.base( "Sources", propList.subList("Channels"), "Source", "", "servvar", 
				"theForm", "theSourceList", "SourceName", null,
				"SourceName", "Source" );
}
SourcePropView.prototype = new NestedEnumPropListView ;

// define a subclass of NestedPropListView that will handle the main prop set \
("NNSCFilePath" var) // and the channels sublist.
function ChnPropView ()
{
	this.base = NestedPropListView ;
	this.base( "Channels", propList, "Channel", 
				"config.Windows Media Multicast.", "servvar",
				"theForm", "theChannelList", "theChannelEdit" );

	this.m_subListParent = subListChannels;

	this.addSubView( new SourcePropView() );

	//this.m_resultsTitleListIndex = 5;
	//this.m_resultsTitlePropIndex = 6;
}
ChnPropView.prototype = new NestedPropListView ;

ChnPropView.prototype.onSubListChangeNotify = function ( action, subListName )
{

	if ( "delete" == action )
	{
		// clear the list of sources
		theForm.theSourceList.length = 0;
	}

	if ( this.m_bDoDirtyCheck )
		this.showDirtyFlag( this.isDirty() );

}	// onSubListChangeNotify

ChnPropView.prototype.postValidate = function ()
{

	if ( propViewTransChannel.validate( false, true ) )
	{
		this.m_submitString += propViewTransChannel.m_submitString;
	}

	return true;
}

ChnPropView.prototype.postSubmit = function ()
{
	propViewTransChannel.m_propList.commit();

	setTimeout( "document.location.reload( true );", 3000 );

}	// postSubmit

ChnPropView.prototype.postValidateSubList = function ( subListName )
{
	var subList = propView.getSubList( subListName );
	if ( ! subList )
	{
		return true ;
	}

	if ( subList.m_status || subList.prop( "MulticastAddress" ).isDirty() )
	{
		// check for conflicts between the multicast address with back-channel and scalable \
addresses

		var addr = subList.prop( "MulticastAddress" ).getValue();
		var addrObj = new IPAddress( addr );
		if ( ! (addrObj && addrObj.isMulticast) )
		{
			return rejectInput( theForm.MulticastAddress, 
				"Invalid Multicast Address." );
		}

		// check for conflicts with scalable multicast
		if ( configList["FSMount"] &&
			 configList["FSMount"]["Scalable Multicast"] && 
			 configList["FSMount"]["Scalable Multicast"]["Sources"] )
		{
			conflict = "";
			range = "";
			function _checkScaleAddressConflict ( a, propName, curDepth, curPath )
			{
				if ( propName == "AddressRange" )
				{
					var range = new IPRange( a[ propName ] );
					if ( range && range.isValid && 
                    	 range.addressInRange( addrObj ) )
					{
						conflict = curPath.rightProp( 2 ).leftProp();
						range = a[ propName ];
						return 1;
					}
				}
			}
			enumPropArray( configList["FSMount"]["Scalable Multicast"]["Sources"], 
							_checkScaleAddressConflict );

			if ( conflict )
			{
				return rejectInput( theForm.MulticastAddress, 
					"The '" + subListName + 
					"' Multicast Address conflicts with the Multicast Address Range used by Scalable \
Multicasting channel '" +   conflict + "' (" + range + ")." );
			}
		}

		// check for conflicts with backchannel multicast
		if ( configList["Multicast"] && 
			 configList["Multicast"]["AddressRange"] )
		{
			var range = new IPRange( configList["Multicast"]["AddressRange"] );
			if ( range && range.isValid && range.addressInRange( addrObj ) )
			{
				return rejectInput( theForm.MulticastAddress, 
					"The '" + subListName + 
					"' Multicast Address conflicts with the Multicast Address Range used by \
Backchannel Multicasting (" +   configList["Multicast"]["AddressRange"] + ")." );
			}
		}

		// check for conflicts with other WM addresses
		conflict = "";
		function _checkAddressConflict( otherSubList, prop )
		{
			// don't compare this sublist with itself
			if ( otherSubList == subList ) return;

			if ( prop.getValue() == addr )
			{
				conflict = otherSubList.toString();
				return 1;
			}
		}
		propList.propSearch( "MulticastAddress", _checkAddressConflict );
		if ( conflict )
		{
			return rejectInput( theForm.MulticastAddress, 
				"The '" + subListName + "' Multicast Address conflicts with the '" + conflict + \
"' Multicast Address." );  }
	}

	if ( subList.m_status || subList.prop( "Port" ).isDirty() )
	{
		// check for port conflict with the rest of the server configuration
		var port = subList.prop( "Port" ).getValue();
		var conflict = findPortConflictName( port );
		if ( conflict )
		{
			return rejectInput( theForm.Port, getConflictErrMsg( conflict, "Multicast Port" ) \
);  }

		// check the port against other multicast channels
		function _checkPortConflict( otherSubList, prop )
		{
			// don't compare this sublist with itself
			if ( otherSubList == subList ) return;

			if ( prop.getValue() == port )
			{
				conflict = otherSubList.toString();
				return 1;
			}
		}
		propList.propSearch( "Port", _checkPortConflict );
		if ( conflict )
		{
			return rejectInput( theForm.Port, 
				"The '" + subListName + "' Multicast Port conflicts with the '" + conflict + "' \
Multicast Port." );  }

	}

	// make sure that at least one source has been setup
	subList = subList.subList( "Sources" );
	if ( ! subList && subList.subListCount() )
	{
		alert( "At least one Channel Source must be added to '" + subListName + "' \
Channel." );  return false ;
	}

	return true;
}

var theForm = null ;

var tocFrame = findFrame( "TOC" );

function onLoad ()
{
	theForm = document.theForm;

	if (! propList )
		init();

	propViewTransChannel = new NestedPropListViewNoEdit( "Channels", \
propListTransChannels, "Channel",   "config.Windows Media Multicast.", "servvar",
				"theForm", "theTransChannelList" );
	propViewTransChannel.m_subListParent = propListTransChannels.subList( "Channels" );

	propView.onLoad( window );
	propViewTransChannel.onLoad(window, true);
}

function addSource ()
{
	if ( ! propView.getSubList() )
	{
		alert( "A multicast Channel must be created before adding a Channel Source." );
		return;
	}
	propView.subView( 'Sources' ).createSubList();
}
</SCRIPT>

</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">BROADCAST DISTRIBUTION</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
Multicasting is an alternative to traditional broadcasting that allows
multiple clients to connect to a given live stream, thereby conserving
bandwidth usage. Helix Server can deliver scalable multicasts to
Windows Media Players. This style of multicasting builds on the basic
unicasting definitions you set up according to instructions in 
<a class="linkText" href="javascript:contextHelp('config_broad_wm');">Broadcasting \
Windows Media</a>.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Windows Media Multicasting</TD> \
<TD bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="42%">
			<span class="offsetLabel">NSCFilePath</span>
		</td>
		<TD class="input" valign="top" align="left" width="58%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="NSCFilePath" SIZE="20" TYPE="text" \
VALUE="">  </td>
	</tr>
<tr </tr>
<tr>
	<TD class="input" valign="top" width="42%">
		<TABLE CLASS="PROPLIST_LABEL" width="190" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Transmitting \
Channels</TD>  <TD NOWRAP align="right"><A href="javascript://" \
onclick="propViewTransChannel.removeSubList()"><IMG src="images/delete_g.gif" \
HSPACE=1 ALT="Remove Current Channel" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theTransChannelList" SIZE="3" WIDTH="190">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="58%">
		<BR>
		<input CLASS="input" NAME="_Disabled" TYPE="checkbox" VALUE="">&nbsp;Stop \
Transmitting  </TD>
</TR>
<tr </tr>
<tr>
	<TD class="input" valign="top" width="42%">
		<TABLE CLASS="PROPLIST_LABEL" width="190" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Channels</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Channel" BORDER=0></A><A href="javascript://" onclick="propView.removeSubList()"><IMG \
src="images/delete_g.gif" HSPACE=1 ALT="Remove Current Channel" BORDER=0></A><A \
href="javascript://" onclick="propView.copySubList()"><IMG src="images/copy_g.gif" \
HSPACE=1 ALT="Copy Current Channel" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theChannelList" SIZE="8" WIDTH="190">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="58%">
		Channel Name
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theChannelEdit" SIZE="20" \
TYPE="text" VALUE="">

		<BR>
		<SCRIPT>if ( isNav6 ){document.write( '<BR>' );}</SCRIPT>
		<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="1" WIDTH="100%">
		<TR>
			<TD valign="middle" class="input" width="50%">
				Enable&nbsp;Broadcast
			</TD>
			<TD valign="middle" class="input"  width="50%">
				<select class="longInput" size="1" width="118" name="Disabled">
					<OPTION value="1">No
					<OPTION value="0">Yes
				</SELECT>
			</TD>
		</TR>
		</TABLE>
		<BR>
		Multicast Address
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="MulticastAddress" SIZE="20" \
TYPE="text" VALUE="">  <TABLE BORDER="0" CELLPADDING="0" CELLSPACING="1" \
WIDTH="100%">  <TR>
			<TD valign="bottom" class="input" WIDTH="24%">
				Port
			</TD>
			<TD valign="bottom" class="input" WIDTH="24%">
				TTL
			</TD>
		</TR>
		<TR>
			<TD valign="top" class="input">
				<input maxlength="5"   class="longInput" size="3" value="" type="text" \
name="Port">  </TD>
			<TD valign="top" class="input">
				<input maxlength="3"   class="longInput" size="3" value="" type="text" \
name="TTL">  </TD>
		</TR>
		</TABLE>
		<BR>
		<SCRIPT>if ( isNav4 ){document.write( '<SPAN class="input">' );}</SCRIPT>

		Stream Description (optional)
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Description" SIZE="20" TYPE="text" \
VALUE="">

		Alternate Unicast URL (optional)
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="AlternateURL" SIZE="20" TYPE="text" \
VALUE="">

		Client Statistics URL (optional)
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="ClientStatisticsURL" SIZE="20" \
TYPE="text" VALUE="">

		<SCRIPT>if ( isNav4 ){document.write( '</SPAN>' );}</SCRIPT>
	</TD>
</TR>
<tr>
	<TD class="input" valign="top" width="42%">
		<TABLE CLASS="PROPLIST_LABEL" width="190" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Channel Sources</TD>
		<TD NOWRAP align="right"><A href="javascript://" onclick="addSource()"><IMG \
src="images/add_g.gif" HSPACE=1 ALT="Add New Source" BORDER=0></A><A \
href="javascript://" onclick="propView.subView( 'Sources' ).removeSubList()"><IMG \
src="images/delete_g.gif" HSPACE=1 ALT="Remove Current Source" BORDER=0></A><A \
href="javascript://" onclick="propView.subView( 'Sources' ).incSubList(-1)"><IMG \
src="images/moveup_g.gif" HSPACE=1 ALT="Move Current Source Up" BORDER=0></A><A \
href="javascript://" onclick="propView.subView( 'Sources' ).incSubList(1)"><IMG \
src="images/movedown_g.gif" HSPACE=1 ALT="Move Current Source Down" \
BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theSourceList" SIZE="4" WIDTH="190">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>

		<SPAN CLASS="units"><A class="linkTextSmall" \
HREF="javascript:tocFrame.gotoPage('config_broad_wm.html')">Set up</A> Windows Media \
Encoder.</SPAN>  </TD>
	<TD class="input" valign="top" width="58%">
		Channel Source Name
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="SourceName" SIZE="20" TYPE="text" \
VALUE="">

		Stream Format File (.asf)
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Filename" SIZE="20" TYPE="text" \
VALUE="">

		Live Source
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="LiveFilePath" SIZE="20" TYPE="text" \
VALUE="">  </TD>
</TR>

<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: datachn.js ---

var frameFile = "datachannel.html" ;

function DataChannel ( frameName )
{
	if ( top.gDataChannel != null ) return top.gDataChannel ;

	this.m_frameName					= frameName ;

	this.dataReadyCallback 			= null ;
	this.dataReadyCallbackUserArgs	= null ;
	this.inUse 						= false ;
	this.m_frame					= null ;

	return this ;
}

DataChannel.prototype.frameName = function ()
{
	if ( (arguments.length == 0) || (! arguments[ 0 ]) )
	{
		return this.m_frameName ;
	}
	else
	{
		var oldName = this.m_frameName ;
		this.m_frameName = arguments[ 0 ];
		this.m_frame = findFrame( this.m_frameName );
		return oldName ;
	}
}

DataChannel.prototype.frame = function ()
{
	if ( (arguments.length == 0) || (! arguments[ 0 ]) )
	{
		return this.m_frame ;
	}
	else
	{
		// is this really a window?
		if ( typeof( frame ) == "object" && frame.document )
		{
			this.m_frame = arguments[ 0 ];
			this.m_frameName = this.m_frame.name ;
			// no return value: old frame may be gone
		}
	}
}

DataChannel.prototype.setDataReadyCallback = function ( callback, userArgs )
{
	this.dataReadyCallback 			= callback ;
	this.dataReadyCallbackUserArgs	= userArgs ;
}

DataChannel.prototype.getServerData = function ()
{
	// force the dataChannel to refresh and fetch the property data
	if ( ! this.inUse )
	{
		/*
			arguments are registry property names whose values we'll fetch 
			from the dataChannel, we tell the server what properties we're interested 
			in by passing them in the query string of the datachannel URL
		*/
		var qStr = "" ;
		for ( var i = 0; i < arguments.length; i++ )
		{
			if ( (arguments[ i ] != null) && (arguments[ i ] != "") )
				qStr += arguments[ i ] + '=&' ;
		}

		this.go( qStr );
	}

}	// getServerData

DataChannel.prototype.go = function ( qStr )
{
	if ( ! this.m_frame ) this.m_frame = findFrame( this.m_frameName );

	if ( this.m_frame )
	{
		this.inUse = true ;
		this.m_frame.location = frameFile + "?" + qStr ;
	}
}

DataChannel.prototype.chgConfig = function
( 
	chgType,			// "servvar" or "configvar"
	chgParams 			// parameter string to submit to server
)
{
	if ( ! this.m_frame ) this.m_frame = findFrame( this.m_frameName );

	if ( this.m_frame )
	{
		// TODO reuse raSubmitCHnages for this
		//	PROCESS ARGS for bad things
		// strip off leading/trailing '&' seperators
		chgParams = chgParams.replace( /^&*/, '' );
		chgParams = chgParams.replace( /&*$/, '' );
		var url = chgType + ".set.html?respage=datachannel.html&" + chgParams ;

		this.inUse = true ;
		this.m_frame.location.href = url ;
	}
}

// when the dataChannel has finished loading we'll be notified via this function
DataChannel.prototype.onDataReady = function ()
{
	//alert( "data has arrived" );

	// make sure we really need to fire the event
	if ( this.dataReadyCallback && this.inUse)
	{
		this.dataReadyCallback( this.dataReadyCallbackUserArgs );
	}

	this.inUse = false ;
}


--- NEW FILE: propview_nolist.js ---

//<SCRIPT>

function PropListView ( listName, propList, configRootPath, serverMethod,
	sFormName, aDirtyImgNames )
{

	if ( ! PropListView.bIsInitialized )
		PropListView.initClass();

	this.m_name = listName;

	this.m_configRootPath = configRootPath;
	this.m_serverMethod = (serverMethod ? serverMethod : "servvar");

	this.m_propList = propList ;

	this.m_submitString = "";
	this.m_oWin = null;
	this.m_oDoc = null;

	this.m_sFormName = sFormName ;
	this.m_aDirtyImgNames = (aDirtyImgNames ? aDirtyImgNames : ["IMG_DIRTY_TAB", \
"IMG_DIRTY_APPLY"] );

	this.m_parent = null ;

	this.m_resultsTitleListIndex = 3;
	this.m_resultsTitlePropIndex = 4;

	this.m_origClickHandler = null;
	this.m_origKeyUpHandler = null;

	this.m_bDoDirtyCheck = true ;

	this.m_imgSrcDirty = PropListView.imgSrcDirty;
	this.m_imgSrcClean = PropListView.imgSrcClean;

	this.m_hDirtyCheckTimerID = null;

	this.m_subViews = new Array();

	this.m_bLoaded = false;

}	// PropListView ()

// class data
PropListView.aDirtyImgNames = null;
PropListView.imgSrcDirty = null;
PropListView.imgSrcClean = null;
PropListView.bIsInitialized = false;

PropListView.InitClass = function ()
{
	// initialize class data
	PropListView.aDirtyImgNames = ["IMG_DIRTY_TAB", "IMG_DIRTY_APPLY"];
	PropListView.imgSrcDirty = new Image();
	PropListView.imgSrcDirty.src = "images/arrow.gif" ;
	PropListView.imgSrcClean = new Image();
	PropListView.imgSrcClean.src = "images/spacer.gif" ;

	PropListView.DIRTY_CHECK_SUPRESS_TIME = 1000 ;	//millisecs

	PropListView.bIsInitialized = true;
}

PropListView.prototype.addSubView = function ( subView )
{

	this.m_subViews[ subView.m_name ] = subView ;
	subView.m_parent = this ;

	// a sub view shouldn't do dirty checks - presumably the parent does 'em
	subView.m_bDoDirtyCheck = false ;

}	// addSubView ()

PropListView.prototype.toString = function ()
{
	return this.m_name ;
}

PropListView.prototype.subView = function ( subViewName )
{
	return this.m_subViews[ subViewName ];
}

PropListView.prototype.formName = function ( sFormName )
{
	if ( sFormName )
	{
		this.m_sFormName = sFormName ;
	}

	return this.m_sFormName ;
}

PropListView.prototype.getForm = function ( subListName )
{
	return getElem( this.m_sFormName );
}

PropListView.prototype.preOnLoad = function ()
{
	return true ; // continue with super class onLoad
}

/* 
	before calling this function make sure the propList member has been initialized.
	
	Call this method from your pages onload handler, passing in the
	following page element/obj references:
		oWin		the page's window object, required

	after using the parameters to initialize the object's member properties, onPrelLoad \
is called. This allows  subclasses to perform any need initialization. The base \
class's implementation jsut returns true, if an   subclass's onPreLoad returns false \
the bodyof onLoad is skipped.

	The bodyof this method initializes the form using propList data as well as creating \
an EditSelect obj  to tie the list and edit controls together.

	onPostLoad is then called at the end. A do nothing method in the base class \
onPostLoad should be overridden  in sub classes to perform custom actions - \
                hide/show/resize elements etc.
*/

PropListView.prototype.onLoad = function ( oWin, fNoInitForm, fNoDisplayData )
{

	// initialize member variables TODO validate parameters	
	if (! oWin ) return;

	if ( ! isXblibInit ) xblibInit();

	this.m_oWin = oWin;
	this.m_oDoc = oWin.document;

	this.m_bLoaded = true ;

	if ( this.preOnLoad() )
	{
		this.m_propList.reset();

		if( this.m_bDoDirtyCheck )
			this.showDirtyFlag( false );

		if ( ! fNoInitForm )
			clearForm( this.getForm() );

		//init any subViews
		for ( var subViewName in this.m_subViews )
		{
			var subView = this.m_subViews[ subViewName ];
			if ( subView )
			{
				subView.onLoad( oWin, true, true );
			}
		}

		if ( ! fNoDisplayData )
		{
			this.initListDataDisplay();
		}

		if ( ! fNoInitForm )
			this.hookForm();
	}
	this.postOnLoad();

}	// onLoad()

PropListView.prototype.initListDataDisplay = function ()
{
	this.m_propList.fillForm( this.getForm() );
}

PropListView.prototype.postOnLoad = function ()
{
	// no return value needed
}

PropListView.prototype.setPropList = function ( propList )
{
	this.m_propList = propList ;

}	// setPropList

PropListView.prototype.preValidate = function ()
{
	return true;
}

/* ------------ validate the form and create the submit string --------------*/
PropListView.prototype.validate = function ( fNoSubmitString )
{
	if ( ! this.m_bLoaded ) return ;

	this.m_submitString = "" ;

	if ( ! this.preValidate() )
	{
		
		return false ;
	}

	var ctrl = this.m_propList.validate( this.getForm() );
	if ( ctrl ) 
	{
		
		return rejectInput( ctrl, this.m_propList.errMsg );
	}

	if ( ! fNoSubmitString )
		this.buildParamString();

	if ( ! this.postValidate() )
	{
		
		return false ;
	}

	// chk for unchanged condition
	if ( (!fNoSubmitString) && (!this.m_submitString) )
	{
		alert( "No changes were made to the " + this.m_name + " settings." );
		return false ;
	}

	return true ;

}	// validate ()

PropListView.prototype.postValidate = function ()
{
	return true;
}

PropListView.prototype.buildParamString = function ()
{
	if ( ! this.m_bLoaded ) return ;

	
	
	function _getInstanceOf_buildParamStringCallback ( obj )
	{
		return function( propList, prop, paramStr )
		{
			return obj.buildParamStringCallback( propList, prop, paramStr );		
		}
	}
	
	this.m_submitString = this.m_propList.buildParamString( 
		this.m_configRootPath, false, _getInstanceOf_buildParamStringCallback( this ) );

}	// buildParamString ()

PropListView.prototype.buildParamStringCallback = function ( propList, prop, paramStr \
) {
	return paramStr ;
}

PropListView.prototype.doSubmit = function ()
{
	if ( ! this.m_bLoaded ) return ;

	function _getInstanceOf_resultsCallback ( obj )
	{
		return function(results)
		{
			return obj.resultsCallback(results);		
		}
	}

	var method = (this.m_serverMethod == 
		"servvar" ? (this.m_propList.needRestart() ? "configvar" : "servvar") : \
this.m_serverMethod);  raSubmitChanges( method, this.m_submitString, 
		this.m_name + " Settings", _getInstanceOf_resultsCallback( this ) );

	this.m_propList.commit();
	commitForm( this.getForm() );
	
	if( this.m_bDoDirtyCheck )
		this.showDirtyFlag( false );

	this.postSubmit();

}	// doSubmit ()

PropListView.prototype.postSubmit = function ()
{
}	// postSubmit

PropListView.prototype.resultsCallback = function ( results )
{
	// TODO use members to determine the properties to print
	// use the fourth and fifth properties as the result title
	var res;
    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];
        res.title = propName.rightProp();
	}
}

PropListView.prototype.hookForm = function ()
{
	if ( ! this.m_bLoaded ) return ;

	if( this.m_bDoDirtyCheck )
	{
		//because of Mozilla Bug 49980 (as of 4/11/01) we can't use anonymous functions
		//as event handlers - so we assign the instance method call generated by
		// getInstanceEventHandler() to a variable of TOC window...
		this.m_oWin._onDocClick = getInstanceEventHandler( this, "onFormKeyOrClick" );

		//... and then hook it in as the document's click handler
		this.m_origClickHandler = addEvent( this.m_oDoc, "click", 
			this.m_oWin._onDocClick, 1, "Event.CLICK" );

		// ...do the same for the keyup event
		this.m_oWin._onDocKeyUp = getInstanceEventHandler( this, "onFormKeyOrClick" );
		this.m_origKeyUpHandler = addEvent( this.m_oDoc, "keyup", 
			this.m_oWin._onDocKeyUp, 1, "Event.KEYUP" );

		// ...set up the timeout handler
		this.m_oWin._doDirtyChk = getInstanceEventHandler( this, "doDirtyChk" );
	}

}	// hookForm ()

PropListView.prototype.onFormKeyOrClick = function ( evt )
{
	if ( ! this.m_bLoaded ) return ;

	// if we've already set the time then ignore
	if ( this.m_bDoDirtyCheck && (!this.m_hDirtyCheckTimerID) )
	{
		var oForm = this.getForm();

		// if the event src element is not part of our form then ignore
		var srcElem = ( isIE ? this.m_oWin.event.srcElement : evt.target );
		if ( (srcElem.form && (srcElem.form == oForm)) ||
			 (oForm == getParentByTagName( srcElem, "FORM" )) )
		{
			
			this.m_hDirtyCheckTimerID = this.m_oWin.setTimeout( "_doDirtyChk()", \
PropListView.DIRTY_CHECK_SUPRESS_TIME );  }
	}

	var evtType = ( evt ? evt.type : this.m_oWin.event.type );
	if ( this.m_origClickHandler && (evtType == "click") )
	{
		return this.m_origClickHandler( evt );
	}
	else if ( this.m_origKeyUpHandler )
	{
		return this.m_origKeyUpHandler( evt );
	}

	if ( isNav4 )
	  	this.m_oDoc.routeEvent( evt );

	return true ;

}	// onFormKeyOrClick

PropListView.prototype.doDirtyChk = function ()
{
	if ( ! this.m_bLoaded ) return ;

	if ( this.m_bDoDirtyCheck )
	{

		this.showDirtyFlag( this.isDirty() );
		this.m_hDirtyCheckTimerID = null ;
	}
}

PropListView.prototype.isDirty = function ()
{
	if ( ! this.m_bLoaded ) return ;

	
	if ( ! this.m_bDoDirtyCheck ) 
	{
		return false;
	}
	else
	{
		return ( this.m_propList.isFormDirty( this.getForm(), 1 ) || 
				 this.m_propList.isDirty() || this.postIsDirty() );
	}
}

PropListView.prototype.postIsDirty = function ()
{
	return false ;
}

PropListView.prototype.showDirtyFlag = function ( bIsFormDirty )
{
	if ( ! this.m_bLoaded ) return ;

	if ( this.m_bDoDirtyCheck )
	{
		for ( var i = 0; i < this.m_aDirtyImgNames.length; i++ )
		{
			var oImgDirty = getElem( this.m_aDirtyImgNames[ i ] );
			if ( oImgDirty )
			{
				oImgDirty.src = 
				(bIsFormDirty ? 
					this.m_imgSrcDirty.src : 
					this.m_imgSrcClean.src);
			}
		}
	}
}

PropListView.InitClass();

//</SCRIPT>


--- NEW FILE: enumproplist.js ---

//<SCRIPT>

/*

Helper class for dealing with enumerated configuration file lists like the 
following:

<List Name="HTTPDeliverable">
    <Var Path_0="/admin"/>
    <Var Path_2="/ramgen"/>
    <Var Path_1="/farm"/>
    <Var Path_3="/scalable"/>
</List>

Usage:

in server code do something like this:

emitPropsToJSArray( "config.HTTPDeliverable", "httpDelivList", 0, 0 );

On the client side, instantiate an EnumPropList object like so:

var httpEnumList = new EnumPropList( httpDelivList, "config.HTTPDeliverable", "Path_" \
);

during the onLoad handler for your page, use this to populate a <SELECT> list:

httpEnumList.fillSelectList( theForm.HTTPLIST );

uses a form control to display current values and retrieve new values,

when a select control is used the class addes the 

*/

function EnumPropList ( name, initVals, listEnumPrefix, enumIncAmount, ctrlName )
{

	this.base = PropList ;
	this.base( name );

	this.m_oForm = null;
	this.m_ctrlName = ( ctrlName ? ctrlName : name );

	this.m_origValues = new Array();
	this.m_prefix = ( (listEnumPrefix!=null) ? listEnumPrefix : "item_" );
	if ( (enumIncAmount == null) || 
		 (parseInt( enumIncAmount ) != enumIncAmount) )
	{
		this.m_enumIncAmount = 1;
	}
	else
	{
		this.m_enumIncAmount = enumIncAmount;
	}

	this.m_newValues = new Array();
	this.m_propSet = 1;

	if ( initVals )
	{
		this.initProps( initVals );
	}

	return this ;
}
EnumPropList.prototype = new PropList ;

EnumPropList.prototype.copy = function ( destList )
{

	destList.m_parent = this.m_parent ;
	destList.m_oldName = "" ;
	destList.m_status = "added" ;
	destList.m_bRestart = this.m_bRestart ;
	destList.m_bRestartOnDelete = this.m_bRestartOnDelete ;

	// make copys of the this list's original values
	destList.m_origValues = copyIndexedArray( this.m_origValues );
	destList.m_newValues = copyIndexedArray( this.m_newValues );

	destList.m_oForm = this.m_oForm;

}	// copy ()

EnumPropList.prototype.initProps = function ( initVals )
{
	this.m_origValues.length = 0;

	// pivot the original list into a hash for easy lookup (eliminates duplicates also)
	if ( initVals )
	{

		var sortList = new Array();
		for ( var key in initVals )
		{
			// does key match the form listEnumPrefix<Enum>?
			if ( -1 != this.parseEnumIndex( key ) )
			{
				sortList[ sortList.length ] = key;
			}
		}

		if ( isIE )
			sortList.sort( sortCaseInsensitive );
		else
			sortList.sort();	

		for ( var i = 0; i < sortList.length; i++ )
		{
			var key = sortList[ i ];
			var keyValue = initVals[ key ];

			this.m_origValues[ this.m_origValues.length ] = keyValue ;
			this.m_newValues[ this.m_newValues.length ] = keyValue ;

			
		}
	}

}	// initProps

EnumPropList.prototype.createNew = function ( newName )
{

	return null ;	

}	// copy ()

EnumPropList.prototype.setForm = function ( oForm )
{
	if ( oForm )
		this.m_oForm = oForm;
}

// save the contents of selCtrl into m_newValues
EnumPropList.prototype.validate = function ( oForm, fIgnoreErrors )
{

	return true;

}	// validate ()

// convert the contents of the associated Select control into
// a param string
EnumPropList.prototype.buildParamString = function ( rootPropPath, fForce, \
paramCallbackFunc ) {
	if ( (!fForce) && 
		 (this.m_newValues.toString() == this.m_origValues.toString()) )
		return "";

	// first destroy the old list
	var posLastDotFromEnd = 0;
	if ( "." == rootPropPath.charAt( rootPropPath.length - 1 ) )
		posLastDotFromEnd = -1 ;

	var qStr = buildParam( rootPropPath.slice( 0, posLastDotFromEnd ), "" );
	if ( paramCallbackFunc )
	{
		qStr = paramCallbackFunc( this, null, qStr );
	}

	// recreate it using the contents of m_newValues

	var enumIndex = this.m_enumIncAmount;
	// make copys of the this list's original values
	for ( var i = 0; i < this.m_newValues.length; i++ )
	{
		var propValue = this.m_newValues[ i ];
		if ( ! isBlank( propValue ) )
		{
			paramStr = buildParam( rootPropPath + this.m_prefix + enumIndex, propValue );
			if ( paramCallbackFunc )
			{
				paramStr = paramCallbackFunc( this, null, paramStr );
			}
			qStr += paramStr ;
			enumIndex += this.m_enumIncAmount;
		}
	}

	return qStr ;

}	// buildParamString ()

EnumPropList.prototype.reset = function ()
{

	this.m_newValues = copyIndexedArray( this.m_origValues );

}	// reset ()

EnumPropList.prototype.propCount = function ()
{
	var nCount = this.m_newValues.length ;

	return nCount ;

}	// nCount ()

EnumPropList.prototype.clearList = function ()
{
	this.m_newValues.length = 0;
}

EnumPropList.prototype.isDirty = function ( oForm )
{

	return ( this.m_newValues.toString() != this.m_origValues.toString() );

}	// isDirty ()

EnumPropList.prototype.commit = function ()
{

	this.m_origValues = copyIndexedArray( this.m_newValues );

}	// commit ()

EnumPropList.prototype.parseEnumIndex = function ( enumName )
{
	var enumIndex = -1 ;
	var regExp = new RegExp( "^" + escRegExMetaChars( this.m_prefix ) + "(\\d+)" + "$", \
"i" );

	// make sure enumName is a string
	enumName = enumName + "";

	// does key match the form listEnumPrefix<Enum>?
	var tempA = enumName.match( regExp );
	if ( tempA && tempA[ 1 ] )
	{
		enumIndex = parseInt( tempA[ 1 ] );
		if ( isNaN( enumIndex ) )
			enumIndex = -1 ;
	}

	return enumIndex;
}	

EnumPropList.prototype.propNames = function ()
{
	return null;
}

EnumPropList.prototype.addPropValue = function ( oForm, propValue )
{

}	// addPropValue ()

EnumPropList.prototype.fillForm = function ( oForm )
{

}	// PropList.prototype.fillForm ()

EnumPropList.prototype.getDisplayCtrl = function ( oForm )
{
	if ( oForm ) this.setForm( oForm );

	if ( this.m_oForm )
	{
		return this.m_oForm[ this.m_ctrlName ];
	}
	
	return null ;

}	// PropList.prototype.getDisplayCtrl ()

// overrides of PropList methods that 'do nothing'

EnumPropList.prototype.initSubLists = function ( initVals, propSet ){}
EnumPropList.prototype.value = function ( name ){return null;}
EnumPropList.prototype.addSubList = function ( subList, status ){}
EnumPropList.prototype.copySubList = function ( srcName, copyName ){}
EnumPropList.prototype.clearForm = function ( form ){}
EnumPropList.prototype.fillSelectList2 = function ( selectCtrl, propName ){}
EnumPropList.prototype.propSearch = function ( propNameExp, callback ){}
EnumPropList.prototype.save = function ( form ){}
EnumPropList.prototype.setFormDefaults = function ( form ){}
EnumPropList.prototype.resetToDefaults = function ( form ){}

/****

	EnumPropListSel
	
	EnumPropListSel sub classes EnumPropListSel and uses a Select Control to display \
items

****/

function EnumPropListSel ( name, initVals, listEnumPrefix, enumIncAmount, ctrlName )
{

	this.base = EnumPropList ;
	this.base( name, initVals, listEnumPrefix, enumIncAmount, ctrlName );

	return this ;
}
EnumPropListSel.prototype = new EnumPropList ;

EnumPropListSel.prototype.createNew = function ( newName, fCopy )
{
	if ( isBlank( newName ) ) 
		newName = this.m_name ; 

	var newList = new EnumPropListSel( newName, null, this.m_prefix, \
this.m_enumIncAmount, this.m_ctrlName );  if ( fCopy )
		this.copy( newList );

	return newList;

}	// createNew

EnumPropListSel.prototype.swapValueOrder = function ( oForm, dir )
{

	if ( oForm ) this.setForm( oForm );

	selectMoveItem( this.getDisplayCtrl(), dir );

}	// swapValueOrder ()

EnumPropListSel.prototype.addPropValue = function ( oForm, propValue )
{

	if ( oForm ) this.setForm( oForm );

	var ctrl = this.getDisplayCtrl();
	if ( ctrl )
	{
		// make sure this propValue isn't in the list already
		if ( -1 == selectFind( ctrl, propValue ) )
		{
			selAddOption( ctrl, propValue );
		}
	}

}	// addPropValue ()

EnumPropListSel.prototype.removeCurSelValue = function ( oForm )
{

	if ( oForm ) this.setForm( oForm );

	selectDel( this.getDisplayCtrl() );

	return true ;

}	// removeProp ()

// save the contents of selCtrl into m_newValues
EnumPropListSel.prototype.validate = function ( oForm, fIgnoreErrors )
{

	if ( oForm ) this.setForm( oForm );

	var ctrl = this.getDisplayCtrl();
	if ( ! ctrl ) return null ;

	// first destroy the current list
	this.m_newValues = new Array();

	for ( var i= 0; i < ctrl.options.length; i++ )
	{
		var propValue = ctrl.options[ i ].value ;
		if ( ! isBlank( propValue ) )
		{
			this.m_newValues[ this.m_newValues.length ] = propValue ;
		}
	}

	return null ;

}	// validate ()

EnumPropListSel.prototype.fillForm = function ( oForm )
{

	if ( oForm ) this.setForm( oForm );

	var ctrl = this.getDisplayCtrl();
	if ( ! ctrl ) return ;

	ctrl.options.length = 0;
	for ( var i = 0; i < this.m_newValues.length; i++ )
	{
		selAddOption( ctrl, this.m_newValues[ i ] );
	}

}	// fillForm ()

EnumPropListSel.prototype.isFormDirty = function ( oForm )
{

	if ( oForm ) this.setForm( oForm );

	var ctrl = this.getDisplayCtrl();
	if ( ! ctrl ) return false ;

	var tempA = new Array();
	for ( var i= 0; i < ctrl.options.length; i++ )
	{
		var propValue = ctrl.options[ i ].value ;
		if ( ! isBlank( propValue ) )
		{
			tempA[ tempA.length ] = propValue;
		}
	}

	return (tempA.toString() != this.m_origValues.toString());

}	// isFormDirty ()

/****

	EnumPropListText
	
	EnumPropListText sub classes EnumPropList and uses an edit or textarea Control to \
display items

****/

function EnumPropListText ( name, initVals, listEnumPrefix, enumIncAmount, ctrlName, \
sepStr, parseRegExp ) {

	this.base = EnumPropList ;
	this.base( name, initVals, listEnumPrefix, enumIncAmount, ctrlName );

	// sepStr is used to separate the property values when displaying them
	// in a text control. Ex: ", "
	this.m_sepStr = sepStr;

	// parseRegExp is used when parsing out the property values from a text control
	// Ex: "\s*,\s*"
	this.m_parseRegExp = (parseRegExp ? parseRegExp : new RegExp( sepStr ) );

	return this ;
}
EnumPropListText.prototype = new EnumPropList ;

EnumPropListText.prototype.createNew = function ( newName, fCopy )
{
	if ( isBlank( newName ) ) 
		newName = this.m_name ; 

	var newList = new EnumPropListText( newName, null, this.m_prefix, 
		this.m_enumIncAmount, this.m_ctrlName, this.m_sepStr, this.m_parseRegExp );

	if ( fCopy )
		this.copy( newList );

	return newList;

}	// createNew

EnumPropListText.prototype.getValuesHash = function ( oForm )
{

	if ( oForm ) this.setForm( oForm );

	var valuesHash = new Object();

	var ctrl = this.getDisplayCtrl();
	if ( ctrl )
	{
		var sPropValues = getCtrlValue( ctrl );
		var tempA = sPropValues.split( this.m_parseRegExp );
		for ( var i= 0; i < tempA.length; i++ )
		{
			if ( (!isBlank( tempA[ i ] )) && 
				   isBlank( valuesHash[ tempA[ i ] ] ) )
			{
				valuesHash[ tempA[ i ] ] = 0;
			}
		}
	}

	return valuesHash ;

}	// getValuesHash ()

EnumPropListText.prototype.getValuesArray = function ( oForm )
{

	if ( oForm ) this.setForm( oForm );

	var valuesArray = new Array();
	var valuesHash = this.getValuesHash();

	var ctrl = this.getDisplayCtrl();
	if ( ctrl )
	{
		var sPropValues = getCtrlValue( ctrl );
		var tempA = sPropValues.split( this.m_parseRegExp );
		var nextX = 0;
		for ( var i= 0; i < tempA.length; i++ )
		{
			if ( (!isBlank( tempA[ i ] )) && 
				 (0 == valuesHash[ tempA[ i ] ]) )
			{
				valuesArray[ nextX++ ] = tempA[ i ];
				valuesHash[ tempA[ i ] ] = 1;
			}
		}
	}

	return valuesArray ;

}	// getValuesArray ()

EnumPropListText.prototype.fillForm = function ( oForm )
{

	if ( oForm ) this.setForm( oForm );

	var ctrl = this.getDisplayCtrl();
	if ( ! ctrl ) return ;

	var sPropValues = "";
	for ( var i = 0; i < this.m_newValues.length; i++ )
	{
		sPropValues += this.m_newValues[ i ];
		if ( i < (this.m_newValues.length - 1) )
		{
			sPropValues += this.m_sepStr ;
		}
	}

	setCtrlValue( ctrl, sPropValues, true );

}	// fillForm ()

EnumPropListText.prototype.addPropValue = function ( oForm, propValue )
{

	if ( oForm ) this.setForm( oForm );

	var ctrl = this.getDisplayCtrl();
	if ( ! ctrl ) return;

	// make sure this propValue isn't in the text ctrl already
	if ( isBlank( this.getValuesHash()[ propValue ] ) )
	{
		var sPropValues = getCtrlValue( ctrl );
		sPropValues += (isBlank(sPropValues) ? "" : this.m_sepStr) + propValue ;
		setCtrlValue( ctrl, sPropValues );
	}

}	// addPropValue ()

EnumPropListText.prototype.isFormDirty = function ( oForm )
{

	if ( oForm ) this.setForm( oForm );

	var ctrl = this.getDisplayCtrl();
	if ( ! ctrl ) return false;

	return (this.getValuesArray().toString() != this.m_origValues.toString());

}	// isFormDirty ()

// save the contents of the text ctrl into m_newValues
EnumPropListText.prototype.validate = function ( oForm, fIgnoreErrors )
{

	if ( oForm ) this.setForm( oForm );

	this.m_newValues = this.getValuesArray();

	return true ;

}	// validate ()

//</SCRIPT>

--- NEW FILE: regview_main.html ---

<html>
<head>

<STYLE>

BODY.CONFIG
{
	background-color:	white ;
	padding-left:		0 ;
	padding:			0 ;
	margin: 			0;
	font-size:      	8.5pt;
}
CAPTION
{
	background-color: "#BBBBBB" ;
}
TD, CAPTION, TH
{ 
	font-family:      	Arial,Geneva;
	font-size:        	8pt;
	font-weight:      	500;
	color:            	#333355;
	text-align:       	left;
}
TH 
{
	font-weight:      	600;
}

</STYLE>

<SCRIPT></SCRIPT>

</head>
<BODY
	CLASS="CONFIG"
> 

<LAYER ID="DATA_LAYER"></LAYER>
<DIV ID="DATA_DIV"></DIV>

</body>
</html>

--- NEW FILE: regpick_toc.html ---

<HTML>
<HEAD>

<script src="xblib.js"></script>
<script src="tree.js"></script>

<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT src="qstr.js"></SCRIPT>
<SCRIPT src="regpick_list.js"></SCRIPT>

<link rel=stylesheet href="regtree_nav.css" type="text/css">
<STYLE TYPE="text/css">
	/* nav4 ignores \@import rule */
	@import url("regtree_w3c.css");

	TD
	{
		color: 			#FFFFCC;
		font-family:    Verdana, Arial, Helvetica, sans-serif;
		font-size:      11px;
		width:			100%;
	}

	.Strong
	{
		color: 			#FFFFCC;
		font-family: 	Arial,Helvetica,Geneva;
		font-weight: 	600;
		font-size:      11px;
	}
</STYLE>

<SCRIPT LANGUAGE="JavaScript">
if ( ! TOCTree.bInitialized ) TOCTree.initTOCTreeClass();

var	imgOpenSrc = "images/minus_tree.gif" ;
var	imgCloseSrc = "images/plus_tree.gif" ;
var	imgLeafSrc  = "images/solid_tree.gif" ;

function REGTree ( winTOC, winContent )
{
	this.base = window.TOCTree ;
	this.base( winTOC, winContent );

	this.m_bDoArrowKeyNav = false ;

	this.m_bSyncTOCWithContent = false ;
	this.m_bHiliteCurLink = false ;

	this.m_hiColor = "blue";
	this.m_hiBGColor = "gray";

	if ( isIE )
	{
		this.m_basePath = "";
	}
	this.m_imgOpenSrc  = imgOpenSrc ;
	this.m_imgCloseSrc = imgCloseSrc ;
	this.m_imgLeafSrc  = imgLeafSrc ;

	// various magic numbers for Nav4
	if ( isNav4 )
	{
		this.m_nYOffset = 40 ;		// the Y pos for the first TOC link - we have to absolutly \
position it in Nav4

		// in Nav4 we can't read a folder's className attribute so we have to infer its \
level in the  // hierarchy by comparing its "left" attribute to the following:
		this.m_nIndentDelta = 14 ;	// no. of pixels each class is indented - should match \
stylesheet  this.m_nXOffset = 10;		// no. of pixels root level folder is indented - \
should match stylesheet  }

}REGTree.prototype = new window.TOCTree ;

REGTree.prototype.si = function ( divID )
{
	if ( ! this.m_bInitialized ) return ;

	if ( isBlank( divID ) ) return;
	if ( null == linkMap[ divID ] ) return;
	if ( null == IDToPathMap[ divID ] ) return;

	var path = IDToPathMap[ divID ];
	var isGlobals = (0 == path.indexOf( "GLOBALS" ));

	this.m_curFolderID = divID ;

	var folder = getElem( "z" + divID );
	if ( ! folder ) 
	{
		return ;
	}

	this.exposeFolder( folder );
	this.hiliteFolder( folder );

	var sRows = "" ;
	var rowCounter = 0 ;

	var o = linkMap[ divID ];
	for ( var prop in o )
	{
		if (!isObj( o[ prop ] ))
		{
			var addPropArg = (isGlobals ? prop : path + "." + prop);
			var propDisplayText = prop.toString().ent();

			if ( o[ prop ] != "" )
			{
				propDisplayText = o[ prop ].toString().ent();
			}
			sRows += '<A HREF=\'javascript:top.TOC.addProp(' + qqVar( addPropArg ) + ')\'>' + 
				propDisplayText + '</A><BR>' ;
		}
		rowCounter++ ;
	}

	//

	var captionTag = '<SPAN class="Strong">properties&nbsp;of ' + path + '</SPAN><BR>';
	if ( isGlobals )
		captionTag = '<SPAN class="Strong">Time and Date properties</SPAN><BR>';

	var itemsHTML = captionTag + sRows ;
	setData( top.DUMP, itemsHTML );

	if ( isNav4 )
	{
		//guesstimate new height of window 
		// 24 is the estimated row height, 3 accounts for the caption and header rows plus \
a buffer row  top.DUMP.window.height = top.DUMP.document.height = ((rowCounter + 3) * \
24);  }

}	// si

function setData ( dataWin, sHTML )
{
	if ( ! isNav4 )
	{
		var dataDiv = getElem( "DATA_DIV", dataWin.document );
		if ( dataDiv ) dataDiv.innerHTML = sHTML ;
	}
	else	// Nav4
	{
		var dataLayer = getElem( "DATA_DIV", dataWin.document );
		var doc = (dataLayer ? dataLayer.document : null);
		if ( doc )
		{
			doc.open();
			doc.write( sHTML );
			doc.close();
		}
	}
}

function onLoad ()
{
	if ( ! isXblibInit ) xblibInit();

	setData( top.DUMP, "" );

	//create the TOCTree (the constructor will save a ref to the obj in \
window.TheTOCTree)  var tree = new REGTree( window, window );
	tree.initialize();

}	// onLoad ()

function addProp ( path )
{
	if ( top.window.opener && top.window.opener.addProp )
	{
		top.window.opener.addProp( path );
	}
}

function isWildCardMatch ( path, wildcardRoot )
{
	var rPos = path.lastIndexOf( "*" );
	if  (-1 == rPos) return true;
	if  ( !wildcardRoot ) return false;
	return ( path.substr( 0, rPos+1 ) == wildcardRoot.substr( 0, rPos+1 ) );
}

function hasChildObject ( o, origPath, wildcardRoot  )
{
	var hasChildren = false ;
	function _lookAhead ( a, prop, curDepth, path )
	{
		if ( isObj( a[ prop ] ) &&
			 isWildCardMatch( origPath + "." + path, wildcardRoot ) )
		{
			hasChildren = true ;
			return 1 ;
		}
	}
	enumPropArray( o, _lookAhead, 1 );
	return hasChildren;
}

function hasChildProp ( o )
{
	var hasChildren = false ;
	function _lookAhead ( a, prop, curDepth, path )
	{
		if ( (!isObj( a[ prop ] )) && 
			 (null != a[ prop ]) )
		{
			hasChildren = true ;
			return 1 ;
		}
	}
	enumPropArray( o, _lookAhead, 1 );
	return hasChildren;
}

var linkMap = new Array();
var IDToPathMap = new Array();
function updateIndexes ( aRef, path, divID )
{
	linkMap[ divID ] = aRef ;
	IDToPathMap[ divID ] = path;

}	// updateIndexes

function emitRegLists ( wildcardRoot )
{
	var s = "";
	var divID = 0 ;
	var classAttrStart = ' class="l' ;
	var divTagStart = '<DIV id="z' ; // can't use a number or '_' to begin layer id
	var imgTagStart = '<IMG BORDER=0 SRC="' ;
	var toggleLinkTagStart = '<A href="javascript://" onclick="TheTOCTree.tf(' ;
	var showLinkTagStart   = '<A HREF="javascript://" onclick="TheTOCTree.si(' ;
	var divTagEnd = '</A></DIV>' ;
    
	function _TOCcallback ( a, prop, curDepth, path )
	{
		//
		var o = a[ prop ];
		if ( isObj( o ) )
		{
			if ( !isWildCardMatch( path, wildcardRoot ))
			{
				return;
			}

			var hasChildProps = hasChildProp( o )
			var hasChildObjects = hasChildObject( o, path, wildcardRoot );

			if (!(hasChildProps || hasChildObjects))
			{
				return;
			}

			var classAttr = classAttrStart + curDepth + '"' ;
			var divNameAttr = divTagStart + divID + '"' ;
			var imgTag ;
			if ( hasChildObjects )
				imgTag= toggleLinkTagStart + divID + ');">' + imgTagStart + imgCloseSrc + \
'"></A>' ;  else
				imgTag= "<A>" + imgTagStart + imgLeafSrc + '"></A>' ;

			var showLinkTag = "<A>"
			if ( hasChildProps )
			{
				showLinkTag = showLinkTagStart + divID + ')">';
			}

			// save reference to server data
			updateIndexes( o, path, divID );

			var propDisplayText = prop.toString().replace(/\.\*$/, "").ent();
				
			s += divNameAttr + classAttr + '>' + imgTag + showLinkTag + 
				propDisplayText + divTagEnd ;

			divID++ ;
		}
		return false;
	}
	enumPropArray( r, _TOCcallback, 0 );

	document.write( s );
}
</SCRIPT>

</head>
<body
	onload="onLoad();"
> 
<table border=0 cellpadding=0 width="100%">
<tr>
	<td class="Strong" align="CENTER" NOWRAP>
	Helix Server Property List
	</td>
</tr>
<tr>
	<td align="center">
		<font face="sans-serif" size=-2>
		<a href="javascript://" onclick="TheTOCTree.toggleAll(false)" class="toc">1</a> | 
		<a href="javascript://" onclick="TheTOCTree.toggleAll(true,0)" class="toc">2</a> | 
		<a href="javascript://" onclick="TheTOCTree.toggleAll(true,1)" class="toc">3</a> | 
		<a href="javascript://" onclick="TheTOCTree.toggleAll(true)" class="toc">All</a>
		</font>
	</td>
</tr>
</table>
<script>
function writeTOC ()
{
	var qstr = new QStrParser();

	document.open();

	emitRegLists( qstr.getParam( "watchRoot" ) );

	document.close();

}	// writeTOC

writeTOC();
</SCRIPT>

</BODY>
</HTML>

--- NEW FILE: browsers.html ---

<HTML>
<HEAD>
<TITLE>Supported Browsers</TITLE>

</HEAD>
<BODY>

<H3>The Helix Administrator requires either Netscape Communicator version 
4.70 or higher, or Internet Explorer version 5.0 or higher.
If your are running a previous version of these browsers you will need to \
upgrade.</H3>

<A HREF="http://www.netscape.com/download/">Get Netscape Communicator</a><br><br>
<A HREF="http://www.microsoft.com/windows/ie/">Get Microsoft Internet Explorer</a>

</BODY>
</HTML>

--- NEW FILE: qstr.js ---

var sepStr =  ":::" ;

function QStrParser ( href )
{
	this.m_params = new Array();

	var qStr = "" ;
	if ( ! href ) 
	{
		qStr = window.document.location.search.slice( 1 );
	}
	else
	{
		var pos = href.indexOf( '?' );
		if ( pos != -1 )
		{
			qStr = href.slice( pos + 1 );
		}
	}
	if ( !qStr ) return ;	

	var param, paramName, paramValue ;
	var tmp = qStr.split( "&" );
	for ( var i = 0; i < tmp.length; i++ )
	{
		param = tmp[ i ].split( "=" );
		paramName = unescape( param[ 0 ] );
		paramValue = ( param[ 1 ] ? unescape( param[ 1 ] ) : "" );

		this.setParam( paramName, paramValue, 1 );
	}
}

QStrParser.prototype.toString = function ()
{
	var s = "" ;
	for ( var paramName in this.m_params )
	{
		aTemp = this.m_params[ paramName ].split( sepStr );
		for ( var i = 0; i < aTemp.length; i++ )
		{
			if ( s != "" )
			{
				s += "&" ;
			}
			 
			s += escapePlus( paramName ) + "=" + escapePlus( aTemp[ i ] );
		}
	}

	return s ;

}	// QStrParser.prototype.toString

QStrParser.prototype.getParam = function ( paramName )
{
	if ( this.m_params[ paramName ] && 
		 ( -1 != this.m_params[ paramName ].indexOf( sepStr ) ) )
	{
		return this.m_params[ paramName ].split( sepStr );
	}
	
	return this.m_params[ paramName ];
}
		
QStrParser.prototype.setParam = function ( paramName, paramValue, fAppend )
{
	if ( paramValue == null ) 
		paramValue = "" ;

	if ( ! fAppend )
	{
		this.m_params[ paramName ] = paramValue ;
	}
	else
	{
		if ( this.m_params[ paramName ] == null )
		{
			this.m_params[ paramName ] = "" ;
		}
		else if ( this.m_params[ paramName ] != "" )
		{
			this.m_params[ paramName ] += sepStr ;
		}

		this.m_params[ paramName ] += paramValue ;
	}
	
	return this.m_params[ paramName ];
}
		
QStrParser.prototype.delParam = function ( paramName )
{
	delete this.m_params[ paramName ];
	return null ;
}

QStrParser.prototype.fillForm = function ( form )
{
	if ( ! form ) return  ;
	
	for ( var paramName in this.m_params )
	{
		if ( typeof( form[ paramName ] ) == "object" )
		{
			aTemp = this.m_params[ paramName ].split( sepStr );
			for ( var i = 0; i < aTemp.length; i++ )
			{
				setCtrlValue( form[ paramName ],  aTemp[ i ] );
			}
		}
	}

}	// QStrParser.prototype.fillForm


--- NEW FILE: propview.js ---

//<SCRIPT>

function NestedPropListView ( listName, propList, itemLabel, configRootPath, \
serverMethod,  sFormName, sListName, sEditName, aDirtyImgNames )
{

	if ( ! NestedPropListView.bIsInitialized )
		NestedPropListView.initClass();

	this.m_name = listName;
	this.m_itemLabel = itemLabel ;
	this.m_itemDefValue = itemLabel ;

	this.m_configRootPath = configRootPath;
	this.m_serverMethod = (serverMethod ? serverMethod : "servvar");

	this.m_propList = propList ;
	this.m_subListParent = this.m_propList;

	this.m_submitString = "";
	this.m_oWin = null;
	this.m_oDoc = null;

	this.m_sFormName = sFormName ;
	this.m_sListName = sListName ;
	this.m_sEditName = sEditName ;
	this.m_aDirtyImgNames = (aDirtyImgNames ? aDirtyImgNames : ["IMG_DIRTY_TAB", \
"IMG_DIRTY_APPLY"] );

	this.m_oES = null ;

	this.m_parent = null ;

	this.m_resultsTitleListIndex = 3;
	this.m_resultsTitlePropIndex = 4;

	this.m_curSubListName = "";

	this.m_origListChangeHandler = null;
	this.m_origClickHandler = null;
	this.m_origKeyUpHandler = null;

	this.m_bDoDirtyCheck = true ;

	this.m_imgSrcDirty = NestedPropListView.imgSrcDirty;
	this.m_imgSrcClean = NestedPropListView.imgSrcClean;

	this.m_hDirtyCheckTimerID = null;

	this.m_subViews = new Array();

	this.m_bLoaded = false;

}	// NestedPropListView ()

// class data
NestedPropListView.aDirtyImgNames = null;
NestedPropListView.imgSrcDirty = null;
NestedPropListView.imgSrcClean = null;
NestedPropListView.bIsInitialized = false;

NestedPropListView.InitClass = function ()
{
	// initialize class data
	NestedPropListView.aDirtyImgNames = ["IMG_DIRTY_TAB", "IMG_DIRTY_APPLY"];
	NestedPropListView.imgSrcDirty = new Image();
	NestedPropListView.imgSrcDirty.src = "images/arrow.gif" ;
	NestedPropListView.imgSrcClean = new Image();
	NestedPropListView.imgSrcClean.src = "images/spacer.gif" ;

	NestedPropListView.DIRTY_CHECK_SUPRESS_TIME = 1000 ;	//millisecs

	NestedPropListView.bIsInitialized = true;
}

NestedPropListView.prototype.addSubView = function ( subView )
{

	this.m_subViews[ subView.m_name ] = subView ;
	subView.m_parent = this ;

	// a sub view shouldn't do dirty checks - presumably the parent does 'em
	subView.m_bDoDirtyCheck = false ;

}	// addSubView ()

NestedPropListView.prototype.toString = function ()
{
	return this.m_name ;
}

NestedPropListView.prototype.subView = function ( subViewName )
{
	return this.m_subViews[ subViewName ];
}

NestedPropListView.prototype.formName = function ( sFormName )
{
	if ( sFormName )
	{
		this.m_sFormName = sFormName ;
	}

	return this.m_sFormName ;
}

NestedPropListView.prototype.getForm = function ( subListName )
{
	return getElem( this.m_sFormName );
}

NestedPropListView.prototype.getListCtrl = function ()
{
	var oForm = getElem( this.m_sFormName );

	if ( oForm )
	{

		return oForm[ this.m_sListName ];
	}

	return null ;
}

NestedPropListView.prototype.getEditCtrl = function ()
{
	var oForm = getElem( this.m_sFormName );

	if ( oForm )
	{

		return oForm[ this.m_sEditName ];
	}

	return null ;
}

NestedPropListView.prototype.preOnLoad = function ()
{
	return true ; // continue with super class onLoad
}

/* 
	before calling this function make sure the propList member has been initialized.
	
	Call this method from your pages onload handler, passing in the
	following page element/obj references:
		oWin		the page's window object, required

	after using the parameters to initialize the object's member properties, onPrelLoad \
is called. This allows  subclasses to perform any need initialization. The base \
class's implementation jsut returns true, if an   subclass's onPreLoad returns false \
the bodyof onLoad is skipped.

	The bodyof this method initializes the form using propList data as well as creating \
an EditSelect obj  to tie the list and edit controls together.

	onPostLoad is then called at the end. A do nothing method in the base class \
onPostLoad should be overridden  in sub classes to perform custom actions - \
                hide/show/resize elements etc.
*/

NestedPropListView.prototype.onLoad = function ( oWin, fNoInitForm, fNoDisplayData )
{

	// initialize member variables TODO validate parameters	
	if (! oWin ) return;

	if ( ! isXblibInit ) xblibInit();

	this.m_oWin = oWin;
	this.m_oDoc = oWin.document;

	this.m_bLoaded = true ;

	if ( this.preOnLoad() )
	{
		this.m_propList.reset();

		if( this.m_bDoDirtyCheck )
			this.showDirtyFlag( false );

		if ( ! fNoInitForm )
			clearForm( this.getForm() );

		// create or (if in reset mode) sync the EditSelct object
		if ( ! this.m_oES )
		{	
			this.m_oES = new EditSelect2( this.m_oWin, this.getListCtrl(), this.getEditCtrl(), \
this );  this.m_oES.itemName( this.m_itemLabel );
		}

		//init any subViews
		for ( var subViewName in this.m_subViews )
		{
			var subView = this.m_subViews[ subViewName ];
			if ( subView )
			{
				subView.onLoad( oWin, true, true );
			}
		}

		if ( ! fNoDisplayData )
		{
			this.initListDataDisplay();
		}

		if ( ! fNoInitForm )
			this.hookForm();
	}
	this.postOnLoad();

}	// onLoad()

NestedPropListView.prototype.initListDataDisplay = function ()
{
	this.m_oES.clear();
	this.fillSelectList();
	this.m_oES.sync();
	this.m_propList.fillForm( this.getForm() );
	this.fillFormFromSubList( false );
}

NestedPropListView.prototype.postOnLoad = function ()
{
	// no return value needed
}

NestedPropListView.prototype.fillSelectList = function ()
{
	if ( ! this.m_bLoaded ) return ;

	var listCtrl = this.getListCtrl();
	if ( listCtrl )
	{
		listCtrl.options.length = 0;
		
		// fill the list with the name of each sublist
		this.m_subListParent.fillSelectList( listCtrl );
		
		// and select the first one
		selectFirst( listCtrl );
	}

}	// fillSelectList ()

NestedPropListView.prototype.onESSelChange = function ( oES )
{
	if ( ! this.m_bLoaded ) return ;

	return this.fillFormFromSubList( true );

}	// onESSelChange ()

NestedPropListView.prototype.fillFormFromSubList = function ( fValidate )
{
	if ( ! this.m_bLoaded ) return ;

	var newSubListName = this.m_oES.getItemValue();
	if ( ! newSubListName )
	{
		if ( this.m_oES.count() == 0 )
		{
			this.m_curSubListName = "" ;

			return true ;
		}

		var listCtrl = this.getListCtrl();
		if ( listCtrl )
		    listCtrl.selectedIndex = 0;

		newSubListName = this.m_oES.getItemValue();
	}

	// before filling in the controls with the newly selected sublist's value's
	// validate and store chgs for the current (or old) sublist
	if ( this.m_curSubListName && fValidate && ( ! this.validateSubList() ) )
	{
		// the ES control will go back to the last selection if we return false
		return false ;
	}
	
	if ( ! newSubListName ) return false ;

	this.m_curSubListName = newSubListName ;
	var subList = this.getSubList( newSubListName );
	if ( subList )
	{
		subList.fillForm( this.getForm( newSubListName ) );

		//set the propList and fill the select list of any subViews
		for ( var subViewName in this.m_subViews )
		{
			var subView = this.m_subViews[ subViewName ];
			if ( subView && subView.m_bLoaded )
			{
				var subSubList = subList.subList( subViewName );
				if ( subSubList )
				{
					subView.setPropList( subSubList );
					subView.initListDataDisplay();
				} 
			}
		}
	}

	return this.postFillFormFromSubList( fValidate );

}	// fillFormFromSubList ()

NestedPropListView.prototype.setPropList = function ( propList, subListParentName )
{
	this.m_propList = propList ;
	if ( (!isBlank( subListParentName )) && 
		 propList.subList( subListParentName ) )
	{
		this.propList = propList;
		this.m_subListParent = propList.subList( subListParentName );
	}
	else
	{
		this.propList = this.m_subListParent = propList ;
	}

}	// setPropList

NestedPropListView.prototype.postFillFormFromSubList = function ( fValidate )
{
	return true;
}

NestedPropListView.prototype.preValidateSubList = function ( subListName )
{
	return true;
}

NestedPropListView.prototype.validateSubList = function ( subListName )
{
	if ( ! this.m_bLoaded ) return ;

	if ( isBlank( subListName ) )
	{
		if ( ! this.m_oES.doRenameCheck() )
		{
			//alert( "failed renamecheck");
			return false ;
		}
		subListName = this.m_curSubListName ;
	}

	if ( ! this.preValidateSubList( subListName ) )
	{
		
		return false ;
	}
	var subList = this.m_subListParent.subList( subListName );
	if ( subList )
	{
		var ctrl = subList.validate( this.getForm( subListName ) );
		if ( ctrl ) 
		{
			return rejectInput( ctrl, subList.errMsg );
		}
	}

	//validate any subViews
	for ( var subViewName in this.m_subViews )
	{
		var subView = this.m_subViews[ subViewName ];
		if ( subView && subView.m_bLoaded )
		{
			if ( ! subView.validateSubList() )
				return false ;
		}
	}

	if ( ! this.postValidateSubList( subListName ) )
	{
		
		return false ;
	}

	return true ;

}	// validateSubList ()

NestedPropListView.prototype.getSubList = function ( subListName )
{
	if ( isBlank( subListName ) )
	{
		subListName = this.m_curSubListName ;
	}
	return this.m_subListParent.subList( subListName );
}

NestedPropListView.prototype.postValidateSubList = function ( subListName )
{
	return true;
}

NestedPropListView.prototype.preValidate = function ()
{
	return true;
}

/* ------------ validate the form and create the submit string --------------*/
NestedPropListView.prototype.validate = function ( fNoSubmitString, fNoAlert )
{
	if ( ! this.m_bLoaded ) return ;

	this.m_submitString = "" ;

	if ( ! this.preValidate() )
	{
		
		return false ;
	}

	var ctrl = this.m_propList.validate( this.getForm() );
	if ( ctrl ) 
	{
		
		return rejectInput( ctrl, this.m_propList.errMsg );
	}

	// validate and save the subLists
	var subList, ctrl ;
	if ( this.m_curSubListName &&
		 (! this.validateSubList() ) )
	{
		
		return false ;
	}

	if ( ! fNoSubmitString )
		this.buildParamString();

	if ( ! this.postValidate() )
	{
		
		return false ;
	}

	// chk for unchanged condition
	if ( (!fNoSubmitString) && (!this.m_submitString) )
	{
		if ( ! fNoAlert )
		{
			alert( "No changes were made to the " + this.m_name + " settings." );
		}
		
		return false ;
	}

	return true ;

}	// validate ()

NestedPropListView.prototype.postValidate = function ()
{
	return true;
}

NestedPropListView.prototype.buildParamString = function ()
{
	if ( ! this.m_bLoaded ) return ;

	
	
	function _getInstanceOf_buildParamStringCallback ( obj )
	{
		return function( propList, prop, paramStr )
		{
			return obj.buildParamStringCallback( propList, prop, paramStr );		
		}
	}
	
	this.m_submitString = this.m_propList.buildParamString( 
		this.m_configRootPath, false, _getInstanceOf_buildParamStringCallback( this ) );

}	// buildParamString ()

NestedPropListView.prototype.buildParamStringCallback = function ( propList, prop, \
paramStr ) {
	return paramStr ;
}

NestedPropListView.prototype.doSubmit = function ()
{
	if ( ! this.m_bLoaded ) return ;

	function _getInstanceOf_resultsCallback ( obj )
	{
		return function(results)
		{
			return obj.resultsCallback(results);		
		}
	}

	var method = (this.m_serverMethod == 
		"servvar" ? (this.m_propList.needRestart() ? "configvar" : "servvar") : \
this.m_serverMethod);  var winResults = raSubmitChanges( method, this.m_submitString, \
  this.m_name + " Settings", _getInstanceOf_resultsCallback( this ) );

	commitForm( this.getForm() );
	this.m_propList.commit();
	this.fillFormFromSubList( false );

	if ( winResults && (!winResults.closed) )
	{
		winResults.focus();
	}
	
	if( this.m_bDoDirtyCheck )
		this.showDirtyFlag( false );

	this.postSubmit();

}	// doSubmit ()

NestedPropListView.prototype.postSubmit = function ()
{
}	// postSubmit

NestedPropListView.prototype.resultsCallback = function ( results )
{
	// TODO use members to determine the properties to print
	// use the fourth and fifth properties as the result title
	var res, a;
    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];
		a = propName.split( "." );
		if ( a[ this.m_resultsTitlePropIndex ] )
		{
        	res.title = a[ this.m_resultsTitleListIndex ].ent().span("body") + '<br>' + 
        	a[ this.m_resultsTitlePropIndex ];
		}
		else if ( a[ this.m_resultsTitleListIndex ] )
		{
        	res.title = a[ this.m_resultsTitleListIndex ].ent().span("body");
		}
	}
}

NestedPropListView.prototype.hookForm = function ()
{
	if ( ! this.m_bLoaded ) return ;

	if( this.m_bDoDirtyCheck )
	{
		//because of Mozilla Bug 49980 (as of 4/11/01) we can't use anonymous functions
		//as event handlers - so we assign the instance method call generated by
		// getInstanceEventHandler() to a variable of TOC window...
		this.m_oWin._onDocClick = getInstanceEventHandler( this, "onFormKeyOrClick" );

		//... and then hook it in as the document's click handler
		this.m_origClickHandler = addEvent( this.m_oDoc, "click", 
			this.m_oWin._onDocClick, 1, "Event.CLICK" );

		// ...do the same for the keyup event
		this.m_oWin._onDocKeyUp = getInstanceEventHandler( this, "onFormKeyOrClick" );
		this.m_origKeyUpHandler = addEvent( this.m_oDoc, "keyup", 
			this.m_oWin._onDocKeyUp, 1, "Event.KEYUP" );

		// ...set up the timeout handler
		this.m_oWin._doDirtyChk = getInstanceEventHandler( this, "doDirtyChk" );
	}

}	// hookForm ()

NestedPropListView.prototype.onFormKeyOrClick = function ( evt )
{
	if ( ! this.m_bLoaded ) return ;

	// if we've already set the time then ignore
	if ( this.m_bDoDirtyCheck && (!this.m_hDirtyCheckTimerID) )
	{
		var oForm = this.getForm();

		// if the event src element is not part of our form then ignore
		var srcElem = ( isIE ? this.m_oWin.event.srcElement : evt.target );
		if ( (srcElem.form && (srcElem.form == oForm)) ||
			 (oForm == getParentByTagName( srcElem, "FORM" )) )
		{
			
			this.m_hDirtyCheckTimerID = this.m_oWin.setTimeout( "_doDirtyChk()", \
NestedPropListView.DIRTY_CHECK_SUPRESS_TIME );  }
	}

	var evtType = ( evt ? evt.type : this.m_oWin.event.type );
	if ( this.m_origClickHandler && (evtType == "click") )
	{
		return this.m_origClickHandler( evt );
	}
	else if ( this.m_origKeyUpHandler )
	{
		return this.m_origKeyUpHandler( evt );
	}

	if ( isNav4 )
	  	this.m_oDoc.routeEvent( evt );

	return true ;

}	// onFormKeyOrClick

NestedPropListView.prototype.doDirtyChk = function ()
{
	if ( ! this.m_bLoaded ) return ;

	if ( this.m_bDoDirtyCheck )
	{
		this.showDirtyFlag( this.isDirty() );
		this.m_hDirtyCheckTimerID = null ;
	}
}

NestedPropListView.prototype.isDirty = function ()
{
	if ( ! this.m_bLoaded ) return ;

	if ( this.m_bDoDirtyCheck ) 
	{
		if ( this.m_propList.isFormDirty( this.getForm(), 1 ) )
		{
			return true ;
		}

		var subList = this.getSubList();
		if ( subList && subList.isFormDirty( this.getForm() ) )
		{
			return true ;
		}

		if ( this.m_propList.isDirty() )
		{
			return true ;
		}
		return this.postIsDirty();
	}

	return false;
}

NestedPropListView.prototype.postIsDirty = function ()
{
	return false ;
}

NestedPropListView.prototype.showDirtyFlag = function ( bIsFormDirty )
{
	if ( ! this.m_bLoaded ) return ;

	if ( this.m_bDoDirtyCheck )
	{
		for ( var i = 0; i < this.m_aDirtyImgNames.length; i++ )
		{
			var oImgDirty = getElem( this.m_aDirtyImgNames[ i ] );
			if ( oImgDirty )
			{
				oImgDirty.src = 
				(bIsFormDirty ? 
					this.m_imgSrcDirty.src : 
					this.m_imgSrcClean.src);
			}
		}
	}
}

// *******  ADD / EDIT / REMOVE / COPY SUBLIST FUNCTIONS ********

// notify functions - override in sub classes if need be
NestedPropListView.prototype.onSubListChangeNotify = function ( action, subListName )
{
	if ( ! this.m_bLoaded ) return ;

	if ( this.m_bDoDirtyCheck )
		this.showDirtyFlag( this.isDirty() );
}

NestedPropListView.prototype.confirmRenameSubList = function ( oldSubListName, \
newSubListName ) {
	// by default, a rename is OK
    return true ;
	
}	// confirmRenameSubList ()

NestedPropListView.prototype.onESRename = function ( oldSubListName, newSubListName )
{
	if ( ! this.m_bLoaded ) return ;

	// validate the newTestName
	if ( ! this.m_propList.listname_validate( newSubListName ) )
	{
		return rejectInput( this.getEditCtrl(), this.m_propList.errMsg );
	}

	if ( ! this.confirmRenameSubList( oldSubListName, newSubListName ) )
	{
		return false ;
	}

	this.m_subListParent.renameSubList( oldSubListName, newSubListName );
	this.m_curSubListName = newSubListName ;

	this.onSubListChangeNotify( "rename", oldSubListName, newSubListName );

	return true ;

}	// onESRename ()

// called when the select control is empty and the user types into 
// the edit control - create a new sublist with the entered text as the
// sublist name
NestedPropListView.prototype.onESAddNew = function ( oES )
{
	if ( ! this.m_bLoaded ) return ;

	var subListName = oES.getEditText();

	if ( subListName ) 
	{
		this.createSubList( subListName );
	}

}	// onESAddNew ()

NestedPropListView.prototype.createSubList = function ( subListName )
{
	if ( ! this.m_bLoaded ) return false;

	if ( ! this.onSubListChangePreNotify( "add", subListName ) )
    {
    	return false;
    }

	// validate and save the current list's values
	if ( this.m_curSubListName && ( ! this.validateSubList() ) ) 
	{
		return false;
	}

	if ( subListName )
	{
		this.m_oES.addOption( subListName, subListName, true );
	}
	else
	{
		if ( ! this.m_itemDefValuePostFix )
			subListName = this.m_oES.addUntitled( this.m_itemDefValue );
		else
			subListName = this.m_oES.addUntitled( this.m_itemDefValue, 0, 
				this.m_itemDefValuePostFix );
	}

    if ( subListName )
	{
		this.m_curSubListName = subListName;
		var subList = new PropList( subListName, [], this.m_subListParent.m_propSetSubLists \
);  this.m_subListParent.addSubList( subList, "added" );
		subList.clearForm( this.getForm( subListName ) );
		this.fillFormFromSubList( false );

		var editCtrl = this.getEditCtrl();
		if ( editCtrl )
		{
			editCtrl.focus();
			editCtrl.select();
		}
		this.onSubListChangeNotify( "add", subListName );
	}

	return true;
    
}	// createSubList ()

NestedPropListView.prototype.copySubList = function ()
{
	if ( ! this.m_bLoaded ) return ;

	if ( ! this.m_curSubListName )
	{
		/*alert( "Select " + this.m_name + " to copy" );*/
		return false;
	}

	if ( ! this.onSubListChangePreNotify( "copy", this.m_curSubListName ) )
    {
		return false;
    }

	// validate and save the current list's values
	if ( this.m_curSubListName && ( ! this.validateSubList() ) ) 
	{
		return false;
	}

	var newSubListName = this.m_oES.addUntitled( "Copy", 0, " of " + \
this.m_curSubListName );  if ( newSubListName )
	{
		this.m_subListParent.copySubList( this.m_curSubListName, newSubListName );
		this.m_curSubListName = newSubListName;
		this.fillFormFromSubList( false );
		var editCtrl = this.getEditCtrl();
		if ( editCtrl )
		{
			editCtrl.focus();
			editCtrl.select();
		}
		this.onSubListChangeNotify( "add", newSubListName );
	}
    
    return true;

}	// copySubList ()

NestedPropListView.prototype.onSubListChangePreNotify = function ( action, \
subListName ) {
	return true;
}

NestedPropListView.prototype.resetSubList = function ()
{
	if ( ! this.m_bLoaded ) return ;

	if ( ! this.m_curSubListName )
	{
		/*alert( "Select a " + this.m_name + " to reset." );*/
		return;
	}
		
	var subList = this.m_subListParent.subList( this.m_curSubListName );
	if ( subList )
	{
		subList.resetToDefaults( this.getForm( this.m_curSubListName ) );
	}

	if ( this.m_bDoDirtyCheck )
		this.showDirtyFlag( this.isDirty() );

}	// resetSubList

NestedPropListView.prototype.removeSubList = function ()
{
	if ( ! this.m_bLoaded ) return false;

	if ( ! this.m_curSubListName )
	{
		
		return false;
	}
		
	// in case the sublist was renamed
	if ( ! this.m_oES.doRenameCheck() )
		return false;

	if ( ! this.onSubListChangePreNotify( "delete", this.m_curSubListName ) )
    {
		return false;
    }
    
	
	
	var subList = this.getSubList();
	if ( subList )
	{
	    if ( this.confirmRemoveSubList( this.m_curSubListName ) )
		{
			var deletedSubListName = this.m_curSubListName;
			// mark as 'deleted'
			this.m_oES.remove();
			subList.clearForm( this.getForm( deletedSubListName ) );
			if ( subList.m_status == "added" )
			{
				this.m_subListParent.delSubList( subList );
			}
			else
			{
				subList.m_status = "deleted" ;
			}
			this.onSubListChangeNotify( "delete", deletedSubListName );
			this.fillFormFromSubList( false );
		}
	}

    return true;
    
}	// removeSubList ()

NestedPropListView.prototype.confirmRemoveSubList = function ( subListName )
{
    return confirm( "Remove " + this.m_itemLabel + " '" + subListName + "'?" );
	
}	// confirmRemoveSubList ()

/*if ( isIE )
{
	window.onbeforeunload = onBeforeUnload ;
}
else
{
	window.onunload = onUnload ;
}
*/
/*
function onBeforeUnload ()
{
}

function onUnload ()
{
	if ( (null != isFormDirty( theForm )) || propList.isDirty() )
	{
		if ( confirm (
				"You've made unsaved changes to your Test Settings.\n\n" +
				"- Press the OK button to save your changes.\n" +
				"- Press the Cancel button to abandon you changes." ) )
		{
			saveTest();
		}
	}
}
function saveTest ()
{
	validate();
	if ( submitString )
		doSubmit();
}

*/

NestedPropListView.InitClass();

//</SCRIPT>

--- NEW FILE: config_viewsrc.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>View Source</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "22";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?serverData=config.ViewSourceConfiguration"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
// meta data for View Source server data
var propSet = 
[
	new PropObj( 'HidePaths', 		"X", false, false, null, null, "", "Hide Paths" )
   ,new PropObj( 'AllowViewSource',"X", false, false, null, null, "", "View Source \
Enabled" ), ];

var propSetPath =
[
	new PropObj( '_HidePaths', 		"1",	false,	false,	null,null,	"",		"Hide Paths" ), 
	new PropObj( '_AllowViewSource',	"1",	false,	false,	null,null,	"",		"View Source \
Enabled" ), ];

var propList = new PropList( "ViewSourceConfiguration", serverData, propSet, \
propSetPath );

function ViewSrcPropView ()
{
	this.base = NestedPropListView ;
	this.base( "View Source", propList, "Path", "config.ViewSourceConfiguration.", 
		"servvar", "theForm", "theList", "theEdit" );

	this.m_itemDefValue = "/path";
}
ViewSrcPropView.prototype = new NestedPropListView ;

ViewSrcPropView.prototype.confirmRenameSubList = function ( oldSubListName, \
newSubListName ) {
	if ( ! propList.virpath_validate( newSubListName ) )
	{
		return rejectInput( theForm.theEdit, propList.errMsg );
	}

    return true ;
	
}	// confirmRenameSubList ()

ViewSrcPropView.prototype.buildParamStringCallback = function ( propList, prop, \
paramStr ) {
	if ( prop && (prop.getValue() == "X") )
	{
		paramStr = paramStr.replace( /=X/, "" );
	}
	return paramStr ;
}

var propView = new ViewSrcPropView();
var theForm ;

function onLoad ()
{
	theForm = document.theForm ;

	propView.onLoad( window );

}	// initStart ()
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">CONTENT MANAGEMENT</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
Just as users can view the underlying HTML code that was used to create
a Web presentation, the server allows users of
RealPlayer (version 7.0 and above) to view the actual source code for
SMIL, RealText, and RealPix presentations. Users can also receive file
information for other media datatypes. When a user selects the View
Source command from within RealPlayer, the server sends a Web page that
contains the source code or file information to the user’s browser. 
<br><br>

Users can then "learn by example" and understand how to create their own
media clips. Content creators will find this feature useful as they
author and review SMIL presentations and media clips. 

<br><br>

Use the settings below to configure View Source for selected paths. By
default, View Source is enabled for local content, and cannot be
disabled. You can also protect the paths to the URLs of source files.
</td></tr>
</TABLE>
<BR>

<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>View Source</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<tr>
	<TD class="input" valign="top" width="50%">
		<TABLE CLASS="PROPLIST_LABEL" width="226" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">View Paths</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Path" BORDER=0></A><A href="javascript://" onclick="propView.removeSubList()"><IMG \
src="images/delete_g.gif" HSPACE=1 ALT="Remove Current Path" BORDER=0></A></TD>  \
</TR></TABLE>  <DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  \
CLASS="longInput" NAME="theList" SIZE="8" WIDTH="226">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
	</TD>
	<TD class="input" valign="top" width="50%">
		Edit Path
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theEdit" SIZE="18" TYPE="text" \
VALUE="">

		<BR>
		<table border="0" cellspacing="0" cellpadding="0" width="100%">
	 		<tr>
	 		<TD class="input" valign="top" align="RIGHT" width="50%">
	 				<span class="offsetLabel">View&nbsp;Source&nbsp;&nbsp;&nbsp;</span>
	 			</td>
	 			<TD class="input" valign="top" align="left" width="50%">
	 				<select CLASS="longInput" NAME="_AllowViewSource" SIZE="1" WIDTH="110">
	 		            <OPTION value="1">Yes</OPTION>
	 		            <OPTION value="0">No</OPTION>
	 		        </SELECT>
	 			</td>
	 		</tr>
			<tr>
			<TD class="input" valign="top" align="RIGHT" width="50%">
					<span class="offsetLabel">Hide&nbsp;Paths&nbsp;&nbsp;&nbsp;</span>
				</td>
				<TD class="input" valign="top" align="left" width="50%">
					<select CLASS="longInput" NAME="_HidePaths" SIZE="1" WIDTH="110">
			            <OPTION value="1">Yes</OPTION>
			            <OPTION value="0">No</OPTION>
			        </SELECT>
				</td>
			</tr>
		</TABLE>
	</TD>                        
</TR>
<tr </tr>
<tr>
    <td class="input" valign="middle" colspan="2">
		<SPAN CLASS="formHeader">Master Settings</SPAN>
		<BR>
		<SPAN class="units">Options in this section override individual path settings \
above.</SPAN>  <BR>
		<BR>
		<table border="0" cellspacing="0" cellpadding="0" width="100%">
			<tr>
			<TD class="input" valign="top" align="RIGHT" width="50%">
					<span class="offsetLabel">View&nbsp;Source&nbsp;&nbsp;&nbsp;</span>
				</td>
				<TD class="input" valign="top" align="left" width="50%">
					<select CLASS="longInput" NAME="AllowViewSource" SIZE="1" WIDTH="226">
			            <OPTION value="X">Use Settings Above</OPTION>
			            <OPTION value="1">Enable View Source</OPTION>
			            <OPTION value="0">Disable View Source</OPTION>
			        </SELECT>
				</td>
			</tr>
			<tr>
			<TD class="input" valign="top" align="RIGHT" width="50%">
					<span class="offsetLabel">Hide&nbsp;Paths&nbsp;&nbsp;&nbsp;</span>
				</td>
				<TD class="input" valign="top" align="left" width="50%">
					<select CLASS="longInput" NAME="HidePaths" SIZE="1" WIDTH="226">
			            <OPTION value="X">Use Settings Above</OPTION>
			            <OPTION value="1">Hide All Paths</OPTION>
			            <OPTION value="0">Show All Paths</OPTION>
			        </SELECT>
				</td>
			</tr>
		</TABLE>
	</td>
</tr>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: main.css ---

BODY
{
	background-color: #FFFFFF;
	font-family:      Verdana, Arial, Helvetica, sans-serif;
}

BODY.CONFIG
{
	padding-left:	30 ;
}

BODY.POPUP
{
	padding:		  0;
	margin:			  0;
}
DIV.popupPad
{
	padding-right:	0px;
	padding-bottom:	0px;
	padding-top:	16;
	padding-left:	30;
}

/* gives a little space after the tab header */
TABLE.formTable
{
	margin-top:	1px;
}

A
{ 
	font-size:        8.5pt;
	font-weight:      500;
	color:            #0033FF;
	text-Decoration:	underline ;
}

FORM
{
	margin:		0;
	padding: 	0;
}

TABLE
{
	margin:		0 ;
}
TD
{ 
	font-family:      Verdana, Arial, Helvetica, sans-serif;
}
TD.body
{ 
  font-size:        8.5pt;
  font-weight:      normal;
  font-style:       Normal;
  color:            #333350;
  text-indent:      0pt;
}
TD.title2, .title2
{ 
  font-size:        9pt;
  font-weight:      600;																						 
  color:            #336699;
  background-Color: #E6E6E6;
}
TD.input

{ 
  font-size:        9pt;
  font-weight:      500;
  color:            #336699;
  background-Color: #E6E6E6;
  font-family:      Verdana, Arial, Helvetica, sans-serif;
}

SPAN.input, SPAN.FormHeader
{ 
  font-size:        9pt;
  font-weight:      500;
  font-family:      Verdana, Arial, Helvetica, sans-serif;
  color:            #336699;
  background-Color: #E6E6E6;
}
SPAN.FormHeader
{
	font-weight:	600;
}

.units, .unitsOffset
{ 
  font-size:        8.5pt;
  color:            #666666;
}

.unitsOffset
{
	position:	relative;
	top:		-3;
}

.offset
{
	position:	relative;
	top:		-3;
}
SELECT, INPUT, TEXTAREA, SPAN.readOnlyValue, FONT.input
{ 
  font-family:      Verdana, Arial, Helvetica, sans-serif;
  font-size:        9pt;
  font-weight:      500;
  color:            black;
}
.body
{ 
	font-family:      Verdana, Arial, Helvetica, sans-serif;
	font-size:        8.5pt;
	font-weight:      normal;
	font-style:       Normal;
	color:            #333350;
	text-indent:      0pt;
}
.stronger
{ 
  font-size:        8.5pt;
  font-weight:      600;
  font-style:       Normal;
  color:            #474770;
}
.longInput
{
	width: 100% ;
}

.medInput
{
	width: 50% ;
}

.threeQInput
{
	width: 75% ;
}
.offsetLabel
{
	position:relative;
	top:	3;
}
.offsetLabelSelect
{
	position:relative;
	top:	3;
}

/* used on HELP, SAMPLES, & CONFIGURE pages */
.PARA
{
	margin-left: 20;
	margin-bottom: 12;
	font-size:        9pt;
}

.PARAHEAD
{
	font-size: 		  medium;
	font-weight:      600;
	font-style:       Normal;
	color:            #336699;
}
/* new stuff */

.bodyText, .bodyTextBold
{
	font-family:      Verdana, Arial, Helvetica, sans-serif;
	font-size:        9pt;
	font-weight:      500;
	font-style:       Normal;
	color:            #666666;
	text-indent:      0;
}

.bodyTextBold
{
	font-weight:      600;
}

TD.bodyText A
{ 
	font-size:        9pt;
}
.headline
{ 
	font-family:      Verdana, Arial, Helvetica, sans-serif;
	font-size: 		  16pt;
	font-weight:      500;
	font-style:       Normal;
	color:            #336699;
	text-indent:      2em;
	letter-spacing:	  3pt;

	/* to squeeze the headline and headline rule together */
	position:		  relative;	
	top:			  5;
}
.headlineRule
{ 
	font-size:        4pt;
	background-color: #336699;
}

.headerRule
{ 
	font-size:        4pt;
	background-color: #336699;
}

.headerRule2
{ 
	font-size:        4pt;
	background-color: #336699;
}
.linkText, .linkTextSmall
{
	font-size: 		9pt;
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	color:			#FF6600;
	letter-spacing:	normal;
	TEXT-DECORATION: none;
}

.linkTextSmall
{
	font-size: 		8.5pt;
}

A:hover    
{
	TEXT-DECORATION: underline;
}

.TabText
{
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	font-size: 		11pt;
	color:          #336699;
	font-weight:	600;
}

.popupTableHeader, .popupTitle
{
	background-color: #999999;
	color:			  white;
	font-family:	Tahoma, Arial, Helvetica, sans-serif;
	font-size:		12pt;
	font-weight:	bold;
}

.popupTitle
{
	background-color: 	#FFFFFF;
	color:			  	#336699;
	font-size: 		13pt;
}

TD.odd, TD.even
{
	font-size:        9pt;
	font-weight:      500;
	color:            #336699;
	background-Color: #FFFFFF;
}

TD.even
{
	background-Color: #E6E6E6;
}

.grey,SPAN.body
{
	color:            #666666;
	font-size:        9pt;
}
.PROPLIST_LABEL
{width:100%;}
.absolute
{ 
	position:absolute; 
	visibility:hidden; 
	z-index:10;
}
/* header frame specific */

.headerServerLabel, .headerServerName
{
	text-indent: 	12px;
	font-size: 		10pt;
	font-family:	Verdana, Arial, Helvetica, sans-serif;
	color:			white;
	letter-spacing:	normal;
}

.headerServerName
{
	text-indent: 	0;
	font-weight:	600;
}
/* about page specific */

.labelOdd, .valueOdd, .labelEven, .valueEven
{
  font-size:        9pt;
  font-weight:      500;
  color:            #336699;
  background-Color: #FFFFFF;
}

.labelEven, .valueEven
{
  background-Color: #E6E6E6;
}

.valueEven, .valueOdd
{
	color:            #666666;
}

.licenseTitle
{ 
  font-size: 		10pt;
  font-weight:      bold;
  color:            #666666;
  background-Color: #FFFFFF;
}

.trademarkBorder
{
	width:					550px;

	padding-top:			0px;
	padding-bottom:			0px;
	padding-left:			0px;
	padding-right:			0px;

	margin-top:				10px;
	margin-bottom:			0px;
	margin-left:			0px;
	margin-right:			0px;

	border-color:			#E6E6E6;

	border-top-width:		2px;
	border-bottom-width:	2px;
	border-left-width:		0px;
	border-right-width:		0px;

	border-top-style:		solid;
	border-bottom-style:	solid;
	border-left-style:		none;
	border-right-style:		none;
}



--- NEW FILE: test.html ---
<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="servvar.get.html?config=config&fileConfig=fileconfig&diffConfig=diffconfig"></SCRIPT>
 <SCRIPT>


var XX = {};

function _contextCallback ( a, prop, curDepth, curPath )
{
	// for each property found with a scalar value, record in the 
	// output holder
	if ( (!isObj(a[ prop ])) && (!isBlank(a[ prop ])) )
	{
		var contextID = a[ prop ] + "";
		if ( ! isObj( XX[ contextID ] ) )
		{
			XX[ contextID ] = {};
		}
		var oContext = XX[ contextID ];

		var tmpPath = "";
		var tmpConfigProp = config;
		var tmpDiffProp = ( isObj(diffConfig) ? diffConfig.config : null );
		var tmpFileProp = ( isObj(fileConfig) ? fileConfig.config : null );

		// figure out if this property was added, deleted or changed, also
		// whether it is/was a list property

		var aPathParts = curPath.split( '.' );
		for ( var i = 0; i < aPathParts.length; i++ )
		{
			var pathPart = aPathParts[ i ];

			tmpPath += (tmpPath ? "." + pathPart : pathPart);
			tmpDiffProp = ( isObj(tmpDiffProp) ? tmpDiffProp[ pathPart ] : null );
			tmpFileProp = ( isObj(tmpFileProp) ? tmpFileProp[ pathPart ] : null );
			tmpConfigProp = ( isObj(tmpConfigProp) ? tmpConfigProp[ pathPart ] : null );

			// already recorded info about this path?
			if ( isBlank( oContext[ tmpPath ] ) )
			{
				var sAction = "";

				//is this property a list ?
				if ( isObj(tmpDiffProp) )
				{
					// is it a new list?
					if ( (!tmpConfigProp) && 
						   tmpFileProp )
					{
						sAction = "Created New List";
					}
				}
				else
				{
					// is this property a deleted list?
					if (  isObj(tmpConfigProp) && 
						(!isObj(tmpFileProp)) )
					{
						sAction = "Deleted List";
					}
					else // added, changed or deleted property
					{
						var newValue = tmpFileProp;
						var oldValue = tmpConfigProp;

						if ( pathPart.bSearch( /password/i ) )
						{
							if ( oldValue )
								oldValue = '????????' ;
							if ( newValue )
								newValue = '********' ;
						}

						if ( ( oldValue == null ) && ( newValue == null ) )
						{
							sAction = "Deleted";
						}
						else if ( oldValue == null )
						{
							sAction = "Set to ".span( "grey" ) + newValue;
						}
						else
						{
							if ( newValue == null ) newValue = "";
							sAction = "Changed from ".span( "grey" ) + oldValue + " to ".span( "grey" ) + \
newValue;  }
					}
				}
				oContext[ tmpPath ] = sAction;
			}
		}
	}
}
if ( isObj(diffConfig) && isObj(diffConfig.config) )
{
	enumPropArray( diffConfig.config, _contextCallback );
}

for (var p in XX)
{
	alert( p );
	for ( var s in XX[p])
		alert( s + ": " + XX[p][s]);
}

</SCRIPT>
--- NEW FILE: add_redirect.html ---

<HTML>
<HEAD>

<TITLE>Redirect a URL</TITLE> 

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="dialog.js"></SCRIPT>
<SCRIPT SRC="qstr.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
	document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else
{
	document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
</SCRIPT>

<SCRIPT>
var qstr = new QStrParser();
var url = ""

function onLoad ()
{
	setCtrlValue( theForm.RedirectedURL, qstr.getParam( "ProtectedVirtualPath" ) );
}

var submitString = "" ;
function validate ()
{
	submitString = buildParam( "DatabaseID", qstr.getParam( "DatabaseID" ) );

	var RedirectedURL = getCtrlValue( theForm.RedirectedURL );
	if ( RedirectedURL == "" )
	{
		return rejectInput( theForm.RedirectedURL, "Entry required for URL to Redirect." );
	}
	submitString += buildParam( "RedirectedURL", RedirectedURL );

	var DestinationURL = getCtrlValue( theForm.DestinationURL );
	if ( DestinationURL == "" )
	{
		url = "auth.removeredirect.html" ;
	}
	else
	{
		url = "auth.addredirect.html" ;
		submitString += buildParam( "DestinationURL", DestinationURL );
	}

	return true ;
}

function doSubmit () 
{
	raSubmitChanges( url, submitString, "Redirect URL" );
}
</SCRIPT>

</HEAD>

<SCRIPT>
onLoadHookFunc = onLoad;
</SCRIPT>

<BODY 
	CLASS="popup"	
	onload="_onLoadDefault();"
	onunload="_onUnLoadDefault();"
> 
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule" height="7" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule">&nbsp;</SPAN>
	</TD>
</TR>
<TR>
   <TD align="left" valign="middle" bgcolor="#FFFFFF" height="49">
      <img src="images/popup_header.gif"  BORDER="0" HSPACE="0" VSPACE="0">
   </TD>
   <TD align="right" valign="middle" bgcolor="#FFFFFF" height="49">
		<img src="images/popup_logo.gif"  BORDER="0" HSPACE="20" VSPACE="0">      
   </TD>
</TR>
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule2" height="9" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule2">&nbsp;</SPAN>
   </TD>
</TR>
</TABLE>
<DIV CLASS="popupPad">

<form 
	name="theForm" 
	method="POST" 
	action="javascript:doSubmit();" 
	onsubmit="return validate();" 
	onreset="doDlgClose(0); return false;"
> 
<table border="0" cellspacing="0" cellpadding="0" width="400" style="width:400;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Add Redirect</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="118" align="right"><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="400">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">URL to Redirect</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="RedirectedURL" SIZE="18" \
TYPE="text" VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Destination URL</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="DestinationURL" SIZE="18" \
TYPE="text" VALUE=""><SPAN CLASS="unitsOffset">Leave this field blank to disable \
redirection for the above URL.</SPAN>  </td>
	</tr>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="400">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR><TD colspan="2" bgcolor="#E6E6E6" align="right" valign="middle" NOWRAP>
   <input type="image" src="images/okay.gif" alt="Apply changes made to this page" \
name="Apply changes made to this page" value="Apply" border="0">&nbsp;<A \
HREF="javascript://" onclick="window.close()"><img src="images/cancel.gif"  \
ALT="Close this window without applying changes" BORDER="0" HSPACE="0" \
VSPACE="0"></A></TD> </TR>
</TABLE>
</DIV>

</FORM>
<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: samples.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<TITLE>Media Samples</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "38";
</SCRIPT>

<SCRIPT SRC="servvar.get.html?portHTTP=config.HTTPPort&portRTSP=config.RTSPPort"></SCRIPT>


<SCRIPT>
xblibInit();

var httpHost = "http://" + location.hostname + ( portHTTP ? (":" + portHTTP) : "" );
var httpHostRamgen = httpHost + "/ramgen";
var rtspHost = (isNav4 ? httpHostRamgen : ("rtsp://" + location.hostname + (portRTSP \
? (":" + portRTSP) : "")));

function makeLink ( dataType, dataTypeDesc, path, attribs )
{
	if ( (dataType != null) &&
		(top.TOC && 
		 top.TOC.l && 
		 top.TOC.l["Datatypes"] && 
	 	 top.TOC.l["Datatypes"][dataType] &&
	 	(top.TOC.l["Datatypes"][dataType]["Enabled"] == "0")) )
	{
		return '<a CLASS="linkText" href="javascript:alert(\'' + dataTypeDesc + ' is not \
licensed on this Server.\' );">' ;  }
	else
	{
		return '<a CLASS="linkText" href="' + path + '" ' + 
			(isBlank(attribs) ? "" : attribs) + '>';
	}
}

var linkRealVideo = makeLink( "RealVideo", "RealVideo", httpHostRamgen + \
"/realvideo10.rm" ); var linkFlash = makeLink( "RealFlash", "RealFlash", \
httpHostRamgen + "/flash.smi" ); var linkSMIL1 = makeLink( null, null, httpHostRamgen \
+ "/presentation/presentation.smi" ); var linkSMIL2 = makeLink( null, null, \
httpHostRamgen + "/africag2/africa.smi" ); var linkMP3 = makeLink( "realmpa", "MP3", \
httpHostRamgen + "/realmp3.mp3" ); var linkMPEG4 = makeLink( "RealMPEG4", "MPEG-4", \
httpHostRamgen + "/mpg4video.mp4" ); var linkWM = makeLink( "WindowsMediaASF", \
"Windows Media", httpHost + "/asxgen/wmvideo.wmv.asx" );

/*
	for IE, see the playQTSamp() comments below. For non-IE browsers (and the only \
non-IE brwoser   I've tested this on is windows/firefox 1.5) the embed tag used in \
playQTSamp() does not   seem to work (actually it works with an http: src but not an \
rtsp src). The workaround is to   create an rtsp: link to the qt sample, and set the \
target and mimetype to quicktime in hopes that  the quicktime player will be launched \
to play it. In reality, the RealPlayer seems to "own" the   rtsp protocol and that \
player will get used regardless, and after some complaining about missing   softwre \
                the RealPlayer will successfully stream & play the qt clip (at least \
                RP v10).
*/

var linkQT = (isIE ? 
	makeLink("QuickTime", "QuickTime", "javascript:playQTSamp();") :
	makeLink("QuickTime", "QuickTime", rtspHost + "/realqt.mov", 
		'target="quicktimeplayer" type="video/quicktime"'));
		 
/*
	playQTSamp:
	opens a dynamically created html page in a tiny brwoser window centered on top of \
the current page.  The page contains an <embed> tag to stream the qt sample file \
using a quicktime plugin.  This page is dynamically created because we want to use \
the current hostname:RTSPPort.

	Note the use of the dummey src="foo.mov" attrib. The embed tag needs a src 
	attrib to load the correct plugin but the QT plugin seems to work only with 
	the qtsrc attrib when using the rtsp protocol.
	
	Note: a movie reference file placed in the same directory as the sample clip would \
work better  but we chose not to open the sample content directory to http access.

	The best solution would be to generate (on the server-side) the Quicktime equivilent \
of a RAM file   (search for "rtspText" or "QTL").
*/
function playQTSamp ()
{
	var win = window.open("", "QT", 
		"toolbar=no,menubar=no,location=no,scrollbars=no,resizable=yes,dependent,width=300,height=250" \
+   getCenteredCoords(300, 250));

	if (win)
	{
		win.document.open();
		win.document.write('<center><embed src="foo.mov" qtsrc="' + rtspHost + 
			'/realqt.mov" width="250" height="250" autoplay="true" \
controller="true"></center>');  win.document.close();
		win.focus();
	}
}
</SCRIPT>

</HEAD>

<BODY CLASS="CONFIG">
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">SERVER SETUP</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellspacing="0" cellpadding="0" width="476">
<tr><td class="body" width="100%" valign="top">
<DIV class="PARA">
<DIV class="PARAHEAD">RealVideo 10</DIV>

	RealVideo 10 provides the highest quality streaming media experience,
	from narrowband to broadband, with VHS quality for broadband viewers
	and DVD quality at 1 Mbps.

	<DIV>
    <SCRIPT>document.write(linkRealVideo);</SCRIPT>Play RealVideo 10 Sample</a>
	</DIV>
</DIV>

<DIV class="PARA">
<DIV class="PARAHEAD">Flash 4</DIV>

	Ideal for long-form animation and e-commerce applications, streaming Flash 
	4 from Macromedia provides bandwidth-efficient broadcasting and 
	synchronization in SMIL presentations.

	<DIV>
    <SCRIPT>document.write(linkFlash);</SCRIPT>Play Flash 4 Sample</a>
	</DIV>
</DIV>

<DIV class="PARA">
<DIV class="PARAHEAD">RealPix, RealText, and SMIL</DIV>

	RealPix allows existing image formats like JPEG to be easily added
	to presentations, offering powerful transition effects and overlay
	capabilities. RealText allows both static and live XML-compliant
	text to be added to presentations with powerful effects like smooth
	scrolling, selectable fonts, and selectable colors. 

	<BR><BR>

	SMIL (Synchronized Multimedia Integration Language) enables
	the server to deliver and choreograph multiple live and pre-recorded
	events, graphics, ads, and text feeds into a single compelling
	presentation. The SMIL samples demonstrate the use of RealPix, 
	RealText as well as RealAudio and RealVideo.

	<DIV>
    <SCRIPT>document.write(linkSMIL1);</SCRIPT>Play SMIL Sample 1</a>
    &nbsp;&nbsp;&nbsp;
    <SCRIPT>document.write(linkSMIL2);</SCRIPT>Play SMIL Sample 2</a>
	</DIV>
</DIV>

<DIV class="PARA">
<DIV class="PARAHEAD">MP3</DIV>
	Take advantage of streaming delivery for the popular MP3 format.
	<DIV>
    <SCRIPT>document.write(linkMP3);</SCRIPT>Play MP3 Sample</a>
	</DIV>
</DIV>

<DIV class="PARA">
<DIV class="PARAHEAD">MPEG-4</DIV>

	Helix Server delivers 
	<A HREF="http://www.isma.tv" CLASS="linkText" TARGET="EXT">ISMA</A>
	compliant MPEG-4 bit streams with the file extension of "mp4". MPEG-4 
	files must be hinted before it can be streamed from the server. 
	Playback requires an ISMA compliant player such as the RealPlayer 
	with the <A HREF="http://www.envivio.com/" CLASS="linkText" \
TARGET="EXT">EnvivioTV</A>  Plug-in.

	<DIV>
    <SCRIPT>document.write(linkMPEG4);</SCRIPT>Play MPEG-4 Sample</a>
	</DIV>
</DIV>

<DIV class="PARA">
<DIV class="PARAHEAD">QuickTime</DIV>
	Through proven leadership with the industry standard RTSP, Helix Server 
	interoperates with other RTSP clients, broadcasting to QuickTime clients 
	with QuickTime content. Playback requires the QuickTime player.
	<DIV>
    <SCRIPT>document.write(linkQT);</SCRIPT>Play QuickTime Sample</a>
	</DIV>
</DIV>

<DIV class="PARA">
<DIV class="PARAHEAD">Windows Media</DIV>

	Helix Server can deliver Windows Media content with the file
	extensions of "wma", "wmv" and "asf". Playback requires the Windows Media 
	Player, v6.4 and above.

	<DIV>
    <SCRIPT>document.write(linkWM);</SCRIPT>Play Windows Media Sample</a>
	</DIV>
</DIV>
</TD></TR></TABLE>
</BODY>
</HTML>

--- NEW FILE: config_altserv.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Redundant Servers</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "40";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="propview_enum.js"></SCRIPT>

<!--  for dealing with the Rule.<Rule No>.Alternates list -->
<SCRIPT SRC="enumproplist.js"></SCRIPT>

<!-- This external script contains our live server data -->
<SCRIPT SRC="servvar.get.html?serverData=config.ServerAlternates"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
var propSetRule =
[
   ,new PropObj( 'Rule', '', true, true, null, null, "", "Rule" )
   ,new EnumPropListSel( 'Alternates', null, "", 100, "theRuleAlternateList" )
];

var propSetAlternate =
[
	new PropObj( 'Host', '', false, true, null, null, "hostname", "Host" )
   ,new PropObj( 'Port', '554', false, true, null, null, "port", "Port" )
];

var propSetMain =
[
    new PropList( 'Alternates', null, null, propSetAlternate )

   ,new PropList( 'RedirectRules', null, null, propSetRule )
   ,new EnumPropListSel( "ExcludePaths", null, "Path_", 1, "thePathList" )

];

var propList = new PropList( "ServerAlternates", serverData, propSetMain );
var subListRules = propList.subList( "RedirectRules" );
var subListAlternates = propList.subList( "Alternates" );
var subListExPaths = propList.subList( "ExcludePaths" );

function ExPathPropView ()
{
	this.base = NestedPropListView ;
	this.base( "ExcludePaths", subListExPaths, "path", 
				"config.ServerAlternates.ExcludePaths.", "servvar", 
				"theForm", "thePathList", "thePathEdit" );

	this.m_itemDefValue = "/path";
	this.m_itemDefValuePostFix = "/" ;
}
ExPathPropView.prototype = new NestedPropListView ;

ExPathPropView.prototype.postOnLoad = function ( fValidate )
{
	if ( this.m_subListParent )
	{
		this.m_subListParent.fillForm( theForm );
	}
	selectFirst( theForm.thePathList );

	this.m_oES.m_reIllegalChars = /[=!@#\$%\^&\(\){}\[\];:'"<>,\?~]/;
	this.m_oES.sync();

}	// postOnLoad

ExPathPropView.prototype.preValidate = function ()
{

	// validate doesn't recurse into sublists
	if ( this.m_subListParent )
	{
		return (null == this.m_subListParent.validate( theForm ));
	}

	return true;
}

ExPathPropView.prototype.removeSubList = function ()
{
	if ( ! this.m_bLoaded ) return ;

	if ( ! this.m_curSubListName )
	{
		
		return;
	}
		
	// in case the sublist was renamed
	if ( ! this.m_oES.doRenameCheck() )
		return ;

	
	
    if ( this.confirmRemoveSubList( this.m_curSubListName ) )
	{
		var deletedSubListName = this.m_curSubListName;
		// mark as 'deleted'
		this.m_oES.remove();
		this.onSubListChangeNotify( "delete", deletedSubListName );
		this.fillFormFromSubList( false );
	}

}	// removeSubList ()

ExPathPropView.prototype.confirmRenameSubList = function ( oldSubListName, \
newSubListname ) {
	if ( ! this.m_propList.mountpoint_validate( newSubListName ) )
	{
		return rejectInput( this.getEditCtrl(), 
			"Exclude Path paths must begin and end with a forward slash ('/')." );
	}

    return true ;
	
}	// confirmRenameSubList ()

ExPathPropView.prototype.onESRename = function ( oldSubListName, newSubListName )
{
	if ( ! this.m_bLoaded ) return ;

	return true ;

}	// onESRename ()

function RulePropView ()
{
	this.base = NestedEnumPropListView ;
	this.base( "Redirect Rules", subListRules, "Redirect Rule", 
				"config.ServerAlternates.RedirectRules.", "servvar", 
				"theForm", "theRuleList", "Rule", null,
				"Rule", "/path/" );

	//this.m_resultsTitleListIndex = 5;
	//this.m_resultsTitlePropIndex = 6;
}
RulePropView.prototype = new NestedEnumPropListView ;

RulePropView.prototype.postFillFormFromSubList = function ( fValidate )
{

	// fillForm isn't recursive - have to do it for sublists
	var subListRuleAlts = getRuleAltsList();
	if ( subListRuleAlts )
	{
		subListRuleAlts.fillForm( theForm );
	}
	
	return true;

}	// postFillFormFromSubList ()

RulePropView.prototype.postValidateSubList = function ( subListName )
{

	// Alternate list for this rule can't be empty
	if ( 0 == selCtrlRuleAlts.options.length )
	{
		// is it because there are no Alternates in subListAlternates?
		if ( 0 == subListAlternates.subListCount() )
		{
			return rejectInput( theForm.theAlternateEdit, 
				"Create an Alternate and add it to this list" );
		}
		return rejectInput( selCtrlAddAlt, "Add an Alternate" );
	}

	// make sure each Alternate in selCtrlRuleAlts points to a valid 
	// Alternate in subListAlternates
	for ( var i = 0; i < selCtrlRuleAlts.options.length; i++ )
	{
		var AltsubListName = selCtrlRuleAlts.options[ i ].text ;
		var subList = subListAlternates.subList( AltsubListName );
		if ( (!subList) || ("deleted" == subList.m_status) )
		{
			selCtrlRuleAlts.selectedIndex = i ;
			return rejectInput( selCtrlRuleAlts, 
				"'" + AltsubListName + "' is not a valid Alternate" );
		}
	}

	// validate doesn't recurse
	var subListRuleAlts = getRuleAltsList( subListName );
	if ( subListRuleAlts )
	{
		subListRuleAlts.validate( theForm );
	}
	
	return true;

}	// postValidateSubList ()

RulePropView.prototype.getRulesUsingAlt = function ( altName )
{
	var rules = new Array();
	var curRule = this.m_curSubListName ;
	for ( var ruleName in this.m_propList.subLists() )
	{
		if ( curRule != ruleName )
		{
			var ruleSubList = this.m_propList.subList( ruleName )
			if ( ruleSubList && ("deleted" != ruleSubList.m_status) )
			{
				var ruleAltsubList = ruleSubList.subList( "Alternates" );
				if ( ruleAltsubList && ruleAltsubList.m_newValues )
				{
					for ( var i = 0; i < ruleAltsubList.m_newValues.length; i++ )
					{
						if ( altName == ruleAltsubList.m_newValues[ i ] )
						{
							rules[ rules.length ] = ruleSubList.prop( "Rule" ).getValue();
						}
					}
				}
			}
		}
	}

	// since the current rule may not have been validated yet, check the selCtrlRuleAlts \
listbox,  // instead of the proplist, for the existence of altName
	if ( -1 != selectFind( selCtrlRuleAlts, altName, true ) )
		rules[ rules.length ] = getCtrlValue( theForm.Rule );

	return rules ;

}	// getRulesUsingAlt ()

// define a subclass of NestedPropListView that will handle the main prop set \
("enabled" var) // and the Alternates sublist. This class will encapsulate a propView \
to handle the // Rules sublist
function AltPropView ()
{
	this.base = NestedPropListView ;
	this.base( "RedirectRules", propList, "Alternate_", 
				"config.ServerAlternates.", "servvar",
				"theForm", "theAlternateList", "theAlternateEdit" );

	this.m_subListParent = subListAlternates;

	this.propViewRules = new RulePropView();
	this.propViewExPaths = new ExPathPropView();

	//this.m_resultsTitleListIndex = 5;
	//this.m_resultsTitlePropIndex = 6;
}
AltPropView.prototype = new NestedPropListView ;

AltPropView.prototype.preValidate = function ()
{

	return ( this.propViewRules.validate( true ) && 
			 this.propViewExPaths.validate( true ) );
}

AltPropView.prototype.confirmRemoveSubList = function ( altName )
{
	var msg = "Remove Alternate '" + altName + "'?"; 

	var rulesThatUseThisAlt = this.propViewRules.getRulesUsingAlt( altName );
	if ( rulesThatUseThisAlt && rulesThatUseThisAlt.length )
	{
		msg += "\n\nWarning, this Alternate is being used by the '" + 
			rulesThatUseThisAlt.join( "', '" ).replace( /, ([^,]+)$/, " and $1" ) +
			"' rule".pluralize( rulesThatUseThisAlt.length ) + "." +
			"\nIf you delete this Alternate you must update " + 
			"this rule".pluralize( rulesThatUseThisAlt.length, "these rules" ) +
			" to use another Alternate." ;
	}

    return confirm( msg );
	
}	// confirmRemoveSubList ()

AltPropView.prototype.confirmRenameSubList = function ( oldaltName, newaltName )
{

	var rulesThatUseThisAlt = this.propViewRules.getRulesUsingAlt( oldaltName );
	if ( rulesThatUseThisAlt && rulesThatUseThisAlt.length )
	{
		var msg = "Rename Alternate '" + oldaltName + "'?" + 
			"\n\nWarning, '" + oldaltName + "' is being used by the '" + 
			rulesThatUseThisAlt.join( "', '" ) +
			"' rule".pluralize( rulesThatUseThisAlt.length ) + "." +
			"\nIf you rename this Alternate you must update " + 
			"this rule".pluralize( rulesThatUseThisAlt.length, "these rules" ) +
			" to use the new Alternate name." ;

	    if ( ! confirm( msg ) )
			return false ;
	}

	return true ;

}	// confirmRenameSubList ()

AltPropView.prototype.onSubListChangeNotify = function ( action, altName )
{
	if ( this.m_bDoDirtyCheck )
		this.showDirtyFlag( this.isDirty() );

	// reset theAddAlternateList list box
	// preserve the prompt text
	selCtrlAddAlt.options.length = 1;
	subListAlternates.fillSelectList( selCtrlAddAlt );
	selectFirst( selCtrlAddAlt );

}	// onSubListChangeNotify ()

AltPropView.prototype.resultsCallback = function ( results )
{
	var res, a;
    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];

		// filter out the reset of a rule's Alternate list
		if ( propName.bSearch( /Rules.*Alternates$/ ) && ('Remove' == res.action) )
		{
			res.title = "NO_DISPLAY" ;
		}
		else
		{
			a = propName.split( "." );
			if ( propName.bSearch( /\.Rules\./ ) )
			{
				if ( a[ 5 ] )
				{
					var listName = "Rules." + a[ 4 ];
		        	res.title = listName.ent().span("body") + '<br>' + 
		        		a[ 5 ];

					res.actionDisplay = "Added ".span( "grey" ) + res.newval.ent();
				}
				else if ( a[ 4 ] )
				{
		        	res.title = a[ 4 ].ent().span("body");
				}
			}
			else
			{
				if ( a[ 5 ] )
				{
		        	res.title = a[ 4 ].ent().span("body") + '<br>' + 
		        	a[ 5 ];
				}
				else if ( a[ 4 ] )
				{
		        	res.title = a[ 4 ].ent().span("body");
				}
			}
			
		}
	}
}

/*
AltPropView.prototype.buildParamStringCallback = function ( propList, prop, paramStr \
) {
	return paramStr ;
}
*/

var propView = new AltPropView();

// global references to form elements
var theForm ;
var selCtrlRuleAlts ;
var selCtrlAddAlt ;

function onLoad ()
{
	theForm = document.theForm;

	selCtrlRuleAlts = theForm.theRuleAlternateList;
	selCtrlRuleAlts.options.length = 0;

	propView.onLoad( window );

	propView.propViewRules.onLoad( window, true );
	propView.propViewExPaths.onLoad( window, true );

	selCtrlAddAlt = theForm.theAddAlternateList;
	selCtrlAddAlt.options.length = 1;
	subListAlternates.fillSelectList( selCtrlAddAlt );

}	// onLoad ()

// append the selected Alternate to the cur Rule's Alternate list
function onAddRuleAlternate ()
{
	// make sure the selection isn't the propmpt text
	if ( 0 == selCtrlAddAlt.selectedIndex )
		return ;

	var AltToAdd = getCtrlValue( selCtrlAddAlt );
	if ( ! AltToAdd ) return ;

	
	
	var subListRuleAlts = getRuleAltsList();
	if ( subListRuleAlts )
	{
		subListRuleAlts.addPropValue( theForm, AltToAdd );
	}

	// reset the selection to the first item - the prompt text
	selectFirst( selCtrlAddAlt );

}	// onAddRuleAlternate ()

function onAddRuleAlternateFocus ()
{
	propView.m_oES.doRenameCheck();
}

function onDelRuleAlternate ()
{
	
	
	var subListRuleAlts = getRuleAltsList();
	if ( subListRuleAlts )
	{
		subListRuleAlts.removeCurSelValue( theForm );
	}

}	// onDelRuleAlternate ()

function onIncRuleAlternate ( inc )
{
	
	
	var subListRuleAlts = getRuleAltsList();
	if ( subListRuleAlts )
	{
		subListRuleAlts.swapValueOrder( theForm, inc );
	}

}	// onIncRuleAlternate ()

function getRuleAltsList ( ruleListName )
{
	var subListRuleAlts = null;
	var subListRule = propView.propViewRules.getSubList( ruleListName );
	if ( subListRule )
	{
		subListRuleAlts = subListRule.subList( "Alternates" );
	}

	return subListRuleAlts ;

}	// getRuleAltsList ()
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">SERVER SETUP</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
RealPlayer (version 9.0 and later) dynamically attempts to reconnect to
a Helix Server if playback is disrupted due to a catastrophic network
or server host outage. The server enables one or more redundant
servers to be designated. Upon initial connection, RealPlayer is told
what redundant servers exist. If during playback an outage is detected by
RealPlayer, it will reconnect to the redundant host designated via this
web page.
<BR><BR>
The host entry may be a dotted IP address or a host name. The name or
address may resolve to a single system, a DNS rotation or a virtual address
used by a switch. Any redundant server must be able to deliver the
identical live broadcasts and on-demand presentations as this Helix Server.
<BR><BR>
Redundant server assignment is done by resource path. To designate a
redundant server for all hosted content, simply define "/" as the rule.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Redundant Servers</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<tr>
    <TD class="input" valign="top" width="50%">
		<TABLE CLASS="PROPLIST_LABEL" width="226" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Alternate Servers</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Server" BORDER=0></A><A href="javascript://" onclick="propView.removeSubList()"><IMG \
src="images/delete_g.gif" HSPACE=1 ALT="Remove Current Server" BORDER=0></A><A \
href="javascript://" onclick="propView.copySubList()"><IMG src="images/copy_g.gif" \
HSPACE=1 ALT="Copy Current Server" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theAlternateList" SIZE="7" WIDTH="226">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
    <TD valign="top" class="input" valign="top" width="50%">
		 Description
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theAlternateEdit" SIZE="18" \
TYPE="text" VALUE="">  Host
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Host" SIZE="18" TYPE="text" \
VALUE="">

		Port
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Port" SIZE="18" TYPE="text" \
VALUE="">  </TD>                        
</TR>
<tr </tr>
<tr>
    <TD class="input" valign="top">
		<TABLE CLASS="PROPLIST_LABEL" width="226" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Redirect Rules</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.propViewRules.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 \
ALT="Add New Redirect Rule" BORDER=0></A><A href="javascript://" \
onclick="propView.propViewRules.removeSubList()"><IMG src="images/delete_g.gif" \
HSPACE=1 ALT="Remove Current Redirect Rule" BORDER=0></A><A href="javascript://" \
onclick="propView.propViewRules.copySubList()"><IMG src="images/copy_g.gif" HSPACE=1 \
ALT="Copy Current Redirect Rule" BORDER=0></A><A href="javascript://" \
onclick="propView.propViewRules.incSubList(-1)"><IMG src="images/moveup_g.gif" \
HSPACE=1 ALT="Move Current Redirect Rule Up" BORDER=0></A><A href="javascript://" \
onclick="propView.propViewRules.incSubList(1)"><IMG src="images/movedown_g.gif" \
HSPACE=1 ALT="Move Current Redirect Rule Down" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theRuleList" SIZE="8" WIDTH="226">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
    <TD valign="top" class="input" valign="top">
		Edit Rule Path
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Rule" SIZE="18" TYPE="text" \
VALUE="">

		<BR>
		<TABLE CLASS="PROPLIST_LABEL" width="234" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Alternate Servers</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="onDelRuleAlternate()"><IMG src="images/delete_g.gif" HSPACE=1 ALT="Remove \
Current Alternate" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theRuleAlternateList" SIZE="3" WIDTH="234">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>

		<SCRIPT>if ( isNav4 ){document.write( '<FONT class="input">' );}</SCRIPT>
		<SCRIPT>if (isMoz5) document.write('<BR>');</SCRIPT>

		<select CLASS="longInput" NAME="theAddAlternateList" \
ONCHANGE="onAddRuleAlternate();" ONFOCUS="onAddRuleAlternateFocus()" SIZE="1" \
                WIDTH="234">
		    <OPTION value="Add Alternate Server To Rule">Add Alternate Server To \
Rule</OPTION>  <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		</SELECT>

		<SCRIPT>if ( isNav4 ){document.write( '</FONT>' );}</SCRIPT>
    </TD>                        
</TR>
<tr </tr>
<tr>
    <TD class="input" valign="top">
		<TABLE CLASS="PROPLIST_LABEL" width="226" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Exclude Paths</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.propViewExPaths.createSubList()"><IMG src="images/add_g.gif" \
HSPACE=1 ALT="Add New Server" BORDER=0></A><A href="javascript://" \
onclick="propView.propViewExPaths.removeSubList()"><IMG src="images/delete_g.gif" \
HSPACE=1 ALT="Remove Current Server" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="thePathList" SIZE="4" WIDTH="226">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
    <TD valign="top" class="input" valign="top">
		Edit Path
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="thePathEdit" SIZE="18" TYPE="text" \
VALUE="">  </TD>                        
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_mimetypes.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>MIME Types</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "13";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="enumproplist.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?serverData=config.MimeTypes"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
function nestExtensions ()
{
	// EnumPropListText needs to be under a list with a known name
	// so move the extensions to a new "Extensions" sublist
	for ( var mt in serverData )
	{
		if ( isObj( serverData[ mt ] ) )
		{
			serverData[ mt ]["Extensions"] = serverData[ mt ];
		}
	}
}
nestExtensions();

// meta data for mount point variables
var propSet = 
[
    new EnumPropListText( "Extensions", null, "Ext_", 1, "Extensions", ",", /\s*,\s*/ \
) ];

function MTPropView ()
{
	this.base = NestedPropListView ;
	this.base( "MIME Types", propList, "MIME Type", 
				"config.MimeTypes.", "servvar", "theForm", "theList", "theEdit" );

	this.m_itemDefValue = "type/sub-type";
}
MTPropView.prototype = new NestedPropListView ;

MTPropView.prototype.postFillFormFromSubList = function ( fValidate )
{

	var subList = this.getSubList();
	if ( subList && subList.subList( "Extensions" ) )
		subList.subList("Extensions").fillForm( theForm );

	return true;

}	// postFillFormFromSubList ()

MTPropView.prototype.preValidateSubList = function ( subListName )
{

	// validate doesn't recurse into sublists
	var subList = propView.getSubList();
	if ( subList && subList.subList( "Extensions" ) )
		subList.subList("Extensions").validate( theForm );

	return true;

}	// preValidateSubList ()

// remove the artificial "Extensions" sublist
MTPropView.prototype.buildParamStringCallback = function ( propList, prop, paramStr )
{
	return paramStr.replace( /\.Extensions/, "" );
}

MTPropView.prototype.confirmRenameSubList = function ( oldSubListName, newSubListName \
) {
	if ( ! propList.mimetype_validate( newSubListName ) )
		return rejectInput( theForm.theEdit, propList.errMsg );

    return true ;
	
}	// confirmRenameSubList ()

var propList = new PropList( "MimeTypes", serverData, null, propSet );
var propView = new MTPropView();

var theForm ;

function onLoad ()
{
	theForm = document.theForm ;

	propView.onLoad( window );

}	// onLoad
</SCRIPT>

</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">SERVER SETUP</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
The MIME types list ensures that the server sends the correct file type 
information when it streams data via HTTP. Modify this list only if you will be
streaming a data type via HTTP that is not currently on the list.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>MIME Types</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<tr>
	<TD class="input" valign="top" width="50%">
		<TABLE CLASS="PROPLIST_LABEL" width="226" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">MIME Types</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
MIME Type" BORDER=0></A><A href="javascript://" \
onclick="propView.removeSubList()"><IMG src="images/delete_g.gif" HSPACE=1 \
ALT="Remove Current MIME Type" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theList" SIZE="7" WIDTH="226">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="50%">
		Edit MIME Type
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theEdit" SIZE="18" TYPE="text" \
VALUE="">

		<BR>
		<SCRIPT>if ( isNav6 ){document.write( '<BR>' );}</SCRIPT>
        Extensions
        <BR>
        <input CLASS="longInput" MAXLENGTH="255" NAME="Extensions" SIZE="18" \
TYPE="text" VALUE="">

		<SPAN class="Units">
			Separate multiple extensions with a comma.
		</SPAN>
    </TD>                        
</TR>

<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: toc_nav.css ---

BODY
{
	background-color:	#FFFFFF;
	padding:			0;
	margin: 			0;
}
DIV
{
	width: 200;
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	font-size:      8.5pt;
	position:		absolute;
	visibility:		hidden;
	/*layer-background-color: #FFFFFF*/

}

TABLE
{
/*border: solid #E6E6E6 2px;*/
}

Div.l0 TABLE
{
}

A
{
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	font-size:      8.5pt;
	color:			#FF6600;
}

A:link {text-decoration: none;}
A:visited {text-decoration: none;}
/*.l0,.l1,.l2,.l3,.l4,.l5,.l6,.l7 {text-indent: -14; padding-left: 14}*/

.l0 {left: 9; margin-bottom: 12; }
.l1 {left: 10; padding-left:4;}
.l2 {left: 11; }
.l3 {left: 12; }
.l4 {left: 25; }
.l5 {left: 29; }
.l6 {left: 33; }
.l7 {left: 37;}

/* bump the font sizes slightly for the first heading level */
DIV.l0 A
{
	font-weight: bold;	
	color: 			  	#666666;
}

--- NEW FILE: config_broad_redun.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Broadcast Redundancy</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "27";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="propview_nolist.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?serverData=config.RealSystem%20Broadcast%20Redundancy%20Plugin&FSData=config.FSMount&diffConfig=diffconfig"></SCRIPT>


<SCRIPT LANGUAGE="javascript">
var FS_REDUN = "RealSystem Broadcast Redundancy";

var propSet = 
[
	new PropObj( 'Enabled',	"0", false, true, null, null, "int" ), 
	new PropObj( 'SeparatorCharacter',	".", false, true, null, null, "" ), 
	new PropObj( 'LiveSourceTimeout',	"5", false, true, 0, 60, "int" ),
	new PropObj( 'Reconnect',			"Auto", false, true, null, null, "" ),
	new PropObj( 'MountPoint',			"/redundant/", false, true, null, null, "mountpoint", \
"Mount Point", true ),  new PropObj( 'ShortName', "pn-redundant", true, true, null, \
null, "", "Short Name", true ),  new PropObj( 'ErrorMessage', "Broadcast timed out; \
click Play button to restart." ) ];

// copy properties from the filesystem list into the RealSystem Broadcast Redundancy \
list // so that the proplist gets initialized correctly
if ( serverData && FSData && FSData[FS_REDUN] ) 
{
	serverData[ "MountPoint" ] = 
    	(FSData[FS_REDUN][ "MountPoint" ] ? FSData[FS_REDUN][ "MountPoint" ] : "");
	serverData[ "ShortName" ]  = 
    	(FSData[FS_REDUN][ "ShortName" ]  ? FSData[FS_REDUN][ "ShortName" ]  : "");
}
var propList = new PropList( "Broadcast Redundancy", serverData, propSet );

function RedunPropView ()
{
	this.base = PropListView ;
	this.base( "Broadcast Redundancy", propList, "config.RealSystem Broadcast Redundancy \
Plugin.",  "servvar", "theForm" );
}
RedunPropView.prototype = new PropListView ;

RedunPropView.prototype.postValidate = function ()
{
	// make sure the mountpoint is unique among all mount points
    if ( propList && propList.prop( "MountPoint" ) )
    {
		var errMsg = 
	    	propList.prop( "MountPoint" ).getMountPointConflictErrMsg( FSData );
		if ( errMsg )
		{
			return rejectInput( theForm.MountPoint, errMsg );
		}
	}
	return true;
}

RedunPropView.prototype.buildParamStringCallback = function ( propList, prop, \
paramStr ) {
	// change the mount point list name
	if ( paramStr.bSearch( /MountPoint|ShortName/ ) )
	{
		return paramStr.replace( /RealSystem%20Broadcast%20Redundancy%20Plugin/, 
        	"FSMount." + escape(FS_REDUN) );
	}

	return paramStr ;
}

RedunPropView.prototype.resultsCallback = function ( results )
{
	var res;
    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];
       	res.title = propName.rightProp();
	}
}

var propView = new RedunPropView();

var theForm = null ;

function onLoad ()
{
	theForm = document.theForm;

	propView.onLoad( window );

}	// onLoad
</SCRIPT>

</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">BROADCASTING</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
Broadcast Redundancy allows you to treat multiple live sources as a single
broadcast. If a live source stops broadcasting, by default all clients
will be redirected to the next available stream, thus ensuring user
quality-of-service. This safeguard occurs automatically for RTSP-based
client connections, the most common mode of Player to Server communication,
while clients using the legacy PNM protocol must manually restart their
connection.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 

<input type="hidden" name="ShortName" value="">
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Broadcast Redundancy</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="33%">
			<span class="offsetLabel">Broadcast&nbsp;Redundancy</span>
		</td>
		<TD class="input" valign="top" align="left" width="67%">
			<select CLASS="input" NAME="Enabled" SIZE="1" WIDTH="120">
	            <OPTION value="1">Enabled</OPTION>
	            <OPTION value="0">Disabled</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="33%">
			<span class="offsetLabel">Delimiter</span>
		</td>
		<TD class="input" valign="top" align="left" width="67%">
			<select CLASS="input" NAME="SeparatorCharacter" SIZE="1" WIDTH="120">
	            <OPTION value="~">~ (tilde)</OPTION>
	            <OPTION value="^">^ (caret)</OPTION>
	            <OPTION value=".">. (period)</OPTION>
	            <OPTION value="'">' (single quote)</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="33%">
			<span class="offsetLabel">Timeout</span>
		</td>
		<TD class="input" valign="top" align="left" width="67%">
			<input CLASS="input" MAXLENGTH="2" NAME="LiveSourceTimeout" SIZE="2" TYPE="text" \
VALUE=""><SPAN CLASS="units"><BR>(seconds, default is 5)</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="33%">
			<span class="offsetLabel">Reconnect</span>
		</td>
		<TD class="input" valign="top" align="left" width="67%">
			<select CLASS="input" NAME="Reconnect" SIZE="1" WIDTH="120">
	            <OPTION value="Auto">Auto</OPTION>
	            <OPTION value="Manual">Manual</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="33%">
			<span class="offsetLabel">Mount Point<FONT color="red">*</FONT></span>
		</td>
		<TD class="input" valign="top" align="left" width="67%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="MountPoint" SIZE="24" TYPE="text" \
VALUE="">  </td>
	</tr>
<TR>
	<TD class="input" valign="top" align="left" colspan=2>
		<TABLE width="100%" BORDER=0 CELLSPACING=0 CELLPADDING=0>
			Error Message
			<BR>
			<input CLASS="longInput" MAXLENGTH="255" NAME="ErrorMessage" SIZE="37" TYPE="text" \
VALUE="">  </TABLE>
	</TD>
</TR>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" VALIGN="middle" width="100%" class="body" \
                ALIGN="left">
      <FONT color="red">*A server restart is required to effect changes applied to \
this field.</FONT>  </TD>
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: port.js ---

//<SCRIPT>

var allPorts = [];

var excludePaths = 
[
	 "BroadcastDistribution.Destinations"
	,"AccessControl"
	,"ProxyRoutingTable"
	,"WebServerPort"
	,"SplitterSourceList"
	,"LicensePublishers"
	,"Windows Media Live Broadcast Source"
	,"ProxyAlternates"
	,"ServerAlternates"
	,"ContentSubscription"
	,"Multicast.RTSPPort"
];

function initAllPortsList ( configList /*, optional registry path to exclude, exclude \
2, etc. */ ) {
	// build path exclusion regex
	for ( var i = 1; i < arguments.length; i++ )
	{
		excludePaths[ excludePaths.length ] = arguments[ i ];
	}
	var sRegExp = ""
	for ( var i = 0; i < excludePaths.length; i++ )
	{
		sRegExp += escRegExMetaChars( excludePaths[ i ] ) + 
					(i < excludePaths.length-1 ? "|" : "");
	}

	var regExpExclPaths = new RegExp( sRegExp, "i" );
	var regExpPort = new RegExp( ".*(Port|PortRange)$", "i" );
	var regExpPortExcept = new RegExp( "transport|support", "i" );

	function _callback ( a, propName, curDepth, curPath )
	{
		if ( typeof( a[ propName ] ) == "object" )
		{
			return;
		}
		
		// Netscape 4 interperets propnames like "100" as numbers
		if ( typeof( propName ) == "number" )
		{
			return;
		}
		
		if ( ! propName.bSearch( regExpPort ) )
		{
			return ;
		}

		if ( propName.bSearch( regExpPortExcept ) )
		{
			return ;
		}

		// filter out ports that are used for allowances or that refer to ports
		// on other servers (see excludePaths above)
		if ( curPath.bSearch( regExpExclPaths ) )
			return ;

		
		allPorts[ curPath ] = a[ propName ];
	}
	enumPropArray( configList, _callback );
}

function findPortConflictName ( lowerPort, upperPort )
{
	// handle case where the lowerPort was in 'PortRange' format: "NNNN-NNNN"
	var aTemp = (""+lowerPort).split( /\s*-\s*/ );
	if ( aTemp && aTemp[ 0 ] && aTemp[ 1 ] )
	{
		upperPort = aTemp[ 1 ];
	}
	else
	{
		upperPort = parseInt( upperPort );
	}

	lowerPort = parseInt( lowerPort );

	if ( isNaN( lowerPort ) || (lowerPort == 0) )
		return "" ;

	if ( isNaN( upperPort ) )
		upperPort = lowerPort ;

	for ( var name in allPorts )
	{
		var port = allPorts[ name ];
		if ( ! name.bSearch( /PortRange/ ) )
		{
			if ( (port == lowerPort) ||
				 (upperPort &&
				  (port >= lowerPort) &&
				  (port <= upperPort)) )
			{
				return name ;
			}
		}
		else
		{
			
			if ( isPortRangeOverlap( lowerPort, upperPort, port ) )
			{
				return name ;
			}
		}
	}

	return "" ;
}

function isPortRangeOverlap ( lower1, upper1, lower2, upper2 )
{
	// handle case where lower1 is in 'PortRange' format: "NNNN-NNNN"
	var aTemp1 = (""+lower1).split( /\s*-\s*/ );
	if ( aTemp1 && aTemp1[ 0 ] && aTemp1[ 1 ] )
	{
		// handle case where upper1 is in 'PortRange' format: "NNNN-NNNN"
		var aTemp2 = (""+upper1).split( /\s*-\s*/ );
		if ( aTemp2 && aTemp2[ 0 ] && aTemp2[ 1 ] )
		{
			lower1 = parseInt( aTemp1[ 0 ] );
			upper1 = parseInt( aTemp1[ 1 ] );
			lower2 = parseInt( aTemp2[ 0 ] );
			upper2 = parseInt( aTemp2[ 1 ] );
		}
		else
		{
			upper2 = lower2;
			lower2 = upper1;
			lower1 = parseInt( aTemp1[ 0 ] );
			upper1 = parseInt( aTemp1[ 1 ] );
		}
	}
	// handle case where lower2 is in 'PortRange' format: "NNNN-NNNN"
	aTemp1 = (""+lower2).split( /\s*-\s*/ );
	if ( aTemp1 && aTemp1[ 0 ] && aTemp1[ 1 ] )
	{
		lower2 = parseInt( aTemp1[ 0 ] );
		upper2 = parseInt( aTemp1[ 1 ] );
	}

	// assumes both ranges are valid: lowerX <= upperX
	if ( lower1 <= lower2 )
	{
		return (lower2 <= upper1);
	}
	else
	{
		return (lower1 <= upper2);
	}
}

function getConflictErrMsg ( configPathThanConflicts, propName )
{
	var port = allPorts[ configPathThanConflicts ];
	if ( port )
	{
		port = "' (" + port + ").";
	}
	else
	{
		port = "'.";
	}
	
	return "The " + propName + " conflicts with the '" + configPathThanConflicts + port \
; }

function PortRangeCtrl ( name, minRange, isRequired )
{
	this.m_name = (name ? name : "PortRange");
	this.m_minRange = (minRange != null ? minRange : 0);
	this.m_isRequired = (isRequired != null ? isRequired : true);

	this.m_port1 = this.m_name + "1";
	this.m_port2 = this.m_name + "2";
}

PortRangeCtrl.prototype.fillForm = function ( oForm )
{
	if ( oForm && 
		 oForm[ this.m_name ] && 
		 oForm[ this.m_port1 ] && 
		 oForm[ this.m_port2 ] )
	{
		// split PortRange into lower and upper display fields
		var aTemp = getCtrlValue( oForm[ this.m_name ] ).split( /\s*-\s*/ );
		setCtrlValue( oForm[ this.m_port1 ], (aTemp[0] ? aTemp[0] : ""), true );
		setCtrlValue( oForm[ this.m_port2 ], (aTemp[1] ? aTemp[1] : ""), true );
	}	
}

PortRangeCtrl.prototype.validate = function ( oForm )
{
	if ( oForm && 
		 oForm[ this.m_name ] && 
		 oForm[ this.m_port1 ] && 
		 oForm[ this.m_port2 ] )
	{
		var port1 = getCtrlValue( oForm[ this.m_port1 ] );
		var port2 = getCtrlValue( oForm[ this.m_port2 ] );

		// both pieces missing?
		if ( isBlank( port1 ) && isBlank( port2 ) )
		{
			if ( this.m_isRequired )
			{
				return rejectInput( oForm[ this.m_port1 ], 
					"A Port Range is required." );
			}
			else
			{
				setCtrlValue( oForm[ this.m_name ], "" );
				return true;
			}
		}

		var err1 = getPortErr( port1 );
		var err2 = getPortErr( port2 );

		// one piece missing?
		if ( isBlank( port1 ) || isBlank( port2 ) )
		{
			// fill in the missing piece
			if ( isBlank( port1 ) && !err2 )
			{
				port1 = Math.max( 0, parseInt( port2, 10 ) - this.m_minRange );
				err1 = getPortErr( port1 );
				if ( ! err1 )
				{
					setCtrlValue( oForm[ this.m_port1 ], port1, true );
				}
			}
			else if ( !err1 )
			{
				port2 = Math.min( 65535, parseInt( port1, 10 ) + this.m_minRange );
				err2 = getPortErr( port2 );
				if ( ! err2 )
				{
					setCtrlValue( oForm[ this.m_port2 ], port2, true );
				}
			}
		}

		if ( err1 )
			return rejectInput( oForm[ this.m_port1 ], err1 );

		if ( err2 )
			return rejectInput( oForm[ this.m_port2 ], err2 );

		port1 = parseInt( port1, 10 );
		port2 = parseInt( port2, 10 );

		if ( port1 > port2 )
		{
			// user must be lesydexic, give em a break
			var tmp = port1;
			port1 = port2;
			port2 = tmp;
		}

		if ( Math.abs(port1 - port2) < this.m_minRange )
		{
			return rejectInput( oForm[ this.m_port1 ], 
				"Invalid port range. The port range must span at least " +
				 (this.m_minRange+1) + " port".pluralize(this.m_minRange+1) + "." );
		}

		// combine into PortRange field
		setCtrlValue( oForm[ this.m_name ], port1 + "-" + port2, true );

		return true ;
	}
}

function getPortErr ( origPort )
{
	port = parseInt( origPort, 10 );
	
	if ( (port != origPort) ||
		 isNaN( port ) || 
		 (port > 65535) ||
		 (port == 0) )
	{
		return "'" + origPort + "' is an invalid port. Valid port numbers are 1 through \
65535." ;  }

	return "";
}

//</SCRIPT>

--- NEW FILE: propview_enum.js ---

//<SCRIPT>

/* EnumEditSelect is a subclass of the EditSelect2 class, done so we can override the
	getNextUntitledIncrement funtion()
*/
function EnumEditSelect2 ( oWin, selectCtrl, editCtrl, oCallback /*instance of \
NestedPropListView */ ) {
	this.base = EditSelect2 ;
	this.base( oWin, selectCtrl, editCtrl, oCallback );

	// since the edit box isn't tied to a <List> name we can turn off the check for "." \
and '"' chars  this.m_reIllegalChars = null;
}
EnumEditSelect2.prototype = new EditSelect2 ;

/* use the next highest hundred, instead of incrementing by one */
EnumEditSelect2.prototype.getNextUntitledIncrement = function ( curMax )
{
	var nextInc = ( curMax + 100 - ( curMax % 100) );

	return nextInc;
}

function NestedEnumPropListView ( listName, propList, itemLabel, 
				configRootPath, serverMethod, sFormName, sListname, sEditname, aDirtyImgNames, 
				listPropName, listPropDefValue )
{
	this.base = NestedPropListView ;
	this.base( listName, propList, itemLabel, configRootPath, serverMethod,
		sFormName, sListname, sEditname, aDirtyImgNames );

	this.m_fillListPropName = listPropName;
	this.m_listPropDefValue = listPropDefValue ;
	this.m_enumPrefix = "";
}
NestedEnumPropListView.prototype = new NestedPropListView ;

NestedEnumPropListView.prototype.onLoad = function ( oWin, fNoInitForm, \
fNoDisplayData ) {

	if ( ! isXblibInit ) xblibInit();

	// initialize member variables TODO validate parameters	
	this.m_oWin = oWin;
	this.m_oDoc = oWin ? oWin.document : null ;

	this.m_bLoaded = true ;

	// 
	if ( this.preOnLoad() )
	{
		this.m_propList.reset();

		if( this.m_bDoDirtyCheck )
			this.showDirtyFlag( false );

		if ( ! fNoInitForm )
			clearForm( this.getForm() );

		// create or (if in reset mode) sync the EditSelct object
		if ( ! this.m_oES )
		{
			this.m_oES = new EnumEditSelect2( this.m_oWin, this.getListCtrl(), \
this.getEditCtrl(), this );  this.m_oES.m_syncTextAndValue = false ;
			this.m_oES.itemName( this.m_itemLabel );
		}

		//init any subViews
		for ( var subViewName in this.m_subViews )
		{
			var subView = this.m_subViews[ subViewName ];
			if ( subView )
			{
				subView.onLoad( oWin, true );
			}
		}

		if ( ! fNoDisplayData )
		{
			this.initListDataDisplay();
		}

		if ( ! fNoInitForm )
			this.hookForm();
	}
	this.postOnLoad();
}

NestedEnumPropListView.prototype.fillSelectList = function ()
{
	var listCtrl = this.getListCtrl();
	if ( listCtrl )
	{
		listCtrl.length = 0 ;
		
		// fill the list 
		//		value = sublist name
		//		text = value of m_fillListPropName
		this.m_subListParent.fillSelectList2( listCtrl, this.m_fillListPropName );
		
		// and select the first one
		selectFirst( listCtrl );
	}
}

// *******  ADD / EDIT / REMOVE / COPY SUBLIST FUNCTIONS ********

NestedEnumPropListView.prototype.onESRename = function ( oldSubListName, \
newSubListName ) {
	// for enumerated sub list, we're hiding the sublist name, so a
	// change to the seltext is really just a change to the fillListPropName
	// we don't have to do anything special here about that

	if( this.m_bDoDirtyCheck )
		this.showDirtyFlag( false );

	return true ;

}	// onESRename ()

NestedEnumPropListView.prototype.createSubList = function ()
{
	// validate and save the current list's values
	if ( this.m_curSubListName && ( ! this.validateSubList() ) ) 
	{
		return ;
	}

	var defValue = this.m_oES.getIncrementedDisplayText( this.m_listPropDefValue, 
			1, this.m_itemDefValuePostFix );

	var subListName = this.m_oES.addUntitled( this.m_enumPrefix, false, null, defValue \
);

    if ( subListName )
	{
		this.m_curSubListName = subListName;
		var subList = new PropList( subListName, [], this.m_subListParent.m_propSetSubLists \
);  this.m_subListParent.addSubList( subList, "added" );

		// set the default value of the m_fillListPropName to defValue
		var prop = subList.prop( this.m_fillListPropName );
		if ( prop )
			prop.setValue( defValue );

		this.fillFormFromSubList( false );
		var editCtrl = this.getEditCtrl();
		if ( editCtrl )
		{
			editCtrl.focus();
			editCtrl.select();
		}
		this.onSubListChangeNotify( "add", subListName );
	}

}	// createSubList ()

NestedEnumPropListView.prototype.copySubList = function ()
{
	if ( ! this.m_curSubListName )
	{
		/*alert( "Select " + this.m_name + " to copy" );*/
		return ;
	}

	// validate and save the current list's values
	if ( this.m_curSubListName && ( ! this.validateSubList() ) ) 
	{
		return ;
	}
	
	var	defValue = this.m_oES.getIncrementedDisplayText( "Copy", 1, " of " + \
getCtrlValue( this.getEditCtrl() ) );  var newSubListName = this.m_oES.addUntitled( \
this.m_enumPrefix, false, null, defValue );  if ( newSubListName )
	{

		this.m_subListParent.copySubList( this.m_curSubListName, newSubListName );
		this.m_curSubListName = newSubListName;

		var subList = this.m_subListParent.subList( newSubListName );
		if ( subList )
		{
			// set the default value of the m_fillListPropName to defValue
			var prop = subList.prop( this.m_fillListPropName );
			if ( prop )
				prop.setValue( defValue );
		}

		this.fillFormFromSubList( false );
		var editCtrl = this.getEditCtrl();
		if ( editCtrl )
		{
			editCtrl.focus();
			editCtrl.select();
		}
	}
	this.onSubListChangeNotify( "add", newSubListName );

}	// copySubList ()

NestedEnumPropListView.prototype.incSubList = function ( inc )
{
	// zero or one items in the list? nothing to do
	var listCtrl = this.getListCtrl();
	if ( ! listCtrl ) return ;

	var optCount = listCtrl.options.length;
	if ( optCount < 2 )
		return;

	var selX = listCtrl.selectedIndex ;
	if( selX == -1 )
		return ;

	// only move in increments of one
	if ( !inc )
		return ;
	if (inc > 1)
		inc = 1;
	else if (inc < -1)
		inc = -1;

	var newX = selX + inc ;
	var nMax = optCount - 1 ;
	if ((newX < 0) || (newX > nMax))
		return ;	// can't move any further

	if ( ! this.m_curSubListName )
	{
		this.m_curSubListName = this.m_oES.getItemValue();
	}

	// validate and save the current list's values
	if ( this.m_curSubListName && ( ! this.validateSubList() ) ) 
	{
		return ;
	}

	// save the text of the option we're about to overwrite
	var newSubListName = this.m_oES.getItemValue( newX );

	this.m_subListParent.renameSubList( this.m_curSubListName, "TEMP_LIST_NAME" );
	this.m_subListParent.renameSubList( newSubListName, this.m_curSubListName );
	this.m_subListParent.renameSubList( "TEMP_LIST_NAME", newSubListName );

	// reset the EditSelect combo
	this.m_oES.clear();
	this.m_subListParent.fillSelectList2( listCtrl, this.m_fillListPropName );
	setCtrlValue( listCtrl, newSubListName, true );
	this.m_oES.sync();

	this.m_curSubListName = newSubListName ;

}	// incSubList ()

NestedEnumPropListView.prototype.removeSubList = function ()
{
	if ( ! this.m_curSubListName )
	{
		/*alert( "Select a " + this.m_name + " to delete." );*/
		return;
	}

	var subList = this.getSubList();
	if ( subList )
	{
	    if ( confirm( "Remove " + this.m_itemLabel + " '" + getCtrlValue( \
this.getEditCtrl() ) + "'?" ) )  {
			var deletedSubListName = this.m_curSubListName;

			// mark as 'deleted'
			subList.clearForm( this.getForm( deletedSubListName ) );
			this.m_oES.remove();
			if ( subList.m_status == "added" )
			{
				this.m_subListParent.delSubList( subList );
			}
			else
			{
				subList.m_status = "deleted" ;
			}
			this.onSubListChangeNotify( "delete", deletedSubListName );
			this.fillFormFromSubList( false );
		}
	}

}	// removeSubList ()

//</SCRIPT>

--- NEW FILE: config_sec_ac.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Access Control</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "17";
</SCRIPT>

<!--  for dealing with enumerated list (Ports)-->
<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="propview_enum.js"></SCRIPT>
<SCRIPT SRC="enumproplist.js"></SCRIPT>

<!-- This external script contains our live server data -->
<SCRIPT SRC="servvar.get.html?serverData=config.AccessControl&diffConfig=diffconfig"></SCRIPT>


<SCRIPT LANGUAGE="javascript">
function backFillDescriptions ()
{
	// find the Description with the max N in "RuleN"
	var curMax = 0;
	for ( var rule in serverData )
	{
		if ( isObj( serverData[ rule ] ) &&
			 serverData[ rule ]["Description"] )
		{
			var tempA = serverData[ rule ]["Description"].match( /^Rule(\d+)$/i );
			if ( tempA && parseInt( tempA[ 1 ] ) > curMax ) 
				curMax = parseInt( tempA[ 1 ] );
		}
	}

	// massage server data - some AC rules could have been created prior to the addition \
of the  //description field, if the Description field is empty create one based on \
RuleN  for ( var rule in serverData )
	{
		if ( isObj( serverData[ rule ] ) &&
			 isBlank( serverData[ rule ]["Description"] ) )
		{
			serverData[ rule ]["Description"] = "Rule" + (++curMax);
		}
	}
}
backFillDescriptions();

var propSet =
[
	new PropObj( 'Description', "", false, true, null, null, "listname", "Access Rule \
Description" ),  new PropObj( 'Access', "Allow", false, true ),
	new PropObj( 'From', "", false, true, null, null, "hostname", "Client Hostname or IP \
Address/Netmask" ),  new PropObj( 'To', "Any", false, true, null, null, "hostname", \
"Server IP Address" ),  ,new EnumPropListText( "Ports", null, "Port_", 1, "Ports", \
",", /\s*,\s*/ ) ];

function ACPropView ()
{
	this.base = NestedEnumPropListView ;
	this.base( "Access Control Rules", propList, "Access Control Rule", 
				"config.AccessControl.", "configvar", "theForm", "theList", "Description", null,
				"Description", "Rule" );
}
ACPropView.prototype = new NestedEnumPropListView ;

ACPropView.prototype.postFillFormFromSubList = function ( fValidate )
{

	var subList = propView.getSubList();
	if ( subList )
	{
		var subListPorts = subList.subList( "Ports" );
		if ( subListPorts )
		{
			subListPorts.fillForm( theForm );
		}
	}

	return true;

}	// postFillFormFromSubList ()

ACPropView.prototype.preValidateSubList = function ( subListName )
{

	// split port list and validate each 
	// validate doesn't recurse into sublists
	var subList = propView.getSubList();
	if ( subList )
	{
		var subListPorts = subList.subList( "Ports" );
		if ( subListPorts )
		{
			subListPorts.validate( theForm );
			var ports = subListPorts.getValuesArray( theForm );
			for ( var i = 0; i < ports.length; i++ )
			{
				var port = ports[ i ];
				if ( ! propList.port_validate( port ) )
				{
					// check for special wildcard "any"
					if ( (!port ) ||
						 ( port.toLowerCase() != "any" ) )
						return rejectInput( theForm.Ports, 
							"'" + port + "' is an invalid port. Valid port numbers from 1 to 65535 or \
'Any'." );  }
			}
		}
	}

	return true;

}	// preValidateSubList ()

var propList = new PropList( "AccessControl", serverData, null, propSet );
var propView = new ACPropView();

var theForm ;
var tocFrame = findFrame( "TOC" );

function onLoad ()
{
	theForm = document.theForm ;

	checkForPendingChanges( diffConfig );

	propView.onLoad( window );

}	// onLoad
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">SECURITY</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
In addition to <A class="linkText" \
HREF="javascript:tocFrame.gotoPage('config_cc.html')">restricting access</A> to \
content based on number of players or bandwidth, you can restrict  access to the \
server based on the IP address of the client. Using  Access Rules, you can block or \
permit access to specific ports based on the  IP address of the requesting machine. \
If visitors click a URL for which they are  denied access via this method, an error \
message appears in their client, indicating  that this content is not available and \
to contact the content provider for more information. </td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Access Control</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<TR>
	<TD class="input" valign="top" width="40%">
		<TABLE CLASS="PROPLIST_LABEL" width="181" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Access Rules</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Access Control Rule" BORDER=0></A><A href="javascript://" \
onclick="propView.removeSubList()"><IMG src="images/delete_g.gif" HSPACE=1 \
ALT="Remove Current Access Control Rule" BORDER=0></A><A href="javascript://" \
onclick="propView.copySubList()"><IMG src="images/copy_g.gif" HSPACE=1 ALT="Copy \
Current Access Control Rule" BORDER=0></A><A href="javascript://" \
onclick="propView.incSubList(-1)"><IMG src="images/moveup_g.gif" HSPACE=1 ALT="Move \
Current Access Control Rule Up" BORDER=0></A><A href="javascript://" \
onclick="propView.incSubList(1)"><IMG src="images/movedown_g.gif" HSPACE=1 ALT="Move \
Current Access Control Rule Down" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theList" SIZE="8" WIDTH="181">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="60%">
		Edit Rule Description
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Description" SIZE="21" TYPE="text" \
VALUE="">

		<BR>
		Access Type
		<BR>
		<select CLASS="longInput" NAME="Access" SIZE="1" WIDTH="272">
		    <OPTION value="Allow">Allow</OPTION>
		    <OPTION value="Deny">Deny</OPTION>
		</SELECT>

		<BR>
		Client Hostname or IP Address/Netmask
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="From" SIZE="21" TYPE="text" \
VALUE="">

		<SPAN class="Units">
			Use 'Any' to indicate all client IP addresses
			<BR>
		</SPAN>
		<BR>
		Server Hostname or IP Address
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="To" SIZE="21" TYPE="text" VALUE="">

		<SPAN class="Units">
			Use 'Any' to indicate all IP addresses bound to this server.
			<BR>
		</SPAN>
		<BR>

		Ports
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Ports" SIZE="21" TYPE="text" \
VALUE="">

		<SPAN class="Units">
			Allow or Deny access from client to server on these ports.
			Separate multiple ports with a comma. Use 'Any' to indicate all Ports used by this \
server.  <BR><BR>
			<A class="linkTextSmall" \
HREF="javascript:tocFrame.gotoPage('config_ports.html')">View</A>   assigned ports \
for this server.  </SPAN>
	</TD>
</TR>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" VALIGN="middle" width="100%" class="body" \
                ALIGN="left">
      <FONT color="red">*A server restart is required to effect changes applied to \
this page.</FONT>  </TD>
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: serve_me.html ---

<HTML>
<HEAD>
<TITLE>Server is being Restarted</TITLE>
<LINK REL=stylesheet HREF="main.css" TYPE="text/css">
<SCRIPT language="javascript">
function goNow()
{ 
	var tocFrame = top.frames[ "TOC" ];
	if ( ! tocFrame )
	{
		window.history.back();
	}
	else
	{
		if ( top.restartPage )
		{
			tocFrame.gotoPage( top.restartPage, true ); 	
			top.restartPage = "" ;
		}
		else
		{
			tocFrame.gotoPage( tocFrame.welcomePage, true ); 	
		}
	}
}

function paceMe ( )
{
	setTimeout( "goNow()", 20000 );
}
</SCRIPT>
</HEAD>

<BODY CLASS="CONFIG" onLoad="paceMe()">
<TABLE border="0" cellspacing="0" cellpadding="0" width="475">
<tr><td class="body" width="100%" valign="top">
<DIV class="PARAHEAD">

    Please standby while the server is restarted. You will be returned
    to your previous page in approximately 20 seconds.

    <br><br>

    If you should experience problems, check to make sure the server is
	running, and click the reload pages button at the top of the screen.

</DIV>    
</TD></TR>
</TABLE>
</BODY>
</HTML>

--- NEW FILE: regview_toc.html ---

<html>
<head>

<link rel="stylesheet" href="regtree_nav.css" type="text/css">

<STYLE TYPE="text/css">

	/* override nav4 styles - nav4 ignores @import... */
	@import url("regtree_w3c.css");

	/* nav4 hiliter */
	#THEHILITE
	{
		position:absolute;
		left:0;
		padding:0;
		margin:0;
	}

</STYLE>

<SCRIPT src="string.js"></SCRIPT>
<SCRIPT src="qstr.js"></SCRIPT>

<SCRIPT>
var subTree = "";
if ( location.search )
{
	var qstr = new QStrParser();
	subTree = qstr.getParam( "subTree" );
}

if ( (!subTree) &&
	 (top.RegCookies && top.RegCookies.SubTree0) )
{
	
	subTree = top.RegCookies.SubTree0;
}

if ( subTree )
{
	top.curPath( subTree );
}
else
{
	subTree = "REG_ROOT";
	top.curPath( "" );
}

document.write( '<' + 'SCRIPT SRC="servvar.get.html?d=' + subTree + '"><' + \
'/SCRIPT>' ); </script>
<SCRIPT src="xblib.js"></SCRIPT>
<SCRIPT SRC="tree.js"></SCRIPT>
<SCRIPT SRC="regview.js"></SCRIPT>

<SCRIPT>
function onLoad ()
{
	if ( top.framesetLoaded )
	{
		//frameset already loaded before us? - this frame must have been refreshed by \
itself  initTOCFrame();
	}
}
</script>

</head>

<BODY
	CLASS="CONFIG"
	onLoad="onLoad()"
> 

<script>
	document.open();
	if ( isNav4 )
		document.write( '<layer id="THEHILITE"><IMG SRC="images/toc_pointer.gif"></layer>' \
);  writeTOC();
	document.close();
</script>

</body>
</html>

--- NEW FILE: config_sec_db.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>User Databases</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "18";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?serverData=config.Databases"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
var propSet = 
[
	new PropObj( "PluginID", "rn-db-flatfile", false, true, null, null, "Database Type" \
/*,all*/),  new PropObj( "Path", "", false, true, null, null, "path", "Database Path" \
/*,rn-db-flatfile*/),  new PropObj( "TableNamePrefix", "", false, false, null, null, \
null, "Table Name Prefix" /*,rn-db-msql*/),  new PropObj( "Hostname", "", false, \
true, null, null, "Host Name" /*,rn-db-odbc*/),  new PropObj( "User", "", false, \
false, null, null, null, null /*,rn-db-odbc*/),  new PropObj( "Password", "", false, \
false, null, null, null, null /*,rn-db-odbc*/),  new PropObj( "Name", "", false, \
true, null, null, null, "Database Name" /*,rn-db-odbc*/),  new PropObj( "DBName", "", \
false, true, null, null, null, "Database Name" /*,rn-db-wrapper*/),  new PropObj( \
"PathToDBPlugin", "", false, true, null, null, "path", "Database Plugin Path" \
/*,rn-db-wrapper*/),  new PropObj( "DBLoginUsername", "", false, false, null, null, \
null, null /*,rn-db-wrapper*/),  new PropObj( "DBLoginPassword", "", false, false, \
null, null, null, null /*,rn-db-wrapper*/) ];

var propList = new PropList( "Databases", serverData, null, propSet );

function DBPropView ()
{
	this.base = NestedPropListView ;
	this.base( "Authenication Realms", propList, "Database", 
				"config.Databases.", "servvar",
				"theForm", "theList", "theEdit" );
}
DBPropView.prototype = new NestedPropListView ;

DBPropView.prototype.onFormKeyOrClick = function ( evt )
{
	if ( ! this.m_bLoaded ) return ;

	// if we've already set the time then ignore
	if ( this.m_bDoDirtyCheck && (!this.m_hDirtyCheckTimerID) )
	{
	
		// unlike the base class we'll ignore the parent form of the event target since it 
		// could be one of four (just make sure the event target is a member of a form

		var srcElem = ( isIE ? this.m_oWin.event.srcElement : evt.target );

		if ( srcElem.form )

		{
			
			this.m_hDirtyCheckTimerID = this.m_oWin.setTimeout( "_doDirtyChk()", \
NestedPropListView.DIRTY_CHECK_SUPRESS_TIME );  }
	}

	
	if ( isNav4 )
	  	this.m_oDoc.routeEvent( evt );

	return true ;

}	// onFormKeyOrClick

//override this function so we can check all the auxilliary forms
DBPropView.prototype.isDirty = function ()
{
	if ( ! this.m_bLoaded ) return ;

	if ( this.m_bDoDirtyCheck ) 
	{
		// proplist has no form members (all the properties are in sublists
		/*
		if ( this.m_propList.isFormDirty( this.getForm() ) )
		{
			return true ;
		}
		*/

		var subList = this.getSubList();
		if ( subList )
		{
			if ( subList.isFormDirty( theForm ) )
			{
				return true ;
			}

			for ( var i = 0; i < dbTypes.length; i++ ) 
			{
				if ( subList.isFormDirty( getElem( "FORM_" + dbTypes[ i ] ) ) )
				{
					return true ;
				}
			}
		}

		if ( this.m_propList.isDirty() )
		{
			return true ;
		}
	}

	return false;
}

DBPropView.prototype.postFillFormFromSubList = function ( fValidate )
{

	onTypeChange();

	return true;

}	// postFillFormFromSubList ()

DBPropView.prototype.onSubListChangeNotify = function ( action, subListName )
{

	if ( "delete" == action )
	{
		for ( var i = 0; i < dbTypes.length; i++ ) 
		{
			clearForm( getElem( "FORM_" + dbTypes[ i ] ) );
		}
	}

	if ( this.m_bDoDirtyCheck )
		this.showDirtyFlag( this.isDirty() );

}	// onSubListChangeNotify

DBPropView.prototype.postValidateSubList = function ( subListName )
{

	var subList = this.getSubList( subListName );
	if ( subList && curType )
	{
		var ctrl = subList.validate( getElem( "FORM_" + curType ) );
		if ( ctrl ) 
		{
			return rejectInput( ctrl, subList.errMsg );
		}
	}

	if ( "rn_db_flatfile" == curType )
	{
		return true;
	}
	else if ( "rn_db_wrapper" == curType )
	{
		return validatePassword( "DBLoginPassword", false, getElem( "FORM_" + curType ) );
	}
	else
	{
		return validatePassword( "Password", false, getElem( "FORM_" + curType ) );
	}

	return true;

}	// postValidateSubList ()

var dbTypes = 
[
	"rn_db_flatfile"
	,"rn_db_odbc"
	,"rn_db_msql"

	,"rn_db_wrapper"

];

var propView = new DBPropView();
var theForm ;
var curType = ""; //track the last authentication type selected in the _TYpe select \
ctrl

function onLoad () 
{
	theForm = document.theForm ;

	if ( ! isXblibInit ) xblibInit();
	anchorForms();

	propView.onLoad( window );

}	// onLoad

function anchorForms ()
{
	var anchorX;
	var anchorY;
	var tableWidth = 230;

	if ( isNav4 )
	{
		
		anchorX = document.anchors["ANCHOR_FORMS_NAV4_X"].x - 4;
		anchorY = document.anchors["ANCHOR_FORMS_NAV4_Y"].y - 4;
	}
	else
	{
		/* 
			get the location of the output Name edit field
			we'll position the output forms just underneath it
		*/

		var anchor = theForm.PluginID;
		if ( anchor )
		{
			var anchorDim = getAbsDim( anchor );

			anchorY = anchorDim.y + anchor.offsetHeight ;
			anchorX = anchorDim.x ;

			// find the anchor's parent TD cell - we need it's width
			parentTD = getParentByTagName( anchor, "TD" );

			// find the parent TD cell's parent TABLE - we need it's padding
			parentTable = getParentByTagName( parentTD, "TABLE" );

			if ( parentTD && parentTable )
			{
				tableWidth = parentTD.offsetWidth - 
							 parseInt( parentTable.cellPadding * 1.5 );
			}
		}
	}

	if ( ! anchorY )
	{
		return;
	}

	if ( isIE && isMac )
	{
		anchorX += macIE_FormOffsetX ;
		anchorY += macIE_FormOffsetY ;
	}

	for ( var i = 0; i < dbTypes.length; i++ ) 
	{
		var type = dbTypes[ i ];
		var l = getElem( "LAYER_" + type );
		if ( l )
		{
			if ( isNav4 )
			{
				l.top  = anchorY;
				l.left = anchorX;
			}
			else
			{
				l.style.display = "block";

				var oTable = getElem( "TABLE_" + type );
				if ( oTable )
				{
					l.style.top  = anchorY;
					l.style.left = anchorX - oTable.cellPadding ; 
					oTable.style.width = tableWidth;
				}
			}
		}

		clearForm( getElem( "FORM_" + type ) );
	}
	
}	// anchorForms ()

function onTypeChange ()
{
	var type = getCtrlValue( theForm.PluginID );

	// can't use '-' in DHTML element ids
	type = type.replace( /-/g, "_" );

	var subList = propView.getSubList();
	if ( subList )
	{
		var f = getElem( "FORM_" + type );
		if ( f )
		{
			subList.fillForm( f );
			if ( "rn_db_flatfile" == type )
			{
			}
			if ( "rn_db_wrapper" == type )
			{
				setCtrlValue( f.DBLoginPassword2, getCtrlValue( f.DBLoginPassword ) );
			}
			else
			{
				setCtrlValue( f.Password2, getCtrlValue( f.Password ) );
			}
		}
	}

	if ( curType )
	{
		setDisplay( getElem( "LAYER_" + curType ), false );
		curType = "";
	}
	if ( type )
	{
		setDisplay( getElem( "LAYER_" + type ), true );
		curType = type;
	}
}
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">SECURITY</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
The commerce feature works in conjunction with the authentication feature.
It consists of an additional database which stores permissions to individual
clips. To authenticate visitors, the server stores user IDs and
passwords or client IDs, and their associated access permission	information. 
When a client tries to access a clip, the server looks up this information 
to see whether the client or visitor is authorized to view the clip. The 
information can be stored in either a series of text files or in a database. 
Templates for common databases are installed during installation. 
<BR>
<BR>
Two methods are supplied with the server: text file and database. The text file 
storage method uses a combination of directory structure and text files to achieve
a sensible data storage method. It is the default method. The database
templates included with the server use a similar structure to the text file
method, in a more familiar database format.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>User Databases</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<tr>
	<TD class="input" valign="top" width="50%">
		<TABLE CLASS="PROPLIST_LABEL" width="226" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Databases</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Database" BORDER=0></A><A href="javascript://" \
onclick="propView.removeSubList()"><IMG src="images/delete_g.gif" HSPACE=1 \
ALT="Remove Current Database" BORDER=0></A><A href="javascript://" \
onclick="propView.copySubList()"><IMG src="images/copy_g.gif" HSPACE=1 ALT="Copy \
Current Database" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theList" SIZE="13" WIDTH="226">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="50%">
		<A NAME="ANCHOR_FORMS_NAV4_X"></A>
		Edit Database Name
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theEdit" SIZE="18" TYPE="text" \
VALUE="">

		Database Type
		<BR>
		<select CLASS="longInput" NAME="PluginID" ONCHANGE="onTypeChange()" SIZE="1" \
WIDTH="226">  <OPTION value="rn-db-flatfile">Flat File</OPTION>
		    <OPTION value="rn-db-odbc">ODBC</OPTION>
		    <OPTION value="rn-db-msql">mSQL</OPTION>
		    <OPTION value="rn-db-wrapper">RN5 DB Wrapper</OPTION>
		</SELECT>

		<BR>
		<BR>
		<A NAME="ANCHOR_FORMS_NAV4_Y"></A>
		<BR>
		<BR>
		<BR>
		<BR>
		<BR>
		<BR>
		<BR>
		<BR>
		<BR>
		<BR>
		<BR>
		<BR>
		<BR>
		<BR>
		<BR>
	</td>
</tr>

<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>

<SPAN class="absolute" ID="LAYER_rn_db_odbc">
<FORM NAME="FORM_rn_db_odbc">
<table ID="TABLE_rn_db_odbc" cellspacing="0" cellpadding="2" width="226">
<tr>
    <TD class="input" align="left" valign="top" width="100%">
	Database Name
	<BR>
	<input CLASS="longInput" MAXLENGTH="255" NAME="Name" SIZE="18" TYPE="text" VALUE="">

	Table Name Prefix (optional)
	<BR>
	<input CLASS="longInput" MAXLENGTH="255" NAME="TableNamePrefix" SIZE="18" \
TYPE="text" VALUE="">

	User Name (optional)
	<BR>
	<input CLASS="longInput" MAXLENGTH="255" NAME="User" SIZE="18" TYPE="text" VALUE="">

	Password (optional)
	<BR>
	<input CLASS="longInput" MAXLENGTH="14" NAME="Password" SIZE="18" TYPE="password" \
VALUE="">

	Confirm Password
	<BR>
	<input CLASS="longInput" MAXLENGTH="14" NAME="Password2" SIZE="18" TYPE="password" \
VALUE=""> </TD>
</TR>
</table>
</FORM>
</SPAN>

<SPAN class="absolute" ID="LAYER_rn_db_flatfile">
<FORM NAME="FORM_rn_db_flatfile">
<table ID="TABLE_rn_db_flatfile" cellspacing="0" cellpadding="2" width="226">
<tr>
    <TD class="input" align="left" valign="top" width="100%">
	Database File
	<BR>
	<input CLASS="longInput" MAXLENGTH="255" NAME="Path" SIZE="18" TYPE="text" VALUE="">
</TD>
</TR>
</table>
</FORM>
</SPAN>

<SPAN class="absolute" ID="LAYER_rn_db_msql">
<FORM NAME="FORM_rn_db_msql">
<table ID="TABLE_rn_db_msql" cellspacing="0" cellpadding="2" width="226">
<tr>
    <TD class="input" align="left" valign="top" width="100%">
	Host Name
	<BR>
	<input CLASS="longInput" MAXLENGTH="255" NAME="Hostname" SIZE="18" TYPE="text" \
VALUE="">

	Database Name
	<BR>
	<input CLASS="longInput" MAXLENGTH="255" NAME="Name" SIZE="18" TYPE="text" VALUE="">

	Table Name Prefix (optional)
	<BR>
	<input CLASS="longInput" MAXLENGTH="255" NAME="TableNamePrefix" SIZE="18" \
TYPE="text" VALUE="">

	User Name (optional)
	<BR>
	<input CLASS="longInput" MAXLENGTH="255" NAME="User" SIZE="18" TYPE="text" VALUE="">

	Password (optional)
	<BR>
	<input CLASS="longInput" MAXLENGTH="14" NAME="Password" SIZE="18" TYPE="password" \
VALUE="">

	Confirm Password
	<BR>
	<input CLASS="longInput" MAXLENGTH="14" NAME="Password2" SIZE="18" TYPE="password" \
VALUE=""> </TD>
</TR>
</table>
</FORM>
</SPAN>

<SPAN class="absolute" ID="LAYER_rn_db_wrapper">
<FORM NAME="FORM_rn_db_wrapper">
<table ID="TABLE_rn_db_wrapper" cellspacing="0" cellpadding="2" width="226">
<tr>
    <TD class="input" align="left" valign="top" width="100%">
	Database Name
	<BR>
	<input CLASS="longInput" MAXLENGTH="255" NAME="DBName" SIZE="18" TYPE="text" \
VALUE="">

	Plugin Path
	<BR>
	<input CLASS="longInput" MAXLENGTH="255" NAME="PathToDBPlugin" SIZE="18" TYPE="text" \
VALUE="">

	User Name (optional)
	<BR>
	<input CLASS="longInput" MAXLENGTH="255" NAME="DBLoginUsername" SIZE="18" \
TYPE="text" VALUE="">

	Password (optional)
	<BR>
	<input CLASS="longInput" MAXLENGTH="14" NAME="DBLoginPassword" SIZE="18" \
TYPE="password" VALUE="">

	Confirm Password
	<BR>
	<input CLASS="longInput" MAXLENGTH="14" NAME="DBLoginPassword2" SIZE="18" \
TYPE="password" VALUE=""> </TD>
</TR>
</table>
</FORM>
</SPAN>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>

</BODY>
</HTML>

--- NEW FILE: client.js ---

	
var macIE_FormOffsetX = 30;
var macIE_FormOffsetY = 8;

// shortcut to Classes loaded in the top window
PropObj = top.PropObj ;
PropList = top.PropList ;
EditSelect2 = top.EditSelect2 ;
IPAddress = top.IPAddress;
IPRange = top.IPRange;
AddressRangeCtrl = top.AddressRangeCtrl;

if ( window.name == "Main" )
{
	top.fMainFrameIsLocal = true ;
}

function isObj ( objToTest )
[...1047 lines suppressed...]

	return true;
}

// checks for the basic IP dotted format
function isIPAddrFormat ( addr )
{
	// check for IPv6ness
    if ( addr.bSearch( /\:/ ) )
	{
		// just hex digits, colons, dots and '/' ?
		return addr.bSearch( /^ *[\dA-F\.\:\/]+ *$/i ); 
	}
	else
    {
		// just digits and dots?
		return addr.bSearch( /^ *[\d\.:]+ *$/ ); 
    }    
}


--- NEW FILE: config_cc.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Connection Control</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "1";
</SCRIPT>

<SCRIPT SRC="propview_nolist.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?serverData=config,1"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
var propList = new PropList
(
	"Connection Controls", serverData, 
	[
		new PropObj( 'RealPlayersOnly',	 	"0", false, true, null, null, "int", "RealPlayers \
Only" ),  new PropObj( 'PlusOnly',		 	"0", false, true, null, null, "int", \
"RealPlayer Plus Only" ),  new PropObj( 'ClientConnections',	"",	 false, true, null, \
null, "int", "Maximum Client Connections" ),  new PropObj( 'MaxBandwidth',		"",	 \
false, true, null, null, "int", "Maximum Bandwidth" ),  new PropObj( \
'KeepAliveInterval',	"80",false, true, null, null, "int", "Connection Timeout" )  ]
);

var nMaxLicConnections = 10
if ( top.TOC && top.TOC.l &&
	 top.TOC.l["General"] && 
	 top.TOC.l["General"]["ClientConnections"] )
	nMaxLicConnections = top.TOC.l["General"]["ClientConnections"];

function CCPropView ()
{
	this.base = PropListView ;
	this.base( "Connection Controls", propList, "config.", "servvar", "theForm" );
}
CCPropView.prototype = new PropListView ;

CCPropView.prototype.preValidate = function ()
{

	var cc = getCtrlValue( theForm.ClientConnections ); 
	if ( cc > nMaxLicConnections )
	{
		return rejectInput( theForm.ClientConnections, 
			"The Maximum Client Connections cannot exceed the Maximum Licensed Connections for \
this server." );  }

	return true;
}

var propView = new CCPropView();
var theForm ;

function onLoad ()
{
	theForm = document.theForm ;
	propView.onLoad( window );
}
</SCRIPT>

</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">SERVER SETUP</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
The server has several methods of restricting general access to content.
<BR>
<BR>
<span class="stronger">Maximum Client Connections</span> is the number 
of RealPlayers that can simultaneously stream from the server. You must 
change the default setting of 0, which places no restriction, to enable this feature.
<BR>
<BR>
<span class="stronger">RealPlayer Plus Only</span>, when set to On, 
ensures that only RealNetworks RealPlayer Plus software can play your 
content.
<BR>
<BR>
<span class="stronger">Maximum Bandwidth</span> limits the amount of 
bandwidth used by this server. You must change the default setting of 0, 
which places no restriction, to enable this feature.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Connection Control</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<tr>
<TD class="input" valign="top" align="RIGHT" width="45%">
		<span class="offsetLabel">Maximum Client Connections</span>
	</td>
	<TD class="input" valign="top" align="left" width="55%">
		<input CLASS="input" MAXLENGTH="255" NAME="ClientConnections" SIZE="6" TYPE="text" \
VALUE=""><SPAN CLASS="units"><BR>Number cannot exceed value in maximum licensed \
client connections.</SPAN>  </td>
</tr>
<tr>
    <TD class="input" valign="top" align="RIGHT">
        Maximum Licensed<BR>
        Client Connections
    </td>
    <TD class="input" valign="top" align="left">
        <FONT color="black">
        <SCRIPT>
	        document.write( nMaxLicConnections );
		</SCRIPT>
		</FONT>
        <BR>
       	<A class="linkTextSmall" href="Javascript:launchAbout()">View license \
summary</A>  </TD>
</TR>
<tr>
<TD class="input" valign="top" align="RIGHT" width="45%">
		<span class="offsetLabel">RealPlayers Only</span>
	</td>
	<TD class="input" valign="top" align="left" width="55%">
		<select CLASS="input" NAME="PlusOnly" SIZE="1" WIDTH="91">
            <OPTION value="1">On</OPTION>
            <OPTION value="0">Off</OPTION>
        </SELECT>
	</td>
</tr>
<tr>
<TD class="input" valign="top" align="RIGHT" width="45%">
		<span class="offsetLabel">RealPlayer Plus Only</span>
	</td>
	<TD class="input" valign="top" align="left" width="55%">
		<select CLASS="input" NAME="RealPlayersOnly" SIZE="1" WIDTH="91">
            <OPTION value="1">On</OPTION>
            <OPTION value="0">Off</OPTION>
        </SELECT>
	</td>
</tr>
<tr>
<TD class="input" valign="top" align="RIGHT" width="45%">
		<span class="offsetLabel">Maximum Bandwidth</span>
	</td>
	<TD class="input" valign="top" align="left" width="55%">
		<input CLASS="input" MAXLENGTH="255" NAME="MaxBandwidth" SIZE="6" TYPE="text" \
VALUE=""><SPAN CLASS="unitsOffset">&nbsp;kilobits per second</SPAN>  </td>
</tr>
<tr>
<TD class="input" valign="top" align="RIGHT" width="45%">
		<span class="offsetLabel">Connection Timeout</span>
	</td>
	<TD class="input" valign="top" align="left" width="55%">
		<input CLASS="input" MAXLENGTH="255" NAME="KeepAliveInterval" SIZE="6" TYPE="text" \
VALUE=""><SPAN CLASS="units"><BR>set the timeout to zero to disable this \
feature</SPAN>  </td>
</tr>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: regpick_main.html ---

<html>
<head>

<STYLE>
BODY
{
	background-color:	#336699;
	padding-left:		4;
	margin: 			0;
}

A
{
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	font-size:      9pt;
	color:			#FFFFFF;
}

A:link {text-decoration: none;}
A:visited {text-decoration: none;}
A:hover { TEXT-DECORATION: underline;}
.DATA_DIV
{
	position:		absolute;
	line-height:	1.3;
}

.HELPTEXT
{
	color: 			#FFFFCC;
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	font-size:		9pt;
}

.Strong
{
	color: 			#FFFFCC;
	font-family: 	Arial,Helvetica,Geneva;
	font-weight: 	600;
	font-size:      11px;
}

</STYLE>
</head>
<BODY>

<DIV ID="DATA_DIV" CLASS="DATA_DIV"></DIV>

</body>
</html>

--- NEW FILE: regview.html ---

<HTML>

<HEAD>

<TITLE>RealAdministrator Registry Viewer</TITLE>

<script src="xblib.js"></script>
<SCRIPT src="string.js"></script>

<SCRIPT SRC="cookies.js"></SCRIPT>
<SCRIPT>
var RegCookies = new Cookie( document, "RegView", 240 );
//RegCookies.remove();
//RegCookies.store();
RegCookies.load();

var framesetLoaded = false ;
var _curPath = "" ;
//var root = location.host ;

function onLoad ()
{
	
	framesetLoaded = true ;
	frames.TOC.initTOCFrame();
}

function curPath ( path )
{
	if ( path != null )
	{
		
		_curPath = path ;
		if ( frames.HEADER && frames.HEADER.doNewPath )
		{
			frames.HEADER.doNewPath( path );
		}
	}

	return _curPath ;
	
}	// curPath
</SCRIPT>
</HEAD>

<frameset onload="onLoad()" FRAMEBORDER="yes" BORDER="4" rows="85,*">
	<frame FRAMEBORDER="NO" MARGINHEIGHT="0" MARGINWIDTH="0" NAME="HEADER" NORESIZE \
SCROLLING="NO" src="regview_header.html">  <frameset FRAMEBORDER="yes" BORDER="4" \
                cols="220,*">
	    <frame MARGINWIDTH="0" MARGINHEIGHT="0" FRAMEBORDER="yes" NAME="TOC"  \
                SCROLLING="AUTO" src="regview_toc.html">
	    <frame MARGINWIDTH="0" MARGINHEIGHT="0" FRAMEBORDER="yes" NAME="DUMP" \
SCROLLING="AUTO" src="regview_main.html">  </frameset>
</frameset>
</HTML>

--- NEW FILE: config_broad_archive.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Live Archiving </TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "4";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="servvar.get.html?serverData=config.LiveArchive"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
var propSet =
[
	new PropObj( 'TargetDirectory',		 "/Archive/",false,true, null, null, "mountpoint" \
),  new PropObj( 'FileSize',			 "0", false,false,null, null, "int" ),
	new PropObj( 'FileTime',			 "0" ),
	new PropObj( 'NoArchive',			 "1" )
];

propList = new PropList( "LiveArchive", serverData, null, propSet );

var dateParts = [ 'd', 'h', 'm' ];
var theForm = null ;

function ArchPropView ()
{
	this.base = NestedPropListView ;
	this.base( "Windows Media Sources", propList, "Source Path", 
		"config.LiveArchive.", "servvar",
		"theForm", "theList", "theEdit" );

	this.m_itemDefValue = "/directory" ;
}
ArchPropView.prototype = new NestedPropListView ;

ArchPropView.prototype.postFillFormFromSubList = function ( fValidate )
{

	// parse the value out of the hidden theForm.FileTime into the mhd inputboxes
	var fileTime = theForm.FileTime.value ;
	var aMatches ;
	for ( var i = 0; i < dateParts.length; i++ )
	{
		aMatches = fileTime.match( "([\\d]+)" + dateParts[ i ], "i" );
		setCtrlValue( theForm[ dateParts[ i ] ], (aMatches ? aMatches[ 1 ] : "0"), true );
	}

	return true;

}	// postFillFormFromSubList ()

ArchPropView.prototype.preValidateSubList = function ()
{

	// piece together FileTime from the dateParts
	// and shove in the hidden FileTime field
	var ctrl, value, fileTime = "" ;
	for ( i = 0; i < dateParts.length; i++ )
	{
		ctrl = theForm[ dateParts[ i ] ];
		value = ctrl.value ;
		
		if ( value == "" ) 
			value = 0 ;
		else if ( ! propList.int_validate( value ) )
			return rejectInput( ctrl, "Invalid file time limit." );

		fileTime += value + dateParts[ i ];
	}
	if ( fileTime != "" ) 
		setCtrlValue( theForm.FileTime, fileTime, true );

	return true;
}

var propView = new ArchPropView(); 

function onLoad ()
{
	theForm = document.theForm;
	propView.onLoad( window );

}	// onLoad ()
</SCRIPT>

</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">BROADCASTING</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
You can save (or "archive") a live broadcast for historical purposes or for
later playback. When live archiving is enabled, the server examines all
incoming live streams, and compares the names of the streams
with the list names within the LiveArchive section of the configuration
file. If the LiveArchive section contains a list whose name matches the
path name of the incoming live stream, the server will archive the file.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 

<input type="hidden" name="FileTime" value="">
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Live Archiving </TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<tr>
	<TD class="input" valign="top" width="45%">
		<TABLE CLASS="PROPLIST_LABEL" width="203" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Source Paths</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Source Path" BORDER=0></A><A href="javascript://" \
onclick="propView.removeSubList()"><IMG src="images/delete_g.gif" HSPACE=1 \
ALT="Remove Current Source Path" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theList" SIZE="10" WIDTH="203">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" align="top" width="55%">
		Edit Source Path
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theEdit" SIZE="19" TYPE="text" \
VALUE="">  <BR>
		<SCRIPT>if ( isIE && (!isIE5Up) ){document.write( '<BR>' );}</SCRIPT>
		<SCRIPT>if ( isNav6 ){document.write( '<BR>' );}</SCRIPT>
		Archiving
		<BR>
		<select CLASS="input" NAME="NoArchive" SIZE="1" WIDTH="249">
		    <OPTION value="0">Enabled</OPTION>
		    <OPTION value="1">Disabled</OPTION>
		</SELECT>

		<BR>
		<BR>
		Destination Path
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="TargetDirectory" SIZE="19" \
TYPE="text" VALUE="">

		<BR>
		<SCRIPT>if ( isNav6 ){document.write( '<BR>' );}</SCRIPT>
		Limit Archive Files By Size
		<BR>
		<input CLASS="input" MAXLENGTH="255" NAME="FileSize" SIZE="5" TYPE="text" \
VALUE=""><SPAN CLASS="unitsOffset">&nbsp;MB maximum size</SPAN>

		<BR>
		<BR>
		Limit Archive Files By Time
		<BR>
		<input type="text" name="d" value="" class="input" maxlength="2" size="2"><SPAN \
class="unitsOffset">Days&nbsp;</SPAN><input type="text" name="h" value="" \
class="input" maxlength="2" size="2"><SPAN \
class="unitsOffset">Hours&nbsp;</SPAN><input type="text" name="m" value="" \
class="input" maxlength="2" size="2"><SPAN class="unitsOffset">Minutes</SPAN><BR>  \
</TD> </TR>

<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: regpick.html ---

<HTML>

<HEAD>

<TITLE>Helix Server Property List</TITLE>

<script src="xblib.js"></script>
<SCRIPT src="string.js"></script>

<SCRIPT>
var framesetLoaded = false ;

function onLoad ()
{
	
	framesetLoaded = true ;

	frames.TOC.location.href = "regpick_toc.html" + location.search ;
}
</SCRIPT>
</HEAD>

<frameset FRAMEBORDER="yes" cols="220,*" onload="onLoad()">
    <frame MARGINWIDTH="0" MARGINHEIGHT="0" NAME="TOC"  SCROLLING="AUTO" \
src="javascript:'<HTML></HTML>'">  <frame MARGINWIDTH="0" MARGINHEIGHT="0" \
NAME="DUMP" SCROLLING="AUTO" src="regpick_main.html"> </frameset>

</HTML>


--- NEW FILE: grantuser.html ---

<HTML>
<HEAD>

<TITLE>Grant User Permission</TITLE> 

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="dialog.js"></SCRIPT>
<SCRIPT SRC="qstr.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
	document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else
{
	document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
</SCRIPT>

<SCRIPT language="javascript">
var qStr = new QStrParser();
var protectedPath = qStr.getParam( "ProtectedVirtualPath" );

function onLoad ()
{
	// place the perm type forms in the right place

	var	anchorY, anchorX;
	var tableWidth = 230;
	var anchor;

	if ( ! isXblibInit ) xblibInit();

	if ( isNav4 )
	{
		anchor = getElem( "ANCHOR_FORMS_NAV4" );
	}
	else
	{
		anchor = getElem( "ANCHOR_FORMS" );
		var anchorDim = getAbsDim( anchor );

		if ( anchor ) anchor.style.position = "relative" ;

		anchorY = anchorDim.y - ( isIE ? 4 : 12 );
		anchorX = anchorDim.x ;

		// find the anchor's parent TD cell - we need it's width
		var parentTD = getParentByTagName( anchor, "TD" );

		// find the parent TD cell's parent TABLE - we need it's padding
		parentTable = getParentByTagName( parentTD, "TABLE" );

		if ( parentTD && parentTable )
		{
			tableWidth = parentTD.offsetWidth;
		}
	}

	var dynTables = [];
	dynTables[ "date" ] = getElem( "LAYER_date" );
	dynTables[ "time" ] = getElem( "LAYER_time" );

	if ( anchor )
	{
		for ( var tblName in dynTables )
		{
			var l = dynTables[ tblName ];
			if ( l )
			{
				if ( isNav4 )
				{
					l.top  = anchor.y - 4;
					l.left = anchor.x - 6;
				}
				else
				{
					l.style.display = "block";

					var oTable = getElem( "TABLE_" + tblName );
					if ( oTable )
					{
						l.style.top  = anchorY ;
						l.style.left = anchorX - (oTable.cellPadding) ; 
					}
				}
			}
		}
	}

	setCtrlValue( theForm.permtype, 0 );
	setCtrlValue( theForm.url, protectedPath + "/" );
	setCtrlValue( theForm.urltype, "1" );

	onPermTypeChg();
}

function onPermTypeChg ()  
{
	setDisplay( getElem( "LAYER_date" ), false );
	setDisplay( getElem( "LAYER_time" ), false );

    var permType = getCtrlValue( theForm.permtype );
	var tableToShow = ((permType == 1) ? "date" :
		              ((permType == 2) ? "time" : null));
	if ( tableToShow )
	{
		setDisplay( getElem( "LAYER_" + tableToShow ), true );
	}

}	// onPermTypeChg

var submitString = "" ;
function validate () 
{
	if ( !ValidateURL() )
	{
		return false;
	}

	var userName = getCtrlValue( theForm.username );
	if ( userName == "" )
	{
		return rejectInput( theForm.username, "A User Name is required." );
	}

	submitString  = buildParam( "DatabaseID", qStr.getParam( "DatabaseID" ) );
	submitString += buildParam( "name", userName );
	submitString += buildParam( "url", getCtrlValue( theForm.url ) );
	submitString += buildParam( "urltype", getCtrlValue( theForm.urltype ) );
	
	var permType = getCtrlValue( theForm.permtype );
	submitString += buildParam( "permtype", permType );

	if ( permType == 1 )
	{
		dateForm = getElem( "FORM_date" );
		submitString += buildParam( "expire", getCtrlValue( dateForm.expire ) );
	}
	else if (permType == 2)
	{
		timeForm = getElem( "FORM_time" );
		submitString += buildParam( "time", getCtrlValue( timeForm.time ) );
	}

	return true ;
}

function ValidateURL()
{
	var url = getCtrlValue( theForm.url );
	var urltype = getCtrlValue( theForm.urltype );
	if ( (urltype == 0) &&
		 (url.charAt(url.length-1) == '/') )
	{
		return rejectInput( theForm.url, "File paths cannot have a trailing '/'." );
	}
	else if ( (urltype == 1) &&
			  (url.charAt(url.length-1) != '/') )
	{
		return rejectInput( theForm.url, "Directory paths must have a trailing '/'." );
	}

	if ( protectedPath )
	{
		var test = url.substr( 0, protectedPath.length );
		if ( test != protectedPath )
		{
			return rejectInput( theForm.url, "The path entered does not belong to this rule." \
);  }
	}

	return true ;
}

function doSubmit() 
{
	raSubmitChanges( "auth.grantuser.html", submitString, "Grant Permission" );
}
</SCRIPT>
</HEAD>

<SCRIPT>
onLoadHookFunc = onLoad;
</SCRIPT>

<BODY 
	CLASS="popup"	
	onload="_onLoadDefault();"
	onunload="_onUnLoadDefault();"
> 
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule" height="7" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule">&nbsp;</SPAN>
	</TD>
</TR>
<TR>
   <TD align="left" valign="middle" bgcolor="#FFFFFF" height="49">
      <img src="images/popup_header.gif"  BORDER="0" HSPACE="0" VSPACE="0">
   </TD>
   <TD align="right" valign="middle" bgcolor="#FFFFFF" height="49">
		<img src="images/popup_logo.gif"  BORDER="0" HSPACE="20" VSPACE="0">      
   </TD>
</TR>
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule2" height="9" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule2">&nbsp;</SPAN>
   </TD>
</TR>
</TABLE>
<DIV CLASS="popupPad">

<form 
	name="theForm" 
	method="POST" 
	action="javascript:doSubmit();" 
	onsubmit="return validate();" 
	onreset="doDlgClose(0); return false;"
> 
<table border="0" cellspacing="0" cellpadding="0" width="400" style="width:400;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Grant Permission</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="118" align="right"><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="400">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="45%">
			Rule
		</td>
		<TD class="input" valign="top" align="left" width="55%">
			<SPAN class="readOnlyValue"><SCRIPT>document.write( qStr.getParam( "descr" ).ent() \
);</SCRIPT></SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="45%">
			<span class="offsetLabel">User Name</span>
		</td>
		<TD class="input" valign="top" align="left" width="55%">
			<input CLASS="longInput" MAXLENGTH="14" NAME="username" SIZE="17" TYPE="text" \
VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="45%">
			<span class="offsetLabel">Path Type</span>
		</td>
		<TD class="input" valign="top" align="left" width="55%">
			<select CLASS="longInput" NAME="urltype" SIZE="1" WIDTH="100">
	            <OPTION value="0">File</OPTION>
	            <OPTION value="1">Directory</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="45%">
			<span class="offsetLabel">Path</span>
		</td>
		<TD class="input" valign="top" align="left" width="55%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="url" SIZE="17" TYPE="text" \
VALUE=""><SPAN CLASS="unitsOffset"><SCRIPT>document.write( 'The path must begin with \
"' + protectedPath.ent() + '/" and end with a forward slash or a filename (when Path \
Type is set to "File").');</SCRIPT></SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="45%">
			<span class="offsetLabel">Access Type</span>
		</td>
		<TD class="input" valign="top" align="left" width="55%">
			<select CLASS="longInput" NAME="permtype" ONCHANGE="onPermTypeChg()" SIZE="1" \
WIDTH="100">  <OPTION value="0">Event</OPTION>
	            <OPTION value="1">Calendar</OPTION>
	            <OPTION value="2">Duration</OPTION>
	            <OPTION value="3">Credit</OPTION>
	        </SELECT>
		</td>
	</tr>
<TR>
	<TD class="input" colspan=2>
		<SPAN ID="ANCHOR_FORMS"></SPAN>
		<A NAME="ANCHOR_FORMS_NAV4"></A>&nbsp;
		<BR><BR><BR>
	</TD>
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="400">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR><TD colspan="2" bgcolor="#E6E6E6" align="right" valign="middle" NOWRAP>
   <input type="image" src="images/okay.gif" alt="Apply changes made to this page" \
name="Apply changes made to this page" value="Apply" border="0">&nbsp;<A \
HREF="javascript://" onclick="window.close()"><img src="images/cancel.gif"  \
ALT="Close this window without applying changes" BORDER="0" HSPACE="0" \
VSPACE="0"></A></TD> </TR>
</TABLE>
</FORM>

</DIV>

<SPAN ID="LAYER_date" CLASS="absolute">
<FORM name="FORM_date">
<TABLE ID="TABLE_date" border="0" cellspacing="0" cellpadding="6" width="400">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="45%">
			<span class="offsetLabel">Expiration Date<BR><SPAN \
class='units'>(mm/dd/yyyy:hh:mm:ss)</SPAN></span>  </td>
		<TD class="input" valign="top" align="left" width="55%">
			<input CLASS="longInput" MAXLENGTH="20" NAME="expire" SIZE="17" TYPE="text" \
VALUE="">  </td>
	</tr>
</TABLE>
</FORM>
</SPAN>
<SPAN ID="LAYER_time" CLASS="absolute">
<FORM name="FORM_time">
<TABLE ID="TABLE_time" border="0" cellspacing="0" cellpadding="6" width="400">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="45%">
			<span class="offsetLabel">Time Granted<BR><SPAN \
class='units'>(seconds)</SPAN></span>  </td>
		<TD class="input" valign="top" align="left" width="55%">
			<input CLASS="input" MAXLENGTH="8" NAME="time" SIZE="5" TYPE="text" VALUE="">
		</td>
	</tr>
</TABLE>
</FORM>
</SPAN>
<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>

</BODY>
</HTML>

--- NEW FILE: toc_w3c.css ---

BODY
{
    padding-top:	4 ;
	padding-left:	6 ;
	border-left: 	6px solid #336699;
	height: 99%;
}
DIV
{
	width:			95%;
	display:		none;
	visibility:		visible;
	position:		static;
	text-indent:	0;
}

A:hover    
{
	TEXT-DECORATION: underline;
}

DIV.l0 A:hover
{
	TEXT-DECORATION: none;
}
IMG{clear:left;align:top;}
.l0 {left:0;padding: 2; margin-bottom:1;display:block; border: solid #E6E6E6 2px}
.l1 {left:0;padding-left: 4;}
.l2 {}
.l3 {}
.l4 {}
.l5 {}
.l6 {}
.l7 {}

--- NEW FILE: config_broad_rtp.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>QT & RTP Encoding</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "30";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="propview_nolist.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?fslist=config.FSMount&diffConfig=diffconfig"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
// grab the first pn-qtencoder mountpoint
var serverData = [];
var longName = "";
if ( fslist != null )
{
	for ( var fsName in fslist )
	{
		if ( isObj( fslist[ fsName ] ) && 
			 (fslist[ fsName ][ "ShortName" ] == "pn-qtencoder") )
		{
			serverData = fslist[ fsName ];
			longName = fsName;
			break;
		}
	}
}

delete fslist;

var propSet =
[
	new PropObj( 'ShortName', 	   "pn-qtencoder",       true, true, null, null, null, \
"ShortName" ),  new PropObj( 'MountPoint', 	   "/rtpencoder/",        false,true, \
null, null, "mountpoint", "Encoder MountPoint" ),   new PropObj( 'BaseMountPoint', \
"/rtptencodersdp/",     false,true, null, null, "mountpoint", "Encoder Base \
MountPoint" ),   new PropObj( 'ConnectionTimeout', "10",     false,true, 5, 120, \
"int", "Connection Timeout" ),   new PropObj( 'RTPBYETimeout', 	  "10",     \
false,true, 5, 120, "int", "End of Session Timeout" ),   new PropObj( \
'EmulateEncoderModel', "0",     false,true, null, null, "int", "Enable SDP Directory \
Scan" ),   new PropObj( 'DirectoryScanInterval', "5",     false,true, 1, 65536, \
"int", "SDP Directory Scan Interval" ) ];

function RTPEncPropView ()
{
	this.base = PropListView ;
	this.base( "RTP Encoding", propList, "config.FSMount." + longName + ".", 
    			"configvar", "theForm" );
}
RTPEncPropView.prototype = new PropListView ;

RTPEncPropView.prototype.postValidate = function ()
{
	// make sure the mountpoint is unique among all mount points
    if ( propList && propList.prop( "MountPoint" ) )
    {
		var errMsg = 
	    	propList.prop( "MountPoint" ).getMountPointConflictErrMsg( fslist );
		if ( errMsg )
		{
			return rejectInput( theForm.MountPoint, errMsg );
		}
	}
	return true;
}

var propList = new PropList( "RTP Encoding", serverData, propSet );
var propView = new RTPEncPropView();
var theForm ;

function onLoad ()
{
	theForm = document.theForm;
	checkForPendingChanges( diffConfig );
	propView.onLoad( window );

}	// onLoad ()
</SCRIPT>

</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">BROADCASTING</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
RTP Encoders (such as the Sorenson Encoder for QuickTime) by default uses 
the mount point defined below.
<br><br>

Unlike the RealSystem and Pre-G2 encoders, the Helix Server uses .sdp files 
to connect to RTP encoders. Once the live encoder has been started with the 
RTP encoders, the encoder will create an .sdp file. These RTP encoder .sdp 
files should be placed in the appropriate subdirectory (e.g. rtpencodersdp) 
under your Content directory. Note: Your Content directory's default base 
path is the Content subdirectory under your server's installation directory.
</td></tr>
</TABLE>
<BR>

<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 

<input type="hidden" name="ShortName" value="">
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>QT & RTP Encoding</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="50%">
			<span class="offsetLabel">Mount Point</span>
		</td>
		<TD class="input" valign="top" align="left" width="50%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="MountPoint" SIZE="18" TYPE="text" \
VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="50%">
			<span class="offsetLabel">Base Mount Point</span>
		</td>
		<TD class="input" valign="top" align="left" width="50%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="BaseMountPoint" SIZE="18" \
TYPE="text" VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="50%">
			<span class="offsetLabel">Connection Timeout</span>
		</td>
		<TD class="input" valign="top" align="left" width="50%">
			<input CLASS="input" MAXLENGTH="5" NAME="ConnectionTimeout" SIZE="5" TYPE="text" \
VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="50%">
			<span class="offsetLabel">End of Session Timeout</span>
		</td>
		<TD class="input" valign="top" align="left" width="50%">
			<input CLASS="input" MAXLENGTH="5" NAME="RTPBYETimeout" SIZE="5" TYPE="text" \
VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="50%">
			<span class="offsetLabel">Enable SDP Directory Scan</span>
		</td>
		<TD class="input" valign="top" align="left" width="50%">
			<select CLASS="input" NAME="EmulateEncoderModel" SIZE="1" WIDTH="226">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="50%">
			<span class="offsetLabel">SDP Directory Scan Interval</span>
		</td>
		<TD class="input" valign="top" align="left" width="50%">
			<input CLASS="input" MAXLENGTH="5" NAME="DirectoryScanInterval" SIZE="5" \
TYPE="text" VALUE="">  </td>
	</tr>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" VALIGN="middle" width="100%" class="body" \
                ALIGN="left">
      <FONT color="red">*A server restart is required to effect changes applied to \
this page.</FONT>  </TD>
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: edituser.html ---

<HTML>
<HEAD>

<TITLE>Change User Password</TITLE> 

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="dialog.js"></SCRIPT>
<SCRIPT SRC="qstr.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
	document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else
{
	document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
</SCRIPT>

<SCRIPT>
var realm = document.location.search.slice( 1 );
var submitString = "" ;

function validate() 
{
    if ( getCtrlValue( theForm.username ) == "" )
		return rejectInput( theForm.username, "A User name is required." );

	if ( ! validatePassword( "pass", false ) )
		return false;

	submitString = buildParam( "name", getCtrlValue( theForm.username ) );
	submitString += buildParam( "pass", getCtrlValue( theForm.pass ) );
	submitString += buildParam( "realm", realm );

	return true ;
}

function doSubmit () 
{
	raSubmitChanges( "auth.changeuserpass.html", submitString, "Change User Password" );
}

function onLoad ()
{

}	// onLoad
</SCRIPT>
</HEAD>

<SCRIPT>
onLoadHookFunc = onLoad;
</SCRIPT>

<BODY 
	CLASS="popup"	
	onload="_onLoadDefault();"
	onunload="_onUnLoadDefault();"
> 
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule" height="7" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule">&nbsp;</SPAN>
	</TD>
</TR>
<TR>
   <TD align="left" valign="middle" bgcolor="#FFFFFF" height="49">
      <img src="images/popup_header.gif"  BORDER="0" HSPACE="0" VSPACE="0">
   </TD>
   <TD align="right" valign="middle" bgcolor="#FFFFFF" height="49">
		<img src="images/popup_logo.gif"  BORDER="0" HSPACE="20" VSPACE="0">      
   </TD>
</TR>
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule2" height="9" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule2">&nbsp;</SPAN>
   </TD>
</TR>
</TABLE>
<DIV CLASS="popupPad">

<form 
	name="theForm" 
	method="POST" 
	action="javascript:doSubmit();" 
	onsubmit="return validate();" 
	onreset="doDlgClose(0); return false;"
> 
<table border="0" cellspacing="0" cellpadding="0" width="400" style="width:400;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Change Password</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="118" align="right"><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="400">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			Realm
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<SPAN class="readOnlyValue"><SCRIPT>document.write( realm );</SCRIPT></SPAN>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">User Name</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="longInput" MAXLENGTH="14" NAME="username" SIZE="19" TYPE="text" \
VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">New Password</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="longInput" MAXLENGTH="14" NAME="pass" SIZE="19" TYPE="password" \
VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Confirm New Password</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="longInput" MAXLENGTH="14" NAME="pass2" SIZE="19" TYPE="password" \
VALUE="">  </td>
	</tr>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="400">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR><TD colspan="2" bgcolor="#E6E6E6" align="right" valign="middle" NOWRAP>
   <input type="image" src="images/okay.gif" alt="Apply changes made to this page" \
name="Apply changes made to this page" value="Apply" border="0">&nbsp;<A \
HREF="javascript://" onclick="window.close()"><img src="images/cancel.gif"  \
ALT="Close this window without applying changes" BORDER="0" HSPACE="0" \
VSPACE="0"></A></TD> </TR>
</TABLE>
</DIV>

</FORM>
<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_broad_real.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>RealNetworks Encoding</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "36";
</SCRIPT>

<SCRIPT SRC="propview_nolist.js"></SCRIPT>
<SCRIPT SRC="port.js"></SCRIPT>

<!-- This external script contains our live server data -->
<SCRIPT SRC="servvar.get.html?configList=config"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
/*
     <!-- RBS Authentication File System -->
     <List Name="Encoder Admin File System">
         <Var ShortName="rn-encfs"/>
         <Var MountPoint="/encfs/"/>
         <Var PortRange="50001-50050"/>
         <Var Realm="ACULBRETH.AdminRealm"/>
     </List>

    <List Name="RealSystem G2 Encoders">
        <Var ShortName="pn-encoder"/>
        <Var MountPoint="/encoder/"/>
        <Var Port="4040"/>
        <Var EncoderRealm="beng.EncoderRealm"/>
    </List>

    <!-- Pre-G2 Encoders -->
    <List Name="Pre-RealSystem G2 Encoders">
        <Var ShortName="pn-live3"/>
        <Var MountPoint="/live/"/>
        <Var Port="5050"/>
        <!-- Var Password="letmein"/ -->
    </List>
*/

var FS_ENCODER_9 = "Encoder Admin File System";
var FS_ENCODER_G2 = "RealSystem G2 Encoders";

propSet9 = 
[
	new PropObj( 'ShortName', "pn-encfs", true, true, null, null, null, "ShortName" ),
	new PropObj( 'MountPoint', "/encfs/", false, true, null, null, "mountpoint", \
"Encoder MountPoint" ),   new PropObj( 'PortRange', "50001-50050", false, true, null, \
null, "port_range", "Encoder Port Range" ),  new PropObj( 'Realm', "", false, false, \
null, null, "Realm", "Encoder Realm", true ) ];

var serverData9 = null;
if ( configList &&
	 configList["FSMount"] &&
	 configList["FSMount"][FS_ENCODER_9] )
{
	serverData9 = configList["FSMount"][FS_ENCODER_9];
}

propSetG2 = 
[
	new PropObj( '_ShortName', "pn-encoder", true, true, null, null, null, "ShortName" \
),  new PropObj( '_MountPoint', "/encoder/", false,true, null, null, "mountpoint", \
"Encoder MountPoint", true ),   new PropObj( 'Port', 		 "4040", 		   false,true, \
null, null, "port", "Encoder Port" ),  new PropObj( 'EncoderTimeout',  "30", false, \
true, null, null, "int", "Timeout" ),  new PropObj( 'EncoderRealm', "EncoderRealm", \
false,false,null, null, "Realm", "Encoder Realm", true ) ];

var serverDataG2 = null;
if ( configList &&
	 configList["FSMount"] &&
	 configList["FSMount"][FS_ENCODER_G2] )
{
	serverDataG2 = configList["FSMount"][FS_ENCODER_G2];
}

var propSetAll = 
[ 
	new PropList( FS_ENCODER_9, serverData9, propSet9 ),
	new PropList( FS_ENCODER_G2, serverDataG2, propSetG2 )
];
var propList = new PropList( "RealSystem Encoding", [], propSetAll );
var subList9 = propList.subList( FS_ENCODER_9 );
var subListG2 = propList.subList( FS_ENCODER_G2 );

function Enc9PropView ()
{
	this.base = PropListView ;
	this.base( "Producer 9.0", propList, 
			"config.FSMount.", "servvar", "theForm" );
}
Enc9PropView.prototype = new PropListView ;

Enc9PropView.prototype.initListDataDisplay = function ()
{
	this.m_propList.fillForm( this.getForm() );

	// fillForm isn't recursive - have to do it for sublists
	subList9.fillForm( theForm );
	subListG2.fillForm( theForm );

	thePortRange.fillForm( theForm );
}

Enc9PropView.prototype.preValidate = function ()
{

	if ( ! thePortRange.validate( theForm ) )
		return false ;

	// validate doesn't recurse into sublists
	var ctrl = subList9.validate( theForm );
	if ( ctrl ) 
	{
		
		return rejectInput( ctrl, subList9.errMsg );
	}
	ctrl = subListG2.validate( theForm );
	if ( ctrl ) 
	{
		
		return rejectInput( ctrl, subListG2.errMsg );
	}

	return true;
}

Enc9PropView.prototype.postValidate = function ()
{
	if ( subList9.prop( "PortRange" ).isDirty() )
	{
		// check for port conflict with the rest of the server configuration
		var conflict = findPortConflictName( 
							getCtrlValue( theForm.PortRange1 ), 
							getCtrlValue( theForm.PortRange2 ) );
		if ( conflict )
		{
			return rejectInput( theForm.PortRange1, getConflictErrMsg( conflict, "Producer 9.0 \
Port Range" ) );  }
	}

	if ( subListG2.prop( "Port" ).isDirty() )
	{
		// check for port conflict with the rest of the server configuration
		var conflict = findPortConflictName( getCtrlValue( theForm.Port ) );
		if ( conflict )
		{
			return rejectInput( theForm.Port, getConflictErrMsg( conflict, "G2 Encoder Port" ) \
);  }
	}

	// make sure the mountpoint is unique among all mount points
    if ( subListG2 && subListG2.prop( "_MountPoint" ) )
    {
		var errMsg = 
	    	subListG2.prop( "_MountPoint" ).getMountPointConflictErrMsg( 
            	configList.FSMount );
		if ( errMsg )
		{
			return rejectInput( theForm._MountPoint, errMsg );
		}
    }

	return true;
}

Enc9PropView.prototype.postIsDirty = function ()
{

	return ( isCtrlDirty( theForm.PortRange1 ) || 
			 isCtrlDirty( theForm.PortRange2 ) );
}

initAllPortsList( configList, FS_ENCODER_G2, FS_ENCODER_9 );

var propView = new Enc9PropView();
var theForm ;
var tocFrame = findFrame( "TOC" );

var thePortRange = new PortRangeCtrl();

function onLoad ()
{
	theForm = document.theForm;

	fillRealms();

	propView.onLoad( window );
}

function fillRealms ()
{
	var aTmp = [];
	function _fillTmpArrayCallback ( array, prop, curDepth )
	{
		aTmp[ aTmp.length ] = prop ;
	}
	enumPropArray( configList["AuthenticationRealms"], _fillTmpArrayCallback, 1 ); 
	aTmp.sort();
	
	var ctrl;
	var ctrls = [ theForm.Realm, theForm.EncoderRealm ];
	for ( var i = 0; i < ctrls.length; i++ )
	{
		ctrl = ctrls[ i ];
		ctrl.options.length = 2;	//preserve the "Select" and "None" choices

		for ( var x = 0; x < aTmp.length; x++ )
		{
			selAddOption( ctrl, aTmp[ x ], configList["AuthenticationRealms"][ aTmp[ x ] ][ \
'Realm' ] );  }
		selectFirst( ctrl );
	}
}
</SCRIPT>

</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">BROADCASTING</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
This page allows you to configure account-based live broadcasting, the
simpler of two methods of connecting a live broadcast source to the
server. Account-based broadcasting allows 
Producer 9 to emulate the simpler broadcasting connection found in
earlier versions of the Producer. This emulation also provides
support for RealProducer G2 through 8.5..
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 

<input type="hidden" name="ShortName" value="">
<input type="hidden" name="MountPoint" value="">
<INPUT type="hidden" name="PortRange" value="">
<input type="hidden" name="_ShortName" value="">
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>9.0 Producer</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="25%">
			<span class="offsetLabel">Port Range</span>
		</td>
		<TD class="input" valign="top" align="left" width="75%">
			<input type="text" class="input" name="PortRange1" size="6" maxlength="5"><SPAN \
class="unitsOffset">&nbsp;to&nbsp;</span><input type="text" class="input" \
name="PortRange2" size="6" maxlength="5">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="25%">
			<span class="offsetLabel">Authentication<FONT color="red">*</FONT></span>
		</td>
		<TD class="input" valign="top" align="left" width="75%">
			<select CLASS="threeQInput" NAME="Realm" SIZE="1" WIDTH="340">
	            <OPTION value="">Select an Authentication Realm</OPTION>
	            <OPTION value="">None</OPTION>
	            <OPTION value="A">B</OPTION>
	            <OPTION value="C">D</OPTION>
	            <OPTION value="E">F</OPTION>
	            <OPTION value="G">H</OPTION>
	            <OPTION value="I">J</OPTION>
	        </SELECT><SPAN CLASS="units"><BR><A class="linkTextSmall" \
HREF="javascript:tocFrame.gotoPage('config_sec_uauth.html')">Create</a> user names \
and passwords.<BR><BR></SPAN>  </td>
	</tr>
</TABLE>
<BR>
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>G2 to 8.5 Producer</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="25%">
			<span class="offsetLabel">Mount Point<FONT color="red">*</FONT></span>
		</td>
		<TD class="input" valign="top" align="left" width="75%">
			<input CLASS="threeQInput" MAXLENGTH="255" NAME="_MountPoint" SIZE="24" \
TYPE="text" VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="25%">
			<span class="offsetLabel">Port</span>
		</td>
		<TD class="input" valign="top" align="left" width="75%">
			<input CLASS="input" MAXLENGTH="255" NAME="Port" SIZE="6" TYPE="text" VALUE="">
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="25%">
			<span class="offsetLabel">Timeout</span>
		</td>
		<TD class="input" valign="top" align="left" width="75%">
			<input CLASS="input" MAXLENGTH="255" NAME="EncoderTimeout" SIZE="6" TYPE="text" \
VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="25%">
			<span class="offsetLabel">Authentication<FONT color="red">*</FONT></span>
		</td>
		<TD class="input" valign="top" align="left" width="75%">
			<select CLASS="threeQInput" NAME="EncoderRealm" SIZE="1" WIDTH="340">
	            <OPTION value="">Select an Authentication Realm</OPTION>
	            <OPTION value="">None</OPTION>
	            <OPTION value="A">B</OPTION>
	            <OPTION value="C">D</OPTION>
	            <OPTION value="E">F</OPTION>
	            <OPTION value="G">H</OPTION>
	            <OPTION value="I">J</OPTION>
	        </SELECT><SPAN CLASS="units"><BR><A class="linkTextSmall" \
HREF="javascript:tocFrame.gotoPage('config_sec_uauth.html')">Create</a> user names \
and passwords.</SPAN>  </td>
	</tr>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" VALIGN="middle" width="100%" class="body" \
                ALIGN="left">
      <FONT color="red">*A server restart is required to effect changes applied to \
this field.</FONT>  </TD>
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_pc_cache.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Cache Directives</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "14";
</SCRIPT>

<SCRIPT SRC="enumproplist.js"></SCRIPT>
<SCRIPT SRC="propview.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?enabled=config.TSEnable&noCacheDirs=config.NoCacheDir"></SCRIPT>


<SCRIPT LANGUAGE="javascript">
// merge server side data into one data structure
var serverData = [];
serverData[ "TSEnable" ] = enabled;
serverData[ "NoCacheDir" ] = noCacheDirs;

// merge server values (logList array) with property meta-data ( propSet )
var propList = new PropList
(
	"cache", serverData, 
	[
		new PropObj( 'TSEnable', "1", false, false, null, null, null, "Cache Requests" )
	   ,new EnumPropListSel( "NoCacheDir", null, "Directory_", 1, "thePathList" )
	]
);

function CachePropView ()
{
	this.base = NestedPropListView ;
	this.base( "Cache Directives", propList, "path", 
				"config.", "servvar", 
				"theForm", "thePathList", "thePathEdit" );

	this.m_itemDefValue = "/path";
	this.m_itemDefValuePostFix = "/" ;
	this.m_subListParent = this.m_propList.subList( "NoCacheDir" );
}
CachePropView.prototype = new NestedPropListView ;

CachePropView.prototype.postOnLoad = function ( fValidate )
{
	if ( this.m_subListParent )
	{
		this.m_subListParent.fillForm( theForm );
	}
	selectFirst( theForm.thePathList );
	this.m_oES.sync();
	this.m_curSubListName = this.m_oES.getItemValue();

}	// postOnLoad

CachePropView.prototype.onESRename = function ( oldSubListName, newSubListName )
{
	if ( ! this.m_bLoaded ) return ;

	// no validation here - validate during preValidateSubList

	this.m_subListParent.renameSubList( oldSubListName, newSubListName );
	this.m_curSubListName = newSubListName ;
	this.onSubListChangeNotify( "rename", oldSubListName, newSubListName );

	return true ;

}	// onESRename ()

CachePropView.prototype.preValidate = function ()
{

	// validate doesn't recurse into sublists
	if ( this.m_subListParent )
	{
		//enumproplist::validate doesn't fail, always returns null
		this.m_subListParent.validate( theForm );
	}

	return true;
}

CachePropView.prototype.removeSubList = function ()
{
	if ( ! this.m_bLoaded ) return ;

	if ( ! this.m_curSubListName )
	{
		return;
	}
		
	// in case the sublist was renamed
	if ( ! this.m_oES.doRenameCheck() )
		return ;

	
	
    if ( this.confirmRemoveSubList( this.m_curSubListName ) )
	{
		var deletedSubListName = this.m_curSubListName;
		// mark as 'deleted'
		this.m_oES.remove();
		this.onSubListChangeNotify( "delete", deletedSubListName );
		this.fillFormFromSubList( false );
	}

}	// removeSubList ()

CachePropView.prototype.confirmRenameSubList = function ( oldSubListName, \
newSubListName ) {
	if ( ! this.m_propList.mountpoint_validate( newSubListName ) )
	{
		return rejectInput( this.getEditCtrl(), 
			"No-Cache paths must begin and end with a forward slash ('/')." );
	}

    return true ;
	
}	// confirmRenameSubList ()

var propView = new CachePropView();
var theForm ;

function onLoad ()
{
	theForm = document.theForm ; 
	propView.onLoad( window );
	propView.m_oES.m_reIllegalChars = null;
}
</SCRIPT>

</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">SERVER SETUP</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
By default all on-demand streaming media presentations delivered by
the server are permitted to be cached and all live broadcasts are
permitted to be split by intermediary proxy-cache devices that exist between
the server and client. Permitting caching and splitting conserves server
delivery bandwidth when multiple requests for identical media originate
through a proxy.  
<BR><BR>

Server administrators may wish to designate some or all of the media
hosted by the server to not be cached or split by any proxy-cache
device. To designate some hosted media as not cacheable or splitable, list the
appropriate resource paths in the list box below. To insure that no hosted
media is cacheable or splitable, set the 'Deny All Cache Requests' toggle
to 'Yes'.
</td></tr>
</TABLE>
<BR>

<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Cache Directives</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<tr><TD class="input" valign="top" colspan="2">
	Deny All Cache Requests
	&nbsp;
	<select CLASS="input" NAME="TSEnable" SIZE="1" WIDTH="453">
	    <OPTION value="0">Yes</OPTION>
	    <OPTION value="1">No</OPTION>
	</SELECT>
	<BR><BR>
	<TABLE CLASS="PROPLIST_LABEL" width="453" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Deny Cache Requests for \
these Resource Paths</TD>  <TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Path" BORDER=0></A><A href="javascript://" onclick="propView.removeSubList()"><IMG \
src="images/delete_g.gif" HSPACE=1 ALT="Remove Current Path" BORDER=0></A></TD>  \
</TR></TABLE>  <DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  \
CLASS="longInput" NAME="thePathList" SIZE="6" WIDTH="453">  <SCRIPT>
	       if ( isMac && isNav4 )
	       {
	          document.write( \
"<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );  }
	    </SCRIPT>
	</SELECT></FONT></DIV>

	<BR>
	<SPAN class="input">Edit Path</SPAN>
	<BR>
	<input CLASS="longInput" MAXLENGTH="255" NAME="thePathEdit" SIZE="36" TYPE="text" \
VALUE=""> </TD></TR>

<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_localFS.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Mount Points</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "7";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?fs=config.FSMount&diffConfig=diffconfig"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
var fsLocal = [];
function findLocalFSCallback ( a, prop, curDepth )
{
	var list = a[ prop ];

	// check for a content mountpoint
	if ( ! ( isObj( list ) &&
			 list[ "MountPoint" ] &&
			 list[ "ShortName" ] &&
			 list[ "ShortName" ].bSearch( /pn-local|pn-network/i ) ) )
		return ;

	// check for adminfs related mount point (don't want these)
	if ( list[ "BaseMountPoint" ] ||
		 list[ "MountPoint" ].bSearch( /admin/i ) )
		 return ;

	// it's a keeper
	fsLocal[ prop ] = list;
}
enumPropArray( fs, findLocalFSCallback, 1 );

var propSet = 
[
	new PropObj( 'ShortName',  "pn-local", false, true ),
	new PropObj( 'MountPoint', "/",    	  false,true, null, null, "mountpoint", "Content \
MountPoint" ),   new PropObj( 'BasePath',   "", 		  false,true, null, null, \
"physpath", "Base Path" ),

	new PropObj( 'UseContentDistribution', "1", false, true, null, null, "Cacheable" )

];

propList = new PropList( "Content Mount Points", fsLocal, null, propSet );

function FSPropView ()
{
	this.base = NestedPropListView ;
	this.base( "Mount Points", propList, "Mount Point", 
		"config.FSMount.", "configvar", "theForm", 
		"theList", "theEdit" );

	this.m_itemDefValue = "Content";
}
FSPropView.prototype = new NestedPropListView ;

FSPropView.prototype.postValidateSubList = function ( subListName )
{
	var subList = this.m_subListParent.subList( subListName );
	if ( subList && subList.prop( "MountPoint" ) )
	{
		var errMsg = 
	    	subList.prop( "MountPoint" ).getMountPointConflictErrMsg( fs );
		if ( errMsg )
		{
			return rejectInput( theForm.MountPoint, errMsg );
		}
	}

	return true;
}

var propView = new FSPropView();
var theForm = null ;

// handler for initializing and resetting the form
function onLoad ()
{
	theForm = document.theForm;

	checkForPendingChanges( diffConfig );

	propView.onLoad( window );

}	// onLoad ()
</SCRIPT>

</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">SERVER SETUP</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
A mount point appears in every link to a Helix Server file.
It is a short way of referring to the actual directory where the files 
are stored. This page shows each mount point's actual directory in the 
Base Path.
<br>
<br>
Every mount point begins and ends with a forward slash, with the exception of
the main mount point, which consists simply of a single "/" slash. Links to your
main content will use this main "/" mount point. Its default base path is the
Content subdirectory under your server isntallation directory. Modify the 
base path of the main "/" mount point only if the base path does not reflect the 
location of your media files.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Mount Points</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<tr>
	<TD class="input" valign="top" width="45%">
		<TABLE CLASS="PROPLIST_LABEL" width="203" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Mount Point \
Description</TD>  <TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Mount Point" BORDER=0></A><A href="javascript://" \
onclick="propView.removeSubList()"><IMG src="images/delete_g.gif" HSPACE=1 \
ALT="Remove Current Mount Point" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theList" SIZE="16" WIDTH="203">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="55%">
		Edit Description
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theEdit" SIZE="19" TYPE="text" \
VALUE="">

		<BR>
		Mount Point
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="MountPoint" SIZE="19" TYPE="text" \
VALUE="">

		<BR>
        Base Path
        <BR>
        <input CLASS="longInput" MAXLENGTH="255" NAME="BasePath" SIZE="19" \
TYPE="text" VALUE="">

		<BR>
        Base Path Location
        <BR>
        <select CLASS="longInput" NAME="ShortName" SIZE="1" WIDTH="249">
            <OPTION value="pn-network">Network</OPTION>
            <OPTION value="pn-local">Local</OPTION>
        </SELECT>

		<BR>
        Cacheable by Caching Subscribers
        <BR>
        <select CLASS="input" NAME="UseContentDistribution" SIZE="1" WIDTH="249">
            <OPTION value="1">Yes</OPTION>
            <OPTION value="0">No</OPTION>
        </SELECT>
	</TD>
</TR>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" VALIGN="middle" width="100%" class="body" \
                ALIGN="left">
      <FONT color="red">*A server restart is required to effect changes applied to \
this page.</FONT>  </TD>
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_spl_dist.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Transmitter</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "28";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>

<!--  for dealing with IP address validation -->
<SCRIPT SRC="port.js"></SCRIPT>

<!-- This external script contains our live server data -->
<SCRIPT SRC="servvar.get.html?serverData=config"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
var propSetSecurity =
[
	new PropObj( 'Type', "Basic" ),
	new PropObj( 'Password', "" )
];

var propSetDestination = 
[
	new PropObj( 'PathPrefix', 	"/broadcast/", false, true, null, null, "path", "Path" \
),   new PropObj( 'Address',  "", false, true, null, null, "hostname", "Receiver \
Address" ),  new PropObj( 'Protocol',  "udp/unicast", false, true, null, null, "", \
"Transport" ),  new PropObj( 'LocalAddress', "", false, false, null, null, \
"ipwildcard", "Local Address" ),   new PropObj( 'SureStreamAware', "1", false, true, \
null, null, "int", "SureStream Aware Splitting" ),  new PropObj( 'DisableLowLatency', \
"0", false, true, null, null, "int", "Disable Low Latency" ),  new PropObj( 'TTL',  \
"16", false, true, null, null, "TTL", "Time to Live" ),  new PropObj( 'FECLevel',  \
"0", false, true, 0, 100, "int", "Error Correction Rate" ),  new PropObj( \
'AcquisitionDataInterval',  "30", false, true, 3, 60, "int", "Metadata Transmit Rate" \
),  new PropObj( 'ResendSupported', "1" ),
	new PropObj( 'RelayMode', "0" ),
	new PropObj( 'PortRange',  "30001-30020", false, false, null, null, "port_range", \
"Port Range" ),  new PropList( 'Security', null, propSetSecurity )
];

var propSetPullSrcSecurity =
[
	new PropObj( '_Type', "Basic" ),
	new PropObj( '_Password', "" )
];

var propSetPullSource = 
[
	new PropObj( '_LocalAddress', "", false, false, null, null, "ip", "Local Address" ), \
  new PropObj( '_SureStreamAware',  "1", false, true, null, null, "int", "SureStream \
Aware Splitting" ),  new PropObj( '_PathPrefix',  "/broadcast/", false, true, null, \
null, "path", "Path" ),   new PropObj( 'ListenPort',  "", false, true, null, null, \
"port", "Port Range" ),  new PropList( 'Security', null, propSetPullSrcSecurity )
];

var propSetMain =
[
	new PropObj( 'SourceName', '',  false, false, null, null, "", "Source Name" ),
	new PropList( "Destinations", null, null, propSetDestination ),
	new PropList( "Pull Settings", null, null, propSetPullSource )
];

var propList = new PropList( "BroadcastDistribution", \
serverData["BroadcastDistribution"], propSetMain ); var subListDestinations = \
propList.subList( "Destinations" ); var subListPullSources = propList.subList( "Pull \
Settings" );

function PullSrcPropView ()
{
	this.base = NestedPropListView ;
	this.base( "Pull Sources", subListPullSources, "Pull Splitting Source", 
				"config.BroadcastDistribution.Pull Settings.", "servvar", 
				"theForm", "thePullList", "thePullEdit" );

	this.m_itemDefValue = "PullSource" ;
}
PullSrcPropView.prototype = new NestedPropListView ;

PullSrcPropView.prototype.postFillFormFromSubList = function ( fValidate )
{

	// fillForm isn't recursive - have to do it for sublists
	var subList = this.getSubList();
	if ( subList && subList.subList( "Security" ) )
	{
		subList.subList( "Security" ).fillForm( theForm );
	}
	
	onSecurityChange( "_" );

	return true;

}	// postFillFormFromSubList ()

PullSrcPropView.prototype.onSubListChangeNotify = function ( action, subListName )
{

	if ( "add" == action )
	{
		setCtrlValue( theForm.ListenPort, getNextAvailListenPort( getMaxListenPort() ) );
	}
	if ( "delete" == action )
	{
		setCtrlValue( theForm._Password, "" );
		setCtrlValue( theForm._Password2, "" );
	}

	if ( this.m_bDoDirtyCheck )
		this.showDirtyFlag( this.isDirty() );

}	// onSubListChangeNotify

PullSrcPropView.prototype.postValidateSubList = function ( subListName )
{

	// validate doesn't recurse
	var subList = this.getSubList();
	if ( subList && subList.subList( "Security" ) )
	{
		var ctrl = subList.subList( "Security" ).validate( theForm );
		if ( ctrl )
			return rejectInput( ctrl, subList.subList( "Security" ).errMsg );
	}
	
	if ( "Basic" == getCtrlValue( theForm._Type ) )
	{
		if ( isBlank( getCtrlValue( theForm._Password ) ) )
		{
			return rejectInput( theForm._Password,
				"A password is required when using Basic security." );
		}
		if ( ! validatePassword( "_Password", false ) )
			return false;
	}

	if ( subList.m_status || subList.prop( "ListenPort" ).isDirty() )
	{
		var port = getCtrlValue( theForm.ListenPort );
		var conflict = findPortConflictName( port );
		if ( conflict )
		{
			return rejectInput( theForm.ListenPort, getConflictErrMsg( conflict, "Pull Source \
Listen Port" ) );  }

		// check the port against other pull sources
		function _checkPortConflict( otherSubList, prop )
		{
			// don't compare this sublist with itself
			if ( otherSubList == subList ) return;

			if ( prop.getValue() == port )
			{
				conflict = otherSubList.toString();
				return 1;
			}
		}
		subListPullSources.propSearch( "ListenPort", _checkPortConflict );
		if ( conflict )
		{
			return rejectInput( theForm.ListenPort, 
				"The '" + subListName + "' Listen Port conflicts with the '" + conflict + "' \
Listen Port." );  }
	}

	return true;

}	// postValidateSubList ()

// define a subclass of NestedPropListView that will handle the main prop set \
("enabled" var) // and the publishers sublist. This class will encapsulate a propView \
to handle the // Rules sublist
function DestPropView ()
{
	this.base = NestedPropListView ;
	this.base( "Transmitter", propList, "Broadcast Receiver", 
				"config.BroadcastDistribution.", "servvar",
				"theForm", "theRecvList", "theRecvEdit" );

	this.m_itemDefValue = "Receiver" ;
	this.m_subListParent = subListDestinations;

	this.propViewPullSrc = new PullSrcPropView();
}
DestPropView.prototype = new NestedPropListView ;

DestPropView.prototype.postFillFormFromSubList = function ( fValidate )
{

	// fillForm isn't recursive - have to do it for sublists
	var subList = this.getSubList();
	if ( subList && subList.subList( "Security" ) )
	{
		subList.subList( "Security" ).fillForm( theForm );
	}
	
	thePortRange.fillForm( theForm );

	onSecurityChange( "" );

	return true;

}	// postFillFormFromSubList ()

DestPropView.prototype.onSubListChangeNotify = function ( action, subListName )
{

	if ( "add" == action )
	{
	}
	if ( "delete" == action )
	{
		setCtrlValue( theForm.Password, "" );
		setCtrlValue( theForm.Password2, "" );
	}

	if ( this.m_bDoDirtyCheck )
		this.showDirtyFlag( this.isDirty() );

}	// onSubListChangeNotify

DestPropView.prototype.preValidateSubList = function ()
{

	if ( ! thePortRange.validate( theForm ) )
		return false ;

	return true;
}

DestPropView.prototype.postValidateSubList = function ( subListName )
{

	// validate doesn't recurse
	var subList = this.getSubList();
	if ( subList && subList.subList( "Security" ) )
	{
		var ctrl = subList.subList( "Security" ).validate( theForm );
		if ( ctrl )
			return rejectINput( ctrl, subList.subList( "Security" ).errMsg );
	}
	
	if ( "Basic" == getCtrlValue( theForm.Type ) )
	{
		if ( isBlank( getCtrlValue( theForm.Password ) ) )
		{
			return rejectInput( theForm.Password,
				"A password is required when using Basic security." );
		}
		if ( ! validatePassword( "Password", false ) )
			return false;
	}

	if ( isIPAddr( getCtrlValue( theForm.Address ) ) )
	{
		var oAddr = new IPAddress( getCtrlValue( theForm.Address ) );
		var transport = getCtrlValue( theForm.Protocol );

		if ( transport.bSearch( /multicast/i ) )
		{			
			if ( ! (oAddr && oAddr.isMulticast) )
			{
				return rejectInput( theForm.Address,
					"Use of the " + transport + 
					" transport requires a Class D receiver address." );
			}
		}
		else if ( oAddr && oAddr.isMulticast )
		{
			return rejectInput( theForm.Address,
				"A class D receiver address is not valid when using the " + transport + 
				" transport." );
		}
	}

	return true;

}	// postValidateSubList ()

DestPropView.prototype.preValidate = function ()
{

	return this.propViewPullSrc.validate( true );
}

DestPropView.prototype.resultsCallback = function ( results )
{
    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];

		var propNameRight = propName.rightProp();
		var listName = "";

		var a = propName.split( "." );
		if ( a[ 4 ] ) // receiver list name
		{
			listName = a[ 4 ];
			if ( propNameRight == listName )
				listName = "";
		}

		
       	res.title = (listName ? listName.ent().span("body") + '<br>' : "") + 
       				propNameRight ;

		
	}
}

initAllPortsList( serverData, "BroadcastDistribution" );

var propView = new DestPropView();
var theForm ;

var thePortRange = new PortRangeCtrl();

function onLoad ()
{
	theForm = document.theForm;
	propView.onLoad( window );
	propView.propViewPullSrc.onLoad( window, true );

	// if multicast is not licensed remove that option from the tranport listbox
	if ( ! (top.TOC && 
	 		top.TOC.l && 
	 		top.TOC.l["BroadcastDistribution"] && 
		 	top.TOC.l["BroadcastDistribution"]["EnableMulticastTransport"]) )
	{
		selectDel( theForm.Protocol, 1 );
	}

	onSecurityChange( "" );
	onSecurityChange( "_" );
	
}	// onLoad ()

function onSecurityChange ( prefix )
{
	var type = getCtrlValue( theForm[ prefix + "Type" ] );
	if ( "Basic" != type )
	{
		setCtrlValue( theForm[ prefix + "Password" ], "" );
		setCtrlValue( theForm[ prefix + "Password2" ], "" );
	}
	else
	{
		setCtrlValue( theForm[ prefix + "Password2" ], 
			getCtrlValue( theForm[ prefix + "Password" ] ) );
	}
}

function getMaxListenPort ()
{
	maxPort = 2020 ;

	function findMaxCallback( subList, prop )
	{
		var port = prop.getValue();
		if ( port > maxPort )
		{
			maxPort = port ;
		}
	}
	subListPullSources.propSearch( "ListenPort", findMaxCallback );

	return maxPort ;
}

function getNextAvailListenPort ( prevPort )
{
	prevPort = parseInt( prevPort );
	for ( var i = prevPort + 10; true; i += 10 )
	{
		if ( ! findPortConflictName( i ) )
			return i ;
	}
}
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">BROADCAST DISTRIBUTION</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
The transmitter server is the originator of the live
broadcasts it sends to receiver servers. Links on Web pages point to the receiver,
rather than to the transmitter. When a user clicks the link, the receiver
recognizes the special URL and relays the stream from the transmitter to the
client, thus providing faster, better quality broadcasts.
<br>
<br>
A transmitter can send its broadcasts via UDP, TCP or UDP multicast; the
default is UDP unicast.
<br>
<br>
Refer to the documentation for detailed instructions on managing the
settings for the fields below.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 

<input type="hidden" name="PortRange" value="">
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Transmitter</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="44%">
			<span class="offsetLabel">Source Name</span>
		</td>
		<TD class="input" valign="top" align="left" width="56%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="SourceName" SIZE="20" TYPE="text" \
VALUE="">  </td>
	</tr>
<tr </tr>
<tr>
	<TD class="input" valign="top" width="44%">
		<TABLE CLASS="PROPLIST_LABEL" width="199" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Broadcast Receivers</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Receiver" BORDER=0></A><A href="javascript://" \
onclick="propView.removeSubList()"><IMG src="images/delete_g.gif" HSPACE=1 \
ALT="Remove Current Receiver" BORDER=0></A><A href="javascript://" \
onclick="propView.copySubList()"><IMG src="images/copy_g.gif" HSPACE=1 ALT="Copy \
Current Receiver" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theRecvList" SIZE="10" WIDTH="199">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="56%">
		Edit Receiver Name
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theRecvEdit" SIZE="20" TYPE="text" \
VALUE="">

		Source Path
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="PathPrefix" SIZE="20" TYPE="text" \
VALUE="">

		Receiver IP Address or Hostname
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Address" SIZE="20" TYPE="text" \
VALUE="">

		Local IP Address
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="LocalAddress" SIZE="20" TYPE="text" \
VALUE="">

		Transport
		<BR>
		<select CLASS="longInput" NAME="Protocol" SIZE="1" WIDTH="253">
		    <OPTION value="udp/unicast">udp/unicast</OPTION>
		    <OPTION value="udp/multicast">udp/multicast</OPTION>
		    <OPTION value="tcp">tcp</OPTION>
		</SELECT>

		SureStream Aware Splitting
		<BR>
		<select CLASS="longInput" NAME="SureStreamAware" SIZE="1" WIDTH="253">
		    <OPTION value="1">Enabled</OPTION>
		    <OPTION value="0">Disabled</OPTION>
		</SELECT>

		Low Latency
		<BR>
		<select CLASS="longInput" NAME="DisableLowLatency" SIZE="1" WIDTH="253">
		    <OPTION value="0">Enabled</OPTION>
		    <OPTION value="1">Disabled</OPTION>
		</SELECT>

		Multicast Time to Live (TTL)
		<BR>
		<input CLASS="input" MAXLENGTH="3" NAME="TTL" SIZE="6" TYPE="text" VALUE="">

		<BR>
		Error Correction Rate
		<BR>
		<input CLASS="input" MAXLENGTH="3" NAME="FECLevel" SIZE="6" TYPE="text" VALUE="">

		<BR>
		Metadata Transmit Rate
		<BR>
		<input CLASS="input" MAXLENGTH="3" NAME="AcquisitionDataInterval" SIZE="6" \
TYPE="text" VALUE="">

		<BR>
		Honor Resend Requests
		<BR>
		<select CLASS="input" NAME="ResendSupported" SIZE="1" WIDTH="91">
		    <OPTION value="1">Yes</OPTION>
		    <OPTION value="0">No</OPTION>
		</SELECT>

		<BR>
		Relay Live Broadcasts
		<BR>
		<select CLASS="input" NAME="RelayMode" SIZE="1" WIDTH="91">
		    <OPTION value="1">Yes</OPTION>
		    <OPTION value="0">No</OPTION>
		</SELECT>

		<BR>
		Port Range
		<BR>
		<input type="text" class="input" name="PortRange1" size="6" maxlength="5"><SPAN \
class="unitsOffset">&nbsp;to&nbsp;</span><input type="text" class="input" \
name="PortRange2" size="6" maxlength="5">

		<BR>
		Security Type
		<BR>
		<select CLASS="longInput" NAME="Type" ONCHANGE="onSecurityChange( '' );" SIZE="1" \
WIDTH="253">  <OPTION value="None">None</OPTION>
		    <OPTION value="Basic">Basic</OPTION>
		</SELECT>

		Password
		<BR>
		<input CLASS="longInput" MAXLENGTH="14" NAME="Password" SIZE="20" TYPE="password" \
VALUE="">

		Confirm Password
		<BR>
		<input CLASS="longInput" MAXLENGTH="14" NAME="Password2" SIZE="20" TYPE="password" \
VALUE="">  </TD>                        
</TR>
<tr </tr>
<tr>
	<TD class="input" valign="top" width="44%">
		<TABLE CLASS="PROPLIST_LABEL" width="199" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Pull Splitting \
Sources</TD>  <TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.propViewPullSrc.createSubList()"><IMG src="images/add_g.gif" \
HSPACE=1 ALT="Add New Pull Splitting Source" BORDER=0></A><A href="javascript://" \
onclick="propView.propViewPullSrc.removeSubList()"><IMG src="images/delete_g.gif" \
HSPACE=1 ALT="Remove Current Pull Splitting Source" BORDER=0></A><A \
href="javascript://" onclick="propView.propViewPullSrc.copySubList()"><IMG \
src="images/copy_g.gif" HSPACE=1 ALT="Copy Current Pull Splitting Source" \
BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="thePullList" SIZE="10" WIDTH="199">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="56%">
		Edit Source Name
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="thePullEdit" SIZE="20" TYPE="text" \
VALUE="">

		Source Path
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="_PathPrefix" SIZE="20" TYPE="text" \
VALUE="">

		Local IP Address
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="_LocalAddress" SIZE="20" TYPE="text" \
VALUE="">

		Listen Port
		<BR>
		<input CLASS="input" MAXLENGTH="5" NAME="ListenPort" SIZE="6" TYPE="text" VALUE="">

		<BR>
		SureStream Aware Splitting
		<BR>
		<select CLASS="longInput" NAME="_SureStreamAware" SIZE="1" WIDTH="253">
		    <OPTION value="1">Enabled</OPTION>
		    <OPTION value="0">Disabled</OPTION>
		</SELECT>

		Security Type
		<BR>
		<select CLASS="longInput" NAME="_Type" ONCHANGE="onSecurityChange( '_' );" SIZE="1" \
WIDTH="253">  <OPTION value="None">None</OPTION>
		    <OPTION value="Basic">Basic</OPTION>
		    <OPTION value="ProxyPull">Real Proxy</OPTION>
		</SELECT>

		Password
		<BR>
		<input CLASS="longInput" MAXLENGTH="14" NAME="_Password" SIZE="20" TYPE="password" \
VALUE="">

		Confirm Password
		<BR>
		<input CLASS="longInput" MAXLENGTH="14" NAME="_Password2" SIZE="20" TYPE="password" \
VALUE="">  </TD>                        
</TR>

<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: revokealluser.html ---

<HTML>
<HEAD>

<TITLE>Revoke All Permissions From User</TITLE> 

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="dialog.js"></SCRIPT>
<SCRIPT SRC="qstr.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
	document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else
{
	document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
</SCRIPT>

<SCRIPT language="javascript">
var qStr = new QStrParser();

function onLoad ()
{
}

var submitString = "" ;
function validate ()
{
	var name = getCtrlValue( theForm.name );
	if ( name == "" )
	{
		return rejectInput( theForm.name, "Entry required for user name." );
	}

	submitString = buildParam( "name", name );
	submitString += buildParam( "DatabaseID", qStr.getParam( "DatabaseID" ) );

	return true ;
}

function doSubmit () 
{
	raSubmitChanges( "auth.revokealluser.html", submitString, "Revoke All Permissions" \
); }
</SCRIPT>
</HEAD>

<SCRIPT>
onLoadHookFunc = onLoad;
</SCRIPT>

<BODY 
	CLASS="popup"	
	onload="_onLoadDefault();"
	onunload="_onUnLoadDefault();"
> 
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule" height="7" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule">&nbsp;</SPAN>
	</TD>
</TR>
<TR>
   <TD align="left" valign="middle" bgcolor="#FFFFFF" height="49">
      <img src="images/popup_header.gif"  BORDER="0" HSPACE="0" VSPACE="0">
   </TD>
   <TD align="right" valign="middle" bgcolor="#FFFFFF" height="49">
		<img src="images/popup_logo.gif"  BORDER="0" HSPACE="20" VSPACE="0">      
   </TD>
</TR>
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule2" height="9" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule2">&nbsp;</SPAN>
   </TD>
</TR>
</TABLE>
<DIV CLASS="popupPad">

<form 
	name="theForm" 
	method="POST" 
	action="javascript:doSubmit();" 
	onsubmit="return validate();" 
	onreset="doDlgClose(0); return false;"
> 
<table border="0" cellspacing="0" cellpadding="0" width="400" style="width:400;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Revoke All Permissions</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="118" align="right"><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="400">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			Realm
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<SPAN class="readOnlyValue"><SCRIPT>document.write( qStr.getParam( "descr" ).ent() \
);</SCRIPT></SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">User Name</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="longInput" MAXLENGTH="14" NAME="name" SIZE="19" TYPE="text" \
VALUE="">  </td>
	</tr>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="400">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR><TD colspan="2" bgcolor="#E6E6E6" align="right" valign="middle" NOWRAP>
   <input type="image" src="images/okay.gif" alt="Apply changes made to this page" \
name="Apply changes made to this page" value="Apply" border="0">&nbsp;<A \
HREF="javascript://" onclick="window.close()"><img src="images/cancel.gif"  \
ALT="Close this window without applying changes" BORDER="0" HSPACE="0" \
VSPACE="0"></A></TD> </TR>
</TABLE>
</DIV>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>

--- NEW FILE: mongraph.nc.html ---

<HTML>
<HEAD>
<TITLE>Server Monitor</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "27";
</SCRIPT>

<SCRIPT>
function onLoad ()
{
	
}

function onUnload ()
{

	if ( top.theCookieJar && document.Monitor )
	{
		top.theCookieJar.Monitor = document.Monitor.getConfigParams();
		top.theCookieJar.store();
	}
}
</SCRIPT>

</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault( onUnload );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">LOGGING & MONITORING</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="558">
<tr><TD class="bodyText">
The server monitor displays performance, connection and file activity.
Use the monitor to see how the server is being used, who is using it, when it is 
most used, and which files are the most requested.
</td></tr>
</TABLE>
<BR>
<table border="0" cellspacing="0" cellpadding="0" width="558" style="width:558;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Server Monitor</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="276" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table border="0" cellspacing="0" cellpadding="4" width="558">
<tr>
	<td class="input">	
<!--
	in order to set the "state" PARAM value from javascript (theCookieJar.Monitor)
	we have to use javascript to write out the entire APPLET tag - a script tag inside
	the APPLET tag is illegal
	To hardwire/customize the appearance of the monitor edit the "config" PARAM tag \
found  inside the Applet tag.

syntax: 

<PARAM NAME="config" VALUE="Name=[Value][&Name=[Value]]*">

Where the Name Value pairs can be any or all of the following:
	Name		Syntax			Semantic

	Interval	float 			Update frequency for the monitor (in seconds 
								or fractions of seconds).

	Scale		float   		The time scale - how many minutes of server 
								activty to graph (in minutes or fractions of 
								minutes).

	Panel		keyPanel|		Which panel to display when the monitor first appears
				clientPanel|	If the Panel is not specified (Panel=) then no panel
				filePanel|		is displayed and the graph is maximized.
				resourcePanel	

	FileSort	0-3:0|1			By which column and in which direction to sort the file
	ClientSort	0-3:0|1			and client panels. The first number is the col number, the
								second is a flag indicating wether or not to sort ascending.
								For example FileSort=3:1 will sort the client connection panel
								by the fileName column in ascending order.

	FullScreen  0|1		In full screen mode (FullScreen=1) the graph is hidden and
						the resource panel is maximized (valid only when Panel=clientPanel|filePanel)

	Watches		name[:color][:width][;name[:color][:width]]*
				-or-
				playerCount|monitorCount|encoderCount|fileCount|splitterCount:RGBColor:1-3

				Which statistics to graph, and optionally, the color and line width to use. 
				The order is in reverse priority, with later watches overwriting earlier ones 
				(configuragble in the monitor on the keyPanel). The color is specified in RGB 
				notation. The line width can be between 1 and 3.

	If a config parameter is missing the default value is used.

example:
<PARAM NAME="config" \
VALUE="Interval=1.0&Scale=0.5&Panel=resourcePanel&FullScreen=0&FileSort=0:1&ClientSort \
=0:1&Watches=playerCount:FF0000:1;monitorCount:0000FF:1;encoderCount:00FFFF:2;fileCount:FFFF00:3;">


-->
	<SCRIPT>
		var host = 
		document.write(
	        '<APPLET ' +
				'NAME="Monitor" ' +
	        	'CODEBASE="Monitor/" ' +
	        	'CODE="Monitor.class" ' +
	        	'ARCHIVE="monitor.jar" ' + 
	        	'WIDTH="550" ' +
	        	'HEIGHT="350" ' +
				'MAYSCRIPT ' +
	        '>' +
	            '<PARAM NAME="host" VALUE="' + location.hostname + '"> ' +
	            '<PARAM NAME="port" VALUE="<!--#(config.MonitorPort)-->"> ' +
	            '<PARAM NAME="password" VALUE="<!--#(config.MonitorPassword)-->"> ' +
				'<PARAM NAME="config" VALUE="' + (top.theCookieJar?top.theCookieJar.Monitor:"") + \
'">' +  '</APPLET>'
	    );
    </SCRIPT>
    </td>
</tr>
<tr>
	<td class="units" style="background-color:#FFFFFF;">
	<SCRIPT>
		if ( top.TOC && top.TOC.platform && (-1 != top.TOC.platform.indexOf( "WinNT" )) ) \
// NT platform  {
			document.write( 
				'The server is also designed to work with the Windows NT Performance ' +
				'Monitor to show activity on one or more servers. ' +
				'A Performance Monitor file containing server statistics, ' + 
				'rmserver.pmc, is supplied during installation. More information ' +
				'is available in the ' +
				'<A class="linkTextSmall" href="javascript://" onclick="contextHelp( \
\'mongraph_ntperfmon\' );">' +  'Administration Guide</A>.' );
		}
	</SCRIPT>
    </td>
</tr>
</table>
</BODY>
</HTML>

--- NEW FILE: main_ie_mac.css ---

BODY
{
	background-color: #FFFFFF;
	font-family:      Verdana, Arial, Helvetica, sans-serif;
}

BODY.CONFIG
{
	padding-left:	30 ;
}

BODY.POPUP
{
	padding:		  0;
	margin:			  0;
}
DIV.popupPad
{
	padding-right:	0px;
	padding-bottom:	0px;
	padding-top:	16;
	padding-left:	30;
}

/* gives a little space after the tab header */
TABLE.formTable
{
	margin-top:	1px;
}

A
{ 
	font-size:        8.5pt;
	font-weight:      500;
	color:            #0033FF;
	text-Decoration:	underline ;
}

FORM
{
	margin:		0;
	padding: 	0;
}

TABLE
{
	margin:		0 ;
}
TD
{ 
	font-family:      Verdana, Arial, Helvetica, sans-serif;
}
TD.body
{ 
  font-size:        8.5pt;
  font-weight:      normal;
  font-style:       Normal;
  color:            #333350;
  text-indent:      0pt;
}
TD.title2, .title2
{ 
  font-size:        9pt;
  font-weight:      600;																						 
  color:            #336699;
  background-Color: #E6E6E6;
}
TD.input

{ 
  font-size:        9pt;
  font-weight:      500;
  color:            #336699;
  background-Color: #E6E6E6;
  font-family:      Verdana, Arial, Helvetica, sans-serif;
}

SPAN.input, SPAN.FormHeader
{ 
  font-size:        9pt;
  font-weight:      500;
  font-family:      Verdana, Arial, Helvetica, sans-serif;
  color:            #336699;
  background-Color: #E6E6E6;
}
SPAN.FormHeader
{
	font-weight:	600;
}

.units, .unitsOffset
{ 
  font-size:        8.5pt;
  color:            #666666;
}

.unitsOffset
{
	position:	relative;
	top:		-3;
}

.offset
{
	position:	relative;
	top:		-3;
}
SELECT, INPUT, TEXTAREA, SPAN.readOnlyValue, FONT.input
{ 
  font-family:      Verdana, Arial, Helvetica, sans-serif;
  font-size:        9pt;
  font-weight:      500;
  color:            black;
}
.body
{ 
	font-family:      Verdana, Arial, Helvetica, sans-serif;
	font-size:        8.5pt;
	font-weight:      normal;
	font-style:       Normal;
	color:            #333350;
	text-indent:      0pt;
}
.stronger
{ 
  font-size:        8.5pt;
  font-weight:      600;
  font-style:       Normal;
  color:            #474770;
}
.longInput
{
	width: 100% ;
}

.medInput
{
	width: 50% ;
}

.threeQInput
{
	width: 75% ;
}
.offsetLabel
{
	position:relative;
	top:	3;
}
.offsetLabelSelect
{
	position:relative;
	top:	3;
}

/* used on HELP, SAMPLES, & CONFIGURE pages */
.PARA
{
	margin-left: 20;
	margin-bottom: 12;
	font-size:        9pt;
}

.PARAHEAD
{
	font-size: 		  large;
	font-weight:      600;
	font-style:       Normal;
	color:            #336699;
}
/* new stuff */

.bodyText, .bodyTextBold
{
	font-family:      Verdana, Arial, Helvetica, sans-serif;
	font-size:        9pt;
	font-weight:      500;
	font-style:       Normal;
	color:            #666666;
	text-indent:      0;
}

.bodyTextBold
{
	font-weight:      600;
}

TD.bodyText A
{ 
	font-size:        9pt;
}
.headline
{ 
	font-family:      Verdana, Arial, Helvetica, sans-serif;
	font-size: 		  14pt;
	font-weight:      500;
	font-style:       Normal;
	color:            #336699;
	text-indent:      2em;
	letter-spacing:	  3pt;

	/* to squeeze the headline and headline rule together */
	position:		  relative;	
	top:			  5;
}
.headlineRule
{ 
	font-size:        4pt;
	background-color: #336699;
}

.headerRule
{ 
	font-size:        4pt;
	background-color: #336699;
}

.headerRule2
{ 
	font-size:        4pt;
	background-color: #336699;
}
.linkText, .linkTextSmall
{
	font-size: 		9pt;
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	color:			#FF6600;
	letter-spacing:	normal;
	TEXT-DECORATION: none;
}

.linkTextSmall
{
	font-size: 		8.5pt;
}

A:hover    
{
	TEXT-DECORATION: underline;
}

.TabText
{
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	font-size: 		11pt;
	color:          #336699;
	font-weight:	600;
}

.popupTableHeader, .popupTitle
{
	background-color: #999999;
	color:			  white;
	font-family:	Tahoma, Arial, Helvetica, sans-serif;
	font-size:		12pt;
	font-weight:	bold;
}

.popupTitle
{
	background-color: 	#FFFFFF;
	color:			  	#336699;
	font-size: 		13pt;
}

TD.odd, TD.even
{
	font-size:        9pt;
	font-weight:      500;
	color:            #336699;
	background-Color: #FFFFFF;
}

TD.even
{
	background-Color: #E6E6E6;
}

.grey,SPAN.body
{
	color:            #666666;
	font-size:        9pt;
}
.PROPLIST_LABEL
{width:100%;}
.absolute
{ 
	position:absolute; 
	visibility:hidden; 
	z-index:10;
}
/* header frame specific */

.headerServerLabel, .headerServerName
{
	text-indent: 	12px;
	font-size: 		10pt;
	font-family:	Verdana, Arial, Helvetica, sans-serif;
	color:			white;
	letter-spacing:	normal;
}

.headerServerName
{
	text-indent: 	0;
	font-weight:	600;
}
/* about page specific */

.labelOdd, .valueOdd, .labelEven, .valueEven
{
  font-size:        9pt;
  font-weight:      500;
  color:            #336699;
  background-Color: #FFFFFF;
}

.labelEven, .valueEven
{
  background-Color: #E6E6E6;
}

.valueEven, .valueOdd
{
	color:            #666666;
}

.licenseTitle
{ 
  font-size: 		10pt;
  font-weight:      bold;
  color:            #666666;
  background-Color: #FFFFFF;
}

.trademarkBorder
{
	width:					550px;

	padding-top:			0px;
	padding-bottom:			0px;
	padding-left:			0px;
	padding-right:			0px;

	margin-top:				10px;
	margin-bottom:			0px;
	margin-left:			0px;
	margin-right:			0px;

	border-color:			#E6E6E6;

	border-top-width:		2px;
	border-bottom-width:	2px;
	border-left-width:		0px;
	border-right-width:		0px;

	border-top-style:		solid;
	border-bottom-style:	solid;
	border-left-style:		none;
	border-right-style:		none;
}



--- NEW FILE: index.html ---

<HTML>
<HEAD>

<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon"/>

<SCRIPT>
//<!--

function checkBrowser ()
{

	var isOther = true;	// miscellaneous non-supported browsers

	var isNav4 = false;
	var isNav6 = false ;
	var isIE = false ;
	var isIE4 = false ;
	var isIE5 = false ;
	var isMoz5 = false ;
	var isW3C = false ;
	var isWin = false;
	var isMac = false;
	var isUnix = false;

	var verMajor = 0;
	var verMinor = 0;

	var ver = navigator.appVersion.toLowerCase();
	var agt = navigator.userAgent.toLowerCase(); 
	
	var verMajor = 0;
	var verMinor = 0.0;

	var pos = ver.indexOf( "msie" );
	if ( -1 == pos )
	{
		verMajor = parseInt( ver ); 
		verMinor = parseFloat( ver ); 
	}
	else
	{
		verMajor = parseInt( ver.slice( pos + 4 ) ); 
		verMinor = parseFloat( ver.slice( pos + 4 ) ); 
	}

	isWin = (-1 != ver.indexOf( "win" ) ); 
	isMac = (-1 != ver.indexOf( "mac" ) ); 
	isUnix = !(isMac || isWin); 

	if ( document.layers )
	{

		// check for releases prior to 4.06 - they stink!
		isNav4 = ( verMinor >= 4.06 );

		isOther = !isNav4;
	}
	else
	{
		if ( document.all )
		{
			isIE = true ;
			isIE4 = true ;
			isOther = false;
		}

		if ( document.getElementById )
		{
			isIE4 = false ;
			isIE5 = isIE ;
			isMoz5 = (!isIE);
			isW3C = true ;
			isOther = false;
			isNav6 = (-1 != agt.indexOf( "Netscape" ) );
		}
	}

	if ( isOther || (isIE4 && isMac) )
	{
		top.location.href = "browsers.html" ;
	}
}

checkBrowser();

//-->
</script>

<SCRIPT SRC='xblib.js'></SCRIPT>
<SCRIPT SRC='client.js'></SCRIPT>
<SCRIPT SRC='string.js'></SCRIPT>
<SCRIPT SRC='BigInt.js'></SCRIPT>
<SCRIPT SRC='ip.js'></SCRIPT>
<SCRIPT SRC='datachn.js'></SCRIPT>
<SCRIPT SRC="qstr.js"></SCRIPT>
<SCRIPT SRC='cookies.js'></SCRIPT>

<SCRIPT SRC='proplist.js'></SCRIPT>
<SCRIPT SRC='editsel.js'></SCRIPT>
<SCRIPT SRC='propview.js'></SCRIPT>

<SCRIPT>
//<!--

//dynamically write title w/servername to allow for unique bookmarks
// and save
var origTitle = "Helix Administrator: " + location.hostname ;
document.write( "<TITLE>" + origTitle + "</TITLE>" );

/* 	Frameset-Wide Globals */

var fMainFrameIsLocal = true ;

// create the one and only Data Channel Object
var gDataChannel = new DataChannel( "DataChannelFrame" );

// Create the cookie we'll use to save state for this web page.
// Since we're using the default path, this cookie will be accessible
// to all web pages in the same directory as this file or "below" it.
// Note expiration date == 10 days in the future
var theCookieJar = new Cookie(document, "framesetState", 240);
theCookieJar.load();

var startPage = "" ;
var pendingChanges = false ;	// are there pending changes to the running state?

function getCurPage ()
{
	var page = "" ;
	var mainFrame = top.frames[ "Main" ];
	if ( mainFrame && fMainFrameIsLocal ) 
	{
		//get location.pathname and lop off everything but the filename and querystring
		page = mainFrame.location.pathname ;
		page = page.slice( page.lastIndexOf( '/' ) + 1 );

		if ( page && 
			(page.bSearch( /serve_me.html/i ) ||
			 page.bSearch( /^server\..*\.html/i )) )
		{
			if ( ! restartPage )
			{
				page = "" ;
			}
			else
			{
				page = restartPage ;
				restartPage = "" ;
			}
		}
	}

	return page ;
}

// check for a starting page specified in the query string
if ( location.search )
{
	var params = new QStrParser( top.location.href );
	if ( params.getParam( "start" ) )
	{
		startPage = params.getParam( "start" );
	}
}
// else look for a "lastPage" cookie - which is set during the 
// onUnload event of this page - it's the last page that was loaded in the main frame
else if ( theCookieJar.lastPage )
{
	startPage = theCookieJar.lastPage ;
}

function onLoad ()	
{
	if ( pendingChanges )
	{
		headerFrame = frames[ "Header" ];
		if ( headerFrame )
			headerFrame.restartImage();
	}

}	// onLoad ()

function onUnload ()	
{
	// Store the cookie values, even if they were already stored, so that the 
	// expiration date will be reset to 10 days from this most recent visit.
	theCookieJar.store();

	// be polite and close our help window
	if ( window.helpWin && (!window.helpWin.closed) )
		 window.helpWin.close();		

}	// onUnload ()

//-->
</SCRIPT>

</HEAD>
<SCRIPT>
var headerHeight = (isNav4 ? 95 : 100);
document.write('<FRAMESET BORDER="0" FRAMEBORDER="NO" FRAMEBORDER="0" \
FRAMESPACING="0" rows="' + headerHeight + ',*" onload="onLoad()" \
onunload="onUnload()">'); </SCRIPT>
	<frame FRAMEBORDER="NO" MARGINHEIGHT="0" MARGINWIDTH="0" NAME="Header" NORESIZE \
SCROLLING="NO" src="header.html">  <frameset FRAMEBORDER="NO" BORDER="0" \
FRAMEBORDER="0" FRAMESPACING="0" cols="180,*">  <frameset FRAMEBORDER="NO" BORDER="0" \
                FRAMEBORDER="0" FRAMESPACING="0" rows="0,*">
		    <frame FRAMEBORDER="NO" MARGINHEIGHT="0" MARGINWIDTH="0" \
                NAME="DataChannelFrame" SCROLLING="NO" NORESIZE \
                src="datachannel.html">
		    <frame FRAMEBORDER="NO" MARGINHEIGHT="8" MARGINWIDTH="6" NAME="TOC" NORESIZE \
SCROLLING="AUTO" src="toc.html">  </frameset>
	    <frame FRAMEBORDER="NO" MARGINHEIGHT="10" MARGINWIDTH="2" NAME="Main" \
src="about:blank">  </frameset>

    <noframes>
    <body>
    <p>Your browser does not support frames. The Helix Administrator supports \
Netscape  and Internet Explorer version 4.0 or later. </p>
    </body>
    </noframes>

</FRAMESET>
</HTML>

--- NEW FILE: adduser.html ---

<HTML>
<HEAD>

<TITLE>Add a User to Realm</TITLE> 

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="dialog.js"></SCRIPT>
<SCRIPT SRC="qstr.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
	document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else
{
	document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
</SCRIPT>

<SCRIPT>
var realm = document.location.search.slice( 1 );
var submitString = "" ;
function validate() 
{
    if ( getCtrlValue( theForm.username ) == "" )
		return rejectInput( theForm.username, "A User name is required." );

	if ( ! validatePassword( "pass", false ) )
		return false;

	submitString = buildParam( "name", getCtrlValue( theForm.username ) );
	submitString += buildParam( "pass", getCtrlValue( theForm.pass ) );
	submitString += buildParam( "realm", realm );

	return true ;
}

function doSubmit () 
{
	raSubmitChanges( "auth.adduser.html", submitString, "Add User" );
}

function onLoad ()
{

}	// onLoad
</SCRIPT>
</HEAD>

<SCRIPT>
onLoadHookFunc = onLoad;
</SCRIPT>

<BODY 
	CLASS="popup"	
	onload="_onLoadDefault();"
	onunload="_onUnLoadDefault();"
> 
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule" height="7" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule">&nbsp;</SPAN>
	</TD>
</TR>
<TR>
   <TD align="left" valign="middle" bgcolor="#FFFFFF" height="49">
      <img src="images/popup_header.gif"  BORDER="0" HSPACE="0" VSPACE="0">
   </TD>
   <TD align="right" valign="middle" bgcolor="#FFFFFF" height="49">
		<img src="images/popup_logo.gif"  BORDER="0" HSPACE="20" VSPACE="0">      
   </TD>
</TR>
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule2" height="9" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule2">&nbsp;</SPAN>
   </TD>
</TR>
</TABLE>
<DIV CLASS="popupPad">

<form 
	name="theForm" 
	method="POST" 
	action="javascript:doSubmit();" 
	onsubmit="return validate();" 
	onreset="doDlgClose(0); return false;"
> 
<table border="0" cellspacing="0" cellpadding="0" width="400" style="width:400;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Add User</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="118" align="right"><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="400">
<tr>
<TD class="input" valign="top" align="RIGHT" width="40%">
		Realm
	</td>
	<TD class="input" valign="top" align="left" width="60%">
		<SPAN class="readOnlyValue"><SCRIPT>document.write( realm );</SCRIPT></SPAN>
	</td>
</tr>
<tr>
<TD class="input" valign="top" align="RIGHT" width="40%">
		<span class="offsetLabel">User Name</span>
	</td>
	<TD class="input" valign="top" align="left" width="60%">
		<input CLASS="longInput" MAXLENGTH="14" NAME="username" SIZE="18" TYPE="text" \
VALUE="">  </td>
</tr>
<tr>
<TD class="input" valign="top" align="RIGHT" width="40%">
		<span class="offsetLabel">Password</span>
	</td>
	<TD class="input" valign="top" align="left" width="60%">
		<input CLASS="longInput" MAXLENGTH="14" NAME="pass" SIZE="18" TYPE="password" \
VALUE="">  </td>
</tr>
<tr>
<TD class="input" valign="top" align="RIGHT" width="40%">
		<span class="offsetLabel">Confirm Password</span>
	</td>
	<TD class="input" valign="top" align="left" width="60%">
		<input CLASS="longInput" MAXLENGTH="14" NAME="pass2" SIZE="18" TYPE="password" \
VALUE="">  </td>
</tr>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="400">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR><TD colspan="2" bgcolor="#E6E6E6" align="right" valign="middle" NOWRAP>
   <input type="image" src="images/okay.gif" alt="Apply changes made to this page" \
name="Apply changes made to this page" value="Apply" border="0">&nbsp;<A \
HREF="javascript://" onclick="window.close()"><img src="images/cancel.gif"  \
ALT="Close this window without applying changes" BORDER="0" HSPACE="0" \
VSPACE="0"></A></TD> </TR>
</TABLE>
</DIV>

</FORM>
<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: enumlist.js ---

/*

Helper class for dealing with enumerated configuration file lists like the 
following:

<List Name="HTTPDeliverable">
    <Var Path_0="/admin"/>
    <Var Path_2="/ramgen"/>
    <Var Path_1="/farm"/>
    <Var Path_3="/scalable"/>
</List>

Usage:

in server code do something like this:

emitPropsToJSArray( "config.HTTPDeliverable", "httpDelivList", 0, 0 );

On the client side, instantiate an EnumConfigList object like so:

var httpEnumList = new EnumConfigList( httpDelivList, "config.HTTPDeliverable", \
"Path_" );

during the onLoad handler for your page, use this to populate a <SELECT> list:

httpEnumList.fillSelectList( theForm.HTTPLIST );

*/

function ConfigListItem ( value, enumValue, status )
{
	this.m_value = value ;
	this.m_enum = enumValue ;
	this.m_status = status ;
}

function EnumConfigList ( list, listName, listEnumPrefix )
{
	this.list = new Array();
	this.listName = listName ? listName : "" ;
	this.prefix = ( listEnumPrefix ? listEnumPrefix : "item_" );
	this.usedIndexes = new Array( 100 );

	// pivot the original list into a hash for easy lookup (eliminates duplicates also)
	var regEx = new RegExp( "^" + escRegExMetaChars( this.prefix ), "i" );
	var index = null ;
	if ( list )
	{
		for ( var key in list )
		{
			this.list[ list[ key ] ] = new ConfigListItem( list[ key ], key, null );
			// parse the index number Ex: "Path_1" -> "1"
			var index = parseInt( key.replace( regEx, "" ) );
			if ( ! isNaN( index ) )
			{
				this.usedIndexes[ index ] = true ;
			}
		}
	}

	return this ;
}

EnumConfigList.prototype.add = function ( value )
{
	if ( ( value == "" ) || ( value == null ) )
	{
		return ;
	}
	
	// check and see if we got one already
	if ( this.list[ value ] != null )
	{
		switch( this.list[ value ].m_status )
		{
			case "replaced" :
			{
				this.assignNextIndex( this.list[ value ] );
			}
			// fall through to "deleted"

			case "deleted" :
			{
				this.list[ value ].m_status = null ;
				return true ;
			}

			case "added" :
			default:
			{
				return true ; 
			}
		}
	}

	this.list[ value ] = new ConfigListItem( value, "", "added" );
	this.assignNextIndex( this.list[ value ] );
}

// return true if change was made, flase if not
EnumConfigList.prototype.replace = function ( oldValue, newValue )
{
	// if the oldValue didn't exist
	if ( this.list[ oldValue ] == null )
	{
		// need to add the new value ?
		if ( this.list[ newValue ] != null )
		{
			return false ;
		}
		else
		{
			if ( ( newValue != "" ) && ( newValue != null ) )
			{
				this.list[ newValue ] = new ConfigListItem( newValue, "", "added" );
				this.assignNextIndex( this.list[ newValue ] );
				return true ;
			}
			return false ;
		}
	}

	// does the new value exist already?
	if ( this.list[ newValue ] != null )
	{
		// just delete the old value
		if ( oldValue == newValue ) 
		{
			return false ;
		}
		else
		{
			this.list[ oldValue ].m_status = "deleted" ;
			return true ;
		}
	}

	this.list[ newValue ] = new ConfigListItem( newValue, this.list[ oldValue ].m_enum, \
"added" );  if ( this.list[ oldValue ].m_status == "added" )
		delete this.list[ oldValue ];
	else
		this.list[ oldValue ].m_status = "replaced" ;

	return true ;	
}

EnumConfigList.prototype.remove = function ( value )
{
	// check and see if we got one already
	if ( this.list[ value ] == null )
		return true ;

	this.list[ value ].m_status = "deleted" ;
}

// convert changes into a ra param string
EnumConfigList.prototype.buildParamString = function ( fForce )
{
	var s = "" ;
	for ( var value in this.list )
	{
		var item = this.list[ value ];
		switch( item.m_status )
		{
			case "added" :
			{
				s += buildParam( this.listName + "." + item.m_enum, value );
				break ; 
			}

			case "deleted" :
			{
				s += buildParam( this.listName + "." + item.m_enum, "" );
				break ; 
			}

			case "replaced" :
			{
				break ; 
			}
			default:
			{
				if ( fForce )
				{
					s += buildParam( this.listName + "." + item.m_enum, value );
				}
			
				break ; 
			}
		}
	}

	return s ;
}

EnumConfigList.prototype.fillSelectList = function ( selectCtrl, fNoSort )
{
	var aTemp = new Array();
	for ( var value in this.list )
	{
		var item = this.list[ value ];
		switch( item.m_status )
		{
			case "deleted" :
			case "replaced" :
			{
				break ; 
			}

			case "added" :
			default:
			{
				aTemp[ aTemp.length ] = value ;
				break ; 
			}
		}
	}

	if ( ! fNoSort )
	{
		if ( isIE )
			aTemp.sort( sortCaseInsensitive );
		else
			aTemp.sort();	
	}
	for( var i = 0; i < aTemp.length; i++ )
	{
		selAddOption( selectCtrl, aTemp[ i ] );
	}
}

EnumConfigList.prototype.reset = function ()
{
	for ( var value in this.list )
	{
		var item = this.list[ value ];
		switch( item.m_status )
		{
			case "deleted" :
			case "replaced" :
				item.m_status = null ;
				break ;
				
			case "added" :
				delete this.list[ value ];
				break ;

			default:
				break ; 
		}
	}
}

EnumConfigList.prototype.clearList = function ()
{
	this.list = new Array();
	this.usedIndexes = new Array( 100 );
}

EnumConfigList.prototype.commit = function ()
{
	for ( var value in this.list )
	{
		var item = this.list[ value ];
		switch( item.m_status )
		{
			case "replaced" :
			case "deleted" :
				delete this.list[ value ];
				break ;
				
			case "added" :
				item.m_status = null ;
				break ;

			default:
				break ; 
		}
	}
}

EnumConfigList.prototype.assignNextIndex = function ( item )
{
	// skip 0'th element
	for( var i = 1; i < this.usedIndexes.length; i++ )
	{
		if ( ! this.usedIndexes[ i ] )
			break ;
	}

	this.usedIndexes[ i ] = true ;
	item.m_enum = this.prefix + i ;
}

EnumConfigList.prototype.toCSV = function ()
{
	// flatten list of values to comma separated list (as string)
	var csv = "" ;
	for ( var value in this.list )
	{
		csv += value + ", " ;
	}
	return csv.replace( /, $/, '' );
}

// turn a comma separated list ("htm,html,shtml,shtm") into an enum list
// like this: Ext_1=htm&Ext_2=html, etc.
EnumConfigList.prototype.removeCSV = function ( csv )
{
	if ( ! csv ) return ;

	var val ;
	var aTmp = csv.split( /\s*,\s*/ );
	for ( var i = 0; i < aTmp.length; i++ )
	{
		val = aTmp[ i ];
		if ( val ) val = val.trim();
		if ( val )
		{
			this.remove( val );
		}
	}

}	// removeCSV

// turn a comma separated list ("htm,html,shtml,shtm") into an enum list
// like this: Ext_1=htm&Ext_2=html, etc.
EnumConfigList.prototype.addCSV = function ( csv )
{
	if ( ! csv ) return ;

	var val ;
	var aTmp = csv.split( /\s*,\s*/ );
	for ( var i = 0; i < aTmp.length; i++ )
	{
		val = aTmp[ i ];
		if ( val ) val = val.trim();
		if ( val )
		{
			this.add( val );
		}
	}

}	// addCSV

EnumConfigList.prototype.dump = function ()
{
	var s = "" ;
	for ( var value in this.list )
	{
		var item = this.list[ value ];
		s += value + "\n\tenum = " + item.m_enum + "\n\tstatus = " + item.m_status + "\n\n" \
;  }
	alert( s );
}


--- NEW FILE: config_mc_bc.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Back-Channel Multicasting</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "9";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="propview_enum.js"></SCRIPT>
<SCRIPT SRC="propview_nolist.js"></SCRIPT>
<SCRIPT SRC="enumproplist.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?serverData=config.Multicast&wmSources=config.Windows%20M \
edia%20Multicast.Channels&scalableSources=config.FSMount.Scalable%20Multicast.Sources&diffConfig=diffconfig"></SCRIPT>


<SCRIPT LANGUAGE="javascript">
var CLIST = "ControlList";

function backFillDescriptions ()
{
	var cList = serverData[CLIST]
	if ( ! cList )
		return;

	// find the Description with the max N in "RuleN"
	var curMax = 0;
	for ( var rule in cList )
	{
		var oRule = cList[ rule ];
		if ( isObj( oRule ) && oRule["Description"] )
		{
			var tempA = oRule["Description"].match( /^Rule(\d+)$/i );
			if ( tempA && parseInt( tempA[ 1 ] ) > curMax ) 
				curMax = parseInt( tempA[ 1 ] );
		}
	}

	// massage server data - some AC rules could have been created prior to the addition \
of the  //description field, if the Descroption field is empty create one based on \
RuleN  for ( var rule in cList )
	{
		var oRule = cList[ rule ];
		if ( isObj( oRule ) && isBlank( oRule["Description"] ) )
		{
			oRule["Description"] = "Rule" + (++curMax);
		}
	}
}
if ( serverData )
	backFillDescriptions();

var propSetRule = 
[
	new PropObj( 'Description', "", false, true, null, null, "listname", "Access Rule \
Description" ),  new PropObj( 'Allow',  "", false, true, null, null, "netmaskany", \
"Client Host/Netmask" ) ];

// meta data for Splitter Farm server data
var propSet = 
[
	new PropObj( 'Enabled', 	"1", false, true, null, null /*, "int" */ ),  //TODO \
TRUE/FALSE????   new PropObj( 'AnnounceSap', 	"0", false, true, null, null, "int", \
"Enable SAP" ),   new PropObj( 'RTSPPort',  "3554", false, true, null, null, "port", \
"RTSP Port" ),  new PropObj( 'AddressRange',  "", false, true, null, null, null, \
"Address Range" ),  new PropObj( 'TTL',  "16", false, true, null, null, "TTL", "Time \
to Live" ),  new PropObj( 'Resend',  "", false, true, null, null, "int" ),
	new PropObj( 'DeliveryOnly',  "0", false, true, null, null, "int", "Delivery Only" \
),  new PropList( CLIST, null, null, propSetRule )
];

var propList = new PropList( "Multicast", serverData, propSet );
var subListRules = propList.subList( CLIST );

function ACPropView ()
{
	this.base = NestedEnumPropListView ;
	this.base( "Access Control Rules", subListRules, "Access Control Rule", 
				"config.Multicast.AccessControl.", "configvar", "theForm", "theList", \
"Description", null,  "Description", "Rule" );
}
ACPropView.prototype = new NestedEnumPropListView ;

ACPropView.prototype.postFillFormFromSubList = function ( fValidate )
{

	return true;

}	// postFillFormFromSubList ()

ACPropView.prototype.onSubListChangeNotify = function ( action, subListName )
{

	if ( "delete" == action )
	{
		setCtrlValue( theForm.AddressRange1, "" );
		setCtrlValue( theForm.AddressRange2, "" );
	}

	if ( this.m_bDoDirtyCheck )
		this.showDirtyFlag( this.isDirty() );

}	// onSubListChangeNotify

function BackChnPropView ()
{
	this.base = PropListView ;
	this.base( "BackChannel Multicasting", propList, "config.Multicast.",
			   "configvar", "theForm" );

	this.subViewRules = new ACPropView();
}
BackChnPropView.prototype = new PropListView ;

BackChnPropView.prototype.postIsDirty = function ()
{
	return ( this.subViewRules.isDirty() ||
    		 isCtrlDirty( theForm.AddressRange1 )||
			 isCtrlDirty( theForm.AddressRange2 ) );
}

BackChnPropView.prototype.preValidate = function ()
{
	if ( ! this.subViewRules.validate( true, true ) )
		return false;

	var isEnabled = ( getCtrlValue( theForm.Enabled ) != 0 );

	// the following fields are required if Multicasting is enabled
	propList.prop( 'RTSPPort' ).required = isEnabled ;
	propList.prop( 'AddressRange' ).required = isEnabled ;
	propList.prop( 'TTL' ).required = isEnabled ;

	theAddressRange.m_isRequired = isEnabled ;
	if ( ! theAddressRange.validate( theForm ) )
		return false ;

	if ( ! isEnabled ) 
		return true;

	// check for  address range conflicts
	if ( ! checkAddressRange() )
		return false ;

	// there must be at leat one valid Control List to enable DeliveryOnly
	if ( ( propList.prop( "DeliveryOnly" ).getValue() == "1" ) &&
		 ( theForm.RuleList.length == 0 ) )
	{
		return rejectInput( theForm.DeliveryOnly, 
			"To enable Multicast Delivery Only, you must have at least one entry in the Client \
Access List." );  }

	return true ;

}	//preValidate

BackChnPropView.prototype.postSubmit = function ()
{
	this.subViewRules.m_propList.commit();
	
}	// postSubmit

BackChnPropView.prototype.resultsCallback = function ( results )
{
    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];
        res.title = propName.rightProp();
	}
}

function checkAddressRange ()
{
 	var thisRange = new IPRange( getCtrlValue( theForm.AddressRange ) );
	if ( thisRange && thisRange.errMsg )
	{
		return rejectInput( theForm.AddressRange1, thisRange.errMsg );
	}

	// ensure the address range is valid for multicast
	if ( ! thisRange.isMulticast )
    {
		return rejectInput( theForm.AddressRange1, 
			'Invalid Multicast Address Range, Address ranges must be within \
"224.0.0.0-239.255.255.255" for IPv4 addresses or begin with "00FF:" for IPv6 \
addresses.' );  }
	// check to make sure the address range doesn't 
	// overlap with the scalable multicasting address ranges or Windows media multicast \
addresses 

	// check against Windows Media Multicasting MultcastAddresses
	if ( scalableSources )
	{
		var conflict = "";
		var range = null;
		function _checkAddressConflict_Scale ( a, propName, curDepth, curPath )
		{
			if ( isObj( a[ propName ] ) && 
				 (a[ propName ]["Enabled"] == 1) && 
				  a[ propName ]["AddressRange"] )
			{
				range = new IPRange( a[ propName ]["AddressRange"] );
				if ( range && thisRange.isOverlap( range ) )
				{
					conflict = propName ;
					return 1; // abort search
				}
			}
		}
		enumPropArray( scalableSources, _checkAddressConflict_Scale, 1 );

		if ( conflict )
		{
			return rejectInput( theForm.AddressRange1, 
				'The address range overlaps with the Scalable Multicast "' +
				conflict + '" address range (' + addr + '). Please select another address range, \
or disable Back Channel Multicasting to continue.');  }
	}

	// check against Windows Media Multicasting MultcastAddresses
	if ( wmSources )
	{
		var conflict = "";
		var addr = null;
		function _checkAddressConflict_WM ( a, propName, curDepth, curPath )
		{
			if ( isObj( a[ propName ] ) && 
				 (a[ propName ]["Disabled"] != 1) && 
				  a[ propName ]["MulticastAddress"] )
			{
				addr = new IPAddress( a[ propName ]["MulticastAddress"] );
				if ( thisRange.addressInRange( addr ) )
				{
					conflict = propName ;
					return 1; // abort search
				}
			}
		}
		enumPropArray( wmSources, _checkAddressConflict_WM, 1 );

		if ( conflict )
		{
			return rejectInput( theForm.AddressRange1, 
				'The address range overlaps with the Windows Media Multicast "' +
				conflict + '" multicast address (' + addr + '). Please select another address \
range, or disable Back Channel Multicasting to continue.');  }
	}

  	return true ;

}	// checkAddressRange ()

var propView = new BackChnPropView();

var theAddressRange = new AddressRangeCtrl();

var theForm = null ;

function onLoad ()
{
	theForm = document.theForm;

	checkForPendingChanges( diffConfig );

	if ( ! isNav4 )
	{
		theForm.AddressRange1.size = 17;
		theForm.AddressRange2.size = 17;
	}

	propView.onLoad( window );
	propView.subViewRules.onLoad( window, true );

	theAddressRange.fillForm( theForm );
	
}	// onLoad
</SCRIPT>

</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">BROADCAST DISTRIBUTION</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
A Back-Channel multicast maintains a TCP control channel between the client and 
server. The data stream is multicasted using UDP from the 
server to RealPlayers who join this multicast group. Use this 
type of multicast when user authentication is required or if you are multicasting 
to a medium sized group.
<br><br>

If you remove all Client Access Rules from the Back-Channel settings,
the server automatically grants access to all multicast client
IP addresses, and re-inserts the default Access Rule.
</td></tr>
</TABLE>
<BR>

<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 

<input type="hidden" name="AddressRange">
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Back-Channel Multicasting</TD> \
<TD bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Enable Multicast</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<select CLASS="input" NAME="Enabled" SIZE="1" WIDTH="91">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Enable SAP</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<select CLASS="input" NAME="AnnounceSap" SIZE="1" WIDTH="91">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">RTSP Port</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="input" MAXLENGTH="255" NAME="RTSPPort" SIZE="6" TYPE="text" \
VALUE=""><SPAN CLASS="units"><BR><br clear=all>If you specify a port lower than 1024 \
on a UNIX system, the client must be logged on as super-user.</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">IP Address Range</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input type="text" class="longInput" name="AddressRange1" size="10" \
maxlength="39"><SPAN class="unitsOffset"><BR>to<BR></span><input type="text" \
class="longInput" name="AddressRange2" size="10" maxlength="39">  <SPAN \
                class="units"><br clear=all>
	        		   The IP Address Range for back-channel multicasting must not overlap 
	        		   with scalable multicast IP Address Ranges, and must be between 
	        		   224.0.0.0 to 239.255.255.255.</SPAN>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Time to Live</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="input" MAXLENGTH="255" NAME="TTL" SIZE="6" TYPE="text" \
VALUE=""><SPAN CLASS="units"><BR>(Measured in router hops)</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Resend</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<select CLASS="input" NAME="Resend" SIZE="1" WIDTH="91">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Multicast Delivery Only</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<select CLASS="input" NAME="DeliveryOnly" SIZE="1" WIDTH="91">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr </tr>
<tr>
	<TD class="input" valign="top" width="40%">
		<TABLE CLASS="PROPLIST_LABEL" width="181" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Access Rules</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.subViewRules.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 \
ALT="Add New Client Access Rule" BORDER=0></A><A href="javascript://" \
onclick="propView.subViewRules.removeSubList()"><IMG src="images/delete_g.gif" \
HSPACE=1 ALT="Remove Current Client Access Rule" BORDER=0></A><A href="javascript://" \
onclick="propView.subViewRules.incSubList(-1)"><IMG src="images/moveup_g.gif" \
HSPACE=1 ALT="Move Current Client Access Rule Up" BORDER=0></A><A \
href="javascript://" onclick="propView.subViewRules.incSubList(1)"><IMG \
src="images/movedown_g.gif" HSPACE=1 ALT="Move Current Client Access Rule Down" \
BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theList" SIZE="9" WIDTH="181">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="60%">
		Edit Client Access Rule Description
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Description" SIZE="21" TYPE="text" \
VALUE="">

		<BR>
		<SCRIPT>if ( isNav6 ){document.write( '<BR>' );}</SCRIPT>
		Client IP Address/Netmask or Hostname
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Allow" SIZE="21" TYPE="text" \
VALUE="">

		<SPAN class="units">
			Use 'Any' to indicate all client IP addresses
			<BR>
			<BR>
		</SPAN>
    </TD>
</TR>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" VALIGN="middle" width="100%" class="body" \
                ALIGN="left">
      <FONT color="red">*A server restart is required to effect changes applied to \
this page.</FONT>  </TD>
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_cdist.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Content Caching</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "33";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="propview_enum.js"></SCRIPT>
<SCRIPT SRC="enumproplist.js"></SCRIPT>
<SCRIPT SRC="servvar.get.html?serverData=config.ContentSubscription&maxSize=config.RNCache.MaxCacheSizeMB"></SCRIPT>


<SCRIPT LANGUAGE="javascript">
// add maxSize to serverData
serverData[ "MaxCacheSizeMB" ] = maxSize ;

var propSetRule =
[
	new PropObj( 'RuleName', '', false, true, null, null, "", "Rule Name" )
   ,new PropObj( 'EnableRule', '1', false, true, null, null, "", "Enabled" )
   ,new PropObj( 'Rule', '/', true, true, null, null, "", "Rule" )
   ,new EnumPropListSel( 'Publishers', null, "", 100, "theRulePublisherList" )
];

var propSetPublisher =
[
	new PropObj( 'Host', '', false, true, null, null, "hostname", "Host" )
   ,new PropObj( 'Port', '554', false, true, null, null, "port", "Port" )
   ,new PropObj( 'UserName', '', false, true, null, null, "", "User Name" )
   ,new PropObj( 'Password', '', false, false, null, null, "", "Password" )
];

var propSetMain =
[
	new PropObj( 'Enabled', '1', false, true, null, null, "", "Enabled" )
   ,new PropObj( 'MaxCacheSizeMB', '1000', false, true, 11, null, "int", "Max Cache \
Size", true )  ,new PropList( 'Publishers', null, null, propSetPublisher )
   ,new PropList( 'Rules', null, null, propSetRule )
];

var propList = new PropList( "ContentSubscription", serverData, propSetMain );
var subListRules = propList.subList( "Rules" );
var subListPublishers = propList.subList( "Publishers" );

function RulePropView ()
{
	this.base = NestedEnumPropListView ;
	this.base( "Rules", subListRules, "Rule", 
				"config.ContentSubscription.Rules.", "servvar", 
				"theForm", "theRuleList", "RuleName", null,
				"RuleName", "Rule" );

	//this.m_resultsTitleListIndex = 5;
	//this.m_resultsTitlePropIndex = 6;
}
RulePropView.prototype = new NestedEnumPropListView ;

RulePropView.prototype.postFillFormFromSubList = function ( fValidate )
{

	// fillForm isn't recursive - have to do it for sublists
	var subListRulePubs = getRulePubsList();
	if ( subListRulePubs )
	{
		subListRulePubs.fillForm( theForm );
	}
	
	return true;

}	// postFillFormFromSubList ()

RulePropView.prototype.postValidateSubList = function ( subListName )
{

	// publisher list for this rule can't be empty
	if ( 0 == selCtrlRulePubs.options.length )
	{
		// is it because there are no publishers in subListPublishers?
		if ( 0 == subListPublishers.subListCount() )
		{
			return rejectInput( theForm.thePublisherEdit, 
				"Create a Publisher and add it to this Rule's publisher list" );
		}
		return rejectInput( selCtrlAddPub, "Add a Publisher" );
	}

	// make sure each publisher in selCtrlRulePubs points to a valid 
	// publisher in subListPublishers
	for ( var i = 0; i < selCtrlRulePubs.options.length; i++ )
	{
		var pubSubListName = selCtrlRulePubs.options[ i ].text ;
		var subList = subListPublishers.subList( pubSubListName );
		if ( (!subList) || ("deleted" == subList.m_status) )
		{
			selCtrlRulePubs.selectedIndex = i ;
			return rejectInput( selCtrlRulePubs, 
				"'" + pubSubListName + "' is not a valid Publisher" );
		}
	}

	// validate doesn't recurse
	var subListRulePubs = getRulePubsList( subListName );
	if ( subListRulePubs )
	{
		subListRulePubs.validate( theForm );
	}
	
	return true;

}	// postValidateSubList ()

RulePropView.prototype.onSubListChangeNotify = function ( action, pubName )
{
	if ( this.m_bDoDirtyCheck )
		this.showDirtyFlag( this.isDirty() );

	if ( "delete" == action )
	{
		//clear the publisher list
		selCtrlRulePubs.options.length = 0;
	}

}	// onSubListChangeNotify ()

RulePropView.prototype.getRulesUsingPub = function ( pubName )
{
	var rules = new Array();
	var curRule = this.m_curSubListName ;
	for ( var ruleName in this.m_propList.subLists() )
	{
		if ( curRule != ruleName )
		{
			var ruleSubList = this.m_propList.subList( ruleName )
			if ( ruleSubList && ("deleted" != ruleSubList.m_status) )
			{
				var rulePubSubList = ruleSubList.subList( "Publishers" );
				if ( rulePubSubList && rulePubSubList.m_newValues )
				{
					for ( var i = 0; i < rulePubSubList.m_newValues.length; i++ )
					{
						if ( pubName == rulePubSubList.m_newValues[ i ] )
						{
							rules[ rules.length ] = ruleSubList.prop( "Rule" ).getValue();
						}
					}
				}
			}
		}
	}

	// since the current rule may not have been validated yet, check the selCtrlRulePubs \
listbox,  // instead of the proplist, for the existence of pubName
	if ( -1 != selectFind( selCtrlRulePubs, pubName, true ) )
		rules[ rules.length ] = getCtrlValue( theForm.Rule );

	return rules ;

}	// getRulesUsingPub ()

// define a subclass of NestedPropListView that will handle the main prop set \
("enabled" var) // and the publishers sublist. This class will encapsulate a propView \
to handle the // Rules sublist
function PubPropView ()
{
	this.base = NestedPropListView ;
	this.base( "Publishers", propList, "Publisher", 
				"config.ContentSubscription.", "servvar",
				"theForm", "thePublisherList", "thePublisherEdit" );

	this.m_subListParent = subListPublishers;

	this.propViewRules = new RulePropView();

	//this.m_resultsTitleListIndex = 5;
	//this.m_resultsTitlePropIndex = 6;
}
PubPropView.prototype = new NestedPropListView ;

PubPropView.prototype.postFillFormFromSubList = function ( fValidate )
{

	setCtrlValue( theForm.Password2, getCtrlValue( theForm.Password ) );

	return true;

}	// postFillFormFromSubList ()

PubPropView.prototype.preValidate = function ()
{

	return this.propViewRules.validate( true );
}

PubPropView.prototype.postValidateSubList = function ()
{

	return validatePassword( "Password", false );
}

PubPropView.prototype.confirmRemoveSubList = function ( pubName )
{
	var msg = "Remove Publisher '" + pubName + "'?"; 

	var rulesThatUseThisPub = this.propViewRules.getRulesUsingPub( pubName );
	if ( rulesThatUseThisPub && rulesThatUseThisPub.length )
	{
		msg += "\n\nWarning, this Publisher is being used by the '" + 
			rulesThatUseThisPub.join( "', '" ).replace( /, ([^,]+)$/, " and $1" ) +
			"' rule".pluralize( rulesThatUseThisPub.length ) + "." +
			"\nIf you delete this Publisher you must update " + 
			"this rule".pluralize( rulesThatUseThisPub.length, "these rules" ) +
			" to use an alternate Publisher." ;
	}

    return confirm( msg );
	
}	// confirmRemoveSubList ()

PubPropView.prototype.confirmRenameSubList = function ( oldPubName, newPubName )
{

	var rulesThatUseThisPub = this.propViewRules.getRulesUsingPub( oldPubName );
	if ( rulesThatUseThisPub && rulesThatUseThisPub.length )
	{
		var msg = "Rename Publisher '" + oldPubName + "'?" + 
			"\n\nWarning, '" + oldPubName + "' is being used by the '" + 
			rulesThatUseThisPub.join( "', '" ) +
			"' rule".pluralize( rulesThatUseThisPub.length ) + "." +
			"\nIf you rename this Publisher you must update " + 
			"this rule".pluralize( rulesThatUseThisPub.length, "these rules" ) +
			" to use the new Publisher name." ;

	    if ( ! confirm( msg ) )
			return false ;
	}

	return true ;

}	// confirmRenameSubList ()

PubPropView.prototype.onSubListChangeNotify = function ( action, pubName )
{
	if ( this.m_bDoDirtyCheck )
		this.showDirtyFlag( this.isDirty() );

	// reset theAddPublisherList list box
	// preserve the prompt text
	selCtrlAddPub.options.length = 1;
	subListPublishers.fillSelectList( selCtrlAddPub );
	selectFirst( selCtrlAddPub );

	if ( "delete" == action )
	{
		setCtrlValue( theForm.Password, "" );
		setCtrlValue( theForm.Password2, "" );
	}

}	// onSubListChangeNotify ()

PubPropView.prototype.resultsCallback = function ( results )
{
	var res, a;
    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];

		// filter out the reset of a rule's publisher list
		if ( propName.bSearch( /Rules.*Publishers$/ ) && ('Remove' == res.action) )
		{
			res.title = "NO_DISPLAY" ;
		}
		else
		{
			a = propName.split( "." );
			if ( propName.bSearch( /\.Rules\./ ) )
			{
				if ( a[ 5 ] )
				{
					var listName = "Rules." + a[ 4 ];
		        	res.title = listName.ent().span("body") + '<br>' + 
		        		a[ 5 ];

					res.actionDisplay = "Added ".span( "grey" ) + res.newval.ent();
				}
				else if ( a[ 4 ] )
				{
		        	res.title = a[ 4 ].ent().span("body");
				}
			}
			else
			{
				if ( a[ 5 ] )
				{
		        	res.title = a[ 4 ].ent().span("body") + '<br>' + 
		        	a[ 5 ];
				}
				else if ( a[ 4 ] )
				{
		        	res.title = a[ 4 ].ent().span("body");
				}
			}
			
		}
	}
}

PubPropView.prototype.buildParamStringCallback = function ( propList, prop, paramStr \
) {
	return paramStr.replace( /ContentSubscription\.MaxCacheSizeMB/, \
"RNCache.MaxCacheSizeMB" ); }

var propView = new PubPropView();

// global references to form elements
var theForm ;
var selCtrlRulePubs ;
var selCtrlAddPub ;

function onLoad ()
{
	theForm = document.theForm;
	selCtrlRulePubs = theForm.theRulePublisherList;
	selCtrlRulePubs.options.length = 0;

	propView.onLoad( window );
	propView.propViewRules.onLoad( window, true );

	selCtrlAddPub = theForm.theAddPublisherList;
	selCtrlAddPub.options.length = 1;
	subListPublishers.fillSelectList( selCtrlAddPub );

}	// onLoad ()

function onAddRulePublisherFocus ()
{
	propView.m_oES.doRenameCheck();
}

// append the selected Publisher to the cur Rule's publisher list
function onAddRulePublisher ()
{
	// make sure the selection isn't the prompt text
	if ( 0 == selCtrlAddPub.selectedIndex )
		return ;

	var pubToAdd = getCtrlValue( selCtrlAddPub );
	if ( ! pubToAdd ) return ;

	var subListRulePubs = getRulePubsList();
	if ( subListRulePubs )
	{
		subListRulePubs.addPropValue( theForm, pubToAdd );
	}
	else
	{
		alert( "Create a new Rule before adding Publishers." );
	}

	// reset the selection to the first item - the prompt text
	selectFirst( selCtrlAddPub );

}	// onAddRulePublisher ()

function onDelRulePublisher ()
{
	
	
	var subListRulePubs = getRulePubsList();
	if ( subListRulePubs )
	{
		subListRulePubs.removeCurSelValue( theForm );
	}

}	// onDelRulePublisher ()

function onIncRulePublisher ( inc )
{
	
	
	var subListRulePubs = getRulePubsList();
	if ( subListRulePubs )
	{
		subListRulePubs.swapValueOrder( theForm, inc );
	}

}	// onIncRulePublisher ()

function getRulePubsList ( ruleListName )
{
	var subListRulePubs = null;
	var subListRule = propView.propViewRules.getSubList( ruleListName );
	if ( subListRule )
	{
		subListRulePubs = subListRule.subList( "Publishers" );
	}

	return subListRulePubs ;

}	// getRulePubsList ()

function onPullDown ()
{
	// check for dirty condition
	// if not dirty, make sure distribution is enabled and at least one rule is in \
effect  // launch pulldown dialog

	if ( propView.isDirty() )
	{
		alert( "Save Changes First" );
		return;
	}

	if ( "0" == getCtrlValue( theForm.Enabled ) )
	{
		alert( "Content Fetching is not enabled" );
		return;
	}

	if ( 0 == subListRules.subListCount() )
	{
		alert( "No Distribution Rules have been configured." );
		return;
	}

	var dlgParams = new Object();
    raDialog( "cdistpulldown.html", dlgParams );
}
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">CONTENT MANAGEMENT</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
Content caching enables static content to be dynamically
transferred between two or more Helix Servers. You configure a Helix Server 
with physical access to static media content as a content publisher, and the 
other Helix Server as a content subscriber. Static content is then moved from 
the publisher to the subscriber as client software request clips from 
subscribers; if the file is not in the subscriber's cache, the subscriber 
requests it from the publisher.
<BR><BR>

You may manually add files to the subscriber cache by
using the <A class="linkText" href="javascript:onPullDown()">Populate Cache 
page</A>.
</td></tr>
</TABLE>
<BR>

<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Content Caching</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Enable Content Fetching</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<select CLASS="input" NAME="Enabled" SIZE="1" WIDTH="272">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Maximum Cache Size<FONT color="red">*</FONT></span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="input" MAXLENGTH="8" NAME="MaxCacheSizeMB" SIZE="7" TYPE="text" \
VALUE=""><SPAN CLASS="unitsOffset">&nbsp;(MB)</SPAN>  </td>
	</tr>
<tr </tr>
<tr>
	<TD class="input" valign="top" width="40%">
		<TABLE CLASS="PROPLIST_LABEL" width="181" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Publishers</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Publisher" BORDER=0></A><A href="javascript://" \
onclick="propView.removeSubList()"><IMG src="images/delete_g.gif" HSPACE=1 \
ALT="Remove Current Publisher" BORDER=0></A><A href="javascript://" \
onclick="propView.copySubList()"><IMG src="images/copy_g.gif" HSPACE=1 ALT="Copy \
Current Publisher" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="thePublisherList" SIZE="10" WIDTH="181">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="60%">
		Publisher Description
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="thePublisherEdit" SIZE="21" \
TYPE="text" VALUE="">

		Host
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Host" SIZE="21" TYPE="text" \
VALUE="">

		Port
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Port" SIZE="21" TYPE="text" \
VALUE="">

		User Name
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="UserName" SIZE="21" TYPE="text" \
VALUE="">

		Password
		<BR>
		<input CLASS="longInput" MAXLENGTH="14" NAME="Password" SIZE="21" TYPE="password" \
VALUE="">

		Confirm Password
		<BR>
		<input CLASS="longInput" MAXLENGTH="14" NAME="Password2" SIZE="21" TYPE="password" \
VALUE="">  </TD>                        
</TR>
<tr </tr>
<tr>
	<TD class="input" valign="top" width="40%">
		<TABLE CLASS="PROPLIST_LABEL" width="181" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Rules</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.propViewRules.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 \
ALT="Add New Rule" BORDER=0></A><A href="javascript://" \
onclick="propView.propViewRules.removeSubList()"><IMG src="images/delete_g.gif" \
HSPACE=1 ALT="Remove Current Rule" BORDER=0></A><A href="javascript://" \
onclick="propView.propViewRules.copySubList()"><IMG src="images/copy_g.gif" HSPACE=1 \
ALT="Copy Current Rule" BORDER=0></A><A href="javascript://" \
onclick="propView.propViewRules.incSubList(-1)"><IMG src="images/moveup_g.gif" \
HSPACE=1 ALT="Move Current Rule Up" BORDER=0></A><A href="javascript://" \
onclick="propView.propViewRules.incSubList(1)"><IMG src="images/movedown_g.gif" \
HSPACE=1 ALT="Move Current Rule Down" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theRuleList" SIZE="10" WIDTH="181">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="60%">
		Rule Name
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="RuleName" SIZE="21" TYPE="text" \
VALUE="">

		Rule Path
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Rule" SIZE="21" TYPE="text" \
VALUE="">

		Enable Rule
		<BR>
		<select CLASS="longInput" NAME="EnableRule" SIZE="1" WIDTH="272">
		    <OPTION value="1">Yes</OPTION>
		    <OPTION value="0">No</OPTION>
		</SELECT>
		<TABLE CLASS="PROPLIST_LABEL" width="272" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Publishers</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="onDelRulePublisher()"><IMG src="images/delete_g.gif" HSPACE=1 ALT="Remove \
Current Publisher" BORDER=0></A><A href="javascript://" \
onclick="onIncRulePublisher(-1)"><IMG src="images/moveup_g.gif" HSPACE=1 ALT="Move \
Current Publisher Up" BORDER=0></A><A href="javascript://" \
onclick="onIncRulePublisher(1)"><IMG src="images/movedown_g.gif" HSPACE=1 ALT="Move \
Current Publisher Down" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theRulePublisherList" SIZE="2" WIDTH="272">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>

		<SCRIPT>if ( isNav4 ){document.write( '<FONT class="input">' );}</SCRIPT>
		<SCRIPT>if (isMoz5) document.write('<BR>');</SCRIPT>

		<select CLASS="longInput" NAME="theAddPublisherList" \
ONCHANGE="onAddRulePublisher();" ONFOCUS="onAddRulePublisherFocus()" SIZE="1" \
                WIDTH="272">
		    <OPTION value="Add Publisher To This Rule">Add Publisher To This Rule</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		    <OPTION value="0">0</OPTION>
		</SELECT>

		<SCRIPT>if ( isNav4 ){document.write( '</FONT>' );}</SCRIPT>
    </TD>                        
</TR>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" VALIGN="middle" width="100%" class="body" \
                ALIGN="left">
      <FONT color="red">*A server restart is required to effect changes applied to \
this field.</FONT>  </TD>
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_mc_sap.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Session Announcement</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "10";
</SCRIPT>

<SCRIPT SRC="propview_nolist.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?serverData=config.SAP&diffconfig=diffconfig"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
// merge server values (getServerData()) with property meta-data
var propList = new PropList
(
	"SAP", serverData,
	[
		new PropObj( 'HostAddress', "", 				false, false, null, null, "ip", "Host IP \
Address" ),  new PropObj( 'SendAnnouncementEnabled', "0",	false, true, null, null, \
null, "Send SAP Announcements" ),  new PropObj( 'ListenAnnouncement',	"1",		false, \
true, null, null, null, "Listen for SAP Announcements" )  ]
);

function SAPPropView ()
{
	this.base = PropListView ;
	this.base( "SAP", propList, "config.SAP.", "configvar", "theForm" );
}
SAPPropView.prototype = new PropListView ;

SAPPropView.prototype.preValidate = function ()
{
	// if Enable SAP is 'yes', there must be a valid host address
	if ( ( getCtrlValue( theForm.SendAnnouncementEnabled ) == "1" ) && 
		 ( getCtrlValue( theForm.HostAddress ) == "" ) )
	{
		return rejectInput( theForm.HostAddress, 
			"You must provide a host IP address when 'Enable SAP Service' is set to 'yes'." );
	}

	return true;
}

SAPPropView.prototype.resultsCallback = function ( results )
{
	// tweak the title by splitting, formatting the results property (the thing that we \
modified)  var res, a;
    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];
		a = propName.split( "." );
		if ( a[4] )
        	res.title = a[3].ent().span("body") + '<br>' + a[4] ;
	}
}

var propView = new SAPPropView();
var theForm ;

function onLoad ()
{
	theForm = document.theForm ;
	checkForPendingChanges( diffconfig );
	propView.onLoad( window );
}
</SCRIPT>

</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">BROADCAST DISTRIBUTION</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
You can publicize your scalable multicasts to anyone running
a program which listens for the Session Announcement Protocol (SAP).
The SAP contains the multicast description using the Session Description
Protocol (SDP). The SDP contains the event's multicast address, port, and other \
information. When SAP is enabled, the server creates the SDP and multicasts this
information over SAP. The server will also collect all other SAP
messages on your network to avoid duplicate usage of the same multicast address.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Session Announcement</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Host IP Address</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="HostAddress" SIZE="21" TYPE="text" \
VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Enable SAP Service</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<select CLASS="input" NAME="SendAnnouncementEnabled" SIZE="1" WIDTH="91">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Listen to SAP</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<select CLASS="input" NAME="ListenAnnouncement" SIZE="1" WIDTH="91">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT>
		</td>
	</tr>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" VALIGN="middle" width="100%" class="body" \
                ALIGN="left">
      <FONT color="red">*A server restart is required to effect changes applied to \
this page.</FONT>  </TD>
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_sec_rules.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Commerce</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "19";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="servvar.get.html?ruleList=config.CommerceRules&dbList=config.Databases&re \
almList=config.AuthenticationRealms&prefixList=config.GUIDRegistrationPrefixes"></SCRIPT>


<SCRIPT LANGUAGE="javascript">
var propSetGUID =
[
	new PropObj( 'GUIDRegistrationPrefix',"", false, true, null, null, '', 'Registration \
Prefix' )  ,new PropObj( '_DatabaseID', "", false, true, null, null, '', 'Player GUID \
Database' ) ];

var propSet =
[
	new PropObj( 'ProtectedVirtualPath',"", 	false,	true,  \
null,null,	'virpath',	'Protected Path' ),  new PropObj( 'DatabaseID',			"", \
false,	false ),  new PropObj( 'EvaluatePermissions',	"1",	false,	true,  \
null,null,	'int',		'Evaluate Permissions' ),  new PropObj( \
'UseGUIDValidation',	"0",	false,	true,  null,null,	'int',		'Use Player Validation' \
),			  new PropObj( 'AllowDuplicateIDs',	"0",	    false,	true,  \
null,null,	'int',		'Allow Duplicate User IDs' ),  new PropObj( 'Realm',				"" )
];

var propList = new PropList( "CommerceRules", ruleList, null, propSet );
var propListGUID = new PropList( "GUID Registration Databases", prefixList, null, \
propSetGUID );

var ERRMSG_NTLM_PERM = "NTLM Authenication Realms are incompatible with the Evaluate \
Permissions feature.\n\nSelect a non-NTLM realm or select the 'Do Not Evaluate User \
Permissions' option under User Permissions Database.";

function RulePropView ()
{
	this.base = NestedPropListView ;
	this.base( "Commerce Rules", propList, "Rule", 
				"config.CommerceRules.", "servvar",
				"theForm", "theList", "theEdit" );

	this.propViewGUID = new GUIDPropView();

}
RulePropView.prototype = new NestedPropListView ;

RulePropView.prototype.postFillFormFromSubList = function ( fValidateFirst )
{

	var subList = this.getSubList();
	if ( subList )
	{
		subList.fillForm( formUserAuth );
		subList.fillForm( formPlayerAuth );
	
		if ( isNav6 )
		{
			
			var realm = subList.prop( "Realm" ).getValue();
			setTimeout("setCtrlValue(formUserAuth.Realm, " + qVar( realm ) + ",1)", 100 );
		}
	}

	onCredentialTypeChg();

	return true;

}	// postFillFormFromSubList ()

RulePropView.prototype.postIsDirty = function ()
{
	return this.propViewGUID.isDirty();
}

RulePropView.prototype.resultsCallback = function ( results )
{
	// tweak the title by splitting, formatting the results property (the thing that we \
modified)  var res, a;
    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];
		a = propName.split( "." );
		if ( a[4] )
        	res.title = a[3].ent().span("body") + '<br>' + a[4] ;
	}
}

RulePropView.prototype.preValidateSubList = function ( subListName )
{
	setCtrlValue( theForm.EvaluatePermissions, 
		("" == getCtrlValue( theForm.DatabaseID )) ? "0" : "1", true );

	if ( "1" == getCtrlValue( theForm.UseGUIDValidation ) )
	{
		setCtrlValue( formUserAuth.Realm, "", true );
		setCtrlValue( formUserAuth.AllowDuplicateIDs, "0", true );
	}
	else
	{
		if ( getCtrlValue( theForm.DatabaseID ) && 
			 isNTLMRealm( getCtrlValue( formUserAuth.Realm ) ) )
		{
			return rejectInput( formUserAuth.Realm, ERRMSG_NTLM_PERM ); 
		}
	}

	return true;

}	// preValidateSubList ()

RulePropView.prototype.postValidateSubList = function ( subListName )
{
	if ( ("0" == getCtrlValue( theForm.UseGUIDValidation )) && 
		 (!getCtrlValue( formUserAuth.Realm )) )
	{
		return rejectInput( formUserAuth.Realm, 
			"A Realm is required when using User Authentication." );
	}

	var subList = this.getSubList();
	if ( subList )
	{
		var ctrl = subList.validate( formUserAuth );
		if ( ! ctrl ) 
			ctrl = subList.validate( formPlayerAuth );

		if ( ctrl )
		{
			return rejectInput( ctrl, subList.errMsg );
		}
	}

  	return true ;

}	// postValidateSubList ()

RulePropView.prototype.postValidate = function ()
{

	if ( ! this.propViewGUID.validate( true ) )
	{
		return false;
	}

	// if one or more rule uses GUIDValidation, then 
	// make sure at least one prefix list exists
	var bCheckForGUIDDB = false;
	function _callback ( subList, propObj )
	{
		if ( "1" == propObj.getValue() )
		{
			bCheckForGUIDDB = true;
			return 1;	
		}
	}
	propList.propSearch( 'UseGUIDValidation', _callback );
	if ( bCheckForGUIDDB && (!propListGUID.subListCount()) )
	{
		return rejectInput( theForm.GUIDRegistrationPrefix,
			"At least one Player GUID Database must be configured for the Player Validation \
feature to work." );  }

	this.propViewGUID.buildParamString();
	this.m_submitString += this.propViewGUID.m_submitString;

	return true;
}

RulePropView.prototype.postSubmit = function ()
{
	this.propViewGUID.m_propList.commit();

}	// postSubmit

function GUIDPropView ()
{
	this.base = NestedPropListView ;
	this.base( "Prefix Registration Databases", propListGUID, "Prefix Database", 
				"config.GUIDRegistrationPrefixes.", "servvar", 
				"theForm", "theGUIDList", "theGUIDEdit" );
}
GUIDPropView.prototype = new NestedPropListView ;

var theForm ;
var formUserAuth;
var formPlayerAuth;
var propView = new RulePropView();

function onLoad ()
{
	theForm = document.theForm ;

	formUserAuth = getElem( "FORM_UserAuth" );
	formPlayerAuth = getElem( "FORM_PlayerAuth" );

	if ( ! isXblibInit ) xblibInit();

	anchorForms();

	fillSelectCtrls();

	propView.onLoad( window );	
	propView.propViewGUID.onLoad( window, true );

}	// onLoad ()

function anchorForms ()
{
	var anchorX;
	var anchorY;
	var tableWidth = 230;

	if ( isNav4 )
	{
		
		anchorX = document.anchors["ANCHOR_FORMS_NAV4_X"].x - 4;
		anchorY = document.anchors["ANCHOR_FORMS_NAV4_Y"].y;
	}
	else
	{
		var anchor = getElem( "ANCHOR_FORMS_IE" );

		var anchorDim = getAbsDim( anchor );

		anchorY = anchorDim.y + anchor.offsetHeight ;
		anchorX = anchorDim.x ;

		// find the anchor's parent TD cell - we need it's width
		parentTD = getParentByTagName( anchor, "TD" );

		// find the parent TD cell's parent TABLE - we need it's padding
		parentTable = getParentByTagName( parentTD, "TABLE" );

		if ( parentTD && parentTable )
		{
			tableWidth = parentTD.offsetWidth - 
						 parseInt( parentTable.cellPadding * 1.5 );
		}
	}

	if ( ! anchorY )
	{
		return;
	}

	if ( isIE && isMac )
	{
		anchorX += macIE_FormOffsetX ;
		anchorY += macIE_FormOffsetY ;
	}

	for ( var type in {PlayerAuth:0, UserAuth:0} )
	{
		var l = getElem( "LAYER_" + type );
		if ( l )
		{
			if ( isNav4 )
			{
				l.top  = anchorY;
				l.left = anchorX;
			}
			else
			{
				l.style.display = "block";

				var oTable = getElem( "TABLE_" + type );
				if ( oTable )
				{
					l.style.top  = anchorY ;
					l.style.left = anchorX - oTable.cellPadding ; 

					//set the width
					oTable.style.width = tableWidth;
				}
			}
		}
	}
	
}	// anchorForms ()

function fillSelectCtrls ()
{
	var aTmp = new Array();
	function _fillTmpArrayCallback ( array, prop, curDepth )
	{
		aTmp[ aTmp.length ] = prop ;
	}
	
	// databaseID lists
	var ctrlList = [ theForm.DatabaseID, theForm._DatabaseID ];
	for ( var ctrlX = 0 ; ctrlX < ctrlList.length; ctrlX++ )
	{
		var ctrl = ctrlList[ ctrlX ];

		aTmp.length = 0 ;
		enumPropArray( dbList, _fillTmpArrayCallback, 1 ); 
		aTmp.sort();

		ctrl.options.length = 1 ;

		for ( var i = 0; i < aTmp.length; i++ )
		{
			selAddOption( ctrl, aTmp[ i ] );
		}
		selectFirst( ctrl );
	}

	var ctrl = formUserAuth.Realm;
	aTmp.length = 0 ;
	enumPropArray( realmList, _fillTmpArrayCallback, 1 ); 
	aTmp.sort();

	ctrl.options.length = 1;

	// the realm dropdown displays the Realm Description whilst saving
	// the realmID to the config file
	for ( var i = 0; i < aTmp.length; i++ )
	{
		selAddOption( ctrl, aTmp[ i ], realmList[ aTmp[ i ] ][ 'Realm' ] );
	}
	selectFirst( ctrl );
	
}	// fillSelectCtrls

function onCredentialTypeChg ()
{
	var isUserAuth = ("0" == getCtrlValue( theForm.UseGUIDValidation ) );

	setDisplay( getElem( "LAYER_UserAuth" ), isUserAuth );
	setDisplay( getElem( "LAYER_PlayerAuth" ), (!isUserAuth) );
}

function onRealmChg ()
{
	// if the Realm is an NTLM realm (pluginid == 'rn-auth-sspi')
	// then we can't evaluate permissions (not implemented yet)

	if ( getCtrlValue( theForm.DatabaseID ) && 
		 isNTLMRealm( getCtrlValue( formUserAuth.Realm ) ) )
	{
		alert( ERRMSG_NTLM_PERM ); 
		formUserAuth.Realm.focus();
	}

}	// onRealmChg ()

function onDatabaseChg ()
{
	if ( ("0" == getCtrlValue( theForm.UseGUIDValidation )) &&
		 getCtrlValue( theForm.DatabaseID ) && 
		 isNTLMRealm( getCtrlValue( formUserAuth.Realm ) ) )
	{
		alert( ERRMSG_NTLM_PERM ); 
		theForm.DatabaseID.focus();
	}

}	// onDatabaseChg ()

function isNTLMRealm ( realm )
{
	if ( ! realm ) 
	{
		return false ;
	}

	var isNTLM = false ;
	function _CheckPluginIDCallback ( a, prop, curDepth ) 
	{
		if ( ( prop.toUpperCase() == "PLUGINID" ) && 
			 ( a[ prop ] == 'rn-auth-sspi' ) )
		{
			isNTLM = true ;
			return 1 ;
		}
	}
	function _CheckRealmCallback ( a, prop, curDepth ) 
	{
		if ( ( prop.toUpperCase() == "REALM" ) && 
			 ( a[ prop ] == realm ) )
		{
			enumPropArray( a, _CheckPluginIDCallback, 0 ); 
			return 1 ;
		}
	}
	enumPropArray( realmList, _CheckRealmCallback, 0 ); 
	return isNTLM ;
}

function openPermDialog ( dialog ) 
{
	var isRedirectDlg = ( -1 != dialog.search( /redirect/ ) );
	if ( isRedirectDlg )
	{
		if ( getCtrlValue( theForm.UseGUIDValidation ) == "0" )
		{
			alert( "Redirection is only availble for Player Validated content." );
			return ;
		}
	}

	var curRule = getCtrlValue( theForm.theList );
	if ( ! curRule )
	{
		alert( "You must select a Rule from the list" );
		return ;
	}

	if ( ! getCtrlValue( theForm.DatabaseID ) ) 
	{
		alert( "This Rule does not evaluate permissions" );
		return ;
	}

	function _callback ( propList, prop, paramStr )
	{
		if ( ( prop != "ProtectedVirtualPath" ) || isRedirectDlg )
		{
			return paramStr ;
		}
		else	// strip off leading '/' from the path
		{	
			return paramStr.replace( /=\//, "=" );
		}
	}
	
	var qStr = "?descr=" + escapePlus( curRule );
	var subList = propList.subList( curRule );
	if ( subList )
	{
		qStr += subList.buildParamString( "", true, _callback );
	}

	raDialog( dialog + qStr );
}
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">SECURITY</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
The commerce feature builds on the authentication feature, and consists
of an additional database which stores permissions to content. To
authenticate visitors, the server stores user IDs, passwords, or client
IDs, and their associated access permissions. When a client tries to
access content, the server uses this data to determine whether the
client is authorized to view the content.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 

<input type="hidden" name="EvaluatePermissions">
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Commerce</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<tr>
	<TD class="input" valign="top" width="50%">
		<TABLE CLASS="PROPLIST_LABEL" width="226" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Commerce Rules</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Commerce Rule" BORDER=0></A><A href="javascript://" \
onclick="propView.removeSubList()"><IMG src="images/delete_g.gif" HSPACE=1 \
ALT="Remove Current Commerce Rule" BORDER=0></A><A href="javascript://" \
onclick="propView.copySubList()"><IMG src="images/copy_g.gif" HSPACE=1 ALT="Copy \
Current Commerce Rule" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theList" SIZE="10" WIDTH="226">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>

		<P>
		<SPAN class="formHeader">Content Access</SPAN>
		<br>
		&nbsp;<A CLASS="linkText" HREF="Javascript://" onclick="openPermDialog( \
'grantuser.html' )">Grant User Permission</a><BR>  &nbsp;<A CLASS="linkText" \
HREF="Javascript://" onclick="openPermDialog( 'edituserperm.html' )">Edit User \
Permission</a><BR>  &nbsp;<A CLASS="linkText" HREF="Javascript://" \
onclick="openPermDialog( 'revokeuser.html' )">Revoke User Permission</a><BR>  \
&nbsp;<A CLASS="linkText" HREF="Javascript://" onclick="openPermDialog( \
'revokealluser.html' )">Revoke All Permissions</a><BR>  </TD>
	<TD class="input" valign="top" width="50%">
		<A NAME="ANCHOR_FORMS_NAV4_X"></A>
		Edit Rule Name
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theEdit" SIZE="18" TYPE="text" \
VALUE="">

		Protected Path
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="ProtectedVirtualPath" SIZE="18" \
TYPE="text" VALUE="">

		User Permissions Database
		<BR>
		<select CLASS="longInput" NAME="DatabaseID" ONCHANGE="onDatabaseChg()" SIZE="1" \
WIDTH="226">  <OPTION value="">Do Not Evaluate Permissions</OPTION>
		    <OPTION value="0">1</OPTION>
		    <OPTION value="2">3</OPTION>
		    <OPTION value="4">5</OPTION>
		    <OPTION value="6">7</OPTION>
		    <OPTION value="8">9</OPTION>
		</SELECT>

		Credential Type
		<BR>
		<select CLASS="longInput" NAME="UseGUIDValidation" ONCHANGE="onCredentialTypeChg()" \
SIZE="1" TITLE="" WIDTH="226">  <OPTION value="0">Use User Authentication</OPTION>
		    <OPTION value="1">Use Player Validation</OPTION>
		</SELECT>

		<DIV ID="ANCHOR_FORMS_IE" class="Units">
			User Authentication requires a Realm to validate users and passwords. Player 
			Validation uses the registration prefix to database mapping below.
		</DIV>
		<BR>
		<A NAME="ANCHOR_FORMS_NAV4_Y"></A>
		<BR>
		<BR>
		<BR>
		<BR>
		<BR>
	</TD>
</TR>
<tr </tr>
<tr>
	<TD class="input" valign="top" width="50%">
		<TABLE CLASS="PROPLIST_LABEL" width="226" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Player GUID \
Databases</TD>  <TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.propViewGUID.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 \
ALT="Add New GUID Database" BORDER=0></A><A href="javascript://" \
onclick="propView.propViewGUID.removeSubList()"><IMG src="images/delete_g.gif" \
HSPACE=1 ALT="Remove Current GUID Database" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theGUIDList" SIZE="7" WIDTH="226">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="50%">
		Edit Description
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theGUIDEdit" SIZE="18" TYPE="text" \
VALUE="">

		Player Registration Prefix
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="GUIDRegistrationPrefix" SIZE="18" \
TYPE="text" VALUE="">

		Player Database
		<BR>
		<select CLASS="longInput" NAME="_DatabaseID" SIZE="1" WIDTH="226">
		    <OPTION value="">Select a Database</OPTION>
		    <OPTION value="0">1</OPTION>
		    <OPTION value="2">3</OPTION>
		    <OPTION value="4">5</OPTION>
		    <OPTION value="6">7</OPTION>
		    <OPTION value="8">9</OPTION>
		</SELECT>
	</TD>
</TR>

<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>

<SPAN class="absolute" ID="LAYER_UserAuth">
<FORM NAME="FORM_UserAuth">
<table ID="TABLE_UserAuth" cellspacing="0" cellpadding="2" width="228">
<tr>
	<TD class="input" valign="top" width="100%">
		Realm
		<BR>
		<select CLASS="longInput" NAME="Realm" ONCHANGE="onRealmChg()" SIZE="1" \
WIDTH="226">  <OPTION value="">Select a Realm</OPTION>
		    <OPTION value="0">1</OPTION>
		    <OPTION value="2">3</OPTION>
		    <OPTION value="4">5</OPTION>
		    <OPTION value="6">7</OPTION>
		    <OPTION value="8">9</OPTION>
		</SELECT>

		Allow Duplicate User IDs
		<BR>
		<select CLASS="longInput" NAME="AllowDuplicateIDs" SIZE="1" WIDTH="226">
		    <OPTION value="1">Yes</OPTION>
		    <OPTION value="0">No</OPTION>
		</SELECT>
	</TD>
</TR>
</TABLE>
</FORM>
</SPAN>

<SPAN class="absolute" ID="LAYER_PlayerAuth">
<FORM NAME="FORM_PlayerAuth">
<table ID="TABLE_PlayerAuth" cellspacing="0" cellpadding="2" width="228">
<tr>
	<TD class="input" valign="top" width="100%">
		<A CLASS="linkText" HREF="Javascript:openPermDialog( 'add_redirect.html' \
)">Redirect Unauthenticated Players</a>  </TD>
</TR>
</TABLE>
</FORM>
</SPAN>
<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>

</BODY>
</HTML>

--- NEW FILE: license.html ---

<HTML>
<HEAD>

<SCRIPT SRC="xblib.js"></SCRIPT>
         <SCRIPT SRC="string.js"></SCRIPT>
         <SCRIPT SRC="client.js"></SCRIPT>
         <SCRIPT SRC="results.js"></SCRIPT>
         <SCRIPT SRC="help.js"></SCRIPT>
         <SCRIPT>
         if ( isX11 )
         {
            document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" \
TYPE="text/css">' );  }
         else if ( isIE && isMac )
         {
            document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" \
TYPE="text/css">' );  }
         else if ( isNav4 && isMac )
         {
            document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" \
TYPE="text/css">' );  }
         else
         {
            document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' \
);  }
         var contextID = "0";
         </SCRIPT>

<SCRIPT SRC="BigInt.js"></SCRIPT>
<SCRIPT SRC="ip.js"></SCRIPT>
<SCRIPT SRC="servvar.get.html?license=license&server=server&licDir=config.LicenseDirectory"></SCRIPT>


<SCRIPT>
if ( ! license )
{
	license = [];
}
if ( ! license[ "Summary" ] )
{
	license[ "Summary" ] = [];
}

var host = getMachineName( location.hostname );

function Prop ( propValue, displayText, defVal, fHideEmpty )
{
	this.propValue = (!isBlank( propValue ) ? propValue : defVal );
	this.displayText = displayText;
	this.fHideEmpty = (fHideEmpty ? true : false);
}

Prop.prototype.emit = function ( rowCounter )
{
	if ( this.fHideEmpty && isBlank( this.propValue ) )
		return "" ;

	var className = ((rowCounter % 2) ? 'labelOdd' : 'labelEven');
	return "<tr><td width=49% class='" + className + "'>" + this.displayText + '</td>' +
		   "<td width='51%' class='" + className + "'>" + this.propValue + '</td></tr>\n' ;
}

var release = "Helix Server";
if ( license["License0"] &&
	 license["License0"]["License"] &&
	 license["License0"]["License"]["Definition"] && 
	 license["License0"]["License"]["Definition"]["ProductID"] )
{
	release = license["License0"]["License"]["Definition"]["ProductID"];
}

var licLocation = licDir ;
var licDisplay = "License Directory";

function LicenseProp ( propPath, displayText, defVal, fHideEmpty )
{
	if ( isBlank( defVal ) )
		defVal = false ;

	var propValue = null;
	if ( propPath )
	{
		propValue = license["Summary"];
		var a = propPath.split( '.' );
		for ( var i = 0; a && i < a.length; i++ )
		{
			if ( ! (propValue && propValue[ a[ i ] ]) )
			{
				propValue = null;
				break;
			}
			propValue = propValue[ a[ i ] ];
		}
	}

	this.base = Prop ;
	this.base( (propValue!=null ? (propValue ? "yes" : "no") : (defVal ? "yes" : "no")), \
  displayText, null, fHideEmpty );
}
LicenseProp.prototype = new Prop ;

function DataTypeProp ( propPath, displayText, defVal, fHideEmpty )
{
	propPath = "DataTypes." + propPath + ".Enabled";

	this.base = LicenseProp;
	this.base( propPath, displayText, defVal, fHideEmpty );
}
DataTypeProp.prototype = new LicenseProp ;

var serverMap =
[
	new Prop( host + ":" + location.port, "Server:Port")
   ,new Prop( server["platform"], "Platform" )
   ,new Prop( release, "Product" )
   ,new Prop( server["version"], "Version" )

   ,new Prop( licLocation, licDisplay )

];

var capacityMap = null;

var maxConnections = null;
var maxBandwidth = null;

if ( license["Summary"]["General"] &&
	 license["Summary"]["General"]["ClientConnections"] )
	maxConnections = license["Summary"]["General"]["ClientConnections"];

if ( license["Summary"]["General"] &&
	 license["Summary"]["General"]["BandwidthCapacity"] )
	maxBandwidth = license["Summary"]["General"]["BandwidthCapacity"] + " Mbps" ;

capacityMap =
[
    new Prop( maxConnections, "Max Client Connections", 10 )
   ,new Prop( maxBandwidth, "Bandwidth Capacity", "", true )
];																	   

 <!-- if ( not ($DEFS::RIA or $DEFS::DNA) ) -->

var featureMap =
[
    new LicenseProp( "Authentication.Storage.Basic", "Authentication Storage Basic" )
   ,new LicenseProp( "Authentication.Storage.Msql", "Authentication Storage mSQL" )
   ,new LicenseProp( "Authentication.Storage.Odbc", "Authentication Storage ODBC" )

   ,new LicenseProp( "Authentication.Commerce.Access", "Authentication Commerce \
Access" )  ,new LicenseProp( "Authentication.Commerce.Permissions", "Authentication \
Commerce Permissions" )

   ,new LicenseProp( "BroadcastDistribution.PullTransmissionEnabled", "Broadcast \
Distribution - Push Transmission" )  ,new LicenseProp( \
"BroadcastDistribution.PullTransmissionEnabled", "Broadcast Distribution - Pull \
Transmission" )  ,new LicenseProp( "BroadcastDistribution.PushReceiveEnabled", \
"Broadcast Distribution - Push Receive" )  ,new LicenseProp( \
"BroadcastDistribution.PullReceiveEnabled", "Broadcast Distribution - Pull Receive" ) \
,new LicenseProp( "BroadcastDistribution.EnableMulticastTransport", "Broadcast \
Distribution - Multicast" )

   ,new LicenseProp( "BroadcastRedundancy.Enabled", "Broadcast Redundancy" )

   ,new LicenseProp( "CapabilityExchange.Enabled", "Capability Exchange" )

   ,new LicenseProp( "ContentDistribution.Publisher", "Content Caching - Publisher" )
   ,new LicenseProp( "ContentDistribution.Subscriber", "Content Caching - Subscriber" \
)

   ,new LicenseProp( "DRM.RNBA.MimeTypes.Default.Enabled", "Digital Rights \
Management" )

   ,new LicenseProp( "Multicast.Scalable", "Scalable Multicast" )
   ,new LicenseProp( "Multicast.General", "RTSP Back-Channel Multicast" )
   ,new LicenseProp( "Multicast.WindowsMedia", "Windows Media Multicast" )

   ,new LicenseProp( "RTSPEventStats.Enabled", "RTSP Event Stats" )

   ,new LicenseProp( "SDPFileGen.Enabled", "SDP File Generation" )
];																	   

 <!-- if ( $DEFS::SERVER and not ($DEFS::RIA or $DEFS::DNA) ) -->

var dataTypesMap =
[
    new DataTypeProp( "3GPPPacketizer",	"3GPP Packetization" )
   ,new DataTypeProp( "MultiRateContainer","MultiRate Container" )
   ,new DataTypeProp( "RealAudio",		"RealAudio" )
   ,new DataTypeProp( "RealVideo", 		"RealVideo" )
   ,new DataTypeProp( "RealFlash",		"RealFlash" )
   ,new DataTypeProp( "RealPix",		"RealPix" )
   ,new DataTypeProp( "RealEvents", 	"RealEvents" )
   ,new DataTypeProp( "RealText", 		"RealText" )
   ,new DataTypeProp( "realmpeg4", 		"MPEG 4" )
   ,new DataTypeProp( "QuickTime", 		"QuickTime" )
   ,new DataTypeProp( "WindowsMediaASF","Windows Media" )
];																   

																	   
document.write( "<TITLE>Helix Server License Information - " + host.ent() + \
"</title>" ); </script>

</HEAD>

<BODY CLASS="popup">
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule" height="7" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule">&nbsp;</SPAN>
	</TD>
</TR>
<TR>
   <TD align="left" valign="middle" bgcolor="#FFFFFF" height="49">
      <img src="images/popup_header.gif"  BORDER="0" HSPACE="0" VSPACE="0"></TD>
   <TD align="right" valign="middle" bgcolor="#FFFFFF" height="49">
		<img src="images/popup_logo.gif"  BORDER="0" HSPACE="20" VSPACE="0"></TD>
</TR>
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule2" height="9" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule2">&nbsp;</SPAN>
   </TD>
</TR>
</TABLE>
<DIV style="padding-left:26;padding-top:6;padding-bottom:6;">
<TABLE border="0" cellpadding="0" cellspacing="1" width="550">
<TR>
   <TD class="popupTitle" align="left" valign="bottom" width="100%">
      <BR>
      ABOUT&nbsp;<SCRIPT>document.write( host.ent() )</SCRIPT>
   </TD>
</TR>
</TABLE>

<DIV class="trademarkBorder">
<TABLE border="0" cellpadding="6" cellspacing="1" width="550">
<TR>
     <TD colspan=2 class="bodyText" align="left" valign="top" width="100%">
        Information about the license for your Helix Server, including which features
        are enabled, is stored in a file in a license directory. 
		The license files are written in XML format. The LicenseDirectory variable in the 
		configuration file tells Helix Server where to look for license information. 
        <br><br>
		If you purchase additional features, these will be listed in additional 
		files stored in the same directory and will appear on this page. To upgrade 
		your license so that you can use more of Helix Server's features, contact 
        <a target="_blank" class="linkText" \
href="http://www.realnetworks.com">RealNetworks</a> or your reseller.  <br>
    </TD>
</TR>
</TABLE>
</DIV>
<BR>
<TABLE border="0" cellpadding="6" cellspacing="1" width="550">
<TR>
     <TD colspan=2 class="popupTableheader" align="left" valign="top" width="100%">
		 Properties
    </TD>
</TR>
<SCRIPT>
map = serverMap ;
for ( var i = 0; i < map.length; i++ )
{
	document.write( map[ i ].emit( i ) );
}
</SCRIPT>
</TABLE>

<BR>
<TABLE border="0" cellpadding="6" cellspacing="1" width="550">
<TR>
     <TD colspan=3 class="popupTableheader" align="left" valign="top">
		 Licenses
    </TD>
</TR>
<TR>
	<td width=49% class='licenseTitle'>
		Product ID
	</td>
	<td width=26% class='licenseTitle'>
		Issue Date
	</td>
	<td width=25% class='licenseTitle'>
		Expire Date
	</td>
</tr>
<SCRIPT>
function emitLicenses ()
{
	var s = "";

	for ( var licName in license )
	{
		if ( licName != "Summary" )
		{
			var l = license[ licName ];
			if ( isObj( l ) &&
				 l[ "License" ] &&
				 l[ "License" ]["Definition" ] &&
				 l[ "License" ]["Definition" ]["ProductID"] &&
				 l[ "License" ]["Definition" ]["StartDate"] &&
				 l[ "License" ]["Definition" ]["EndDate"] )
			{
				s += "<td width='49%' class='input'>" + l[ "License" ]["Definition" \
                ]["ProductID"] + '</td>' +
					 "<td width='26%' class='input'>" + l[ "License" ]["Definition" ]["StartDate"] + \
                '</td>' +
					 "<td width='25%' class='input'>" + l[ "License" ]["Definition" ]["EndDate"]   + \
'</td></tr>\n';  }
		}
	}

	if ( ! s )
	{
		s = "<td width='49%' class='input'>Helix Server Basic</td><td width='26%' \
class='input'>n/a</td><td width='25%' class='input'>unlimited</td></tr>\n" ;  }
	
	document.write( s );
}
emitLicenses();
</SCRIPT>
</TABLE>

<BR>
<TABLE border="0" cellpadding="6" cellspacing="1" width="550">
<TR>
     <TD colspan=2 class="popupTableheader" align="left" valign="top">
		 Capacity
    </TD>
</TR>
<SCRIPT>
map = capacityMap ;
for ( var i = 0; i < map.length; i++ )
{
	document.write( map[ i ].emit( i ) );
}
</SCRIPT>
</TABLE>

<BR>
<TABLE border="0" cellpadding="6" cellspacing="1" width="550">
<TR>
     <TD colspan=2 class="popupTableheader" align="left" valign="top">
		 Features
    </TD>
</TR>
<SCRIPT>
map = featureMap ;
for ( var i = 0; i < map.length; i++ )
{
	document.write( map[ i ].emit( i ) );
}
</SCRIPT>
</TABLE>

<BR>
<TABLE border="0" cellpadding="6" cellspacing="1" width="550">
<TR>
     <TD colspan=2 class="popupTableheader" align="left" valign="top">
		 Data Types
    </TD>
</TR>
<SCRIPT>
map = dataTypesMap ;
for ( var i = 0; i < map.length; i++ )
{
	document.write( map[ i ].emit( i ) );
}
</SCRIPT>
</TABLE>

<DIV class="trademarkBorder">
<TABLE border="0" cellpadding="6" cellspacing="1" width="550">
<tr>
    <TD class="bodyText" width="100%" align="left" valign="top">
		Copyright © 1995-2005 RealNetworks, Inc. This product may incorporate
		one or more of the following: U.S. Patent # 5,793,980; U.S. Patent #
		5,917,835; U.S. Patent # 6,151,634; U.S. Patent # 6,487,663; 
        U.S. Patent # 6,731,600. Other U.S. patents pending. All rights reserved.
        <BR><BR>  

		Flash © 1997 Macromedia, Inc. Macromedia, the Macromedia logo, Flash,
		and Shockwave are trademarks or registered trademarks of Macromedia,
		Inc.

        <BR><BR>  

		Includes support for JavaScript ™. JavaScript © Netscape Communications
		Corporation.

        <BR><BR>  

		Java™ is a trademark of Sun Microsystems.

        <BR><BR>  

		Helix, RealAudio, RealNetworks, RealSystem, RealVideo, and SureStream are
		trademarks or registered trademarks of RealNetworks, Inc. All other
		companies or products listed herein are trademarks or registered
		trademarks of their respective owners. All rights reserved.
    </td>
</tr>
</TABLE>
</DIV>

<BR>
<TABLE width="550" cellspacing="0" border="0" cellpadding="0">
<TR><TD ALIGN="RIGHT" WIDTH="100%">
	<A HREF="javascript://" onclick="window.close();"><IMG src="images/close.gif" \
alt="Close" BORDER="0"></A> </TD></TR>
</TABLE>
</DIV>
</BODY>
</HTML>

--- NEW FILE: results.js ---

/* Globals */

var hwndDlg = null ;
var dlgParams = null ;
var oldOnFocus = null ;

var defOptions = 'status=no,resizable=yes,dependent=yes,scrollbars=' ; // MUST append \
"yes" or "no" !!!!

function _configOnLoadDefault ( nextHandler )
{
	if ( isMac && isNav && document.MACFIX )
		document.MACFIX.hidden=true;

	if ( (typeof( pendingChanges ) != "undefined") && pendingChanges )
		doPendingChanges();

	// set frameset title to reflect main frame title
	if ( isIE ) 
		top.document.title = top.origTitle + " | " + document.title ; 

	if ( nextHandler )
		nextHandler();
}

function _configOnUnLoadDefault ( nextHandler )
{
	// reset frameset title
	if ( isIE && top.document.title ) 
		top.document.title = top.origTitle ;

	//use a cookie to store the last page viewed

	//get location.pathname and lop off everything but the filename and querystring
	page = location.pathname ;
	page = page.slice( page.lastIndexOf( '/' ) + 1 );

	if ( top.theCookieJar && page && 
		(!(page.bSearch( /serve_me.html/i ) || page.bSearch( /^server\..*\.html/i ))) )
	{
		top.theCookieJar.lastPage = page;
		top.theCookieJar.store();
	}
    
	if ( nextHandler )
		nextHandler();
}

function doPendingChanges ()
{
	var headerFrame = findFrame( "Header" );
	var img = getElem( "RESTART_IMG" );
	if ( img && headerFrame )
	{
		var imgSpan = ( isNav4 ? null : getElem( "RESTART_IMG_SPAN" ) );
		headerFrame.restartImage( img, imgSpan );
	}
}

function raSubmitChanges
( 
	chgType,			// "servvar" or "configvar"
	chgParams, 			// parameter string to submit to server

	// following parameters allow the caller to customize the results page
	context,			// the catagory that is being changed "IP Bindings", "Mime Types", etc)
	resultsFunc,		// (optional) function for preprocessing the results array
	propStart			// (optional) starting property of the property path to display, default \
= 2 (omit "config.")

	/* EX: 
		property = "config.HTTPDeliverable.Path_1"
		propStart = 2
		display = "HTTPDeliverable.Path_1"
	*/
)
{
	dlgParams = new Object();

	var resultsFile = "config_results.nc.html" ;
	var options = defOptions + "yes" + dlgGetDimensons( resultsFile );

	dlgParams.isModal 		= true ;
	dlgParams.isOpen		= false ;

	dlgParams.userParams				= new Object();
	dlgParams.userParams.context		= context ;
	dlgParams.userParams.resultsFunc	= resultsFunc ;
	dlgParams.userParams.propStart		= propStart ;

	oldOnFocus = window.onfocus ;
	window.onfocus = doOnFocus ;

	//	PROCESS ARGS for bad things
	// strip off leading/trailing '&' seperators
	chgParams = chgParams.replace( /^&*/, '' );
	chgParams = chgParams.replace( /&*$/, '' );

	var url = "" ;
	if ( ( chgType == "configvar" ) ||
		 ( chgType == "servvar" ) )
	{
		url = chgType + ".set.html" ;

		if ( chgType == "configvar" )
		{
			// pass along the contextID so that we later associate 
			// each changes with the current page
			if ( contextID )
				chgParams += buildParam( "context", contextID );

			doPendingChanges();
		}
	}
	else
	{
		url = chgType ;
		// when a dialog opens the results window, close that dialog when
		// the results window is closed
		dlgParams.bCloseOpenerOnClose = true ;
	}

	chgParams = "respage=" + resultsFile + "&" + chgParams;

	// use POST method to submit unless the config file sez to use GET, or
	// we can't find the DIV_DYNFORM div to write the the dynamically created form to
	if (  (!getElem( "DIV_DYNFORM" )) ||
		 (top.TOC && (! isBlank( top.TOC.useGetMethod )) && (0 != top.TOC.useGetMethod)) )
	{
		hwndDlg = raSubmitChangesGet( url + "?" + chgParams, options );
	}
	else	// use POST
	{
		// open a blank window to 'target' the form submittal
		if ( window.name != "_RESULTS" )
		{
			hwndDlg = window.open( "", "_RESULTS", options );
		}
		else // this is the results window
		{
			hwndDlg = window ;
		}
		var f = new DynamicForm( "POST", url, "_RESULTS", getElem( "DIV_DYNFORM" ) );

		f.addQStr( chgParams );
		f.submit();
	}
			
	if ( hwndDlg ) hwndDlg.focus();

	return hwndDlg ;
}

function raSubmitChangesGet ( url, options )
{

	var hwndResults = null;

	// already in the results window?
	if ( window.name != "_RESULTS" )
	{
		hwndResults = window.open( url, "_RESULTS", options );
	}
	else
	{
		window.location = url ;
		hwndResults = window ;
	}

	return hwndResults ;
}

function displayChanges ()
{
	var resultsFile = "config_pending.nc.html" ;
	var options = defOptions + "yes" + dlgGetDimensons( resultsFile );

	dlgParams 				= new Object();
	dlgParams.isModal 		= false ;
	dlgParams.isOpen		= false ;
	dlgParams.userParams	= new Object();

 	hwndDlg = window.open( resultsFile, "_CHANGES", options );
	if ( hwndDlg ) hwndDlg.focus();

}	// displayChanges ()

// results window is 'modal' - bounce focus back to it
function doOnFocus ()
{
	if ( hwndDlg && (! hwndDlg.closed) && dlgParams.isOpen )
	{
		hwndDlg.focus();
	}
	else
	{
		hwndDlg = null ;
		dlgParams.isOpen = false ;
		if ( oldOnFocus )
		{
			window.onfocus = oldOnFocus ;
			oldOnFocus = null ;
		}
	}
}

function raDialog
( 
	dialog,
	userParams,
	OKHandler,
	width,
	height,
	scrollbars
)
{
	dlgParams = new Object();

	var options = defOptions + (scrollbars?"yes":"no") + dlgGetDimensons( dialog, width, \
height );

	// set standard dialog properties
	dlgParams.OKHandler  		= OKHandler ;
	dlgParams.isModal 			= true ;
	dlgParams.isOpen			= false ;

	// setup user properties
	dlgParams.userParams		= userParams ;

	oldOnFocus = window.onfocus ;
	window.onfocus = doOnFocus ;

	// already in the "_DIALOG" window?
	var defName = "_DIALOG" ;
	if ( window.name == defName )
	{
		defName = "_DIALOG_" + dialog.replace( /\..*/, "" );
	}

	hwndDlg = window.open( dialog, defName, options );
	if ( hwndDlg ) hwndDlg.focus();

	return hwndDlg ;
}

function dlgGetDimensons ( dlg,	width, height )
{
	if ( ! (width && height) )
	{
		//strip off url query string
		dlg = dlg.replace( /\?.*/, "" );

		var aDim = dlgDimensions[ dlg.toLowerCase() ];
		if ( aDim == null )	// use defaults
		{
			width  = 460 ;
			height = 380 ;
		}
		else
		{
			if ( aDim.length == 1 )
				aDim = aDim[ 0 ];
			else if ( aDim.length == 2 )
				aDim = aDim[ (isIE ? 0 : 1) ];
			else
				aDim = aDim[ (isIE ? 0 : isWin ? 1 : 2) ];

			width  = aDim[ 0 ];
			height = aDim[ 1 ];
		}
	}

	return ",width=" + width + ",height=" + height +	
		getCenteredCoords( width, height );
}
dlgDimensions = new Array();				//   IE		   Nav on Win	Nav on X/Mac
dlgDimensions[ 'grantuser.html' ]		= [ [ 460, 440 ], [ 480, 480 ], [ 460, 560 ] ];
dlgDimensions[ 'edituserperm.html' ]	= [ [ 460, 460 ], [ 480, 480 ], [ 460, 590 ] ];
dlgDimensions[ 'revokeuser.html' ]		= [ [ 460, 360 ], [ 480, 400 ], [ 460, 440 ] ];
dlgDimensions[ 'revokealluser.html' ]	= [ [ 460, 300 ], [ 480, 320 ], [ 460, 300 ] ];
dlgDimensions[ 'add_redirect.html' ]	= [ [ 460, 300 ], [ 460, 300 ], [ 460, 340 ] ];

dlgDimensions[ 'adduser.html' ]			= [ [ 460, 300 ], [ 480, 310 ], [ 460, 380 ] ];
dlgDimensions[ 'edituser.html' ]		= [ [ 460, 300 ], [ 480, 310 ], [ 460, 390 ] ];
dlgDimensions[ 'removeuser.html' ]	  	= [ [ 460, 260 ], [ 480, 260 ], [ 460, 300 ] ];
dlgDimensions[ 'getusers.html' ]	  	= [ [ 460, 350 ], [ 480, 380 ], [ 460, 440 ] ];

dlgDimensions[ 'cdistpulldown.html' ]  	= [ [ 460, 370 ], [ 480, 400 ], [ 460, 440 ] \
];

dlgDimensions[ 'config_results.nc.html' ] = [ [ 600, 480 ] ];
dlgDimensions[ 'config_pending.nc.html' ] = [ [ 600, 540 ] ];
dlgDimensions[ 'ria_status.html' ] 		  = [ [ 600, 640 ] ];

dlgDimensions[ 'prompt_' ] = [ [ 440, 210 ], [ 438, 208 ] ];

function getCenteredCoords ( width, height )
{
	// returns the X and Y coords to center a window with the given dimensions
	// return format is in window.open() style parameters
	return ( (isIE ? ",left=": ",screenX=") + parseInt( (screen.width - width) / 2 ) +
		     (isIE ? ",top=" : ",screenY=") + parseInt( (screen.height- height)/ 2 ) );
}

function checkForPendingChanges ( serverDataChanges )
{

	var isPending = false ;
	function _enumCallback ( a, prop, depth, path )
	{
		if ( a[ prop ] != contextID )
		{
			return 0;
		}
		else
		{
			isPending = true ;
			return 1;	// aborts enum
		}
	}

	// contextID is a global
	if ( serverDataChanges && contextID )
		enumPropArray( serverDataChanges, _enumCallback );

	if ( isPending )
		doPendingChanges();

}	// checkForPendingChanges

function DynamicForm ( sMethod, sAction, sTarget, oDiv /*nav4/IE4 only*/ )
{
	if ( document.getElementById )
	{
		this.m_oForm = document.createElement('FORM');
		this.m_oForm.style.display = "none";
		this.m_oForm.name = "DYN_FORM";
		this.m_oForm.method = sMethod;
		this.m_oForm.action = sAction;
		this.m_oForm.target = sTarget;
		
		document.body.appendChild( this.m_oForm );
	}
	else
	{
		this.m_sFormHTML = '<FORM NAME="DYN_FORM" METHOD="' + 
			sMethod + '" ACTION="' + sAction + '" TARGET="' + sTarget + '">';

		this.m_oDiv = oDiv ;
	}

}	// 

DynamicForm.prototype.addParam = function ( fieldName, fieldValue )
{
	
	if ( document.getElementById )
	{
		var input = document.createElement( 'INPUT' );
		
		if ( !( isIE && isMac) )
		{
			input.type = "hidden";
		}

		input.name = fieldName;
		input.value = fieldValue;
		this.m_oForm.appendChild( input );
	}
	else
	{
		this.m_sFormHTML += "<input type='hidden' name='" + fieldName + "' value='" + \
fieldValue + "'>" ;  }

}	// addParam

DynamicForm.prototype.addQStr = function ( sQStr )
{
	var params = sQStr.split( /&/ );
	for ( var i = 0; i < params.length; i++ )
	{
		var parts = params[ i ].split( /=/ );
		if ( ! isBlank( parts[ 0 ] ) )
		{
			this.addParam( unescape( parts[ 0 ] ), 
				(isBlank(parts[ 1 ]) ? "" : unescape( parts[ 1 ] )) );
		}
	}
	
}	// addQStr

DynamicForm.prototype.submit = function ()
{
	if ( ! document.getElementById )
	{
		this.m_sFormHTML += "</FORM>";

		if ( isNav4 )	//Nav4
		{
			
			
			this.m_oDiv.document.open();
			this.m_oDiv.document.write( this.m_sFormHTML );
			this.m_oDiv.document.close();
			
		}
		else	// IE4
		{
			this.m_oDiv.innerHTML = this.m_sFormHTML ;
		}
		this.m_oForm = getElem( "DYN_FORM", (isNav4 ? this.m_oDiv.document : null) );
	}

	if ( this.m_oForm )
	{
		this.m_oForm.submit();
	}

}	// submit


--- NEW FILE: cookies.js ---

// The constructor function: creates a cookie object for the specified
// document, with a specified name and optional attributes.
// Arguments:
//   document: The Document object that the cookie is stored for. Required.
//   name:     A string that specifies a name for the cookie. Required.
//   hours:    An optional number that specifies the number of hours from now
//             that the cookie should expire.
//   path:     An optional string that specifies the cookie path attribute.
//   domain:   An optional string that specifies the cookie domain attribute.
//   secure:   An optional Boolean value that, if true, requests a secure cookie.
//
function Cookie(document, name, hours, path, domain, secure)
{
    // All the predefined properties of this object begin with '$'
    // to distinguish them from other properties which are the values to
    // be stored in the cookie.
    this.$document = document;
    this.$name = name;
    if (hours)
        this.$expiration = new Date((new Date()).getTime() + hours*3600000);
    else this.$expiration = null;
    if (path) this.$path = path; else this.$path = null;
    if (domain) this.$domain = domain; else this.$domain = null;
    if (secure) this.$secure = true; else this.$secure = false;
}

Cookie.prototype.store = function ()
{
    // First, loop through the properties of the Cookie object and
    // put together the value of the cookie. Since cookies use the
    // equals sign and semicolons as separators, we'll use colons
    // and ampersands for the individual state variables we store 
    // within a single cookie value. Note that we escape the value
    // of each state variable, in case it contains punctuation or other
    // illegal characters.
    var cookieval = "";
    for(var prop in this) {
        // Ignore properties with names that begin with '$' and also methods.
        if ((prop.charAt(0) == '$') || ((typeof this[prop]) == 'function')) 
            continue;
        if (cookieval != "") cookieval += '&';
        cookieval += prop + ':' + escape(this[prop]);
    }

    // Now that we have the value of the cookie, put together the 
    // complete cookie string, which includes the name and the various
    // attributes specified when the Cookie object was created.
    var cookie = this.$name + '=' + cookieval;
    if (this.$expiration)
        cookie += '; expires=' + this.$expiration.toGMTString();
    if (this.$path) cookie += '; path=' + this.$path;
    if (this.$domain) cookie += '; domain=' + this.$domain;
    if (this.$secure) cookie += '; secure';

    // Now store the cookie by setting the magic Document.cookie property.
    this.$document.cookie = cookie;
}

Cookie.prototype.load = function ()
{
    // First, get a list of all cookies that pertain to this document.
    // We do this by reading the magic Document.cookie property.
    var allcookies = this.$document.cookie;
    if (allcookies == "") return false;

    // Now extract just the named cookie from that list.
    var start = allcookies.indexOf(this.$name + '=');
    if (start == -1) return false;   // Cookie not defined for this page.
    start += this.$name.length + 1;  // Skip name and equals sign.
    var end = allcookies.indexOf(';', start);
    if (end == -1) end = allcookies.length;
    var cookieval = allcookies.substring(start, end);

    // Now that we've extracted the value of the named cookie, we've
    // got to break that value down into individual state variable 
    // names and values. The name/value pairs are separated from each
    // other by ampersands, and the individual names and values are
    // separated from each other by colons. We use the split method
    // to parse everything.
    var a = cookieval.split('&');    // Break it into array of name/value pairs.
    for(var i=0; i < a.length; i++)  // Break each pair into an array.
        a[i] = a[i].split(':');

    // Now that we've parsed the cookie value, set all the names and values
    // of the state variables in this Cookie object. Note that we unescape()
    // the property value, because we called escape() when we stored it.
    for(var i = 0; i < a.length; i++) {
        this[a[i][0]] = unescape(a[i][1]);
    }

    // We're done, so return the success code.
    return true;
}

Cookie.prototype.remove = function ()
{
    var cookie;
    cookie = this.$name + '=';
    if (this.$path) cookie += '; path=' + this.$path;
    if (this.$domain) cookie += '; domain=' + this.$domain;
    cookie += '; expires=Fri, 02-Jan-1970 00:00:00 GMT';

    this.$document.cookie = cookie;
}

Cookie.prototype.fillSelList = function ( listCtrl, cookiePrefix, listOffset, \
maxListLength ) {
	if ( ! (listCtrl && cookiePrefix) ) return;

	if ( listOffset == null || 
		 (listOffset != parseInt( listOffset )) )
	{
		 listOffset = 0 ;
	}

	var regEx = new RegExp( "^" + escRegExMetaChars( cookiePrefix ) + "([\\d]+)" );

	var aTemp = new Array();
	for( var prop in this )
	{
		// Ignore properties with names that begin with '$' and also methods.
		if ((prop.charAt(0) == '$') || (typeof(this[prop]) == 'function')) 
		 	continue;

		// and parse the list ordinal out
		var a = prop.match( regEx );
		if ( !a ) continue;

		var listValue = this[ prop ];
		if ( ! isBlank( listValue ) )
		{
			aTemp[ parseInt(a[1]) ] = listValue;
		}
	}

	for ( var i = 0; i < aTemp.length; i++ )
	{
		var listValue = aTemp[ i ];
		if ( ! isBlank( listValue ) )
		{
			selAddOption( listCtrl, listValue );

			if ( maxListLength && (listCtrl.options.length >= maxListLength) )
				break;
		}
	}
	
}	// fillSelList ()

Cookie.prototype.saveSelList = function ( listCtrl, cookiePrefix, listOffset, \
listMaxLen ) {
	if ( ! (listCtrl && cookiePrefix) ) return;
	
	if ( listOffset == null || 
		 (listOffset != parseInt( listOffset )) )
	{
		 listOffset = 0 ;
	}

	var nSaveCount = 0;

	// save all the list items as cookies <cookiePrefix>i=list.options[i].value
	for ( var i = listOffset; i < listCtrl.options.length; i++ )
	{
		this[ cookiePrefix + (i-listOffset) ] = listCtrl.options[ i ].value;
		if ( listMaxLen )
		{
			nSaveCount++ ;
			if ( nSaveCount >= listMaxLen )
				break ;
		}
	}

	// if we saved listMaxLen-N items, overwrite any old cookies between listMaxLen-N \
and listMaxLen  if ( listMaxLen )
	{
		for ( var i = nSaveCount; i <= listMaxLen; i++ )
		{
			delete this[ cookiePrefix + (i-listOffset) ];
		}
	}

	// store in the cookie
	this.store();
}

--- NEW FILE: regview_header.html ---

<html>
<head>

<SCRIPT SRC="xblib.js"></SCRIPT>
         <SCRIPT SRC="string.js"></SCRIPT>
         <SCRIPT SRC="client.js"></SCRIPT>
         <SCRIPT SRC="results.js"></SCRIPT>
         <SCRIPT SRC="help.js"></SCRIPT>
         <SCRIPT>
         if ( isX11 )
         {
            document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" \
TYPE="text/css">' );  }
         else if ( isIE && isMac )
         {
            document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" \
TYPE="text/css">' );  }
         else if ( isNav4 && isMac )
         {
            document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" \
TYPE="text/css">' );  }
         else
         {
            document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' \
);  }
         
         </SCRIPT>

<STYLE TYPE='text/css'>
</STYLE>

<SCRIPT>
var lastTarget = "" ;
var theForm ;
var theSubTreeList;
var isLoaded = false;

function doFindClick ()
{
	var target = getCtrlValue( theForm.SearchTarget );
	if ( ! target ) 
	{
		theForm.SearchTarget.focus();
		return ;
	}

	var fNext = 0 ;

	if ( lastTarget == target )
		fNext = 1 ;

	lastTarget = target ;

	var fHit = top.TOC.search( target, 
					getCtrlValue( theForm.SearchIn ), 
					fNext, 
					getCtrlValue( theForm.SearchType ) );

	if ( fHit )
	{
		// switch focus to the FIND NEXT btn
		theForm.FindNext.focus();
	}
	else
	{
		theForm.SearchTarget.focus();
	}

}	// doFindClick

function doRefresh ()
{
	lastTarget = "" ;
	var subTree = getCtrlValue( theForm.txtRegSubTree );
	if ( subTree )
	{
		top.curPath( subTree == "REG_ROOT" ? "" : subTree );
		top.TOC.location.search = "subTree=" + subTree;
		selectPush( theSubTreeList, subTree, subTree, 20, true, 2 );
		setCtrlValue( theSubTreeList, subTree );
		if ( top.RegCookies )
		{
  			top.RegCookies.saveSelList( theSubTreeList, "SubTree", 2, 20 );
		}
	}
	else
	{
		top.TOC.location.reload( 1 );
	}
}

function doNewPath ( path )
{
	if ( ! isLoaded ) return;
	
	// trim off hostname from path
	/*
	var pos = path.indexOf( "." );
	if ( pos == -1 )
		path = "";
	else
		path = path.slice( pos + 1 );
	*/
	if ( path == "REG_ROOT" )
		path = "";

	setCtrlValue( theForm.txtRegSubTree, path, true );

}	// doNewPath 

function doSubTreeChange ()
{
	var bRefresh = true ;
	var path = getCtrlValue( theSubTreeList );
	switch ( path )
	{
		case "REG_ROOT":
			top.TOC.location.search = "subTree=REG_ROOT";
			return;

		case "":
		case "SPACER":
			path = "";
			selFirst( theSubTreeList );
			break;

		default:
			break;
	}
		
	if ( path )
	{
		setCtrlValue( theForm.txtRegSubTree, path );
	}
	if ( bRefresh )
	{
		doRefresh();
	}
}

// handle ESCape key: simulate Cancel button
// handle ENTER/RETURN key: simulate OK button
// NOTE: Nav doesn't seem to capture the ESC key
function _onKeyDefault ( evt )
{
	var keyCode = ( isIE ) ? event.keyCode : evt.which;
	var target = ( isIE ) ? event.srcElement : evt.target;

	switch ( keyCode )
	{
		case 13:	// ENTER
		{
			if ( target == theForm.SearchTarget )
			{
				doFindClick();
			}
			else
			{
				doRefresh();
			}
			
			return cancelEvent( evt );
		}
	}

	if ( isNav4 )
		this.m_docTOC.routeEvent( evt );
	
	return true ;
}

function onLoad ()
{
	theForm = document.theForm ;
	theSubTreeList = theForm.selRegSubTree;

	isLoaded = true;
	
	addEvent( document, "keydown", _onKeyDefault, 1, "Event.KEYDOWN" );

	if ( top.RegCookies )
	{
		top.RegCookies.fillSelList( theSubTreeList, "SubTree", 2, 20 );
	}

	if ( theSubTreeList.options.length > 2 )
	{
		theSubTreeList.selectedIndex = 2;
	}

	if ( isIE )
	{
		theForm.txtRegSubTree.size = 73 ;
	}

	theForm.SearchTarget.focus();
}
</SCRIPT>
</head>

<BODY 
	onload="onLoad()"
> 

<form 
	name="theForm"
	method="POST"
	onsubmit="return false;"
> 
<table cellspacing="0" cellpadding="4" border="0" width="750">
<tr>
	<td align="left" valign="top" class="body" width="450">
		Restrict View to Registry Sub Tree
		<BR>
		<SELECT class="longInput" type="text" name="selRegSubTree" width="350" \
onchange="doSubTreeChange()">  <OPTION VALUE="REG_ROOT">View Entire Registry
			<OPTION VALUE="SPACER">----------------------------
		</SELECT><BR>
		<INPUT class="input" size="30" type="text" name="txtRegSubTree"><INPUT \
class="input" type="button" name="Refresh" value="Refresh" onClick="doRefresh()">  \
</td>  <td align="left" valign="top" class="body" width="250">
		Search for
		<BR>
		<INPUT class="longInput" type="text" name="SearchTarget">
		<INPUT class="longInput" type="button" name="FindNext" value="     Find Next     " \
onClick="doFindClick()">  </td>
	<td align="left" valign="top" class="body" width="250">
		Search Options
		<BR>
		<SELECT class="longInput" name="SearchIn">
			<OPTION VALUE="0">Look In Names and Values
			<OPTION VALUE="-1">Look In Variable Values Only
			<OPTION SELECTED VALUE="1">Look In List and Variable Names Only
		</SELECT>
		<SELECT class="longInput" name="SearchType">
			<OPTION VALUE="1">Use Regular Expression
			<OPTION SELECTED VALUE="0">Do Not Use Regular Expression
		</SELECT>
    </td>
</tr>
</table>
</form>	
</body>
</html>

--- NEW FILE: config_clog.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Advanced Logging</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
[...2186 lines suppressed...]
	<TD class="input" valign="top" align="LEFT" width="40%">
			<span class="offsetLabel">Command</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="Command" SIZE="24" TYPE="text" \
VALUE="">  </td>
	</tr>
</table>
</FORM>
</SPAN>
<SCRIPT>
	if ( isMac && isNav4 )
	{
		document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="299.88" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>

--- NEW FILE: config_results.nc.html ---

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 

<SCRIPT>
var newAdminPort = <!--#(config.AdminPort)-->;
var curPort = location.port;
if ( curPort == "" )
{
	curPort = 80;
}

function reloadFrameset ()
{
	alert( "The Helix Administrator must reload itself using the new Admin Port ('" +
		newAdminPort + 
		"').\n\nBe sure to alter any Helix Administrator bookmarks to use the new Admin \
Port." );

	// reload the admin system
	var curPage = window.opener.location.pathname;
	curPage = curPage.slice( curPage.lastIndexOf( '/' ) + 1 );
	var href = window.opener.top.location.href;
	href = href.replace( /\?.*$/, "" );
    if ( -1 == href.search( ":" + curPort) )
    {
    	href = href.replace( location.host, location.host + ":" + newAdminPort );
	}
    else
    {
		href = href.replace( ":" + curPort, ":" + newAdminPort );
    }
    
	href += "?start=" + curPage;

	window.opener.top.location.href = href;
}

if ( curPort != newAdminPort )
{
	if ( document.layers && (-1 != navigator.appVersion.toLowerCase().indexOf( "win" ) ) \
)  {
		// win version of Nav 4x doesn't handle a dynamically genereated <BASE> tag, just
		// alert and close
		reloadFrameset();
	}
	else
	{
		var href = location.href;
	    if ( -1 == href.search( ":" + curPort) )
	    {
	    	href = href.replace( location.host, location.host + ":" + newAdminPort );
		}
	    else
	    {
			href = href.replace( ":" + curPort, ":" + newAdminPort );
	    }

		document.write( '<BASE HREF="' + href + '">' );
	}
}
</SCRIPT>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="dialog.js"></SCRIPT>
<SCRIPT SRC="qstr.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
	document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else
{
	document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
</SCRIPT>

<TITLE>Helix Administrator - Change Status</TITLE> 

<STYLE>
.failed
{
	font-weight:      600;
}
.red
{ 

  font-weight:      600;
  color:            red;
}

</STYLE>

<SCRIPT LANGUAGE="javascript">
// assigns results object to results var
<!--@(results=results)-->

var chgCount = 0, failCount = 0, configvarChgCount = 0 ;
var args = gParams.userParams ;

var isconfigvar	= ( -1 != window.location.pathname.search( /configvar/i ) );
var isservvar	= ( -1 != window.location.pathname.search( /servvar/i ) );

// assume the context of the page submitting the changes (in case thier are 
// servvar failures we need to write to the config file (via configvar)
var qStr = new QStrParser();
var contextID = qStr.getParam( "context" );

function emitResults ()
{
	var propStart = args.propStart ;
	var propEnd ;
	var res = null ;
	var action = "" ;
	var title = "" ;
	var actionDisplay = "" ;
	var maxLen		= 30 ;
	var aProps ;

	// is this a change to authentication settings?
	if ( ! (isconfigvar || isservvar) )
	{
		emitAuthResults();
		return ;
	}

	if (! propStart) propStart = 2 ;
	propEnd = (propEnd) ? propEnd + 1 : propStart + 1 ;

	if ( args.resultsFunc ) args.resultsFunc( results );

    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];

		// is there an actual change?
		if ( isconfigvar || ( res.action == "Remove" ) || ( res.oldval != res.newval ) )
		{
			// emit table headers
			if ( res.title != "NO_DISPLAY" )
			{
				if ( chgCount == 0 )
				{
			        document.write( '<tr><td class="popupTableHeader" valign="middle" \
width="150">Property</td><td class="popupTableHeader" valign="middle" \
width="300">Action Taken</td><td class="popupTableHeader" valign="middle" \
width="40">Status</td></tr>' );  }
			
				var className = ((chgCount % 2) ? 'odd' : 'even');
				var tagTD = "<td class='" + className + "'>" ;

				chgCount++ ;

				if ( isconfigvar && (( res.action == "Remove" ) || ( res.oldval != res.newval )) \
)  configvarChgCount++ ;

				if ( res.title ) // use the title field as set by the results callback function
				{
					title = res.title ;
				}
				else
				{
				    aProps = propName.split( "." );
					title = aProps.slice( propStart ).join( '.' ).ent();
				}

		        document.write( '<tr>' + tagTD + title + '</td>' );

				if ( ! isBlank( res.actionDisplay ) )
				{
					action = res.actionDisplay ;
				}
				else
				{
					if ( res.action == "Remove" )
						action = 'Removed ' ;
					else
						action = ( res.oldval ? 'Changed from ' : 'Set to ' );

					action = action.span( "grey" );

				    if ( res.oldval )
					{
					    if ( res.oldval.length > maxLen ) 
					    	action += ' <br>';

				        action += ' ' + res.oldval.ent()
					    
					    if ( res.oldval.length > maxLen ) 
					    	action += ' <br>';

				        if ( res.newval ) 
				        	action += '&nbsp;to '.span( "grey" );
					}
				    if ( res.newval.length > maxLen )
				    	action += ' <br>';

					action += res.newval.ent()
				}

		        document.write( tagTD + action + '</td>' + tagTD );
		    	
		    	if ( res.success == "Succeeded" ) 
				{
		    		document.write(' Succeeded');
		    	}
		    	else
		    	{
					failCount++ ;
		    		document.write( ' FAILED'.span( "failed" ) );
		    	}
		        document.write( '</td></tr>' );
			}
		}
    }

}	// emitResults

function emitAuthResults ()
{
	var titleTD	 = '<td class="input" valign="top">' ;
	var statusTD = '<td class="input" valign="middle">' ;

	chgCount = 1 ;

	// find the prop that starts with "auth."
	var status = "" ;
	var action = "" ;
	var params = "" ;
	var res = null ;
	for ( var propName in results )
	{
		// shortcut to current result
		res = results[propName] ;

		// is there an actual change?
		if( -1 != propName.search( /auth\./ ) )
		{
			action = res.action.ent();
	    	if ( res.success == "Succeeded" ) 
			{
	    		status = 'Succeeded' ;
	    	}
	    	else
	    	{
	    		status = 'FAILED'.span( "failed" );
				if ( res.info && res.info.length )
				{
					for ( var i = 0; i < res.info.length; i++ )
					{
						if ( ! isBlank( res.info[ i ] ) )
						{
							status += '<BR>' + res.info[ i ].span( "red" );
						}
					}
				}
	    	}
		}
		else
		{
			if ( (res.newval != "") || (res.oldval != "") ) 
			{
				params += '<TR><TD class="input">' + propName.rightProp() + '</TD><TD \
class="input">' + res.newval + res.oldval + '</TD></TR>' ;  }
		}
	}

	// emit table headers
    document.write( '<tr><td class="popupTableHeader" valign="middle" \
width="450">Action</td><td class="popupTableHeader" valign="middle" \
width="40">Status</td></tr>' );  document.write( '<tr>' + titleTD + action );
	if ( params != "" )
	{
	    document.write( '<BR><BR><table width="50%" border=0 cellspacing=1 \
cellpadding=0><tr><td class="input"><B>parameter</B></td><td \
class="input"><B>value</B></td></tr>' );  document.write( params + '</table>' );
	}
    document.write( '</td>' + statusTD + status + '</td></tr>' );

}	// emitAuthResults

function emitFailures ()
{
	var desc = "<SPAN class='grey'>The following configuration change(s) could not be \
applied to the running server. To write the change(s) to the configuration file \
select the changes you wish to keep and click the Ok button. Changes made this way \
will not take effect until you restart the server.</SPAN>";

	var failParam 	= "" ;
	var failDisplay	= "" ;
	var res 		= null ;
	var s 			= "" ;
	var count		= 0;
    for ( var propName in results )
    {
		res = results[ propName ];
    	if ( res.success != "Succeeded" ) 
		{
			failParam = escape( propName.rightProp( -1 ) ) + "=" + escapePlus( res.newval );

			if( res.action == "Remove" )
			{
				failDisplay = "Delete " + propName.rightProp().ent() + 
					" (was set to '".span( "grey" ) + res.oldval.ent() + "')".span( "grey" );
			}
			else
			{
				failDisplay = "Set ".span( "grey" ) + propName.rightProp().ent() + " = '".span( \
"grey" ) +   res.newval.ent() + 
					( res.oldval ? "' (was '".span( "grey" ) + res.oldval.ent() + "')".span( "grey" \
) : "'" );  }

	        s += '<tr><td class="' + ((count++ % 2) ? 'odd">' : 'even">');
			s += '<input type="Checkbox" value="' + failParam + '" \
onclick="addFailure(this)">' + failDisplay ;  if ( res.info && res.info.length )
			{
				s += "<BR>";
				for ( var i = 0; i < res.info.length; i++ )
				{
					if ( ! isBlank( res.info[ i ] ) )
					{
						s += '<BR>' + res.info[ i ].span( "input" );
					}
				}
			}
	        s += '</td></tr>' ;
		}
    }
	if ( s )
	{
	    document.write( '<BR><TABLE border="0" cellpadding="6" cellspacing="1" \
                width="520">' );
        document.write( '<tr><td class="popupTableHeader" valign="middle" \
width="100%">FAILURES</td></tr>' );  document.write( '<tr><td class="even" \
colspan=3>' + desc + '</td></tr>' );  document.write( s );
		document.write( '</TABLE>' );
	}

}	// emitFailures

var restartMsg = "You must restart the server for the changes to take effect." ;
function doRestartAlert ( fDoIt, customMsg )
{
	// set fDoit to no-op this function - handy to pass some value that indicates \
whether   // changes occured
	// if the current page is a configvar response page then alert the user that they \
need  // to restart the server to bring the recent changes online
	// check for parent frame too!
	if ( fDoIt && isconfigvar )
	{
		alert( customMsg ? customMsg : restartMsg );
	}

}	// doRestartAlert ()

/* -------create failures submit string -------*/
var submitString = "" ;
function addFailure ( fail )
{
	
	if ( fail.checked )
		submitString += "&" + fail.value;
	else
	{
		reg = new RegExp("&" + fail.value);
		submitString = submitString.replace(reg, "");
	}
}

/* -------submit string to save failures to config file-------*/
function validate ()
{
	if ( ! failCount )
		window.close();

	if ( submitString )
	{
		return true ;
	}
	else
	{
		alert( "No values have been selected for submittal" );
		return false ;
	}

}

function doSubmit ()
{
	if ( ! failCount )
	{
		window.close();
	}

	if ( submitString )
		raSubmitChanges( "configvar", submitString, "Config Errors" );
}

function onLoad ()
{
	doRestartAlert( configvarChgCount );
	if ( curPort != newAdminPort )
	{
		reloadFrameset();
	}
}

onLoadHookFunc = onLoad;
</SCRIPT>

</HEAD>

<BODY 
	CLASS="popup"	
	onload="_onLoadDefault();"
	onunload="_onUnLoadDefault();"
> 
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule" height="7" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule">&nbsp;</SPAN>
	</TD>
</TR>
<TR>
   <TD align="left" valign="middle" bgcolor="#FFFFFF" height="49">
      <img src="images/popup_header.gif"  BORDER="0" HSPACE="0" VSPACE="0"></TD>
   <TD align="right" valign="middle" bgcolor="#FFFFFF" height="49">
		<img src="images/popup_logo.gif"  BORDER="0" HSPACE="20" VSPACE="0"></TD>
</TR>
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule2" height="9" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule2">&nbsp;</SPAN>
   </TD>
</TR>
</TABLE>
<CENTER>
<TABLE border="0" cellpadding="0" cellspacing="1" width="520">
<TR>
   <TD class="popupTitle" align="left" valign="bottom" width="100%">
      <BR>
      Configuration Change Results
   </TD>
</TR>
</TABLE>
<FORM 
	name="theForm"
	method="POST" 
	action="javascript:doSubmit();" 
	onsubmit="validate();"
	onreset="window.close();"
> 
<TABLE border="0" cellpadding="6" cellspacing="1" width="520">
<script LANGUAGE="javascript">
	emitResults();
	if ( (chgCount == 0) && (failCount == 0) )
	{
		document.write( '<tr><td class="body" valign="center" align="left">No changes were \
made to the ' + args.context + '.</td></tr>' );  }
</script>
</TABLE>

<script LANGUAGE="javascript">
	if ( failCount ) emitFailures();
</script>
<TABLE border="0" cellpadding="1" cellspacing="0" width="520">
<TR>
	<TD align="right" valign="middle">
		<BR>
		<script LANGUAGE="javascript">
			if ( failCount == 0 )
				document.write( '<a href="javascript://" onclick="window.close();"><img \
src="images/close.gif", border=0 alt="Close"></A>' );  else
				document.write( '<input type="image" border=0 src="images/okay.gif" name="Submit" \
value="Save failed changes to the config file" alt="Save failed changes to the config \
file">&nbsp;<a href="javascript:window.close();"><img src="images/cancel.gif", \
border="0" alt="Close"></A>' );  </script>
    </TD>
</TR>
</TABLE>

</FORM>

</CENTER>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>

</BODY>
</HTML>


--- NEW FILE: toc.html ---

<HTML>
<HEAD>

<script src="xblib.js"></script>
<SCRIPT SRC="tree.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>

<!-- grab registry license & platform info we need to decide wther to display/hide \
TOC links --> <SCRIPT \
SRC="servvar.get.html?l=license.Summary&pendingChanges=diffconfig.config,1&platform=server.platform&useGetMethod=config.AdminUseGetMethod"></SCRIPT>


<link rel=stylesheet href="toc_nav.css" type="text/css">
<STYLE TYPE="text/css">
	/* nav4 ignores \@import rule */
	@import url("toc_w3c.css");
</STYLE>

<SCRIPT LANGUAGE="JavaScript">

//ensure browser sniff variables are set
xblibInit();

// adjust the font size upward for X11/Mac browsers
if ( isX11 )
{
	document.write( "<STYLE TYPE='text/css'>DIV,A{font-size:medium;}</STYLE>" );
}
else if ( isMac && isNav4 )
{
	document.write( "<STYLE TYPE='text/css'>DIV,A{font-size:small;}</STYLE>" );
}

// make sure we're in the frameset
if ( window == top ) location = "index.html" ;

if ( ! isXblibInit ) xblibInit();

var	imgOpenSrc = "images/spacer_minus.gif" ;
var	imgCloseSrc = "images/spacer_plus.gif" ;
var	imgLeafSrc  = "images/spacer.gif" ;

var welcomePage = "welcome.html" ;

function onLoad ()
{

	//create the TOCTree (the constructor will save a ref to the obj in \
window.TheTOCTree)  var tree = new RSATOCTree();

	tree.m_bDoArrowKeyNav = false ;

	tree.m_bSyncTOCWithContent = false ;
	tree.m_bHiliteCurLink = true ;

	tree.m_hiColor = "white";
	tree.m_hiBGColor = "#E6E6E6";

	if ( isIE )
	{
		tree.m_basePath = "";
	}
	tree.m_imgOpenSrc  = imgOpenSrc ;
	tree.m_imgCloseSrc = imgCloseSrc ;
	tree.m_imgLeafSrc  = imgLeafSrc ;

	// various magic numbers for Nav4
	if ( isNav4 )
	{

		tree.m_nYOffset = 2 ;		// the Y pos for the first TOC link - we have to absolutly \
position it in Nav4

		// in Nav4 we can't read a folder's className attribute so we have to infer its \
level in the  // hierarchy by comparing its "left" attribute to the following:
		tree.m_nIndentDelta = 1 ;	// no. of pixels each class is indented - should match \
stylesheet  tree.m_nXOffset = 9;		// no. of pixels root level folder is indented - \
should match stylesheet  }

	tree.initialize();

	// open the starting page stored in the top window, or if none, the welcome page
	gotoPage( (top.startPage ? top.startPage : welcomePage) );

	top.tocReloading = false ;

	// reflect server-side state variable into frameset global
	top.pendingChanges = pendingChanges;

}	// onLoad ()

function onUnload ()
{
	// in case we're just refreshing the toc:
	// record the current page so that we can sync the toc when we reload
	// set a "tocReloading" flag so we know not to reload the main frame
	top.startPage = top.getCurPage();
	top.tocReloading = true ;
}

function gotoPage( url, fReplace )
{
	//! FOOOOOOOD
	var folderID = TOCLink.linkMap[ url ];
	if ( folderID != null )
	{
		TheTOCTree.si( url + ":" + folderID, true );
	}
	var f = top.frames[ "Main" ];
	if ( (! top.tocReloading) && f ) 
	{
		if ( ! fReplace )
		{
			f.location = url ;
		}
		else
		{
			// replace current page with url in history list 
			f.location.replace( url );
		}
	}
}

/*******************************************

	RSATOCTree - TOCTree sub class

*******************************************/
function RSATOCTree ()
{
	this.base = TOCTree ;
	this.base( window, top.frames.Main );
}
RSATOCTree.prototype = new TOCTree ;

RSATOCTree.prototype.applyHilite_IE4 = function ( folder )
{
	if ( this.m_hiColor )
		folder.children[ folder.children.length - 1 ].style.color = this.m_hiColor ;

	if ( this.m_hiBGColor )
		folder.children[ folder.children.length - 1 ].style.backgroundColor = \
this.m_hiBGColor ;

}	// applyHilite_IE4

RSATOCTree.prototype.applyHilite_Nav4 = function ( folder )
{
	if ( ! folder ) return;

	if ( this.isRootFolder( folder ) )
	{
		folder.bgColor = "#E6E6E6" ;
	}
	else
	{
		var iter = new FolderIter( folder );
		var parentFolder = iter.getParent();
		if ( parentFolder )
		{
			parentFolder.bgColor = "#E6E6E6" ;
		}

		folder.bgColor = "#E6E6E6" ;
	}

}	// applyHilite_Nav4

RSATOCTree.prototype.applyHilite_W3C = function ( folder )
{
	if ( this.isRootFolder( folder ) )
	{
		var aTags = folder.getElementsByTagName( "A" );
		aTags[ 1 ].style.color = "#336699" ;
		folder.style.backgroundColor = "#E6E6E6" ;
	}
	else
	{
		var iter = new FolderIter( folder );
		var parentFolder = iter.getParent();
		if ( parentFolder )
		{
			var aTags = parentFolder.getElementsByTagName( "A" );
			aTags[ 1 ].style.color = "#336699" ;
			parentFolder.style.backgroundColor = "#E6E6E6" ;
		}

		folder.lastChild.style.fontWeight = "bold" ;
		folder.style.border  = "solid #E6E6E6 1px" ;
	}

}	// applyHilite_W3C

RSATOCTree.prototype.removeHilite_IE4 = function ( folder )
{
	folder.children[ folder.children.length - 1 ].style.color = "" ;
	folder.children[ folder.children.length - 1 ].style.backgroundColor = "" ;

}	// removeHilite_IE4

RSATOCTree.prototype.removeHilite_Nav4 = function ( folder )
{
	if ( ! folder ) return;

	if ( this.isRootFolder( folder ) )
	{
		folder.bgColor = "#FFFFFF" ;
	}
	else
	{
		var iter = new FolderIter( folder );
		var parentFolder = iter.getParent();
		if ( parentFolder )
		{
			parentFolder.bgColor = "#FFFFFF" ;
		}

		folder.bgColor = "#FFFFFF" ;
	}

}	// removeHilite_Nav4

RSATOCTree.prototype.removeHilite_W3C = function ( folder )
{
	if ( this.isRootFolder( folder ) )
	{
		aTags = folder.getElementsByTagName( "A" );
		aTags[ 1 ].style.color = "#666666" ;
		folder.style.backgroundColor = "white" ;
	}
	else
	{
		var iter = new FolderIter( folder );
		var parentFolder = iter.getParent();
		if ( parentFolder )
		{
			aTags = parentFolder.getElementsByTagName( "A" );
			aTags[ 1 ].style.color = "#666666" ;
			parentFolder.style.backgroundColor = "white" ;
		}

		folder.lastChild.style.fontWeight = "normal" ;
		//folder.style.border = "" ;
		folder.style.border  = "solid #FFFFFF 0px" ;
	}

}	// removeHilite_W3C

/********************************

	TOCLink &
	TOCLinkLicensed Class Code

********************************/

function TOCLink 
(
	title,
	url,			
	parent
)
{
	this.title 		= title ;
	this.url 		= url ;
	this.parent 	= parent ;
	this.children	= new Array();
	this.bDisplay 	= true;

	if ( parent )
	{
		parent.addChild( this );
	}
	else	// add to root-level list of links
	{
		if ( ! TOCLink.parentList )
		{
			TOCLink.parentList = [];
			TOCLink.linkMap = [];	// maps <A> tags to their parent <DIV> tag ID's
		}

		TOCLink.parentList[ TOCLink.parentList.length ] = this ;
	}

	return this ;
}
TOCLink.divID = 0;
TOCLink.parentList = null;
TOCLink.linkMap = null;

TOCLink.emit = function ()
{
	for ( var i = 0; i < TOCLink.parentList.length; i++ )
	{ 
		TOCLink.parentList[ i ].emit( 0 );
	}
}

function TOCLinkLicensed
(
	title,
	url,			
	parent,
	licenseKey,		 // a registry key that must return a non-null value in order for this \
entry to be displayed, unless...  bDisplayDefault  // ... what to do if bDisplay is \
null )
{
	this.base = TOCLink ;
	this.base( title, url, parent );
	this.bDisplay = TOCLinkLicensed.isLiscensed( licenseKey, bDisplayDefault );

	return this ;
}
TOCLinkLicensed.prototype = new TOCLink ;

TOCLinkLicensed.isLiscensed = function ( keyPath, bDefault )
{

	key = l;
	a = keyPath.split( '.' );
	for ( var i = 0; i < a.length; i++ )
	{
		if ( ! (key && key[ a[ i ] ]) )
		{
			key = null;
			break;
		}

		key = key[ a[ i ] ];
	}

	return ( key == null ? bDefault : (key != "0") );
}

TOCLink.prototype.addChild = function ( child )
{
	this.children[ this.children.length ] = child ;
}

function makeFileBrowserSpecfic ( fileName )
{
	var browserTag = ( isIE ? "_ie" : "_nav" );
	return fileName.replace( /\./, browserTag + "." );
}

TOCLink.prototype.emit = function ( level )
{
	// no display if not licensed and/or none of its' children are licensed
	if ( ! this.isDisplayable() )
		return ;

	var linkTag = "";
	var tfLinkTag = '<A href="javascript://" onclick="TheTOCTree.tf(' + TOCLink.divID + \
');">';

	if ( ! this.url )
	{
		// if the folder doesn't have a content link then link the title to the \
toggleFolder function  linkTag = tfLinkTag + this.title + "</A>";
	}
	else
	{
		linkTag = "<A href='javascript://' onclick='";
		if ( ! this.url.bSearch( /javascript/i ) )
		{
			linkTag += "TheTOCTree.si(\"" + this.url + ":" + TOCLink.divID + "\")'>" + \
this.title + "</A>" ;  }
		else
		{
			linkTag += this.url + "'>" + this.title + "</A>" 
		}
	}

	var classAttr = ' class="l' + level + '"' ;
	var divTag = '<DIV bgColor="white" id="z' + TOCLink.divID + '"' ;

	var imgTagStart = '<IMG BORDER=0 SRC="' ;
	var imgTag ;
	if ( this.children.length )
		imgTag= tfLinkTag + imgTagStart + imgCloseSrc + '"></A>' ;
	else	
		imgTag= "<A>" + imgTagStart + imgLeafSrc + '"></A>' ;

	// update URL -> divID map
	TOCLink.linkMap[ (this.url ? this.url : this.title) ] = TOCLink.divID;

	if ( isNav4 )
	{
		if ( ! this.url )
		{
		  	document.write( divTag + classAttr + '>' + imgTag + '<TABLE BORDER="1" \
BORDERCOLOR="#E6E6E6" CELLPADDING="4" CELLSPACING="0" WIDTH="100%"><TR><TD \
VALIGN="MIDDLE" WIDTH="100%">' + linkTag + '</TD></TR></TABLE></DIV>' );  }
		else
		{
		  	document.write( divTag + classAttr + '>' + imgTag + '<TABLE BORDER="0" \
CELLPADDING="1" CELLSPACING="0" WIDTH="100%"><TR><TD VALIGN="MIDDLE" WIDTH="100%">' + \
linkTag + '</TD></TR></TABLE></DIV>' );  }
		//document.write( divTag + classAttr + '>' + imgTag + linkTag + '</DIV>' );
	}
	else
	{
	  	document.write( divTag + classAttr + '>' + imgTag + '<TABLE BORDER="0" \
CELLPADDING="0" CELLSPACING="0" BORDER="0" WIDTH="100%"><TR><TD VALIGN="MIDDLE" \
WIDTH="100%">' + linkTag + '</TD></TR></TABLE></DIV>' );  }
	TOCLink.divID++ ;

	// now emit the children
	for ( var i = 0; i < this.children.length; i++ )
	{
		this.children[ i ].emit( level + 1 );
	}
}

// return true if the this entry and/or any of its children 
// will be displayed
TOCLink.prototype.isDisplayable = function ()
{
	// if there are displayable children the parent must be displayed
	if ( this.children.length )
	{
		for ( var i = 0; i < this.children.length; i++ )
		{
			if ( this.children[ i ].isDisplayable() )
				return true ;
		}
	}

	return ( this.url && this.bDisplay );
}

</SCRIPT>

<SCRIPT SRC="toc.js"></SCRIPT>

</HEAD>

<BODY 
	onload="onLoad();"
	onUnload="onUnload();"
> 

<SCRIPT>
createTOCLinks();
document.open();
TOCLink.emit();
document.close();
</SCRIPT>

</BODY>
</HTML>

--- NEW FILE: config_ports.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Ports</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "15";
</SCRIPT>

<SCRIPT SRC="propview_nolist.js"></SCRIPT>
<SCRIPT SRC="port.js"></SCRIPT>
<SCRIPT SRC="servvar.get.html?serverData=config"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
var propSet = 
[
	new PropObj( 'AdminPort',		 	"",	 false, false,  null, null, "port", 		 "Admin Port" \
),

	new PropObj( 'UDPResendPortRange',	"",	 false, false,  null, null, "portrange", "UDP \
Resend Port Range" ),  new PropObj( 'RTSPPort',		"554",	 false, true,  null, null, \
"port", 	"RTSP Port" ),

	new PropObj( 'MMSPort',			"1755",	 false, true,  null, null, "port", 	"MMS Port" ),

	new PropObj( 'HTTPPort',		"80",	 false, true,  null, null, "port", 	"HTTP Port" ),
	new PropObj( 'MonitorPort',		"9090",	 false, true,  null, null, "port", 	"Monitor \
Port" ),  new PropObj( 'CloakingHint',	"1",	 false, true,  null, null, "int", \
"Cloaking Hint" ),

	new PropObj( "FSMount.ASX File Generator.HaveAltHTTPURL", "0", false, true, null, \
null, "int", "" ),

];

function PortsPropView ()
{
	this.base = PropListView ;
	this.base( "Ports", propList, "config.", "servvar", "theForm" );
}
PortsPropView.prototype = new PropListView ;

PortsPropView.prototype.postIsDirty = function ()
{

	return ( isCtrlDirty( theForm.UDPResendPortRange1 ) || 
			 isCtrlDirty( theForm.UDPResendPortRange2 ) );
}

PortsPropView.prototype.preValidate = function ()
{

	if ( ! thePortRange.validate( theForm ) )
		return false ;

	return true;
}

PortsPropView.prototype.postValidate = function ()
{
	//check for port conflicts
	var ctrl = null;
	var msg = "";
	for ( var propName in propList.props() )
	{
		var prop = propList.prop( propName );
		if ( prop && prop.isDirty() && propName.bSearch( /port/i ) )
		{
			ctrl = (propName.bSearch( /Range/ ) ? theForm.PortRange0 : 
					prop.getCtrl( theForm )); //TODO create a PortRange sub class of PropObj!

			// check for port conflict with the rest of the server configuration
			var conflict = findPortConflictName( prop.getValue() )
			if ( conflict )
			{
				msg = getConflictErrMsg( conflict, prop.label );
			}

			//check for conflicts with other ports on this page
			for ( var propName2 in propList.props() )
			{
				if ( propName2 != propName )
				{
					var prop2 = propList.prop( propName2 );
					if ( prop2 )
					{
						if ( propName.bSearch( /Range/ ) && prop.getValue() )
						{
							if ( isPortRangeOverlap( prop.getValue(), prop2.getValue(), prop2.getValue() ) \
)  {
								msg = "The " + prop2.label + " is in the " + prop.label + ".";
							}
						}
						else if ( propName2.bSearch( /Range/ ) && prop2.getValue() )
						{
							if ( isPortRangeOverlap( prop2.getValue(), prop.getValue(), prop.getValue() ) \
)  {
								msg = "The " + prop.label + " is in the " + prop2.label + ".";
							}
						}
						else if ( prop.getValue() && (prop.getValue() == prop2.getValue()) )
						{
							msg = "The " + prop.label + " and " + prop2.label + " cannot share the same \
port value.";  }
					}
				}
				if ( msg ) break;
			}
		}
		if ( msg ) break;
	}

	if ( msg )
	{
		if ( ctrl )
		{
			return rejectInput( ctrl, msg );
		}
		else
		{
			alert( msg );
			return false;
		}
	}

	return true;
}

initAllPortsList( serverData,
	'AdminPort',
	'HTTPPort',
	'UDPResendPortRange',
	'RTSPPort',
	'MMSPort',
	'MonitorPort' );

var propList = new PropList( "ports", serverData, propSet );
var propView = new PortsPropView();

var thePortRange = new PortRangeCtrl( "UDPResendPortRange", null, false );

var tocFrame = findFrame( "TOC" );
var theForm ;
						
function onLoad ()
{
	theForm = document.theForm;

	propView.onLoad( window );

	thePortRange.fillForm( theForm );

}
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">SERVER SETUP</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
The port numbers shown below are where the server listens for HTTP, RTSP, 
Monitor, and Admin requests. Keeping the default values will result in the widest 
possible number of users able to access your content. If you do decide to change 
these values from their default, you will need to add the new port numbers to all 
links. The server also uses specific ports for encoders, splitting, and 
multicasting.
<BR>
<BR>
<span class="stronger">
	The Admin Port has been initialized to a random value for security.
	Please verify this pre-assigned port will not interfere with ports already 
	in use by your system.
</span>
<br>
<br>
To use a port lower than 1024 on a UNIX system, you must be logged on as super-user.
</td></tr>
</TABLE>
<BR>

<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 

<INPUT type="hidden" name="UDPResendPortRange">
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Ports</TD> <TD bgcolor="#FFFFFF" \
width="20"><img src="images/diagonal.gif"></TD> <TD bgcolor="#FFFFFF" width="194" \
align="right"><SPAN ID="RESTART_IMG_SPAN" STYLE="visibility:hidden;"><A \
HREF="javascript://" onclick="displayChanges()"><img src="images/spacer.gif"  \
BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" VSPACE="0" \
WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">RTSP Port</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="input" MAXLENGTH="255" NAME="RTSPPort" SIZE="6" TYPE="text" \
VALUE=""><SPAN CLASS="unitsOffset">&nbsp;(default is 554)</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">HTTP Port</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="input" MAXLENGTH="255" NAME="HTTPPort" SIZE="6" TYPE="text" \
VALUE=""><SPAN CLASS="unitsOffset">&nbsp;(default is 80)</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">MMS Port</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="input" MAXLENGTH="255" NAME="MMSPort" SIZE="6" TYPE="text" \
VALUE=""><SPAN CLASS="unitsOffset">&nbsp;(default is 1755)</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Monitor Port</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="input" MAXLENGTH="255" NAME="MonitorPort" SIZE="6" TYPE="text" \
VALUE=""><SPAN CLASS="unitsOffset">&nbsp;(default is 9090)</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">Admin Port</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input CLASS="input" MAXLENGTH="255" NAME="AdminPort" SIZE="6" TYPE="text" \
VALUE=""><SPAN CLASS="units"><BR>Caution: If you change the Admin Port value, you \
                must 
	                				remember the new value to log back on to the Administrator. 
	                				Also, you will need to update any URL references to these 
	                				pages with the new port number.
	        					   <BR><BR>
	        					   <A class="linkTextSmall" \
HREF="javascript:tocFrame.gotoPage('config_sec_uauth.html')">Create</a>  user names \
and passwords for Administrators.</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			Enable Ramgen Port Hinting URLs
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<select CLASS="input" NAME="CloakingHint" SIZE="1" WIDTH="91">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT><SPAN CLASS="units"><BR>Include HTTP port in URLs for cloaked \
users</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			Enable HTTP Fail Over URL for ASXGen
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<select CLASS="input" NAME="FSMount.ASX File Generator.HaveAltHTTPURL" SIZE="1" \
WIDTH="91">  <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="40%">
			<span class="offsetLabel">UDP Resend Port Range</span>
		</td>
		<TD class="input" valign="top" align="left" width="60%">
			<input type="text" class="input" name="UDPResendPortRange1" size="6" \
maxlength="5"><span class="unitsOffset">&nbsp;to&nbsp;</span><input type="text" \
class="input" name="UDPResendPortRange2" size="6" maxlength="5">  </td>
	</tr>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: toc.js ---

function createTOCLinks ()
{
	// *** General Setup ***
	var tmpParent = new TOCLink( "Server Setup", "" );

	new TOCLink( "Ports", "config_ports.html", tmpParent );
	new TOCLink( "IP Binding", "config_binding.html", tmpParent );
	new TOCLink( "MIME Types", "config_mimetypes.html", tmpParent );
	new TOCLink( "Connection Control", "config_cc.html", tmpParent );
	new TOCLink( "Redundant Servers", "config_altserv.html", tmpParent );
	new TOCLink( "Mount Points", "config_localFS.html", tmpParent );
	new TOCLink( "URL Aliasing", "config_alias.html", tmpParent );
	new TOCLink( "HTTP Delivery", "config_delivery.html", tmpParent );
	new TOCLink( "Cache Directives", "config_pc_cache.html", tmpParent );
	new TOCLink( "Delayed Shutdown", "config_shutdown.html", tmpParent );

	if ( platform && (-1 == platform.indexOf( "WinNT" )) ) // UNIX platform
	{
		new TOCLink( "User/Group Name", "config_setid.html", tmpParent );
	}

	// *** Mobile Extensions ***
	tmpParent = new TOCLink( "Transport Settings", "" );

	
	new TOCLink( "Differentiated Services", "config_qos.html", tmpParent );
	new TOCLink( "Rate Management", "config_rate.html", tmpParent );

	// *** Security ***
	tmpParent = new TOCLink( "Security", "" );

	new TOCLink( "Access Control", "config_sec_ac.html", tmpParent );
	new TOCLink( "User Databases", "config_sec_db.html", tmpParent );
	new TOCLink( "Authentication", "config_sec_uauth.html", tmpParent );
	new TOCLinkLicensed( "Commerce", "config_sec_rules.html", tmpParent, \
"Authentication.Commerce.Access" );

	// *** Logging/Monitor ***
	tmpParent = new TOCLink( "Logging & Monitoring", "" );

	new TOCLink( "Server Monitor", "mongraph.nc.html", tmpParent );
	new TOCLink( "Basic Logging", "config_logging.html", tmpParent );
	new TOCLink( "Advanced Logging", "config_clog.html", tmpParent );
	new TOCLinkLicensed( "SNMP", "config_snmp.html", tmpParent, "General.SNMP" );

	// *** Broadcasting ***
	tmpParent = new TOCLink( "Broadcasting", "" );

	new TOCLink( "RealNetworks Encoding", "config_broad_real.html", tmpParent );
	new TOCLinkLicensed( "QT & RTP Encoding", "config_broad_rtp.html", tmpParent, \
"DataTypes.QuickTime.Enabled", true );  new TOCLink( "Windows Media Encoding", \
"config_broad_wm.html", tmpParent );  new TOCLink( "Live Archiving ", \
"config_broad_archive.html", tmpParent );  new TOCLinkLicensed( "Broadcast \
Redundancy", "config_broad_redun.html", tmpParent, "BroadcastRedundancy.Enabled", \
true );

	// *** Broadcast Distribution ***
	tmpParent = new TOCLink( "Broadcast Distribution", "" );

	new TOCLinkLicensed( "Transmitter", "config_spl_dist.html", tmpParent, \
"BroadcastDistribution.PushTransmissionEnabled" );  new TOCLinkLicensed( "Receiver", \
"config_spl_recv.html", tmpParent, "BroadcastDistribution.PushReceiveEnabled" );  new \
TOCLinkLicensed( "Scalable Multicasting", "config_mc_scale.html", tmpParent, \
"Multicast.Scalable" );  new TOCLinkLicensed( "Back-Channel Multicasting", \
"config_mc_bc.html", tmpParent, "Multicast.General" );  new TOCLinkLicensed( "Windows \
Media Multicasting", "config_mc_wm.html", tmpParent, "Multicast.WindowsMedia" );  new \
TOCLinkLicensed( "Session Announcement", "config_mc_sap.html", tmpParent, \
"Multicast.General" );

	// *** Content Mgmt ***
	var tmpParent = new TOCLink( "Content Management", "" );

	new TOCLink( "Content Caching", "config_cdist.html", tmpParent );
	new TOCLinkLicensed( "ISP Hosting", "config_isp.html", tmpParent, \
"ISP-Hosting.Enabled" );  new TOCLink( "Content Browsing", \
"config_content_browsing.html", tmpParent );  new TOCLink( "View Source", \
"config_viewsrc.html", tmpParent);

}	// createTOCLinks ()

--- NEW FILE: main_nav4_x.css ---

BODY
{
	background-color: #FFFFFF;
	font-family:      Verdana, Arial, Helvetica, sans-serif;
}

BODY.CONFIG
{
	padding-left:	30 ;
}

BODY.POPUP
{
	padding:		  0;
	margin:			  0;
}
DIV.popupPad
{
	padding-right:	0px;
	padding-bottom:	0px;
	padding-top:	20;
	padding-left:	20;
}

/* gives a little space after the tab header */
TABLE.formTable
{
	margin-top:	1px;
}

A
{ 
	font-size:        12pt;
	font-weight:      500;
	color:            #0033FF;
	text-Decoration:	underline ;
}

FORM
{
	margin:		0;
	padding: 	0;
}

TABLE
{
	margin:		0 ;
}
TD
{ 
	font-family:      Verdana, Arial, Helvetica, sans-serif;
}
TD.body
{ 
  font-size:        12pt;
  font-weight:      normal;
  font-style:       Normal;
  color:            #333350;
  text-indent:      0pt;
}
TD.title2, .title2
{ 
  font-size:        12pt;
  font-weight:      600;																						 
  color:            #336699;
  background-Color: #E6E6E6;
}
TD.input

{ 
  font-size:        12pt;
  font-weight:      500;
  color:            #336699;
  background-Color: #E6E6E6;
  font-family:      Verdana, Arial, Helvetica, sans-serif;
}

SPAN.input, SPAN.FormHeader
{ 
  font-size:        12pt;
  font-weight:      500;
  font-family:      Verdana, Arial, Helvetica, sans-serif;
  color:            #336699;
  background-Color: #E6E6E6;
}
SPAN.FormHeader
{
	font-weight:	600;
}

.units, .unitsOffset
{ 
  font-size:        12pt;
  color:            #666666;
}

.unitsOffset
{
	position:	relative;
	top:		0;
}

.offset
{
	position:	relative;
	top:		0;
}
SELECT, INPUT, TEXTAREA, SPAN.readOnlyValue, FONT.input
{ 
  font-family:      Verdana, Arial, Helvetica, sans-serif;
  font-size:        12pt;
  font-weight:      500;
  color:            black;
}
.body
{ 
	font-family:      Verdana, Arial, Helvetica, sans-serif;
	font-size:        12pt;
	font-weight:      normal;
	font-style:       Normal;
	color:            #333350;
	text-indent:      0pt;
}
.stronger
{ 
  font-size:        12pt;
  font-weight:      600;
  font-style:       Normal;
  color:            #474770;
}
.longInput
{
	width: 100% ;
}

.medInput
{
	width: 50% ;
}

.threeQInput
{
	width: 75% ;
}
.offsetLabel
{
	position:relative;
	top:	12;
}
.offsetLabelSelect
{
	position:relative;
	top:	12;
}

/* used on HELP, SAMPLES, & CONFIGURE pages */
.PARA
{
	margin-left: 20;
	margin-bottom: 12;
	font-size:        12pt;
}

.PARAHEAD
{
	font-size: 		  large;
	font-weight:      600;
	font-style:       Normal;
	color:            #336699;
}
/* new stuff */

.bodyText, .bodyTextBold
{
	font-family:      Verdana, Arial, Helvetica, sans-serif;
	font-size:        12pt;
	font-weight:      500;
	font-style:       Normal;
	color:            #666666;
	text-indent:      0;
}

.bodyTextBold
{
	font-weight:      600;
}

TD.bodyText A
{ 
	font-size:        12pt;
}
.headline
{ 
	font-family:      Verdana, Arial, Helvetica, sans-serif;
	font-size: 		  large;
	font-weight:      500;
	font-style:       Normal;
	color:            #336699;
	text-indent:      2em;
	letter-spacing:	  3pt;

	/* to squeeze the headline and headline rule together */
	position:		  relative;	
	top:			  5;
}
.headlineRule
{ 
	font-size:        4pt;
	background-color: #336699;
}

.headerRule
{ 
	font-size:        4pt;
	background-color: #336699;
}

.headerRule2
{ 
	font-size:        4pt;
	background-color: #336699;
}
.linkText, .linkTextSmall
{
	font-size: 		12pt;
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	color:			#FF6600;
	letter-spacing:	normal;
	TEXT-DECORATION: none;
}

.linkTextSmall
{
	font-size: 		12pt;
}

A:hover    
{
	TEXT-DECORATION: underline;
}

.TabText
{
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	font-size: 		14pt;
	color:          #336699;
	font-weight:	600;
}

.popupTableHeader, .popupTitle
{
	background-color: #999999;
	color:			  white;
	font-family:	Tahoma, Arial, Helvetica, sans-serif;
	font-size:		12pt;
	font-weight:	bold;
}

.popupTitle
{
	background-color: 	#FFFFFF;
	color:			  	#336699;
	font-size: 		large;
}

TD.odd, TD.even
{
	font-size:        12pt;
	font-weight:      500;
	color:            #336699;
	background-Color: #FFFFFF;
}

TD.even
{
	background-Color: #E6E6E6;
}

.grey,SPAN.body
{
	color:            #666666;
	font-size:        12pt;
}
.PROPLIST_LABEL
{width:100%;}
.absolute
{ 
	position:absolute; 
	visibility:hidden; 
	z-index:10;
}
/* header frame specific */

.headerServerLabel, .headerServerName
{
	text-indent: 	12px;
	font-size: 		14pt;
	font-family:	Verdana, Arial, Helvetica, sans-serif;
	color:			white;
	letter-spacing:	normal;
}

.headerServerName
{
	text-indent: 	0;
	font-weight:	600;
}
/* about page specific */

.labelOdd, .valueOdd, .labelEven, .valueEven
{
  font-size:        12pt;
  font-weight:      500;
  color:            #336699;
  background-Color: #FFFFFF;
}

.labelEven, .valueEven
{
  background-Color: #E6E6E6;
}

.valueEven, .valueOdd
{
	color:            #666666;
}

.licenseTitle
{ 
  font-size: 		12pt;
  font-weight:      bold;
  color:            #666666;
  background-Color: #FFFFFF;
}

.trademarkBorder
{
	width:					550px;

	padding-top:			0px;
	padding-bottom:			0px;
	padding-left:			0px;
	padding-right:			0px;

	margin-top:				10px;
	margin-bottom:			0px;
	margin-left:			0px;
	margin-right:			0px;

	border-color:			#E6E6E6;

	border-top-width:		2px;
	border-bottom-width:	2px;
	border-left-width:		0px;
	border-right-width:		0px;

	border-top-style:		solid;
	border-bottom-style:	solid;
	border-left-style:		none;
	border-right-style:		none;
}



--- NEW FILE: config_binding.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>IP Binding</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "3";
</SCRIPT>

<SCRIPT SRC="enumproplist.js"></SCRIPT>
<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="BigInt.js"></SCRIPT>
<SCRIPT SRC="ip.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?serverData=config.IPBindings&diffConfig=diffconfig"></SCRIPT>


<SCRIPT LANGUAGE="javascript">
var theForm = null;

var propList = new EnumPropListSel( 'IPBindings', serverData, "Address_", 1, \
"theList" ) function IPPropView ()
{
	this.base = NestedPropListView ;
	this.base( "IP Bindings", propList, "IP Address", 
				"config.IPBindings.", "configvar", 
				"theForm", "theList", "theEdit" );
}
IPPropView.prototype = new NestedPropListView ;

IPPropView.prototype.preValidateSubList = function ( subListName )
{

	var addr = getCtrlValue( theForm.theEdit );
	if ( (!propList.netmaskany_validate( addr )) && 
    	 (addr.toLowerCase() != "ipv4") &&
    	 (addr.toLowerCase() != "ipv6") )
	{
		return rejectInput( theForm.theEdit, propList.errMsg );
	}

	var selCtrl = theForm.theList;
	for ( var i = 0; i < selCtrl.length; i++ )
	{
		// don't compare the current item to itself
		if ( (i != this.m_oES.m_curIndex) && (subListName == selCtrl.options[ i ].text) )
		{
			return rejectInput( theForm.theEdit, "An IP address may only be used once in the \
IP Bindings list." );  }
	}

	return true ;
}

IPPropView.prototype.preValidate = function ()
{
	var selCtrl = theForm.theList;
	if (selCtrl.length > 1)
	{
		for ( var i = 0; i < selCtrl.length; i++ )
		{
			var ip = new IPAddressAllowAny( selCtrl.options[ i ].text );
			if ( (ip.isUnspecified ||
	             (ip.sAddress.toLowerCase() == "any") ||
	             (ip.sAddress.toLowerCase() == "ipv4") ||
	             (ip.sAddress.toLowerCase() == "ipv6")) )
			{
				return rejectInput( theForm.theEdit, 
					"The IP address '0' or the key words 'Any', 'IPv4' or 'IPv6' may not be used \
with any other IP Addresses in the IP Bindings list." );  }
		}
	}

	return true;
}

IPPropView.prototype.onESRename = function ( oldSubListName, newSubListName )
{
	if ( ! this.m_bLoaded ) return ;

	// no validation here - validate during preValidateSubList

	this.m_subListParent.renameSubList( oldSubListName, newSubListName );
	this.m_curSubListName = newSubListName ;
	this.onSubListChangeNotify( "rename", oldSubListName, newSubListName );

	return true ;

}	// onESRename ()

IPPropView.prototype.removeSubList = function ()
{
	if ( ! this.m_bLoaded ) return ;

	if ( ! this.m_curSubListName )
	{
		return;
	}
		
	// in case the sublist was renamed
	if ( ! this.m_oES.doRenameCheck() )
		return ;

	
	
    if ( this.confirmRemoveSubList( this.m_curSubListName ) )
	{
		var deletedSubListName = this.m_curSubListName;
		// mark as 'deleted'
		this.m_oES.remove();
		this.onSubListChangeNotify( "delete", deletedSubListName );
		this.fillFormFromSubList( false );
	}

}	// removeSubList ()

var propView = new IPPropView();

function onLoad ()
{
	theForm = document.theForm ;

	checkForPendingChanges( diffConfig );

	propView.onLoad( window );
	propView.m_oES.m_reIllegalChars = null;
	propView.m_oES.sync();

}	// onLoad
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">SERVER SETUP</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
If the server is installed on a system that has more than one IP 
address you may need to indicate which IP address or addresses the 
server should use. Addresses on this list are then reserved 
for the server's exclusive use. 
<BR>

To reserve all IP addresses on this system for server use, add 
the IP address 0.0.0.0 and remove all other addresses from the list.
</td></tr>
</TABLE>
<BR>

<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>IP Binding</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<tr>                               
    <td class="input" valign="top" width="50%">
		<TABLE CLASS="PROPLIST_LABEL" width="226" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">IP Addresses</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList('0.0.0.0')"><IMG src="images/add_g.gif" HSPACE=1 \
ALT="Add New IP Address" BORDER=0></A><A href="javascript://" \
onclick="propView.removeSubList()"><IMG src="images/delete_g.gif" HSPACE=1 \
ALT="Remove Current IP Address" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theList" SIZE="5" WIDTH="226">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="50%">
		Edit IP Address
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theEdit" SIZE="18" TYPE="text" \
VALUE="">  <SPAN CLASS="units"><BR>Must be a valid IP Address or the server will not \
run</SPAN>  </TD>
</TR>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" VALIGN="middle" width="100%" class="body" \
                ALIGN="left">
      <FONT color="red">*A server restart is required to effect changes applied to \
this page.</FONT>  </TD>
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: propview_noedit.js ---

//<SCRIPT>

function NestedPropListViewNoEdit ( listName, propList, itemLabel, configRootPath, \
serverMethod,  sFormName, sListName, aDirtyImgNames )
{

	if ( ! NestedPropListView.bIsInitialized )
		NestedPropListView.initClass();

	this.base = NestedPropListView ;

	this.m_name = listName;
	this.m_itemLabel = itemLabel ;
	this.m_itemDefValue = itemLabel ;

	this.m_configRootPath = configRootPath;
	this.m_serverMethod = (serverMethod ? serverMethod : "servvar");

	this.m_propList = propList ;
	this.m_subListParent = this.m_propList;

	this.m_submitString = "";
	this.m_oWin = null;
	this.m_oDoc = null;

	this.m_sFormName = sFormName ;
	this.m_sListName = sListName ;
	this.m_aDirtyImgNames = (aDirtyImgNames ? aDirtyImgNames : ["IMG_DIRTY_TAB", \
"IMG_DIRTY_APPLY"] );

	this.m_parent = null ;

	this.m_resultsTitleListIndex = 3;
	this.m_resultsTitlePropIndex = 4;

	this.m_curSubListName = "";

	this.m_origListChangeHandler = null;
	this.m_origClickHandler = null;
	this.m_origKeyUpHandler = null;

	this.m_bDoDirtyCheck = true ;

	this.m_imgSrcDirty = NestedPropListView.imgSrcDirty;
	this.m_imgSrcClean = NestedPropListView.imgSrcClean;

	this.m_hDirtyCheckTimerID = null;

	this.m_subViews = new Array();

	this.m_bLoaded = false;

}	// NestedPropListViewNoEdit ()
NestedPropListViewNoEdit.prototype = new NestedPropListView ;

NestedPropListViewNoEdit.prototype.getEditCtrl = function ()
{
	return null ;
}

/* 
	before calling this function make sure the propList member has been initialized.
	
	Call this method from your pages onload handler, passing in the
	following page element/obj references:
		oWin		the page's window object, required

	after using the parameters to initialize the object's member properties, onPrelLoad \
is called. This allows  subclasses to perform any need initialization. The base \
class's implementation jsut returns true, if an   subclass's onPreLoad returns false \
the bodyof onLoad is skipped.

	The bodyof this method initializes the form using propList data as well as creating \
an EditSelect obj  to tie the list and edit controls together.

	onPostLoad is then called at the end. A do nothing method in the base class \
onPostLoad should be overridden  in sub classes to perform custom actions - \
                hide/show/resize elements etc.
*/
NestedPropListViewNoEdit.prototype.onLoad = function ( oWin, fNoInitForm, \
fNoDisplayData ) {

	// initialize member variables TODO validate parameters	
	if (! oWin ) return;

	if ( ! isXblibInit ) xblibInit();

	this.m_oWin = oWin;
	this.m_oDoc = oWin.document;

	this.m_bLoaded = true ;

	if ( this.preOnLoad() )
	{
		this.m_propList.reset();

		if( this.m_bDoDirtyCheck )
			this.showDirtyFlag( false );

		if ( ! fNoInitForm )
			clearForm( this.getForm() );

		//init any subViews
		for ( var subViewName in this.m_subViews )
		{
			var subView = this.m_subViews[ subViewName ];
			if ( subView )
			{
				subView.onLoad( oWin, true, true );
			}
		}

		if ( ! fNoDisplayData )
		{
			this.initListDataDisplay();
		}

		if ( ! fNoInitForm )
			this.hookForm();

		//because of Mozilla Bug 49980 (as of 4/11/01) we can't use anonymous functions
		//as event handlers - so we assign the instance method call generated by
		// getInstanceEventHandler() to a variable of parent window...
		this.m_oWin._onSelChange = getInstanceEventHandler( this, "onSelChange" );
		//... and then hook it in as the ctrl's change handler
		this.origOnSelChangeHandler = addEvent( this.getListCtrl(), "change", 
			this.m_oWin._onSelChange );
	}
	this.postOnLoad();

}	// onLoad()

NestedPropListViewNoEdit.prototype.onSelChange = function ()
{
	if ( ! this.m_bLoaded ) return ;

	return this.fillFormFromSubList( true );

}	// onESSelChange ()

NestedPropListViewNoEdit.prototype.initListDataDisplay = function ()
{
	this.fillSelectList();
	this.m_propList.fillForm( this.getForm() );
	this.fillFormFromSubList( false );
}

NestedPropListViewNoEdit.prototype.fillFormFromSubList = function ( fValidate )
{
	if ( ! this.m_bLoaded ) return ;

	var listCtrl = this.getListCtrl();
	if ( ! listCtrl ) return ;
	
	var newSubListName = getCtrlValue( listCtrl );
	if ( ! newSubListName ) return ;

	// before filling in the controls with the newly selected sublist's value's
	// validate and store chgs for the current (or old) sublist
	if ( this.m_curSubListName && fValidate && ( ! this.validateSubList() ) )
	{
		return false ;
	}
	
	if ( ! newSubListName ) return false ;

	this.m_curSubListName = newSubListName ;
	var subList = this.getSubList( newSubListName );
	if ( subList )
	{
		subList.fillForm( this.getForm( newSubListName ) );

		//set the propList and fill the select list of any subViews
		for ( var subViewName in this.m_subViews )
		{
			var subView = this.m_subViews[ subViewName ];
			if ( subView && subView.m_bLoaded )
			{
				var subSubList = subList.subList( subViewName );
				if ( subSubList )
				{
					subView.setPropList( subSubList );
					subView.initListDataDisplay();
				} 
			}
		}
	}

	return this.postFillFormFromSubList( fValidate );

}	// fillFormFromSubList ()

NestedPropListViewNoEdit.prototype.validateSubList = function ( subListName )
{
	if ( ! this.m_bLoaded ) return ;

	if ( isBlank( subListName ) )
	{
		subListName = this.m_curSubListName ;
	}

	if ( ! this.preValidateSubList( subListName ) )
	{
		
		return false ;
	}
	var subList = this.m_subListParent.subList( subListName );
	if ( subList )
	{
		var ctrl = subList.validate( this.getForm( subListName ) );
		if ( ctrl ) 
		{
			return rejectInput( ctrl, subList.errMsg );
		}
	}

	//validate any subViews
	for ( var subViewName in this.m_subViews )
	{
		var subView = this.m_subViews[ subViewName ];
		if ( subView && subView.m_bLoaded )
		{
			if ( ! subView.validateSubList() )
				return false ;
		}
	}

	if ( ! this.postValidateSubList( subListName ) )
	{
		
		return false ;
	}

	return true ;

}	// validateSubList ()

// *******  ADD / EDIT / REMOVE / COPY SUBLIST FUNCTIONS ********

NestedPropListViewNoEdit.prototype.onESRename = function ( oldSubListName, \
newSubListName ) {
	// no renaming allowed
	return false ;

}	// onESRename ()

// called when the select control is empty and the user types into 
// the edit control - create a new sublist with the entered text as the
// sublist name
NestedPropListViewNoEdit.prototype.onESAddNew = function ( oES )
{
	// can't add a list this way

}	// onESAddNew ()

NestedPropListViewNoEdit.prototype.createSubList = function ( subListName )
{
	if ( ! this.m_bLoaded ) return ;

	// validate and save the current list's values
	if ( this.m_curSubListName && ( ! this.validateSubList() ) ) 
	{
		return ;
	}

	var listCtrl = this.getListCtrl();
	if ( ! listCtrl ) return ;

	if ( subListName )
	{
		selAddOption( listCtrl, subListName, subListName, true );
	}
	else
	{
		subListName = selAddGeneric( listCtrl, this.m_itemDefValue, 1, \
this.m_itemDefValuePostFix );  }

    if ( subListName )
	{
		this.m_curSubListName = subListName;
		var subList = new PropList( subListName, [], this.m_subListParent.m_propSetSubLists \
);  this.m_subListParent.addSubList( subList, "added" );
		subList.clearForm( this.getForm( subListName ) );
		this.fillFormFromSubList( false );
		this.onSubListChangeNotify( "add", subListName );
	}

}	// createSubList ()

NestedPropListViewNoEdit.prototype.copySubList = function ()
{
	if ( ! this.m_bLoaded ) return ;

	if ( ! this.m_curSubListName )
	{
		/*alert( "Select " + this.m_name + " to copy" );*/
		return ;
	}

	// validate and save the current list's values
	if ( this.m_curSubListName && ( ! this.validateSubList() ) ) 
	{
		return ;
	}

	var listCtrl = this.getListCtrl();
	if ( ! listCtrl ) return ;

	var newSubListName = selAddGeneric( listCtrl, "Copy", 1, " of " + \
this.m_curSubListName );  if ( newSubListName )
	{
		this.m_subListParent.copySubList( this.m_curSubListName, newSubListName );
		this.m_curSubListName = newSubListName;
		this.fillFormFromSubList( false );
		this.onSubListChangeNotify( "add", newSubListName );
	}

 }	// copySubList ()

NestedPropListViewNoEdit.prototype.removeSubList = function ()
{
	if ( ! this.m_bLoaded ) return ;

	if ( ! this.m_curSubListName )
	{
		
		return;
	}
		
	
	
	var subList = this.getSubList();
	if ( subList )
	{
	    if ( this.confirmRemoveSubList( this.m_curSubListName ) )
		{
			var deletedSubListName = this.m_curSubListName;
			// mark as 'deleted'
			selectDel( this.getListCtrl() );
			subList.clearForm( this.getForm( deletedSubListName ) );
			if ( subList.m_status == "added" )
			{
				this.m_subListParent.delSubList( subList );
			}
			else
			{
				subList.m_status = "deleted" ;
			}
			this.onSubListChangeNotify( "delete", deletedSubListName );
			this.fillFormFromSubList( false );
		}
	}

}	// removeSubList ()

//</SCRIPT>

--- NEW FILE: config_spl_recv.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Receiver</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "29";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="port.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?serverData=config&diffconfig=diffconfig"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
var FS = "FSMount";
var FS_BDIST = "RealSystem Broadcast Distribution";
var BRECV = "BroadcastReceiver";
var MOUNT = "MountPoint";
var SNAME = "ShortName";

// copy properties from the filesystem list into the server data list
// so that the proplist gets initialized correctly
if ( serverData &&
	 serverData[FS] &&
	 serverData[FS][FS_BDIST] )
{
	if ( ! serverData[BRECV] )
		serverData[BRECV] = [];

	if ( serverData[FS][FS_BDIST][MOUNT] )
    {
		serverData[BRECV][MOUNT] = serverData[FS][FS_BDIST][MOUNT];
	}
    
	if ( serverData[FS][FS_BDIST][SNAME] )
    {
		serverData[BRECV][SNAME] = serverData[FS][FS_BDIST][SNAME];
    }    
}

// exclude and receivers that are tied to encoders (they are added/removed \
automatically) var encoderReceivers = [];
if ( serverData[BRECV] &&
	 serverData[BRECV]["Receivers"] )
{
	for ( var recvName in serverData[BRECV]["Receivers"] )
	{
		var recv = serverData[BRECV]["Receivers"][ recvName ];
		if ( isObj( recv ) && recv[ "Encoder"] )
		{
			// save the reciever for  checking port conflicts
			encoderReceivers[recvName] = recv;
			delete serverData[BRECV]["Receivers"][ recvName ];
		}
	}
}

var propSetSecurity =
[
	new PropObj( 'Type', "Basic" )
   ,new PropObj( 'Password', "" )
];

var propSetReceiver = 
[
	new PropObj( 'OriginSpec', 	"", false, true, null, null, "hostname", "" )
   ,new PropObj( 'PortRange',  "", false, true, null, null, "port_range", "Port \
Range" )  ,new PropObj( 'Protocol',  "udp/unicast", false, true, null, null, "", \
"Transport" )  ,new PropObj( 'MulticastAddress', "", false, false, null, null, "ip", \
"Multicast Address" )  ,new PropObj( 'ResendSupported', "0" )

   ,new PropList( 'Security', null, propSetSecurity )

   ,new PropObj( 'PullSplitEnabled', 	"0", false, true, null, null, "", "" )
   ,new PropObj( 'PathPrefix', 	"", false, false, null, null, "path", "Source Path" )
   ,new PropObj( 'FECLevel',  "0", false, true, 0, 100, "int", "Error Correction \
Rate" )  ,new PropObj( 'AcquisitionDataInterval',  "30", false, true, 3, 60, "int", \
"Metadata Transmit Rate" )  ,new PropObj( 'UseTCPForPullBackchannel',  "0", false, \
true, 0, 1, "int", "Pull Splitting Backchannel Transport" ) ];

var propSetMain =
[
	new PropObj( MOUNT, '/broadcast/',  false, true, null, null, "mountpoint", "Mount \
Point", true )  ,new PropObj( SNAME, 'pn-broadcast-receiver-fs', true, true, null, \
null, "", "Short Name", true )  ,new PropList( "Receivers", null, null, \
propSetReceiver ), ];

var propList = new PropList( BRECV, serverData[BRECV], propSetMain );
var subListReceivers = propList.subList( "Receivers" );

// define a subclass of NestedPropListView that will handle the main prop set \
("enabled" var) // and the publishers sublist. This class will encapsulate a propView \
to handle the // Rules sublist
function TransPropView ()
{
	this.base = NestedPropListView ;
	this.base( "Receiver", propList, "Broadcast Transmitter", 
				"config.BroadcastReceiver.", "servvar",
				"theForm", "theList", "theEdit" );

	this.m_itemDefValue = "Transmitter" ;
	this.m_subListParent = subListReceivers;
}
TransPropView.prototype = new NestedPropListView ;

TransPropView.prototype.postFillFormFromSubList = function ( fValidate )
{

	// fillForm isn't recursive - have to do it for sublists
	var subList = this.getSubList();
	if ( subList && subList.subList( "Security" ) )
	{
		subList.subList( "Security" ).fillForm( theForm );
	}

	thePortRange.fillForm( theForm );

	onSecurityChange();

	return true;

}	// postFillFormFromSubList ()

TransPropView.prototype.onSubListChangeNotify = function ( action, subListName )
{

	if ( "add" == action )
	{
		setCtrlValue( theForm.PortRange, getNextAvailPortRange( getMaxPortRange() ) );
		thePortRange.fillForm( theForm );
	}
	else if ( "delete" == action )
	{
		setCtrlValue( theForm.PortRange1, "" );
		setCtrlValue( theForm.PortRange2, "" );
		setCtrlValue( theForm.Password, "" );
		setCtrlValue( theForm.Password2, "" );
	}

	if ( this.m_bDoDirtyCheck )
		this.showDirtyFlag( this.isDirty() );

}	// onSubListChangeNotify

TransPropView.prototype.preValidateSubList = function ()
{

	if ( ! thePortRange.validate( theForm ) )
		return false ;

	return true;
}

TransPropView.prototype.postValidateSubList = function ( subListName )
{

	// validate doesn't recurse
	var subList = this.getSubList();
	if ( subList && subList.subList( "Security" ) )
	{
		var ctrl = subList.subList( "Security" ).validate( theForm );
		if ( ctrl )
			return rejectINput( ctrl, subList.subList( "Security" ).errMsg );
	}

	if ( "Basic" == getCtrlValue( theForm.Type ) )
	{
		if ( isBlank( getCtrlValue( theForm.Password ) ) )
		{
			return rejectInput( theForm.Password,
				"A password is required when using Basic security." );
		}
		if ( ! validatePassword( "Password", false ) )
			return false;
	}

	var multiAddress = getCtrlValue( theForm.MulticastAddress );
	if ( multiAddress )
	{										 
		var ip = new IPAddress( multiAddress );
		if ( ! (ip && ip.isMulticast) )
		{
			return rejectInput( theForm.MulticastAddress,
				"Multicast Address requires a Class D IP address." );
		}
	}

	if ( (getCtrlValue( theForm.PullSplitEnabled ) == "1") &&
	   	 (getCtrlValue( theForm.PathPrefix ) == "") )
	{
		return rejectInput( theForm.PathPrefix,
			"A Source Path is required to enable Pull Splitting from this transmitter." );
	}

	if ( subList.m_status || subList.prop( "PortRange" ).isDirty() )
	{
		var portRange = getCtrlValue( theForm.PortRange );
		var conflict = findPortConflictName( portRange );
		if ( conflict )
		{
			return rejectInput( theForm.PortRange1, 
				getConflictErrMsg( conflict, "Receiver Port Range" ) );
		}

		// check the port against other transmitter settings
		function _checkPortConflict( otherSubList, prop )
		{
			// don't compare this sublist with itself
			if ( otherSubList == subList ) return;

			if ( isPortRangeOverlap( portRange, prop.getValue() ) )
			{
				conflict = otherSubList.toString();
				return 1;
			}
		}
		subListReceivers.propSearch( "PortRange", _checkPortConflict );

		if ( (!conflict) && encoderReceivers )
		{
			// check the port against encoder transmitters
			for ( var recvName in encoderReceivers )
			{
				if ( encoderReceivers[ recvName ] && 
					 encoderReceivers[ recvName ]["PortRange"] )
				{
					var portRangeToCheck = encoderReceivers[ recvName ]["PortRange"];
					if ( isPortRangeOverlap( portRange, portRangeToCheck ) )
					{
						conflict = recvName;
						break;
					}
				}
			}
		}

		if ( conflict )
		{
			return rejectInput( theForm.PortRange1, 
				"The '" + subListName + "' Port Range conflicts with the '" + conflict + "' Port \
Range." );  }
	}

	// can't have two transmitters with the same address/path
	if ( getCtrlValue( theForm.PullSplitEnabled ) == "1" )
	{
		var conflict = "";            
            
		var curAddrPath = subList.prop( "OriginSpec" ).getValue();
        //don't consider Transmitter's netmask in conflict check
		curAddrPath = curAddrPath.replace( /[\/:].*$/, "" );
		curAddrPath += subList.prop( "PathPrefix" ).getValue();

		// check the port against other transmitter settings
		function _checkAddrPathConflict( otherSubList, prop )
		{
			// don't compare this sublist with itself
			if ( otherSubList == subList ) return;
            
            // make sure pull splitting is turned on in 'otherSubList'
            if ( prop.getValue() == "0" ) return;
            
			var otherAddrPath = otherSubList.prop( "OriginSpec" ).getValue() +
		        	otherSubList.prop( "PathPrefix" ).getValue();
                    
			var otherAddrPath = otherSubList.prop( "OriginSpec" ).getValue();
	        //don't consider Transmitter's netmask in conflict check
			otherAddrPath = otherAddrPath.replace( /[\/:].*$/, "" );
			otherAddrPath += otherSubList.prop( "PathPrefix" ).getValue();
                    
			if ( curAddrPath == otherAddrPath )
			{
				
				conflict = otherSubList.toString();
				return 1;
			}
		}
		subListReceivers.propSearch( "PullSplitEnabled", 
        	_checkAddrPathConflict );

		if ( conflict )
		{
			return rejectInput( theForm.PathPrefix, 
				"The '" + subListName + "' Transmitter Address/Pull Splitting " +
                "Path combination conflicts with the combination used in '" + 
                conflict + "'.\n\nPull Splitting Transmitters must have a unique " +
                "Address/Path combination." );
		}
	}

	return true;

}	// postValidateSubList ()

TransPropView.prototype.postValidate = function ()
{

	// make sure the mountpoint is unique among all mount points
	var errMsg = 
    	propList.prop( "MountPoint" ).getMountPointConflictErrMsg( 
        	serverData.FSMount );
	if ( errMsg )
	{
		return rejectInput( theForm.MountPoint, errMsg );
	}

	return true;
}

TransPropView.prototype.buildParamStringCallback = function ( propList, prop, \
paramStr ) {
	// change the mount point list name
			if ( paramStr.bSearch( /MountPoint|ShortName/ ) )
	{
		return paramStr.replace( /BroadcastReceiver/, FS + "." + FS_BDIST );
	}

	return paramStr ;
}

TransPropView.prototype.resultsCallback = function ( results )
{
    for ( var propName in results )
    {
		// shortcut to current result
		res = results[ propName ];

		var propNameRight = propName.rightProp();
		var listName = "";

		var a = propName.split( "." );
		if ( a[ 3 ] ) // receiver list name
		{
			listName = a[ 3 ];
			if ( propNameRight == listName )
				listName = "";
		}
		
       	res.title = (listName ? listName.ent().span("body") + '<br>' : "") + 
       				propNameRight ;
                    
		
	}
}

//override this function so we can check the netmask ctrls
TransPropView.prototype.postIsDirty = function ()
{
	return ( isCtrlDirty( theForm.Address )||
			 isCtrlDirty( theForm.Netmask ) );
}

var thePortRange = new PortRangeCtrl();

initAllPortsList( serverData, BRECV );
var propView = new TransPropView();

var theForm ;
var theList ;

function onLoad ()
{
	theForm = document.theForm;
	checkForPendingChanges( diffconfig );

	propView.onLoad( window );

	// if multicast is not licensed remove that option from the tranport listbox
	if ( ! (top.TOC && 
	 		top.TOC.l && 
	 		top.TOC.l["BroadcastDistribution"] && 
		 	top.TOC.l["BroadcastDistribution"]["EnableMulticastTransport"]) )
	{
		selectDel( theForm.Protocol, 1 );
	}

	onSecurityChange();

}	// onLoad ()

var defRange = 20 ; 
function getMaxPortRange ()
{
	maxPort = 30000 ;

	function findMaxCallback( subList, prop )
	{
		// if the lower port is greater then maxPort...
		var port = parseInt( prop.getValue() );
		if ( port > maxPort )
		{
			//... then the upper port becomes maxPort
			var aTmp = prop.getValue().split( /\s*-\s*/ );
			if ( aTmp && aTmp[ 1 ] )
				maxPort = aTmp[ 1 ];
		}
	}
	subListReceivers.propSearch( "PortRange", findMaxCallback );

	return maxPort + "-" + (maxPort + defRange);
}

function getNextAvailPortRange ( prevPortRange )
{
	var range = 20 ;
	prevPort = parseInt( prevPortRange );
	for ( var i = prevPort + 1; true; i++ )
	{
		if ( ! findPortConflictName( i, i + defRange - 1 ) )
			return i + "-" + (i + defRange - 1);
	}
}

function onSecurityChange ()
{
	if ( "Basic" != getCtrlValue( theForm.Type ) )
	{
		setCtrlValue( theForm.Password, "" );
		setCtrlValue( theForm.Password2, "" );
	}
	else
	{
		setCtrlValue( theForm.Password2,  
			getCtrlValue( theForm.Password ) );
	}
}
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">BROADCAST DISTRIBUTION</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
A receiver server obtains its broadcasts from transmitters, as soon as the
transmitter begins streaming a live source. When a client requests a
broadcast from the receiver, a connection has already been pre-established
between the receiver and the transmitter, and the broadcast is delivered to
the client immediately. 
<br><br>

Refer to the documentation for detailed instructions on managing the
settings for the fields below.
</td></tr>
</TABLE>
<BR>

<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 

<input type="hidden" name="PortRange" value="">
<!-- input type="hidden" name="OriginSpec" value="" -->
<input type="hidden" name="ShortName" value="">
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Receiver</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
      <tr>
      <TD class="input" valign="top" align="RIGHT" width="44%">
      		<span class="offsetLabel">Mount Point<FONT color="red">*</FONT></span>
      	</td>
      	<TD class="input" valign="top" align="left" width="56%">
      		<input CLASS="longInput" MAXLENGTH="255" NAME="MountPoint" SIZE="20" \
TYPE="text" VALUE="">  </td>
      </tr>
<tr </tr>
<tr>
	<TD class="input" valign="top" width="44%">
		<TABLE CLASS="PROPLIST_LABEL" width="199" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Broadcast \
Transmitters</TD>  <TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Transmitter" BORDER=0></A><A href="javascript://" \
onclick="propView.removeSubList()"><IMG src="images/delete_g.gif" HSPACE=1 \
ALT="Remove Current Transmitter" BORDER=0></A><A href="javascript://" \
onclick="propView.copySubList()"><IMG src="images/copy_g.gif" HSPACE=1 ALT="Copy \
Current Transmitter" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theList" SIZE="12" WIDTH="199">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="56%">
		Edit Transmitter Name
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theEdit" SIZE="20" TYPE="text" \
VALUE="">

		Transmitter Address/Netmask
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="OriginSpec" SIZE="20" TYPE="text" \
VALUE="">

		Port Range
		<BR>
		<input type="text" class="input" name="PortRange1" size="6" maxlength="5"><SPAN \
class="unitsOffset">&nbsp;to&nbsp;</span><input type="text" class="input" \
name="PortRange2" size="6" maxlength="5">

		<BR>
		Transport
		<BR>
		<select CLASS="longInput" NAME="Protocol" SIZE="1" WIDTH="253">
		    <OPTION value="udp/unicast">udp/unicast</OPTION>
		    <OPTION value="udp/multicast">udp/multicast</OPTION>
		    <OPTION value="tcp">tcp</OPTION>
		</SELECT>

		Multicast Address
		<BR>
		<input CLASS="longInput" MAXLENGTH="39" NAME="MulticastAddress" SIZE="20" \
TYPE="text" VALUE="">

		Request Resends
		<BR>
		<select CLASS="input" NAME="ResendSupported" SIZE="1" WIDTH="91">
		    <OPTION value="1">Yes</OPTION>
		    <OPTION value="0">No</OPTION>
		</SELECT>

		<BR>
		Security Type
		<BR>
		<select CLASS="longInput" NAME="Type" ONCHANGE="onSecurityChange();" SIZE="1" \
WIDTH="253">  <OPTION value="None">None</OPTION>
		    <OPTION value="Basic">Basic</OPTION>
		</SELECT>

		Password
		<BR>
		<input CLASS="longInput" MAXLENGTH="14" NAME="Password" SIZE="20" TYPE="password" \
VALUE="">

		Confirm Password
		<BR>
		<input CLASS="longInput" MAXLENGTH="14" NAME="Password2" SIZE="20" TYPE="password" \
VALUE="">

		<HR>

		Enable Pull Splitting Requests
		<BR>
		<select CLASS="input" NAME="PullSplitEnabled" SIZE="1" WIDTH="91">
		    <OPTION value="1">Yes</OPTION>
		    <OPTION value="0">No</OPTION>
		</SELECT>

		<BR>
		Pull Splitting Virtual Path
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="PathPrefix" SIZE="20" TYPE="text" \
VALUE="">

		Error Correction Rate
		<BR>
		<input CLASS="input" MAXLENGTH="255" NAME="FECLevel" SIZE="6" TYPE="text" VALUE="">

		<BR>
		Metadata Transmit Rate
		<BR>
		<input CLASS="input" MAXLENGTH="255" NAME="AcquisitionDataInterval" SIZE="6" \
TYPE="text" VALUE="">

		<BR>
		Pull Splitting Backchannel Transport

		<select CLASS="input" NAME="UseTCPForPullBackchannel" SIZE="1" WIDTH="91">
		    <OPTION value="1">TCP</OPTION>
		    <OPTION value="0">UDP</OPTION>
		</SELECT>
    </TD>                        
</TR>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" VALIGN="middle" width="100%" class="body" \
                ALIGN="left">
      <FONT color="red">*A server restart is required to effect changes applied to \
this field.</FONT>  </TD>
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_alias.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>URL Aliasing</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "31";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="servvar.get.html?serverData=config.Aliases"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
var propSetAlias = 
[
	new PropObj( 'Alias', "", false, true, null, null, "virpath", "Alias" )
   ,new PropObj( 'Resource', "", false, true, null, null, "url", "Resource" )
];

var propList = new PropList( "Aliases", serverData, null, propSetAlias );
var propView = new NestedPropListView( "Aliases", propList, "Alias", \
"config.Aliases.", "servvar",  "theForm", "theList", "theEdit" );

function onLoad ()
{
	propView.onLoad( window );

}	// onLoad ()
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">SERVER SETUP</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
Aliases are substitutions for actual file names and directory paths used
in URLs. Using an alias, you can mask actual resources in published
URLs, as well as shorten and simplify published URLs.
</td></tr>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>URL Aliasing</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
<tr>
    <TD class="input" valign="top" width="40%">
		<TABLE CLASS="PROPLIST_LABEL" width="181" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Aliases</TD>
		<TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Alias" BORDER=0></A><A href="javascript://" onclick="propView.removeSubList()"><IMG \
src="images/delete_g.gif" HSPACE=1 ALT="Remove Current Alias" BORDER=0></A><A \
href="javascript://" onclick="propView.copySubList()"><IMG src="images/copy_g.gif" \
HSPACE=1 ALT="Copy Current Alias" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theList" SIZE="9" WIDTH="181">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
    <TD valign="top" class="input" valign="top" width="60%">
		Alias Description
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theEdit" SIZE="21" TYPE="text" \
VALUE="">  <BR>
		Alias
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Alias" SIZE="21" TYPE="text" \
VALUE="">

		<BR>
		Resource
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Resource" SIZE="21" TYPE="text" \
VALUE="">  </TD>                        
</TR>

<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_snmp.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>SNMP</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "45";
</SCRIPT>

<SCRIPT SRC="propview_nolist.js"></SCRIPT>
<SCRIPT SRC="servvar.get.html?serverData=config.SNMP"></SCRIPT>

<SCRIPT>
var propSet = 
[
	 new PropObj( 'Activate', "0", false, true, 0, 1, "int", "Enable SNMP Monitoring" )
	,new PropObj( 'MasterAddress', "127.0.0.1/705", false, true )
	,new PropObj( 'SendTrap', "0", false, true, 0, 1, "int", "Send SNMP Traps" )
	,new PropObj( 'SNMPTrapInterval', "20", false, true, 0, "", "int", "SNMP Trap \
Interval" )

	/* trap thresholds */
	,new PropObj( 'TrapThresholds.ServerStart', "1", false, true, 0, 1, "int", "Server \
Startup" )  ,new PropObj( 'TrapThresholds.GlobalCPUUtilization', "70", false, true, \
0, 100, "int", "CPU Utilization" )

	,new PropObj( 'TrapThresholds.MemoryUsageWaterMark_1', "1", false, true, "", "", \
"int", "Memory Usage Watermark 1" )  ,new PropObj( \
'TrapThresholds.MemoryUsageWaterMark_2', "2", false, true, "", "", "int", "Memory \
Usage Watermark 2" )  ,new PropObj( 'TrapThresholds.MemoryUsageWaterMark_3', "3", \
false, true, "", "", "int", "Memory Usage Watermark 3" )

	,new PropObj( 'TrapThresholds.RTSPUnableToLog', "1", false, true, 0, 1, "int", \
"Logging File Error" )  ,new PropObj( 'TrapThresholds.MaxConnections', "500", false, \
true, "", "", "int", "Connection Count" )

	,new PropObj( 'TrapThresholds.OutBandwidthWaterMark_1', "150", false, true, "", "", \
"int", "Bandwidth Usage Watermark 1" )  ,new PropObj( \
'TrapThresholds.OutBandwidthWaterMark_2', "200", false, true, "", "", "int", \
"Bandwidth Usage Watermark 2" )  ,new PropObj( \
'TrapThresholds.OutBandwidthWaterMark_3', "1024", false, true, "", "", "int", \
"Bandwidth Usage Watermark 3" )

	
];

function SNMPPropView ()
{
	this.base = PropListView ;
	this.base( "SNMP", propList, "config.SNMP.", "servvar", "theForm" );
}
SNMPPropView.prototype = new PropListView ;

SNMPPropView.prototype.preValidate = function ()
{

	var address =  getCtrlValue(theForm.Address);
	var port = getCtrlValue(theForm.Port);

	if (isBlank(address))
	{
		return rejectInput(theForm.Address, "A Master Agent IP Address or Hostname is \
required.");  }
	else if (!propList.hostname_validate(address))
	{
		return rejectInput(theForm.Address, propList.errMsg);
	}
	else
	{
		var ip = new IPAddress( address );
		if (ip.isIPv6)
		{
			return rejectInput(theForm.Address, "An IPv6 address cannot be used as the Master \
Agent IP Address.");  }
	}

	if (isBlank(port))
	{
		return rejectInput(theForm.Port, "A Master Agent Port number is required.");
	}
	else if (!propList.port_validate( port ))
	{
		return rejectInput(theForm.Port, propList.errMsg);
	}

	//combine agent address & port into one field
	setCtrlValue( theForm.MasterAddress, address + "/" + port );

	return true;
}

SNMPPropView.prototype.postIsDirty = function ()
{

	return ( isCtrlDirty( theForm.Address ) || 
			 isCtrlDirty( theForm.Port ) );
}

var propList = new PropList( "SNMP", serverData, propSet );
var propView = new SNMPPropView();

var theForm ;
function onLoad ()
{
	theForm = document.theForm;

	propView.onLoad( window );

	var a = getCtrlValue(theForm.MasterAddress).split( "/" );
	if (isObj(a) && a.length)
	{
		setCtrlValue(theForm.Address, a[ 0 ], true );
		if (a.length > 1)
			setCtrlValue(theForm.Port, a[ 1 ], true );
	}
}
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">LOGGING & MONITORING</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 

<INPUT type="HIDDEN" name="MasterAddress">
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>SNMP</TD> <TD bgcolor="#FFFFFF" \
width="20"><img src="images/diagonal.gif"></TD> <TD bgcolor="#FFFFFF" width="194" \
align="right"><SPAN ID="RESTART_IMG_SPAN" STYLE="visibility:hidden;"><A \
HREF="javascript://" onclick="displayChanges()"><img src="images/spacer.gif"  \
BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" VSPACE="0" \
WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="65%">
			<span class="offsetLabel">Enable SNMP</span>
		</td>
		<TD class="input" valign="top" align="left" width="45%">
			<select CLASS="input" NAME="Activate" SIZE="1" WIDTH="100">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="65%">
			<span class="offsetLabel">Master Agent Hostname or IP Address</span>
		</td>
		<TD class="input" valign="top" align="left" width="45%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="Address" SIZE="6" TYPE="text" \
VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="65%">
			<span class="offsetLabel">Master Agent Port</span>
		</td>
		<TD class="input" valign="top" align="left" width="45%">
			<input CLASS="input" MAXLENGTH="255" NAME="Port" SIZE="6" TYPE="text" VALUE="">
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="65%">
			<span class="offsetLabel">Send SNMP Traps</span>
		</td>
		<TD class="input" valign="top" align="left" width="45%">
			<select CLASS="input" NAME="SendTrap" SIZE="1" WIDTH="100">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="65%">
			<span class="offsetLabel">Trap Interval</span>
		</td>
		<TD class="input" valign="top" align="left" width="45%">
			<input CLASS="input" MAXLENGTH="255" NAME="SNMPTrapInterval" SIZE="6" TYPE="text" \
VALUE=""><SPAN CLASS="unitsOffset">&nbsp;(seconds)</SPAN>  </td>
	</tr>
<TR><TD class="input" ALIGN="CENTER" COLSPAN="2"><SPAN class="stronger">Trap \
Conditions and Watermarks</SPAN></TD></TR>  <tr>
	<TD class="input" valign="top" align="RIGHT" width="65%">
			<span class="offsetLabel">Trap Server Startups</span>
		</td>
		<TD class="input" valign="top" align="left" width="45%">
			<select CLASS="input" NAME="TrapThresholds.ServerStart" SIZE="1" WIDTH="100">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="65%">
			<span class="offsetLabel">Trap Logging Errors</span>
		</td>
		<TD class="input" valign="top" align="left" width="45%">
			<select CLASS="input" NAME="TrapThresholds.RTSPUnableToLog" SIZE="1" WIDTH="100">
	            <OPTION value="1">Yes</OPTION>
	            <OPTION value="0">No</OPTION>
	        </SELECT>
		</td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="65%">
			<span class="offsetLabel">Trap CPU Utilization above</span>
		</td>
		<TD class="input" valign="top" align="left" width="45%">
			<input CLASS="input" MAXLENGTH="255" NAME="TrapThresholds.GlobalCPUUtilization" \
SIZE="6" TYPE="text" VALUE=""><SPAN CLASS="unitsOffset">&nbsp;(as percentage)</SPAN>  \
</td>  </tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="65%">
			<span class="offsetLabel">Trap Connection Counts above</span>
		</td>
		<TD class="input" valign="top" align="left" width="45%">
			<input CLASS="input" MAXLENGTH="255" NAME="TrapThresholds.MaxConnections" SIZE="6" \
TYPE="text" VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="65%">
			<span class="offsetLabel">1</span>
		</td>
		<TD class="input" valign="top" align="left" width="45%">
			<input CLASS="input" MAXLENGTH="255" NAME="TrapThresholds.MemoryUsageWaterMark_1" \
SIZE="6" TYPE="text" VALUE=""><SPAN CLASS="unitsOffset">&nbsp;(in kBytes)</SPAN>  \
</td>  </tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="65%">
			<span class="offsetLabel">Memory Usage Watermarks&nbsp;&nbsp;&nbsp;&nbsp;2</span>
		</td>
		<TD class="input" valign="top" align="left" width="45%">
			<input CLASS="input" MAXLENGTH="255" NAME="TrapThresholds.MemoryUsageWaterMark_2" \
SIZE="6" TYPE="text" VALUE=""><SPAN CLASS="unitsOffset">&nbsp;(in kBytes)</SPAN>  \
</td>  </tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="65%">
			<span class="offsetLabel">3</span>
		</td>
		<TD class="input" valign="top" align="left" width="45%">
			<input CLASS="input" MAXLENGTH="255" NAME="TrapThresholds.MemoryUsageWaterMark_3" \
SIZE="6" TYPE="text" VALUE=""><SPAN CLASS="unitsOffset">&nbsp;(in kBytes)</SPAN>  \
</td>  </tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="65%">
			<span class="offsetLabel">1</span>
		</td>
		<TD class="input" valign="top" align="left" width="45%">
			<input CLASS="input" MAXLENGTH="255" NAME="TrapThresholds.OutBandwidthWaterMark_1" \
SIZE="6" TYPE="text" VALUE=""><SPAN CLASS="unitsOffset">&nbsp;(in Kbps)</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="65%">
			<span class="offsetLabel">Bandwidth Usage Watermarks&nbsp;&nbsp;&nbsp;2</span>
		</td>
		<TD class="input" valign="top" align="left" width="45%">
			<input CLASS="input" MAXLENGTH="255" NAME="TrapThresholds.OutBandwidthWaterMark_2" \
SIZE="6" TYPE="text" VALUE=""><SPAN CLASS="unitsOffset">&nbsp;(in Kbps)</SPAN>  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="65%">
			<span class="offsetLabel">3</span>
		</td>
		<TD class="input" valign="top" align="left" width="45%">
			<input CLASS="input" MAXLENGTH="255" NAME="TrapThresholds.OutBandwidthWaterMark_3" \
SIZE="6" TYPE="text" VALUE=""><SPAN CLASS="unitsOffset">&nbsp;(in Kbps)</SPAN>  </td>
	</tr>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: welcome.html ---

<HTML>
<HEAD>

<TITLE>Welcome</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "29";
</SCRIPT>

<SCRIPT SRC="servvar.get.html?l=license.License0"></SCRIPT>

<SCRIPT>
var goTo = top.frames["TOC"].gotoPage

var product = "Helix Server";
if ( l &&
	 l["License"] &&
	 l["License"]["Definition"] && 
	 l["License"]["Definition"]["ProductID"] )
{
	product = l["License"]["Definition"]["ProductID"];
}
</SCRIPT>

</HEAD>

<BODY CLASS="CONFIG">
<TABLE border="0" cellspacing="0" cellpadding="0" width="476">
<tr>
<td class="body" width="100%" valign="top">
<DIV class="PARA">

<DIV class="PARAHEAD">Welcome to <SCRIPT>document.write( product );</SCRIPT></DIV>
<BR>

The Helix<sup>tm</sup> Server from RealNetworks&#174; is the Universal digital media \
delivery  platform. With industry leading performance, integrated content 
distribution, advertising, authentication, Web Services support, and native 
delivery of RealMedia, Windows Media, Quicktime, and MPEG 4, the 
Helix Server from RealNetworks is the most robust digital media foundation 
to meet the needs of Enterprise and Service provider deployments. Refer to the
<A CLASS="linkText" HREF="Javascript:launchAbout()">about</A> page for a 
complete list of features licensed in your server.

<BR><BR>

Helix Server is ready to stream media without further
configuration. To test your installation, you can choose from a
selection of sample clips on the 
<A class="linkText" HREF="javascript:goTo('samples.html')">Media Samples</a> page. 
For configuration tips and a list of known issues, refer to the 
<a class="linkText" href="javascript:launchHome('http://service.real.com/help/library/ \
servers.html','toolbar=yes,status=no,scrollbars=yes,resizable=yes,menubar=yes,width=800,height=500,dependent')">
 Readme</a>. You can find further assistance in getting started with
Helix Server from the <a class="linkText" href="javascript:contextHelp();">Quick \
Start</a> tutorial in the Administration Guide. 

</DIV>
</td></tr>
</table>
</BODY>
</HTML>

--- NEW FILE: datachannel.html ---
#include "header.wasm"

<HTML>
<HEAD>

<SCRIPT>
if ( top.gDataChannel == null ) //standalone mode: need to instantiate the global \
data channel object {
	//alert( "including datachannel" );
	document.write( "<" + "SCRIPT SRC='datachn.js'><" + "/SCRIPT>" );
}

// use the query string to get some data
var qStr = window.document.location.search.slice( 1 );
//alert( qStr );
if ( qStr )
{
	document.write( "<" + "SCRIPT SRC='servvar.get.html?" + qStr + "'><" + "/SCRIPT>" );
}

function onLoad ()
{
	if ( top.gDataChannel ) top.gDataChannel.onDataReady();
}

function onLoad ()
{
	if ( top.gDataChannel ) top.gDataChannel.onDataReady();
}
</SCRIPT>

<STYLE>
BODY
{
	width:0;
	height:0;
	padding:0;
	margin:0;
}
</STYLE>

</HEAD>

<BODY
	bgcolor="white"
	onload="onLoad();"
> 

</BODY>
</HTML>
--- NEW FILE: config_broad_wm.html ---

<HTML>
<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=utf-8"> 
         <TITLE>Windows Media Encoding</TITLE>

<SCRIPT SRC="xblib.js"></SCRIPT>
<SCRIPT SRC="string.js"></SCRIPT>
<SCRIPT SRC="client.js"></SCRIPT>
<SCRIPT SRC="results.js"></SCRIPT>
<SCRIPT SRC="help.js"></SCRIPT>
<SCRIPT>
if ( isX11 )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" TYPE="text/css">' );
}
else if ( isIE && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_ie_mac.css" TYPE="text/css">' );
}
else if ( isNav4 && isMac )
{
   document.write( '<LINK REL=stylesheet HREF="main_nav4_mac.css" TYPE="text/css">' \
); }
else
{
   document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
}
var contextID = "32";
</SCRIPT>

<SCRIPT SRC="propview.js"></SCRIPT>
<SCRIPT SRC="port.js"></SCRIPT>

<SCRIPT SRC="servvar.get.html?configList=config&diffConfig=diffconfig"></SCRIPT>

<SCRIPT LANGUAGE="javascript">
var FS = "FSMount";
var WM_BROADCAST = "Windows Media Live Broadcast Source";

// meta data for Sources
var propSetSource = 
[
	new PropObj( 'Host', "", false, true, null, null, "hostname", "Host" )
   ,new PropObj( 'Port', "8080", false, true, null, null, "port", "Port" )
   ,new PropObj( 'StreamName', "", false, true, null, null, "", "Stream Name" )
];

var propSet = 
[
	new PropObj( 'MountPoint', "/wmtencoder/", false, true, null, null, "mountpoint", \
"Mount Point", true )  ,new PropObj( 'ShortName', "pn-wmtencoder", false, true, null, \
null, "", "", true )  ,new PropObj( 'PushEncodingPort', "8080", false, true, null, \
null, "port", "Push Encoding Port" )  ,new PropObj( 'Realm', "", false, false, null, \
null, "", "Windows Media Encoder Realm" )  ,new PropList( 'Sources', null, null, \
propSetSource ) ];

var propList = new PropList( "Windows Media Sources", configList[ FS ][ WM_BROADCAST \
], propSet );

function WMPropView ()
{
	this.base = NestedPropListView ;
	this.base( "Windows Media Sources", propList, "Source", 
		"config." + FS + "." + WM_BROADCAST + ".", "servvar",
		"theForm", "theList", "theEdit" );

	this.m_subListParent = propList.subList( 'Sources' );
	this.m_resultsTitleListIndex = 5;
	this.m_resultsTitlePropIndex = 6;
}
WMPropView.prototype = new NestedPropListView ;

WMPropView.prototype.postValidate = function ()
{
	if ( propList.prop( "PushEncodingPort" ).isDirty() )
	{
		// check for port conflict with the rest of the server configuration
		var conflict = findPortConflictName( getCtrlValue( theForm.PushEncodingPort ) );
		if ( conflict )
		{
			return rejectInput( theForm.PushEncodingPort, 
            	getConflictErrMsg( conflict, "Windows Media Push Encoding Port" ) );
		}
	}

	// make sure the mountpoint is unique among all mount points
    if ( propList && propList.prop( "MountPoint" ) )
    {
		var errMsg = 
	    	propList.prop( "MountPoint" ).getMountPointConflictErrMsg( configList.FSMount \
);  if ( errMsg )
		{
			return rejectInput( theForm.MountPoint, errMsg );
		}
	}
	return true;
}

initAllPortsList( configList, WM_BROADCAST );

var tocFrame = findFrame( "TOC" );
var theForm = null;
var propView = new WMPropView(); 

function onLoad ()
{
	theForm = document.theForm;
	checkForPendingChanges( diffConfig );

	fillRealmList();

	propView.onLoad( window );

}	// onLoad ()

function fillRealmList ()
{
	var aTmp = [];
	function _fillTmpArrayCallback ( array, prop, curDepth )
	{
		if ( isObj( array[ prop ][ 'DigestAuthenticator' ] ) )
		{        
			aTmp[ aTmp.length ] = prop ;
        }
	}
	enumPropArray( configList["AuthenticationRealms"], _fillTmpArrayCallback, 1 ); 
	aTmp.sort();
	
	theForm.Realm.options.length = 2;	//preserve the "Select" and "None" choices
	for ( var x = 0; x < aTmp.length; x++ )
	{
		selAddOption( theForm.Realm, aTmp[ x ], 
        	configList["AuthenticationRealms"][ aTmp[ x ] ][ 'Realm' ] );
	}
	selectFirst( theForm.Realm );
}
</SCRIPT>
</HEAD>

<BODY 
   CLASS="CONFIG" 
   onLoad="_configOnLoadDefault( onLoad );"
   onUnLoad="_configOnUnLoadDefault(  );"
> 
<TABLE border="0" cellpadding="0" cellspacing="0" width="100%">
<TR><TD align="left" valign="bottom" width="100%" NOWRAP>
   <P class="headline">BROADCASTING</P>
</TD></TR>
<TR><TD align="left" valign="top" class="headlineRule" height="7" width="100%">
   <SPAN class="headlineRule">&nbsp;</SPAN>
</TD></TR>
</TABLE>
<BR>
<TABLE border="0" cellpadding="0" cellspacing="0" width="476">
<tr><TD class="bodyText">
In a Windows Media broadcast, Helix Server pulls a stream from
Windows Media Encoder (version 7 recommended) over an HTTP connection,
and delivers it to Windows Media Player clients over the MMS protocol.
The server is ready to broadcast as soon as the Windows Media
Encoder settings are applied. The stream is pulled from the Windows
Media Encoder upon the first request from a Windows Media Player client,
so you can define encoders on this page before delivering broadcasts.
<BR><BR>

The server is preconfigured with support for MMS, multiple
bit rate (MBR) encoding, a Windows Media broadcast mount point, and an
<a class="linkText" href="javascript:contextHelp('config_broad_wm_asxgen');">Asxgen</a> \
mount point for launching Windows Media Player. 
<A class="linkText" HREF="javascript:top.frames['TOC'].gotoPage('config_broad_redun.html')">Broadcast \
redundancy</A> is supported for Windows Media broadcasts.
</td></tr>
</TABLE>
<BR>

<FORM 
   method="POST" 
   action="javascript:propView.doSubmit();" 
   onsubmit="return propView.validate()" 
   onreset="onLoad(); return false;"
   name="theForm"
> 

<input type="hidden" name="ShortName" value="">
<table border="0" cellspacing="0" cellpadding="0" width="476" style="width:476;">
<TR><TD bgcolor="#E6E6E6" width="19"><img src="images/spacer.gif"  BORDER="0" \
HEIGHT="17" HSPACE="0" NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD> <TD \
bgcolor="#E6E6E6" class="TabText" width="243" NOWRAP>Windows Media Encoding</TD> <TD \
bgcolor="#FFFFFF" width="20"><img src="images/diagonal.gif"></TD> <TD \
bgcolor="#FFFFFF" width="194" align="right"><SPAN ID="RESTART_IMG_SPAN" \
STYLE="visibility:hidden;"><A HREF="javascript://" onclick="displayChanges()"><img \
src="images/spacer.gif"  BORDER="0" HEIGHT="16" HSPACE="8" NAME="RESTART_IMG" \
VSPACE="0" WIDTH="102"></A></SPAN><A CLASS="linkText" HREF="javascript://" \
onclick="contextHelp()">HELP</A></TD> </TR>
</TABLE>
<table class="formTable" border="0" cellspacing="0" cellpadding="6" width="476">
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="47%">
			<span class="offsetLabel">Mount Point<FONT color="red">*</FONT></span>
		</td>
		<TD class="input" valign="top" align="left" width="53%">
			<input CLASS="longInput" MAXLENGTH="255" NAME="MountPoint" SIZE="19" TYPE="text" \
VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="47%">
			<span class="offsetLabel">Push Encoding Port</span>
		</td>
		<TD class="input" valign="top" align="left" width="53%">
			<input CLASS="input" MAXLENGTH="255" NAME="PushEncodingPort" SIZE="6" TYPE="text" \
VALUE="">  </td>
	</tr>
	<tr>
	<TD class="input" valign="top" align="RIGHT" width="47%">
			<span class="offsetLabel">Push Encoder Authentication</span>
		</td>
		<TD class="input" valign="top" align="left" width="53%">
			<select CLASS="longInput" NAME="Realm" SIZE="1" WIDTH="240">
	            <OPTION value="">Select an Authentication Realm</OPTION>
	            <OPTION value="">No Authentication</OPTION>
	            <OPTION value="A">B</OPTION>
	            <OPTION value="C">D</OPTION>
	            <OPTION value="E">F</OPTION>
	            <OPTION value="G">H</OPTION>
	            <OPTION value="I">J</OPTION>
	        </SELECT><SPAN CLASS="units"><BR><A class="linkTextSmall" \
HREF="javascript:tocFrame.gotoPage('config_sec_uauth.html')">Create</a> user names \
and passwords.</SPAN>  </td>
	</tr>
<tr </tr>
<tr>
	<TD class="input" valign="top" width="47%">
		<TABLE CLASS="PROPLIST_LABEL" width="213" BORDER="0" CELLSPACING="0" \
CELLPADDING="0"><TR>  <TD NOWRAP align="left" class="input">Windows Media \
Sources</TD>  <TD NOWRAP align="right"><A href="javascript://" \
onclick="propView.createSubList()"><IMG src="images/add_g.gif" HSPACE=1 ALT="Add New \
Source" BORDER=0></A><A href="javascript://" onclick="propView.removeSubList()"><IMG \
src="images/delete_g.gif" HSPACE=1 ALT="Remove Current Source" BORDER=0></A><A \
href="javascript://" onclick="propView.copySubList()"><IMG src="images/copy_g.gif" \
HSPACE=1 ALT="Copy Current Source" BORDER=0></A></TD>  </TR></TABLE>
		<DIV STYLE="overflow:hidden;"><FONT CLASS="input"><SELECT  CLASS="longInput" \
NAME="theList" SIZE="12" WIDTH="213">  <SCRIPT>
		       if ( isMac && isNav4 )
		       {
		          document.write( "<OPTION>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
		       }
		    </SCRIPT>
		</SELECT></FONT></DIV>
    </TD>
	<TD class="input" valign="top" width="53%">
		Source Description
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="theEdit" SIZE="19" TYPE="text" \
VALUE="">

		<BR>
		<SCRIPT>if ( isNav6 ){document.write( '<BR>' );}</SCRIPT>
		Host
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Host" SIZE="19" TYPE="text" \
VALUE="">

		<BR>
		<SCRIPT>if ( isNav6 ){document.write( '<BR>' );}</SCRIPT>
		Port
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="Port" SIZE="19" TYPE="text" \
VALUE="">

		<BR>
		<SCRIPT>if ( isNav6 ){document.write( '<BR>' );}</SCRIPT>
		Stream Name
		<BR>
		<input CLASS="longInput" MAXLENGTH="255" NAME="StreamName" SIZE="19" TYPE="text" \
VALUE="">  </TD>                        
</TR>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" VALIGN="middle" width="100%" class="body" \
                ALIGN="left">
      <FONT color="red">*A server restart is required to effect changes applied to \
this field.</FONT>  </TD>
</TR>
<SCRIPT>
if ( ! isNav4 )
{
	document.write( '</TABLE><table class="formTable" border="0" cellspacing="0" \
cellpadding="6" width="476">' ); }
else
{
	document.write( "<TR </TR>" );
}
</SCRIPT>
<TR>
   <TD colspan="2" bgcolor="#E6E6E6" valign="middle" align="right">
      <img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_APPLY" VSPACE="0" WIDTH="19"><input type="image" \
src="images/apply.gif" alt="Apply changes made to this page" name="Apply changes made \
to this page" value="Apply" border="0">&nbsp;<A HREF="javascript://" \
onclick="window.onLoad();"><img src="images/reset.gif"  ALT="Cancel un-applied \
changes" BORDER="0" HSPACE="0" VSPACE="0"></A>  </TD>
</TR>
</TABLE>
</FORM>
<SCRIPT>
   if ( isMac && isNav4 )
   {
      document.write( '<LAYER ID="MACFIX" BGCOLOR="#FFFFFF" WIDTH="476" HEIGHT="800" \
PAGEX="0" PAGEY="0" STYLE="position:absolute;"></LAYER>' );  }
</SCRIPT>

<DIV ID="DIV_DYNFORM" style="position:absolute;visibility:hidden"></DIV>
</BODY>
</HTML>


--- NEW FILE: config_pending.nc.html ---

<HTML>
<HEAD>

<SCRIPT SRC="xblib.js"></SCRIPT>
         <SCRIPT SRC="string.js"></SCRIPT>
         <SCRIPT SRC="client.js"></SCRIPT>
         <SCRIPT SRC="dialog.js"></SCRIPT>
         <SCRIPT SRC="qstr.js"></SCRIPT>
         <SCRIPT SRC="results.js"></SCRIPT>
         <SCRIPT SRC="help.js"></SCRIPT>
         <SCRIPT>
         if ( isX11 )
         {
         	document.write( '<LINK REL=stylesheet HREF="main_nav4_x.css" \
TYPE="text/css">' );  }
         else
         {
         	document.write( '<LINK REL=stylesheet HREF="main.css" TYPE="text/css">' );
         }
         </SCRIPT>

<SCRIPT SRC="servvar.get.html?config=config&fileConfig=fileconfig&diffConfig=diffconfig"></SCRIPT>


<TITLE>Helix Administrator - Pending Changes</TITLE> 

</HEAD>

<BODY CLASS="popup">
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule" height="7" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule">&nbsp;</SPAN>
	</TD>
</TR>
<TR>
   <TD align="left" valign="middle" bgcolor="#FFFFFF" height="49">
      <img src="images/popup_header.gif"  BORDER="0" HSPACE="0" VSPACE="0"></TD>
   <TD align="right" valign="middle" bgcolor="#FFFFFF" height="49">
		<img src="images/popup_logo.gif"  BORDER="0" HSPACE="20" VSPACE="0"></TD>
</TR>
<TR>
   <TD align="left" colspan="2" valign="top" class="headerRule2" height="9" \
width="100%" bgcolor="#336699">  <SPAN class="headerRule2">&nbsp;</SPAN>
   </TD>
</TR>
</TABLE>
<CENTER>
<TABLE border="0" cellpadding="0" cellspacing="1" width="520">
<TR>
   <TD class="popupTitle" align="left" valign="bottom" width="100%">
      <BR>
      Pending Configuration Changes
   </TD>
</TR>
</TABLE>
<TABLE border="0" cellpadding="1" cellspacing="0" width="520">
<TR><TD class="bodyText">
<SCRIPT>
var tab = '<table border="0" cellspacing="0" cellpadding="0" width="520" \
style="width:520;"><TR><TD width=1 bgcolor=white></TD><TD bgcolor="#E6E6E6" \
width="19"><img src="images/spacer.gif"  BORDER="0" HEIGHT="17" HSPACE="0" \
NAME="IMG_DIRTY_TAB" VSPACE="0" WIDTH="19"></TD><TD bgcolor="#E6E6E6" class="TabText" \
width="243" NOWRAP>TABTEXT</TD><TD bgcolor="#FFFFFF" width="20"><img \
src="images/diagonal.gif"></TD><TD bgcolor="#FFFFFF" width="238" \
align="right"></TD></TR></TABLE>';

var aTabTitles = new Array()
aTabTitles[ "15" ] = "Ports";
aTabTitles[ "8" ] = "Basic Logging";
aTabTitles[ "35" ] = "Advanced Logging";
aTabTitles[ "6" ] = "HTTP Delivery";
aTabTitles[ "3" ] = "IP Binding";
aTabTitles[ "13" ] = "MIME Types";
aTabTitles[ "7" ] = "Mount Points";
aTabTitles[ "33" ] = "Content Caching";
aTabTitles[ "34" ] = "ISP Hosting";
aTabTitles[ "31" ] = "URL Aliasing";
aTabTitles[ "25" ] = "Proxy Routing";
aTabTitles[ "1" ] = "Connection Control";
aTabTitles[ "2" ] = "Bandwidth Management";
aTabTitles[ "21" ] = "User/Group Name";
aTabTitles[ "36" ] = "RealNetworks Encoding";
aTabTitles[ "4" ] = "Live Archiving ";
aTabTitles[ "27" ] = "Broadcast Redundancy";
aTabTitles[ "30" ] = "QT & RTP Encoding";
aTabTitles[ "32" ] = "Windows Media Encoding";
aTabTitles[ "28" ] = "Transmitter";
aTabTitles[ "29" ] = "Receiver";
aTabTitles[ "39" ] = "Splitting";
aTabTitles[ "9" ] = "Back-Channel Multicasting";
aTabTitles[ "11" ] = "Scalable Multicasting";
aTabTitles[ "10" ] = "Session Announcement";
aTabTitles[ "14" ] = "Cache Directives";
aTabTitles[ "16" ] = "Cache";
aTabTitles[ "17" ] = "Access Control";
aTabTitles[ "20" ] = "Authentication";
aTabTitles[ "19" ] = "Commerce";
aTabTitles[ "18" ] = "User Databases";
aTabTitles[ "22" ] = "View Source";
aTabTitles[ "5" ] = "Content Browsing";
aTabTitles[ "40" ] = "Redundant Servers";
aTabTitles[ "46" ] = "Player Setup";
aTabTitles[ "47" ] = "Player Update";
aTabTitles[ "24" ] = "Welcome";
aTabTitles[ "48" ] = "Browse Content";
aTabTitles[ "37" ] = "Proxy Monitor";
aTabTitles[ "38" ] = "Media Samples";
aTabTitles[ "41" ] = "Capability Exchange";
aTabTitles[ "42" ] = "Differentiated Services";
aTabTitles[ "43" ] = "Rate Management";
aTabTitles[ "44" ] = "Delayed Shutdown";
aTabTitles[ "45" ] = "SNMP";

var fChanges = ( isObj(diffConfig) && isObj(diffConfig.config) );

document.write( ( (!fChanges) ? 'No changes are pending.' :
	'Shown below are changes you have made that will take effect when you ' +
	'restart the server. Be sure to review these changes before clicking on the ' +
	'Restart Server button.') );
</SCRIPT>
</TD></TR></TABLE>

<BR>

<SCRIPT>
var oChangesByContext = {};
function _contextCallback ( a, prop, curDepth, curPath )
{
	// for each property found with a scalar value, record in the 
	// output holder
	if ( (!isObj(a[ prop ])) && (!isBlank(a[ prop ])) )
	{
		var contextID = a[ prop ] + "";
		if ( ! isObj( oChangesByContext[ contextID ] ) )
		{
			oChangesByContext[ contextID ] = {};
		}
		var oContext = oChangesByContext[ contextID ];

		var tmpPath = "";
		var tmpConfigProp = config;
		var tmpDiffProp = ( isObj(diffConfig) ? diffConfig.config : null );
		var tmpFileProp = ( isObj(fileConfig) ? fileConfig.config : null );

		// figure out if this property was added, deleted or changed, also
		// whether it is/was a list property

		var aPathParts = curPath.split( '.' );
		for ( var i = 0; i < aPathParts.length; i++ )
		{
			var pathPart = aPathParts[ i ];

			tmpPath += (tmpPath ? "." + pathPart : pathPart);
			tmpDiffProp = ( isObj(tmpDiffProp) ? tmpDiffProp[ pathPart ] : null );
			tmpFileProp = ( isObj(tmpFileProp) ? tmpFileProp[ pathPart ] : null );
			tmpConfigProp = ( isObj(tmpConfigProp) ? tmpConfigProp[ pathPart ] : null );

			// already recorded info about this path?
			if ( isBlank( oContext[ tmpPath ] ) )
			{
				var sAction = "";

				//is this property a list ?
				if ( isObj(tmpDiffProp) )
				{
					// is it a new list?
					if ( (!tmpConfigProp) && 
						   tmpFileProp )
					{
						sAction = "Created New List";
					}
				}
				else
				{
					// is this property a deleted list?
					if (  isObj(tmpConfigProp) && 
						(!isObj(tmpFileProp)) )
					{
						sAction = "Deleted List";
					}
					else // added, changed or deleted property
					{
						var newValue = tmpFileProp;
						var oldValue = tmpConfigProp;

						if ( pathPart.bSearch( /password/i ) )
						{
							if ( oldValue )
								oldValue = '????????' ;
							if ( newValue )
								newValue = '********' ;
						}

						if ( ( oldValue == null ) && ( newValue == null ) )
						{
							sAction = "Deleted";
						}
						else if ( oldValue == null )
						{
							sAction = "Set to ".span( "grey" ) + newValue;
						}
						else
						{
							if ( newValue == null ) newValue = "";
							sAction = "Changed from ".span( "grey" ) + oldValue + " to ".span( "grey" ) + \
newValue;  }
					}
				}
				oContext[ tmpPath ] = sAction;
			}
		}
	}
}
if ( isObj(diffConfig) && isObj(diffConfig.config) )
{
	enumPropArray( diffConfig.config, _contextCallback );
}

var s = "";
for (var contextID in oChangesByContext)
{
	s += tab.replace( /TABTEXT/, aTabTitles[ contextID ] ) + 
		'<TABLE border="0" cellspacing="1" cellpadding="6" width="520">' + 
		'<tr><td class="title2" valign="middle" width="190">Configuration Value</td>' +
		'<td class="title2" valign="middle" width="300">Action Taken</td></tr>' ;

	var rowCounter = 1;
	for ( var propPath in oChangesByContext[ contextID ] )
	{
		var sAction = oChangesByContext[ contextID ][ propPath ];
		if ( !isBlank( sAction ) )
		{
			var tdTag = '<td class="' + ((rowCounter++ % 2) ? 'odd' : 'even') + '">';

			s += '<tr>' + 
				tdTag + propPath + '</td>' +
				tdTag + sAction + '</td></tr>' ;
		}
	}
	
	s += "</TABLE><BR>" ;
}

document.write( s );
</SCRIPT>

<!--

var rowCounter = 1;
function emitChanges ( contextID )
{
	RMAOutput( tab.replace( /TABTEXT/, aTabTitles[ contextID ] ) + 
		'<TABLE border="0" cellspacing="1" cellpadding="6" width="520">' + 
		'<tr><td class="title2" valign="middle" width="190">Configuration Value</td><td \
class="title2" valign="middle" width="300">Action Taken</td></tr>' );  // enumerate \
the changes  rowCounter = 1;
	enumProps( "contextconfig." + contextID + ".config", enumFuncChanges, 0 );

	RMAOutput( "</TABLE><BR>" );

}	// emitChanges ()

function enumFuncChanges ( prop, propValue, curDepth )
{
	// strip off the "contextconfig.<contextID>.config"
	prop = prop.rightProp( -2 ); 

	if ( ! prop ) return ;

	var displayValue = "";

	//is this property a list ?
	if ( RMAGetFirstProperty( "diffconfig." + prop ) )
	{
		// is it a new list?
		if ( (!RMAGetFirstProperty( prop )) && 
			 RMAGetFirstProperty( "fileconfig." + prop ) )
		{
			displayValue = "Created New List";
		}
		else
		{
			// else skip it
			return ;
		}
	}
	else
	{
		// is this property a deleted list?
		if ( RMAGetFirstProperty( prop ) && 
			 (!RMAGetFirstProperty( "fileconfig." + prop )) )
		{
			displayValue = "Deleted List";
		}
		else
		{
			var newValue = RMAGetPropertyValue( "fileconfig." + prop );
			var oldValue = RMAGetPropertyValue( prop );

			if ( prop.bSearch( /password/i ) )
			{
				if ( oldValue )
					oldValue = '????????' ;
				if ( newValue )
					newValue = '********' ;
			}

			if ( ( oldValue == null ) && ( newValue == null ) )
			{
				displayValue = "Deleted";
			}
			else if ( oldValue == null )
			{
				displayValue = "Set to ".span( "grey" ) + newValue;
			}
			else
			{
				if ( newValue == null ) newValue = "";
				displayValue = "Changed from ".span( "grey" ) + oldValue + " to ".span( "grey" ) \
+ newValue;  }
		}
	}

	var className = ((rowCounter++ % 2) ? 'odd' : 'even');
	var tdTag = '<td class="' + className + '">';
	RMAOutput( '<tr>' + 
		tdTag + prop.rightProp( -1 ) + '</td>' +
		tdTag + displayValue + '</td></tr>'	);
}	// enumFuncChanges ()

-->
<TABLE border="0" cellpadding="1" cellspacing="0" width="520">
<TR>
	<TD align="right" valign="middle">
		<BR>
		<A href="javascript://" onclick="window.close();"><IMG src="images/close.gif" \
alt="Close" BORDER="0"></A>  </TD>
</TR>
</TABLE>
</CENTER>
</BODY>
</HTML>


_______________________________________________
Server-cvs mailing list
Server-cvs@helixcommunity.org
http://lists.helixcommunity.org/mailman/listinfo/server-cvs


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic