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

List:       helix-server-cvs
Subject:    [Server-cvs]
From:       dcollins () helixcommunity ! org
Date:       2007-05-25 19:28:24
Message-ID: 200705252131.l4PLVLkw008124 () mailer ! progressive-comp ! com
[Download RAW message or body]

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

Added Files:
	LICENSE.txt RCSL.txt RPSL.txt accessrule.js add_redirect.html 
	adduser.html browse_content.html browsers.html client.js 
	config_altserv.html config_binding.html config_cc.html 
	config_clog.html config_content_browsing.html 
	config_delivery.html config_localFS.html config_logging.html 
	config_mc_bc.html config_mc_sap.html config_mc_scale.html 
	config_mimetypes.html config_pc_cache.html 
	config_pending.nc.html config_ports.html 
	config_results.nc.html config_sec_ac.html config_sec_db.html 
	config_sec_rules.html config_sec_uauth.html config_setid.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 serve_me.html string.js 
	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.


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_sec_ac.html ---




<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_sec_ac.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->






<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">

/*!
<List Name="AccessControl">
    <List Name="100">
        <Var Access="Allow"/>
        <Var Description="Rule1"/>
        <Var From="Any"/>
        <List Name="Ports">
            <Var Port_1="52344"/>
            <Var Port_2="5344"/>
        </List>
        <Var To="Any"/>
    </List>
</List>
*/

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 )
{
	//! FOOOOOOOD

	var subList = propView.getSubList();
	if ( subList )
	{
		var subListPorts = subList.subList( "Ports" );
		if ( subListPorts )
		{
			subListPorts.fillForm( theForm );
		}
	}

	return true;

}	// postFillFormFromSubList ()


ACPropView.prototype.preValidateSubList = function ( subListName )
{
	//! FOOOOOOOD

	// 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></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: editsel.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: editsel.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

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: serve_me.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: serve_me.html,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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: config_logging.html ---




<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_logging.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->






<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 ()
{
	//! FOOOOOOOD

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

LogPropView.prototype.preValidate = function ()
{
	//! FOOOOOOOD

	// 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></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></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: config_mc_sap.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_mc_sap.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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></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: tree.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: tree.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
[...1367 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: revokeuser.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: revokeuser.html,v 1.2 2007/05/25 19:28:21 dcollins Exp \
                $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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="#759B00">  <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="#759B00">  <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"></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: getusers.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: getusers.html,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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="#759B00">  <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="#759B00">  <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"></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: client.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: client.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
[...1046 lines suppressed...]
	}

	if (-1 == propPath.indexOf( "." ))
	{
		return (isBlank(o[ propPath ]) ? null : o[propPath]);
	}
	else
	{											
		if ( ! isObj( o[propPath.leftProp(1)] ))
		{
			return null;
		}
		else
		{
			return findPropInObj(o[propPath.leftProp(1)], 
									propPath.rightProp(-1));
		}
	}					
}					


--- NEW FILE: license.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: license.html,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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 DNA 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";

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 )

];

 <!-- if ( not ($DEFS::RIA or $DEFS::DNA) ) -->

 <!-- if ( $DEFS::SERVER and not ($DEFS::RIA or $DEFS::DNA) ) -->

																	   
document.write( "<TITLE>Helix DNA 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="#759B00">  <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="#759B00">  <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>
<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>

<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: config_mc_scale.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_mc_scale.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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></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: grantuser.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: grantuser.html,v 1.2 2007/05/25 19:28:21 dcollins Exp $ \
                
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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="#759B00">  <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="#759B00">  <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"></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: results.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: results.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

/* 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: regview_header.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: regview_header.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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: LICENSE.txt ---
 Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.  
        
 The contents of this directory, and (except where otherwise
 indicated) the directories included within this directory, are
 subject to the current version of the RealNetworks Public Source
 License (the "RPSL") available at RPSL.txt in this directory, unless
 you have licensed the directory under the current version of the
 RealNetworks Community Source License (the "RCSL") available at
 RCSL.txt in this directory, in which case the RCSL will apply. You
 may also obtain the license terms directly from RealNetworks.  You
 may not use the files in this directory except in compliance with the
 RPSL or, if you have a valid RCSL with RealNetworks applicable to
 this directory, the RCSL.  Please see the applicable RPSL or RCSL for
 the rights, obligations and limitations governing use of the contents
 of the directory.
 
 This directory is part of the Helix DNA Technology. RealNetworks is
 the developer of the Original Code and owns the copyrights in the
 portions it created.
   
 This directory, and the directories included with this directory, are
 distributed and made available on an 'AS IS' basis, WITHOUT WARRANTY
 OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY
 DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY
 WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
 QUIET ENJOYMENT OR NON-INFRINGEMENT.
  
 Technology Compatibility Kit Test Suite(s) Location:  
    http://www.helixcommunity.org/content/tck  


--- NEW FILE: index.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: index.html,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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 DNA 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 DNA Administrator supports \
Netscape  and Internet Explorer version 4.0 or later. </p>
    </body>
    </noframes>

</FRAMESET>
</HTML>

--- NEW FILE: config_cc.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_cc.html,v 1.2 2007/05/25 19:28:21 dcollins Exp $ \
                
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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></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: browsers.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: browsers.html,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<HTML>
<HEAD>
<TITLE>Supported Browsers</TITLE>

</HEAD>
<BODY>

<H3>The Helix DNA 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: regtree_nav.css ---

BODY
{
	background-color:	#759B00;
    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: regpick_main.html ---

<html>
<head>

<STYLE>
BODY
{
	background-color:	#759B00;
	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: xblib.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: xblib.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

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: config_pc_cache.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_pc_cache.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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></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_setid.html ---




<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_setid.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->






<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></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: string.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: string.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

// 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*$/ ;

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 ];
}

// checks for the basic IP dotted format
function isIPAddrFormat ( addr )
{

	// just digits and dots?
	return addr.bSearch( /^ *[\d\.]+ *$/ ); 
}

function isIPAddr ( addr, bAllowZero )
{
	if ( isBlank( addr ) )
	{
		return false;
	}
	
	// check the basic form
	if ( ! addr.bSearch( /^(\d{1,3}\.){3}\d{1,3}$/ ) )
	{
		return false ;
	}
	
	var tmpA = addr.split( "." );
	if ( (!bAllowZero) && (parseInt( tmpA[ 0 ] ) == 0) )
	{
		return false;
	}

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

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 ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: removeuser.html,v 1.2 2007/05/25 19:28:21 dcollins Exp \
                $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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="#759B00">  <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="#759B00">  <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"></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: regpick.html ---

<HTML>

<HEAD>

<TITLE>Helix DNA 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: config_clog.html ---




<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_clog.html,v 1.2 2007/05/25 19:28:21 dcollins Exp \
                $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
[...2717 lines suppressed...]
			<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_content_browsing.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_content_browsing.html,v 1.2 2007/05/25 19:28:21 \
                dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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></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: 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:            #759B00;
  background-Color: #E6E6E6;
}
TD.input

{ 
  font-size:        12pt;
  font-weight:      500;
  color:            #759B00;
  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:            #759B00;
  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:            #759B00;
}
/* 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:            #666666;
	text-indent:      2em;
	letter-spacing:	  3pt;

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

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

.headerRule2
{ 
	font-size:        4pt;
	background-color: #759B00;
}
.linkText, .linkTextSmall
{
	font-size: 		12pt;
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	color:			#CC3300;
	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:          #759B00;
	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:			  	#759B00;
	font-size: 		13pt;
}

TD.odd, TD.even
{
	font-size:        12pt;
	font-weight:      500;
	color:            #759B00;
	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:            #759B00;
  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:					476px;

	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: cookies.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: cookies.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

// 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: RPSL.txt ---
RealNetworks Public Source License Version 1.0
(Rev. Date October 28, 2002)

1. General Definitions. This License applies to any program or other work which
RealNetworks, Inc., or any other entity that elects to use this license,
("Licensor") makes publicly available and which contains a notice placed by
Licensor identifying such program or work as "Original Code" and stating that it
is subject to the terms of this RealNetworks Public Source License version 1.0
(or subsequent version thereof) ("License"). You are not required to accept this
License. However, nothing else grants You permission to use, copy, modify or
distribute the software or its derivative works. These actions are prohibited by
law if You do not accept this License. Therefore, by modifying, copying or
distributing the software (or any work based on the software), You indicate your
acceptance of this License to do so, and all its terms and conditions. In
addition, you agree to the terms of this License by clicking the Accept button
or downloading the software. As used in this License:

1.1 "Applicable Patent Rights" mean: (a) in the case where Licensor is the
grantor of rights, claims of patents that (i) are now or hereafter acquired,
owned by or assigned to Licensor and (ii) are necessarily infringed by using or
making the Original Code alone and not in combination with other software or
hardware; and (b) in the case where You are the grantor of rights, claims of
patents that (i) are now or hereafter acquired, owned by or assigned to You and
(ii) are infringed (directly or indirectly) by using or making Your
Modifications, taken alone or in combination with Original Code.

1.2 "Compatible Source License" means any one of the licenses listed on Exhibit
B or at https://www.helixcommunity.org/content/complicense or other licenses
specifically identified by Licensor in writing. Notwithstanding any term to the
contrary in any Compatible Source License, any code covered by any Compatible
Source License that is used with Covered Code must be made readily available in
Source Code format for royalty-free use under the terms of the Compatible Source
License or this License.

1.3 "Contributor" means any person or entity that creates or contributes to the
creation of Modifications.

1.4 "Covered Code" means the Original Code, Modifications, the combination of
Original Code and any Modifications, and/or any respective portions thereof.

1.5 "Deploy" means to use, sublicense or distribute Covered Code other than for
Your internal research and development (R&D) and/or Personal Use, and includes
without limitation, any and all internal use or distribution of Covered Code
within Your business or organization except for R&D use and/or Personal Use, as
well as direct or indirect sublicensing or distribution of Covered Code by You
to any third party in any form or manner.

1.6 "Derivative Work" means either the Covered Code or any derivative work under
United States copyright law, and including any work containing or including any
portion of the Covered Code or Modifications, either verbatim or with
modifications and/or translated into another language. Derivative Work also
includes any work which combines any portion of Covered Code or Modifications
with code not otherwise governed by the terms of this License.

1.7 "Externally Deploy" means to Deploy the Covered Code in any way that may be
accessed or used by anyone other than You, used to provide any services to
anyone other than You, or used in any way to deliver any content to anyone other
than You, whether the Covered Code is distributed to those parties, made
available as an application intended for use over a computer network, or used to
provide services or otherwise deliver content to anyone other than You.

1.8. "Interface" means interfaces, functions, properties, class definitions,
APIs, header files, GUIDs, V-Tables, and/or protocols allowing one piece of
software, firmware or hardware to communicate or interoperate with another piece
of software, firmware or hardware.

1.9 "Modifications" mean any addition to, deletion from, and/or change to, the
substance and/or structure of the Original Code, any previous Modifications, the
combination of Original Code and any previous Modifications, and/or any
respective portions thereof. When code is released as a series of files, a
Modification is: (a) any addition to or deletion from the contents of a file
containing Covered Code; and/or (b) any new file or other representation of
computer program statements that contains any part of Covered Code.

1.10 "Original Code" means (a) the Source Code of a program or other work as
originally made available by Licensor under this License, including the Source
Code of any updates or upgrades to such programs or works made available by
Licensor under this License, and that has been expressly identified by Licensor
as such in the header file(s) of such work; and (b) the object code compiled
from such Source Code and originally made available by Licensor under this
License.

1.11 "Personal Use" means use of Covered Code by an individual solely for his or
her personal, private and non-commercial purposes. An individual's use of
Covered Code in his or her capacity as an officer, employee, member, independent
contractor or agent of a corporation, business or organization (commercial or
non-commercial) does not qualify as Personal Use.

1.12 "Source Code" means the human readable form of a program or other work that
is suitable for making modifications to it, including all modules it contains,
plus any associated interface definition files, scripts used to control
compilation and installation of an executable (object code).

1.13 "You" or "Your" means an individual or a legal entity exercising rights
under this License. For legal entities, "You" or "Your" includes any entity
which controls, is controlled by, or is under common control with, You, where
"control" means (a) the power, direct or indirect, to cause the direction or
management of such entity, whether by contract or otherwise, or (b) ownership of
fifty percent (50%) or more of the outstanding shares or beneficial ownership of
such entity.

2. Permitted Uses; Conditions & Restrictions. Subject to the terms and
conditions of this License, Licensor hereby grants You, effective on the date
You accept this License (via downloading or using Covered Code or otherwise
indicating your acceptance of this License), a worldwide, royalty-free,
non-exclusive copyright license, to the extent of Licensor's copyrights cover
the Original Code, to do the following:

2.1 You may reproduce, display, perform, modify and Deploy Covered Code,
provided that in each instance:

(a) You must retain and reproduce in all copies of Original Code the copyright
and other proprietary notices and disclaimers of Licensor as they appear in the
Original Code, and keep intact all notices in the Original Code that refer to
this License;

(b) You must include a copy of this License with every copy of Source Code of
Covered Code and documentation You distribute, and You may not offer or impose
any terms on such Source Code that alter or restrict this License or the
recipients' rights hereunder, except as permitted under Section 6;

(c) You must duplicate, to the extent it does not already exist, the notice in
Exhibit A in each file of the Source Code of all Your Modifications, and cause
the modified files to carry prominent notices stating that You changed the files
and the date of any change;

(d) You must make Source Code of all Your Externally Deployed Modifications
publicly available under the terms of this License, including the license grants
set forth in Section 3 below, for as long as you Deploy the Covered Code or
twelve (12) months from the date of initial Deployment, whichever is longer. You
should preferably distribute the Source Code of Your Deployed Modifications
electronically (e.g. download from a web site); and

(e) if You Deploy Covered Code in object code, executable form only, You must
include a prominent notice, in the code itself as well as in related
documentation, stating that Source Code of the Covered Code is available under
the terms of this License with information on how and where to obtain such
Source Code. You must also include the Object Code Notice set forth in Exhibit A
in the "about" box or other appropriate place where other copyright notices are
placed, including any packaging materials.

2.2 You expressly acknowledge and agree that although Licensor and each
Contributor grants the licenses to their respective portions of the Covered Code
set forth herein, no assurances are provided by Licensor or any Contributor that
the Covered Code does not infringe the patent or other intellectual property
rights of any other entity. Licensor and each Contributor disclaim any liability
to You for claims brought by any other entity based on infringement of
intellectual property rights or otherwise. As a condition to exercising the
rights and licenses granted hereunder, You hereby assume sole responsibility to
secure any other intellectual property rights needed, if any. For example, if a
third party patent license is required to allow You to make, use, sell, import
or offer for sale the Covered Code, it is Your responsibility to acquire such
license(s).

2.3 Subject to the terms and conditions of this License, Licensor hereby grants
You, effective on the date You accept this License (via downloading or using
Covered Code or otherwise indicating your acceptance of this License), a
worldwide, royalty-free, perpetual, non-exclusive patent license under
Licensor's Applicable Patent Rights to make, use, sell, offer for sale and
import the Covered Code, provided that in each instance you comply with the
terms of this License.

3. Your Grants. In consideration of, and as a condition to, the licenses granted
to You under this License:

(a) You grant to Licensor and all third parties a non-exclusive, perpetual,
irrevocable, royalty free license under Your Applicable Patent Rights and other
intellectual property rights owned or controlled by You, to make, sell, offer
for sale, use, import, reproduce, display, perform, modify, distribute and
Deploy Your Modifications of the same scope and extent as Licensor's licenses
under Sections 2.1 and 2.2; and

(b) You grant to Licensor and its subsidiaries a non-exclusive, worldwide,
royalty-free, perpetual and irrevocable license, under Your Applicable Patent
Rights and other intellectual property rights owned or controlled by You, to
make, use, sell, offer for sale, import, reproduce, display, perform,
distribute, modify or have modified (for Licensor and/or its subsidiaries),
sublicense and distribute Your Modifications, in any form and for any purpose,
through multiple tiers of distribution.

(c) You agree not use any information derived from Your use and review of the
Covered Code, including but not limited to any algorithms or inventions that may
be contained in the Covered Code, for the purpose of asserting any of Your
patent rights, or assisting a third party to assert any of its patent rights,
against Licensor or any Contributor.

4. Derivative Works. You may create a Derivative Work by combining Covered Code
with other code not otherwise governed by the terms of this License and
distribute the Derivative Work as an integrated product. In each such instance,
You must make sure the requirements of this License are fulfilled for the
Covered Code or any portion thereof, including all Modifications.

4.1 You must cause any Derivative Work that you distribute, publish or
Externally Deploy, that in whole or in part contains or is derived from the
Covered Code or any part thereof, to be licensed as a whole at no charge to all
third parties under the terms of this License and no other license except as
provided in Section 4.2. You also must make Source Code available for the
Derivative Work under the same terms as Modifications, described in Sections 2
and 3, above.

4.2 Compatible Source Licenses. Software modules that have been independently
developed without any use of Covered Code and which contain no portion of the
Covered Code, Modifications or other Derivative Works, but are used or combined
in any way wtih the Covered Code or any Derivative Work to form a larger
Derivative Work, are exempt from the conditions described in Section 4.1 but
only to the extent that: the software module, including any software that is
linked to, integrated with, or part of the same applications as, the software
module by any method must be wholly subject to one of the Compatible Source
Licenses. Notwithstanding the foregoing, all Covered Code must be subject to the
terms of this License. Thus, the entire Derivative Work must be licensed under a
combination of the RPSL (for Covered Code) and a Compatible Source License for
any independently developed software modules within the Derivative Work. The
foregoing requirement applies even if the Compatible Source License would
ordinarily allow the software module to link with, or form larger works with,
other software that is not subject to the Compatible Source License. For
example, although the Mozilla Public License v1.1 allows Mozilla code to be
combined with proprietary software that is not subject to the MPL, if
MPL-licensed code is used with Covered Code the MPL-licensed code could not be
combined or linked with any code not governed by the MPL. The general intent of
this section 4.2 is to enable use of Covered Code with applications that are
wholly subject to an acceptable open source license. You are responsible for
determining whether your use of software with Covered Code is allowed under Your
license to such software.

4.3 Mere aggregation of another work not based on the Covered Code with the
Covered Code (or with a work based on the Covered Code) on a volume of a storage
or distribution medium does not bring the other work under the scope of this
License. If You deliver the Covered Code for combination and/or integration with
an application previously provided by You (for example, via automatic updating
technology), such combination and/or integration constitutes a Derivative Work
subject to the terms of this License.

5. Exclusions From License Grant. Nothing in this License shall be deemed to
grant any rights to trademarks, copyrights, patents, trade secrets or any other
intellectual property of Licensor or any Contributor except as expressly stated
herein. No right is granted to the trademarks of Licensor or any Contributor
even if such marks are included in the Covered Code. Nothing in this License
shall be interpreted to prohibit Licensor from licensing under different terms
from this License any code that Licensor otherwise would have a right to
license. Modifications, Derivative Works and/or any use or combination of
Covered Code with other technology provided by Licensor or third parties may
require additional patent licenses from Licensor which Licensor may grant in its
sole discretion. No patent license is granted separate from the Original Code or
combinations of the Original Code with other software or hardware.

5.1. Trademarks. This License does not grant any rights to use the trademarks or
trade names owned by Licensor ("Licensor Marks" defined in Exhibit C) or to any
trademark or trade name belonging to any Contributor. No Licensor Marks may be
used to endorse or promote products derived from the Original Code other than as
permitted by the Licensor Trademark Policy defined in Exhibit C.

6. Additional Terms. You may choose to offer, and to charge a fee for, warranty,
support, indemnity or liability obligations and/or other rights consistent with
the scope of the license granted herein ("Additional Terms") to one or more
recipients of Covered Code. However, You may do so only on Your own behalf and
as Your sole responsibility, and not on behalf of Licensor or any Contributor.
You must obtain the recipient's agreement that any such Additional Terms are
offered by You alone, and You hereby agree to indemnify, defend and hold
Licensor and every Contributor harmless for any liability incurred by or claims
asserted against Licensor or such Contributor by reason of any such Additional
Terms.

7. Versions of the License. Licensor may publish revised and/or new versions of
this License from time to time. Each version will be given a distinguishing
version number. Once Original Code has been published under a particular version
of this License, You may continue to use it under the terms of that version. You
may also choose to use such Original Code under the terms of any subsequent
version of this License published by Licensor. No one other than Licensor has
the right to modify the terms applicable to Covered Code created under this
License.

8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in part
pre-release, untested, or not fully tested works. The Covered Code may contain
errors that could cause failures or loss of data, and may be incomplete or
contain inaccuracies. You expressly acknowledge and agree that use of the
Covered Code, or any portion thereof, is at Your sole and entire risk. THE
COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF
ANY KIND AND LICENSOR AND LICENSOR'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS
"LICENSOR" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY
DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT
NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF
SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET
ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. LICENSOR AND EACH
CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE
COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR
REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR
ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO ORAL OR
WRITTEN DOCUMENTATION, INFORMATION OR ADVICE GIVEN BY LICENSOR, A LICENSOR
AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. You
acknowledge that the Covered Code is not intended for use in high risk
activities, including, but not limited to, the design, construction, operation
or maintenance of nuclear facilities, aircraft navigation, aircraft
communication systems, or air traffic control machines in which case the failure
of the Covered Code could lead to death, personal injury, or severe physical or
environmental damage. Licensor disclaims any express or implied warranty of
fitness for such uses.

9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT
SHALL LICENSOR OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL,
INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR
YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER
UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR STRICT
LIABILITY), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF LICENSOR OR SUCH
CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND
NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME
JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR
CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event
shall Licensor's total liability to You for all damages (other than as may be
required by applicable law) under this License exceed the amount of ten dollars
($10.00).

10. Ownership. Subject to the licenses granted under this License, each
Contributor retains all rights, title and interest in and to any Modifications
made by such Contributor. Licensor retains all rights, title and interest in and
to the Original Code and any Modifications made by or on behalf of Licensor
("Licensor Modifications"), and such Licensor Modifications will not be
automatically subject to this License. Licensor may, at its sole discretion,
choose to license such Licensor Modifications under this License, or on
different terms from those contained in this License or may choose not to
license them at all.

11. Termination. 

11.1 Term and Termination. The term of this License is perpetual unless
terminated as provided below. This License and the rights granted hereunder will
terminate:

(a) automatically without notice from Licensor if You fail to comply with any
term(s) of this License and fail to cure such breach within 30 days of becoming
aware of such breach;

(b) immediately in the event of the circumstances described in Section 12.5(b);
or

(c) automatically without notice from Licensor if You, at any time during the
term of this License, commence an action for patent infringement against
Licensor (including by cross-claim or counter claim in a lawsuit);

(d) upon written notice from Licensor if You, at any time during the term of
this License, commence an action for patent infringement against any third party
alleging that the Covered Code itself (excluding combinations with other
software or hardware) infringes any patent (including by cross-claim or counter
claim in a lawsuit).

11.2 Effect of Termination. Upon termination, You agree to immediately stop any
further use, reproduction, modification, sublicensing and distribution of the
Covered Code and to destroy all copies of the Covered Code that are in your
possession or control. All sublicenses to the Covered Code which have been
properly granted prior to termination shall survive any termination of this
License. Provisions which, by their nature, should remain in effect beyond the
termination of this License shall survive, including but not limited to Sections
3, 5, 8, 9, 10, 11, 12.2 and 13. No party will be liable to any other for
compensation, indemnity or damages of any sort solely as a result of terminating
this License in accordance with its terms, and termination of this License will
be without prejudice to any other right or remedy of any party.

12. Miscellaneous.

12.1 Government End Users. The Covered Code is a "commercial item" as defined in
FAR 2.101. Government software and technical data rights in the Covered Code
include only those rights customarily provided to the public as defined in this
License. This customary commercial license in technical data and software is
provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer
Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical
Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software
or Computer Software Documentation). Accordingly, all U.S. Government End Users
acquire Covered Code with only those rights set forth herein.

12.2 Relationship of Parties. This License will not be construed as creating an
agency, partnership, joint venture or any other form of legal association
between or among You, Licensor or any Contributor, and You will not represent to
the contrary, whether expressly, by implication, appearance or otherwise.

12.3 Independent Development. Nothing in this License will impair Licensor's
right to acquire, license, develop, have others develop for it, market and/or
distribute technology or products that perform the same or similar functions as,
or otherwise compete with, Modifications, Derivative Works, technology or
products that You may develop, produce, market or distribute.

12.4 Waiver; Construction. Failure by Licensor or any Contributor to enforce any
provision of this License will not be deemed a waiver of future enforcement of
that or any other provision. Any law or regulation which provides that the
language of a contract shall be construed against the drafter will not apply to
this License.

12.5 Severability. (a) If for any reason a court of competent jurisdiction finds
any provision of this License, or portion thereof, to be unenforceable, that
provision of the License will be enforced to the maximum extent permissible so
as to effect the economic benefits and intent of the parties, and the remainder
of this License will continue in full force and effect. (b) Notwithstanding the
foregoing, if applicable law prohibits or restricts You from fully and/or
specifically complying with Sections 2 and/or 3 or prevents the enforceability
of either of those Sections, this License will immediately terminate and You
must immediately discontinue any use of the Covered Code and destroy all copies
of it that are in your possession or control.

12.6 Dispute Resolution. Any litigation or other dispute resolution between You
and Licensor relating to this License shall take place in the Seattle,
Washington, and You and Licensor hereby consent to the personal jurisdiction of,
and venue in, the state and federal courts within that District with respect to
this License. The application of the United Nations Convention on Contracts for
the International Sale of Goods is expressly excluded.

12.7 Export/Import Laws. This software is subject to all export and import laws
and restrictions and regulations of the country in which you receive the Covered
Code and You are solely responsible for ensuring that You do not export,
re-export or import the Covered Code or any direct product thereof in violation
of any such restrictions, laws or regulations, or without all necessary
authorizations.

12.8 Entire Agreement; Governing Law. This License constitutes the entire
agreement between the parties with respect to the subject matter hereof. This
License shall be governed by the laws of the United States and the State of
Washington.

Where You are located in the province of Quebec, Canada, the following clause
applies: The parties hereby confirm that they have requested that this License
and all related documents be drafted in English. Les parties ont exig&eacute;
que le pr&eacute;sent contrat et tous les documents connexes soient
r&eacute;dig&eacute;s en anglais.

								EXHIBIT A.  

"Copyright &copy; 1995-2002
RealNetworks, Inc. and/or its licensors. All Rights Reserved.

The contents of this file, and the files included with this file, are subject to
the current version of the RealNetworks Public Source License Version 1.0 (the
"RPSL") available at https://www.helixcommunity.org/content/rpsl unless you have
licensed the file under the RealNetworks Community Source License Version 1.0
(the "RCSL") available at https://www.helixcommunity.org/content/rcsl, in which
case the RCSL will apply. You may also obtain the license terms directly from
RealNetworks. You may not use this file except in compliance with the RPSL or,
if you have a valid RCSL with RealNetworks applicable to this file, the RCSL.
Please see the applicable RPSL or RCSL for the rights, obligations and
limitations governing use of the contents of the file.

This file is part of the Helix DNA Technology. RealNetworks is the developer of
the Original code and owns the copyrights in the portions it created.

This file, and the files included with this file, is distributed and made
available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR
IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING
WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.

Contributor(s): ____________________________________ 

Technology Compatibility Kit Test
Suite(s) Location (if licensed under the RCSL): ______________________________ 

Object Code Notice: Helix DNA Client technology included. Copyright (c)
RealNetworks, Inc., 1995-2002. All rights reserved.


								EXHIBIT B 

Compatible Source Licenses for the RealNetworks Public Source License. The
following list applies to the most recent version of the license as of October
25, 2002, unless otherwise indicated.

* Academic Free License
* Apache Software License
* Apple Public Source License
* Artistic license
* Attribution Assurance Licenses
* BSD license
* Common Public License (1)
* Eiffel Forum License
* GNU General Public License (GPL) (1)
* GNU Library or "Lesser" General Public License (LGPL) (1)
* IBM Public License
* Intel Open Source License
* Jabber Open Source License
* MIT license
* MITRE Collaborative Virtual Workspace License (CVW License)
* Motosoto License
* Mozilla Public License 1.0 (MPL)
* Mozilla Public License 1.1 (MPL)
* Nokia Open Source License
* Open Group Test Suite License
* Python Software Foundation License
* Ricoh Source Code Public License
* Sun Industry Standards Source License (SISSL)
* Sun Public License
* University of Illinois/NCSA Open Source License
* Vovida Software License v. 1.0
* W3C License
* X.Net License
* Zope Public License
* zlib/libpng license

(1) Note: because this license contains certain reciprocal licensing terms that
purport to extend to independently developed code, You may be prohibited under
the terms of this otherwise compatible license from using code licensed under
its terms with Covered Code because Covered Code may only be licensed under the
RealNetworks Public Source License. Any attempt to apply non RPSL license terms,
including without limitation the GPL, to Covered Code is expressly forbidden.
You are responsible for ensuring that Your use of Compatible Source Licensed
code does not violate either the RPSL or the Compatible Source License.

The latest version of this list can be found at:
https://www.helixcommunity.org/content/complicense

								EXHIBIT C 

RealNetworks' Trademark policy.  

RealNetworks defines the following trademarks collectively as "Licensor
Trademarks": "RealNetworks", "RealPlayer", "RealJukebox", "RealSystem",
"RealAudio", "RealVideo", "RealOne Player", "RealMedia", "Helix" or any other
trademarks or trade names belonging to RealNetworks.

RealNetworks "Licensor Trademark Policy" forbids any use of Licensor Trademarks
except as permitted by and in strict compliance at all times with RealNetworks'
third party trademark usage guidelines which are posted at
http://www.realnetworks.com/info/helixlogo.html.


--- NEW FILE: toc_w3c.css ---

BODY
{
    padding-top:	4 ;
	padding-left:	6 ;
	border-left: 	6px solid #759B00;
	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: propview_nolist.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: propview_nolist.js,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

//<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 ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: enumproplist.js,v 1.2 2007/05/25 19:28:21 dcollins Exp \
                $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

//<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 ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: regview_main.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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 DNA 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: config_results.nc.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_results.nc.html,v 1.2 2007/05/25 19:28:21 \
                dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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 DNA Administrator must reload itself using the new Admin Port ('" \
+  newAdminPort + 
		"').\n\nBe sure to alter any Helix DNA 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 DNA 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="#759B00">  <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="#759B00">  <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: config_sec_db.html ---




<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_sec_db.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->






<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">

/*!

<!-- D A T A B A S E S -->
<List Name="Databases">
    <List Name="Admin_Basic">
        <Var PluginID="rn-db-flatfile"/>
        <Var Path="E:\realserver\adm_b_db"/>
    </List>
    <List Name="CDist_Basic">
        <Var PluginID="rn-db-flatfile"/>
        <Var Path="E:\realserver\cdi_b_db"/>
    </List>
    <List Name="Encoder_RN5">
        <Var PluginID="rn-db-flatfile"/>
        <Var Path="E:\realserver\enc_r_db"/>
    </List>
    <List Name="PlayerContent">
        <Var PluginID="rn-db-flatfile"/>
        <Var Path="E:\realserver\con_p_db"/>
    </List>

</List>

*/

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) )
	{
	//! FOOOOOOOD
		// 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 )

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

/*! this code causes "too much recursion" error in Nav4 so its commented out
	for now - see if we can live without it [bg 7/11/01]
	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
DBPropView.prototype.isDirty = function ()
{
	if ( ! this.m_bLoaded ) return ;

	//! FOOOOOOOD

	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 )
{
	//! FOOOOOOOD

	onTypeChange();

	return true;

}	// postFillFormFromSubList ()

DBPropView.prototype.onSubListChangeNotify = function ( action, subListName )
{
	//! FOOOOOOOD

	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 )
{
	//! FOOOOOOOD

	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"

];

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 )
	{
		//! adjust acnhor points to account for table padding
		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 ; //! skooch it over a smidge it \
account for output table padding  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></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>
		</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>




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

</BODY>
</HTML>

--- NEW FILE: toc.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: toc.html,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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 ) )
	{
		aTags = folder.getElementsByTagName( "A" );
		aTags[ 1 ].style.color = "#759B00" ;
		folder.style.backgroundColor = "#E6E6E6" ;
	}
	else
	{
		var iter = new FolderIter( folder );
		var parentFolder = iter.getParent();
		if ( parentFolder )
		{
			aTags = parentFolder.getElementsByTagName( "A" );
			aTags[ 1 ].style.color = "#759B00" ;
			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 ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_ports.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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( '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" ),

];

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></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">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%">
			<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: qstr.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: qstr.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

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: config_delivery.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_delivery.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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 DNA 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></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: 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:            #759B00;
  background-Color: #E6E6E6;
}
TD.input

{ 
  font-size:        9pt;
  font-weight:      500;
  color:            #759B00;
  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:            #759B00;
  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:            #759B00;
}
/* 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:            #666666;
	text-indent:      2em;
	letter-spacing:	  3pt;

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

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

.headerRule2
{ 
	font-size:        4pt;
	background-color: #759B00;
}
.linkText, .linkTextSmall
{
	font-size: 		9pt;
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	color:			#CC3300;
	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:          #759B00;
	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:			  	#759B00;
	font-size: 		13pt;
}

TD.odd, TD.even
{
	font-size:        9pt;
	font-weight:      500;
	color:            #759B00;
	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:            #759B00;
  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:					476px;

	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: dialog.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: dialog.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

/* 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: 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( "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 );
	}

	// *** 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 TOCLink( "Commerce", "config_sec_rules.html", tmpParent );

	// *** 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 );

	// *** Broadcast Distribution ***
	tmpParent = new TOCLink( "Broadcast Distribution", "" );

	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( "Session \
Announcement", "config_mc_sap.html", tmpParent, "Multicast.General" );

	// *** Content Mgmt ***
	var tmpParent = new TOCLink( "Content Management", "" );

	new TOCLink( "Content Browsing", "config_content_browsing.html", tmpParent );

}	// createTOCLinks ()

--- NEW FILE: propview.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: propview.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

//<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: regview.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: regview.html,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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: edituser.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: edituser.html,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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="#759B00">  <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="#759B00">  <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"></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: 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: 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:            #759B00;
  background-Color: #E6E6E6;
}
TD.input

{ 
  font-size:        12pt;
  font-weight:      500;
  color:            #759B00;
  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:            #759B00;
  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:            #759B00;
}
/* 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:            #666666;
	text-indent:      2em;
	letter-spacing:	  3pt;

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

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

.headerRule2
{ 
	font-size:        4pt;
	background-color: #759B00;
}
.linkText, .linkTextSmall
{
	font-size: 		12pt;
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	color:			#CC3300;
	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:          #759B00;
	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:			  	#759B00;
	font-size: 		large;
}

TD.odd, TD.even
{
	font-size:        12pt;
	font-weight:      500;
	color:            #759B00;
	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:            #759B00;
  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:					476px;

	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: ip.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: ip.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

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

var proplist		 	= new PropList();	// for IP Address validation
var validMulticastRange = new IPRange( new IPAddress('224.0.0.0') , new \
IPAddress('239.255.255.255') );

// raise base number to exponent function
function exp( base , exponent )
{
	if ( exponent == 0 )
		return 1;

	// don't support negative exponents
	if ( exponent < 0  )
		return 0;
		
	return base * exp( base , exponent - 1 );
}

// create an ip address range from a string
// create an ip address range from a string
function stringToIPRange( str ) 
{
	var tmp = new Object;
	var addrs = new Array();
	addrs = str.split('-');

	if ( addrs.length != 2 ) {
		tmp.errMsg = "IP Ranges must be of the form \
[0-255].[0-255].[0-255].[0-255]-[0-255].[0-255].[0-255].[0-255].";  return tmp;
	}
	
	if ( ! ( proplist.ip_validate( addrs[0] ) ) && ( proplist.ip_validate( addrs[1] ) ) \
) {  tmp.errMsg = proplist.errMsg;
		return tmp;
	}
	
	return new IPRange( new IPAddress( addrs[0] ) , new IPAddress( addrs[1] ) );
}

// ip address range constructor
function IPRange( addr1 , addr2, isMulticast )
{
	// test to make sure we're working with IPAddress objects
	if ( addr1.type && addr2.type && addr1.type == 'IPAddress' && addr2.type == \
'IPAddress')  {
		if ( addr1.addr > addr2.addr )
		{
			this.addressLow  = addr2;
			this.addressHigh = addr1;
		} 
		else
		{
			this.addressLow	 = addr1;
			this.addressHigh = addr2;
		}
	}
	else
	{
		this.errMsg = "Bad IPRange parameters."
	}
		
	return this;
}

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

IPRange.prototype.addressInRange = function ( addr )
{
	return addr.isInRange( this );
}

IPRange.prototype.isOverlap = function ( range )
{
	return range.addressHigh.isInRange( this ) || range.addressLow.isInRange( this ) || \
this.addressHigh.isInRange( range ) || this.addressLow.isInRange( range ); }

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

IPRange.prototype.numAddrsInRange = function ( )
{
	return this.addressHigh.addr - this.addressLow.addr + 1;
}

function IPAddress( addr, isMulticast )
{
	if ( ! proplist.ip_validate( addr ) ) {
		this.errMsg = proplist.errMsg;
		return this;
	}
		
	var octets	= addr.split('.');
	if ( octets.length < 4 )
	{
		// assure we've got at least 4 octets
		octets.push( 0, 0, 0, 0 );
	}
	
	this.addr = eval(octets[0] * 16777216) + eval(octets[1] * 65536) + eval(octets[2] * \
256) + eval(octets[3]);

	this.type = 'IPAddress';
	return this;
}

IPAddress.prototype.toString = function ( ) 
{
	var str = "";
	for ( var i = 0; i < 4; i++ ) {
		str += ( this.addr & ( 255 << ( 3 - i ) * 8 ) ) >>> ( 3 - i ) * 8;
		str += '.';
	}

	// return string without the trailing '.'
	return str.substr(0 , str.length - 1 );
}

IPAddress.prototype.isBetween = function ( compareIP1 , compareIP2 )
{
	var range = new IPRange( compareIP1 , compareIP2 );
	return this.isInRange( range );
}

IPAddress.prototype.isInRange = function ( range )
{
	return (this.addr < range.addressHigh.addr && this.addr > range.addressLow.addr) || \
( this.addr == range.addressLow.addr || this.addr == range.addressHigh.addr ); }

IPAddress.prototype.isClassD = function ()
{
	return (this.addr >= 3758096384) && (this.addr < 4026531840);
}

IPAddress.prototype.isClassC = function ()
{
	return (this.addr >= 3221225472) && (this.addr < 3758096384);
}

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 getIPAddrErr ( addr, isMulticast )
{
	var errMsg = "";

	var isValid = isIPAddr( addr );
	if ( isValid && isMulticast )
	{
		isValid = (new IPAddress( addr ).isClassD());
	}
	
	if ( ! isValid )
	{
		if ( isMulticast )
		{
			errMsg = "'" + addr + "' is an invalid Multicast IP Address. Multicast Addresses \
must be in the range " +   "224.0.0.0 to 239.255.255.255" ;
		}
		else
		{
			errMsg =  "'" + addr + "' is an invalid IP Address. IP Addresses must be in the \
form [1-255].[0-255].[0-255].[0-255]";  }
	}

	return errMsg;
}

--- NEW FILE: datachannel.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: datachannel.html,v 1.2 2007/05/25 19:28:21 dcollins Exp \
                $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<HTML>
<HEAD>

<SCRIPT>
if ( top.gDataChannel == null ) //standalone mode: need to instantiate the global \
data channel object {
	document.write( "<" + "SCRIPT SRC='ra_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_localFS.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_localFS.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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" ),

];

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 DNA 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></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="">  </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: add_redirect.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: add_redirect.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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="#759B00">  <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="#759B00">  <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"></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: revokealluser.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: revokealluser.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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="#759B00">  <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="#759B00">  <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"></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 ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: mongraph.nc.html,v 1.2 2007/05/25 19:28:21 dcollins Exp \
                $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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></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: propview_noedit.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: propview_noedit.js,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

//<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: 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:            #759B00;
  background-Color: #E6E6E6;
}
TD.input

{ 
  font-size:        9pt;
  font-weight:      500;
  color:            #759B00;
  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:            #759B00;
  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:            #759B00;
}
/* 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:            #666666;
	text-indent:      2em;
	letter-spacing:	  3pt;

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

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

.headerRule2
{ 
	font-size:        4pt;
	background-color: #759B00;
}
.linkText, .linkTextSmall
{
	font-size: 		9pt;
	font-family:    Verdana, Arial, Helvetica, sans-serif;
	color:			#CC3300;
	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:          #759B00;
	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:			  	#759B00;
	font-size: 		13pt;
}

TD.odd, TD.even
{
	font-size:        9pt;
	font-weight:      500;
	color:            #759B00;
	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:            #759B00;
  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:					476px;

	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_sec_rules.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_sec_rules.html,v 1.2 2007/05/25 19:28:21 \
                dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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></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: proplist.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: proplist.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
[...1456 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: accessrule.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: accessrule.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: accessrule.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

function AccessRule ( addressCtrl, netmaskCtrl, ruleCtrl, propList )
{
	this.m_addressCtrl = addressCtrl ;
	this.m_netmaskCtrl = netmaskCtrl ;
	this.m_ruleCtrl = ruleCtrl ;
	this.m_propList = propList ;
	this.m_bAllowHostnames = true ;
	this.m_bAllowZero = false ;

	return this ;
}

AccessRule.prototype.AllowHostnames = function ( bAllowHostnames )
{
	if ( arguments.length )
	{
		this.m_bAllowHostnames = ( bAllowHostnames ? true : false );
	}
	return this.m_bAllowHostnames ;
}

// allow the address 0.0.0.0
AccessRule.prototype.AllowZero = function ( bAllowZero )
{
	if ( arguments.length )
	{
		this.m_bAllowZero = ( bAllowZero ? true : false );
	}
	return this.m_bAllowZero ;
}

AccessRule.prototype.split = function ()
{
	var address = "";
	var netmask = "";

	var rule = getCtrlValue( this.m_ruleCtrl );
	if ( rule.bSearch( "/" ) )
	{
		var tempA = rule.split( "/" );
		if ( tempA )
		{
			address = tempA[ 0 ];
			if ( ! isBlank( tempA[ 1 ] ) )
				netmask = tempA[ 1 ];
		}
	}
	else if ( rule.bSearch( ":" ) )
	{
		var tempA = rule.split( ":" );
		if ( tempA )
		{
			address = tempA[ 0 ];
			if ( ! isBlank( tempA[ 1 ] ) )
			{
				var ip = new IPAddress( tempA[ 1 ] );
				if ( ! ip.errMsg )
				{
					netmask = numBits( ip.addr );
				}
			}
		}
	}
	else
	{
		address = rule ;
	}

	setCtrlValue( this.m_addressCtrl, address );
	setCtrlValue( this.m_netmaskCtrl, netmask );
}

function numBits ( n )
{
    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 : "" );
}

AccessRule.prototype.validate = function ()
{
	// validate address as a proper ip address
	// stores in rule control if valid

	errMsgIP = "IP Addresses must be of the form [1-255].[0-255].[0-255].[0-255]" ;

	var bValid = false ;
	var addr = getCtrlValue( this.m_addressCtrl );
	var rule = addr ;

	// if the address is an IP address, makes sure its valid.
	// then, determine wether a netmask is needed
	if ( ! isIPAddrFormat( addr ) )
	{
		// do we allow hostnames?
		if ( ! this.m_bAllowHostnames )
		{
			return rejectInput( this.m_addressCtrl, errMsgIP );
		}

		// see if the hostname is valid
		if ( ! this.m_propList.hostname_validate( addr ) )
			return rejectInput( this.m_addressCtrl, this.m_propList.errMsg );

		// else hostname is good - no netmask needed
	}
	else if ( !isIPAddr( addr, this.m_bAllowZero ) )
	{
		// invalid IP Address
		return rejectInput( this.m_addressCtrl, errMsgIP );
	}
	else	// valid IP Address - see if the netmask is valid (and whether its needed or \
not)  {
		// determine if a netmask is required: the address has a zero in it
		var needNetmask = false ;
		var octets = addr.split( '.' );
		for ( var i = 0; i < octets.length; i++ )
		{ 
			if ( parseInt( octets[ i ] ) == 0 )
			{
				needNetmask = true ;
				break ;
			}	
		}

		var netmask = getCtrlValue( this.m_netmaskCtrl );
		if ( needNetmask && ("" == netmask) )
		{
			return rejectInput( this.m_netmaskCtrl, "A netmask is required for this IP \
address." );  }
		if ( "" != netmask )
		{
			if ( ! this.m_propList.netmask_validate( netmask ) )
				return rejectInput( this.m_netmaskCtrl, this.m_propList.errMsg );

			var seperator = ":" ;
			if ( -1 == netmask.indexOf( "." ) )
				seperator = "/" ;

			rule += seperator + netmask ;
		}
	}

	setCtrlValue( this.m_ruleCtrl, rule );

	return true ;
}

AccessRule.prototype.join = function ()
{
	var seperator = ":" ;

	var netmask = getCtrlValue( this.m_netmaskCtrl );
	if ( netmask == "" )
		seperator = "" ;
	else if ( parseInt( netmask ) == netmask )
		seperator = "/" ;

	setCtrlValue( this.m_ruleCtrl, 
		getCtrlValue( this.m_addressCtrl ) +
		seperator + netmask );
}


--- NEW FILE: regview_toc.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: regview_toc.html,v 1.2 2007/05/25 19:28:21 dcollins Exp \
                $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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_altserv.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_altserv.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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 = "39";
</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 DNA 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></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: browse_content.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: browse_content.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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 DNA Server Content Browser</H2>

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

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

</BODY>
</HTML>

--- 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></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_mimetypes.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_mimetypes.html,v 1.2 2007/05/25 19:28:21 \
                dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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></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: header.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: header.html,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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 DNA 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 DNA 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=Li \
veConnections.Count&distLicensingList=DistributedLicensing&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="#759B00"
	style="background-color: #759B00"
	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://https://www.helixcommunity.org/" target="_blank"><img \
src="images/helix_logo.gif"  ALT="Helix Community" BORDER="0" HSPACE="0" \
VSPACE="0"></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:#759B00;"><A \
CLASS="linkText" HREF="Javascript:launchAbout()">About</A></SPAN></SPAN></TD> <TD \
align="right" width="8" bgcolor="#FFFFFF">&nbsp;</TD> </TR>
<TR>
<TD align="left"  valign="middle" bgcolor="#759B00" NOWRAP \
class="headerServerLabel">Active Server:&nbsp;<SPAN \
class="headerServerName"><SCRIPT>document.write( hostname.ent() \
)</SCRIPT></SPAN></TD> <TD align="right" valign="middle" bgcolor="#759B00" \
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="#759B00">&nbsp;</TD>
</TR>
</TABLE>
</form>	
</body>
</html>


--- NEW FILE: welcome.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: welcome.html,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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 DNA 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>

</DIV>
</td></tr>
</table>
</BODY>
</HTML>

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

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: regview.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

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: config_binding.html ---




<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_binding.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->






<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 )
{
	//! FOOOOOOOD

	var addr = getCtrlValue( theForm.theEdit );
	if ( (!propList.netmaskany_validate( addr )) && 
    	 (addr.toLowerCase() != "ipv4only") &&
    	 (addr.toLowerCase() != "ipv6only") )
	{
		return rejectInput( theForm.theEdit, propList.errMsg );
	}

	var selCtrl = theForm.theList;
	for ( var i = 0; i < selCtrl.length; i++ )
	{
		var ip = new IPAddressAllowAny( selCtrl.options[ i ].text );
		if ( (selCtrl.length > 1) &&
        	 (ip.isUnspecified ||
              (ip.sAddress.toLowerCase() != "any") ||
              (ip.sAddress.toLowerCase() != "ipv4only") ||
              (ip.sAddress.toLowerCase() != "ipv6only")) )
		{
			return rejectInput( theForm.theEdit, 
				"The IP address '0' or the key words 'Any', 'IPV4Only' or 'IPv6Only' may not be \
used with any other IP Addresses in the IP Bindings list." );  }

		// 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.onESRename = function ( oldSubListName, newSubListName )
{
	if ( ! this.m_bLoaded ) return ;

	//! FOOOOOOOD

	// 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 ;

	//! FOOOOOOOD
	
    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></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: adduser.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: adduser.html,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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="#759B00">  <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="#759B00">  <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"></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: RCSL.txt ---
The RCSL is made up of a base agreement and a few Attachments.

For Research and Development use, you agree to the terms of the
RCSL R&D License (base RCSL and Attachments A, B, and C) 

For Commercial Use (either distribution or internal commercial
deployment) of the Helix DNA with or without support for RealNetworks'
RealAudio and RealVideo Add-on Technology, you agree to the
terms of the same RCSL R&D license
and execute one or more additional Commercial Use License attachments
<see http://www.helixcommunity.org/content/rcsl-attachments>.

------------------------------------------------------------------------


    REALNETWORKS COMMUNITY SOURCE LICENSE

Version 1.2 (Rev. Date: January 22, 2003).


  RECITALS

Original Contributor has developed Specifications, Source Code
implementations and Executables of certain Technology; and

Original Contributor desires to license the Technology to a large
community to facilitate research, innovation and product development
while maintaining compatibility of such products with the Technology as
delivered by Original Contributor; and

Original Contributor desires to license certain Trademarks for the
purpose of branding products that are compatible with the relevant
Technology delivered by Original Contributor; and

You desire to license the Technology and possibly certain Trademarks
from Original Contributor on the terms and conditions specified in this
License.

In consideration for the mutual covenants contained herein, You and
Original Contributor agree as follows:


  AGREEMENT

*1. Introduction.*

The RealNetworks Community Source License ("RCSL") and effective
attachments ("License") may include five distinct licenses:

i) Research Use license -- License plus Attachments A, B and C only.

ii) Commercial Use and Trademark License, which may be for Internal
Deployment Use or external distribution, or both -- License plus
Attachments A, B, C, and D.

iii) Technology Compatibility Kit (TCK) license -- Attachment C.

iv) Add-On Technology License (Executable) Commercial Use License
-Attachment F.

v) Add-On Technology Source Code Porting and Optimization
License-Attachment G.

The Research Use license is effective when You click and accept this
License. The TCK is effective when You click and accept this License,
unless otherwise specified in the TCK attachments. The Commercial Use
and Trademark, Add-On Technology License, and the Add-On Technology
Source Code Porting and Optimization licenses must each be signed by You
and Original Contributor to become effective. Once effective, these
licenses and the associated requirements and responsibilities are
cumulative. Capitalized terms used in this License are defined in the
Glossary.

*2. License Grants.*

2.1 Original Contributor Grant.

Subject to Your compliance with Sections 3, 8.10 and Attachment A of
this License, Original Contributor grants to You a worldwide,
royalty-free, non-exclusive license, to the extent of Original
Contributor's Intellectual Property Rights covering the Original Code,
Upgraded Code and Specifications, to do the following:

(a) Research Use License:

(i) use, reproduce and modify the Original Code, Upgraded Code and
Specifications to create Modifications and Reformatted Specifications
for Research Use by You;

(ii) publish and display Original Code, Upgraded Code and Specifications
with, or as part of Modifications, as permitted under Section 3.1(b) below;

(iii) reproduce and distribute copies of Original Code and Upgraded Code
to Licensees and students for Research Use by You;

(iv) compile, reproduce and distribute Original Code and Upgraded Code
in Executable form, and Reformatted Specifications to anyone for
Research Use by You.

(b) Other than the licenses expressly granted in this License, Original
Contributor retains all right, title, and interest in Original Code and
Upgraded Code and Specifications.

2.2 Your Grants.

(a) To Other Licensees. You hereby grant to each Licensee a license to
Your Error Corrections and Shared Modifications, of the same scope and
extent as Original Contributor's licenses under Section 2.1 a) above
relative to Research Use and Attachment D relative to Commercial Use.

(b) To Original Contributor. You hereby grant to Original Contributor a
worldwide, royalty-free, non-exclusive, perpetual and irrevocable
license, to the extent of Your Intellectual Property Rights covering
Your Error Corrections, Shared Modifications and Reformatted
Specifications, to use, reproduce, modify, display and distribute Your
Error Corrections, Shared Modifications and Reformatted Specifications,
in any form, including the right to sublicense such rights through
multiple tiers of distribution.

(c) Other than the licenses expressly granted in Sections 2.2(a) and (b)
above, and the restrictions set forth in Section 3.1(d)(iv) below, You
retain all right, title, and interest in Your Error Corrections, Shared
Modifications and Reformatted Specifications.

2.3 Contributor Modifications.

You may use, reproduce, modify, display and distribute Contributor Error
Corrections, Shared Modifications and Reformatted Specifications,
obtained by You under this License, to the same scope and extent as with
Original Code, Upgraded Code and Specifications.

2.4 Subcontracting.

You may deliver the Source Code of Covered Code to other Licensees
having at least a Research Use license, for the sole purpose of
furnishing development services to You in connection with Your rights
granted in this License. All such Licensees must execute appropriate
documents with respect to such work consistent with the terms of this
License, and acknowledging their work-made-for-hire status or assigning
exclusive right to the work product and associated Intellectual Property
Rights to You.

*3. Requirements and Responsibilities*.

3.1 Research Use License.

As a condition of exercising the rights granted under Section 2.1(a)
above, You agree to comply with the following:

(a) Your Contribution to the Community. All Error Corrections and Shared
Modifications which You create or contribute to are automatically
subject to the licenses granted under Section 2.2 above. You are
encouraged to license all of Your other Modifications under Section 2.2
as Shared Modifications, but are not required to do so. You agree to
notify Original Contributor of any errors in the Specification.

(b) Source Code Availability. You agree to provide all Your Error
Corrections to Original Contributor as soon as reasonably practicable
and, in any event, prior to Internal Deployment Use or Commercial Use,
if applicable. Original Contributor may, at its discretion, post Source
Code for Your Error Corrections and Shared Modifications on the
Community Webserver. You may also post Error Corrections and Shared
Modifications on a web-server of Your choice; provided, that You must
take reasonable precautions to ensure that only Licensees have access to
such Error Corrections and Shared Modifications. Such precautions shall
include, without limitation, a password protection scheme limited to
Licensees and a click-on, download certification of Licensee status
required of those attempting to download from the server. An example of
an acceptable certification is attached as Attachment A-2.

(c) Notices. All Error Corrections and Shared Modifications You create
or contribute to must include a file documenting the additions and
changes You made and the date of such additions and changes. You must
also include the notice set forth in Attachment A-1 in the file header.
If it is not possible to put the notice in a particular Source Code file
due to its structure, then You must include the notice in a location
(such as a relevant directory file), where a recipient would be most
likely to look for such a notice.

(d) Redistribution.

(i) Source. Covered Code may be distributed in Source Code form only to
another Licensee (except for students as provided below). You may not
offer or impose any terms on any Covered Code that alter the rights,
requirements, or responsibilities of such Licensee. You may distribute
Covered Code to students for use in connection with their course work
and research projects undertaken at accredited educational institutions.
Such students need not be Licensees, but must be given a copy of the
notice set forth in Attachment A-3 and such notice must also be included
in a file header or prominent location in the Source Code made available
to such students.

(ii) Executable. You may distribute Executable version(s) of Covered
Code to Licensees and other third parties only for the purpose of
evaluation and comment in connection with Research Use by You and under
a license of Your choice, but which limits use of such Executable
version(s) of Covered Code only to that purpose.

(iii) Modified Class, Interface and Package Naming. In connection with
Research Use by You only, You may use Original Contributor's class,
Interface and package names only to accurately reference or invoke the
Source Code files You modify. Original Contributor grants to You a
limited license to the extent necessary for such purposes.

(iv) You expressly agree that any distribution, in whole or in part, of
Modifications developed by You shall only be done pursuant to the terms
and conditions of this License.

(e) Extensions.

(i) Covered Code. You may not include any Source Code of Community Code
in any Extensions. You may include the compiled Header Files of
Community Code in an Extension provided that Your use of the Covered
Code, including Heading Files, complies with the Commercial Use License,
the TCK and all other terms of this License.

(ii) Publication. No later than the date on which You first distribute
such Extension for Commercial Use, You must publish to the industry, on
a non-confidential basis and free of all copyright restrictions with
respect to reproduction and use, an accurate and current specification
for any Extension. In addition, You must make available an appropriate
test suite, pursuant to the same rights as the specification,
sufficiently detailed to allow any third party reasonably skilled in the
technology to produce implementations of the Extension compatible with
the specification. Such test suites must be made available as soon as
reasonably practicable but, in no event, later than ninety (90) days
after Your first Commercial Use of the Extension. You must use
reasonable efforts to promptly clarify and correct the specification and
the test suite upon written request by Original Contributor.

(iii) Open. You agree to refrain from enforcing any Intellectual
Property Rights You may have covering any interface(s) of Your
Extension, which would prevent the implementation of such interface(s)
by Original Contributor or any Licensee. This obligation does not
prevent You from enforcing any Intellectual Property Right You have that
would otherwise be infringed by an implementation of Your Extension.

(iv) Interface Modifications and Naming. You may not modify or add to
the GUID space * * "xxxxxxxx-0901-11d1-8B06-00A024406D59" or any other
GUID space designated by Original Contributor. You may not modify any
Interface prefix provided with the Covered Code or any other prefix
designated by Original Contributor.* *

* *

(f) You agree that any Specifications provided to You by Original
Contributor are confidential and proprietary information of Original
Contributor. You must maintain the confidentiality of the Specifications
and may not disclose them to any third party without Original
Contributor's prior written consent. You may only use the Specifications
under the terms of this License and only for the purpose of implementing
the terms of this License with respect to Covered Code. You agree not
use, copy or distribute any such Specifications except as provided in
writing by Original Contributor.

3.2 Commercial Use License.

You may not make Commercial Use of any Covered Code unless You and
Original Contributor have executed a copy of the Commercial Use and
Trademark License attached as Attachment D.

*4. Versions of the License.*

4.1 License Versions.

Original Contributor may publish revised versions of the License from
time to time. Each version will be given a distinguishing version number.

4.2 Effect.

Once a particular version of Covered Code has been provided under a
version of the License, You may always continue to use such Covered Code
under the terms of that version of the License. You may also choose to
use such Covered Code under the terms of any subsequent version of the
License. No one other than Original Contributor has the right to
promulgate License versions.

4.3 Multiple-Licensed Code.

Original Contributor may designate portions of the Covered Code as
"Multiple-Licensed." "Multiple-Licensed" means that the Original
Contributor permits You to utilize those designated portions of the
Covered Code under Your choice of this License or the alternative
license(s), if any, specified by the Original Contributor in an
Attachment to this License.

*5. Disclaimer of Warranty.*

5.1 COVERED CODE PROVIDED AS IS.

COVERED CODE IS PROVIDED UNDER THIS LICENSE "AS IS," WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION,
WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT
FOR A PARTICULAR PURPOSE OR NON-INFRINGING. YOU AGREE TO BEAR THE ENTIRE
RISK IN CONNECTION WITH YOUR USE AND DISTRIBUTION OF COVERED CODE UNDER
THIS LICENSE. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART
OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER
EXCEPT SUBJECT TO THIS DISCLAIMER.

5.2 Not Designed for High Risk Activities.

You acknowledge that Original Code, Upgraded Code and Specifications are
not designed or intended for use in high risk activities including, but
not limited to: (i) on-line control of aircraft, air traffic, aircraft
navigation or aircraft communications; or (ii) in the design,
construction, operation or maintenance of any nuclear facility. Original
Contributor disclaims any express or implied warranty of fitness for
such uses.

*6. Termination.*

6.1 By You.

You may terminate this Research Use license at anytime by providing
written notice to Original Contributor.

6.2 By Original Contributor.

This License and the rights granted hereunder will terminate:

(i) automatically if You fail to comply with the terms of this License
and fail to cure such breach within 30 days of receipt of written notice
of the breach;

(ii) immediately in the event of circumstances specified in Sections 7.1
and 8.4; or

(iii) at Original Contributor's discretion upon any action initiated by
You (including by cross-claim or counter claim) alleging that use or
distribution by Original Contributor or any Licensee, of Original Code,
Upgraded Code, Error Corrections, Shared Modifications or Specifications
infringe a patent owned or controlled by You.

6.3 Effective of Termination.

Upon termination, You agree to discontinue use of and destroy all copies
of Covered Code in Your possession. All sublicenses to the Covered Code
which You have properly granted shall survive any termination of this
License. Provisions that, by their nature, should remain in effect
beyond the termination of this License shall survive including, without
limitation, Sections 2.2, 3, 5, 7 and 8.

6.4 No Compensation.

Each party waives and releases the other from any claim to compensation
or indemnity for permitted or lawful termination of the business
relationship established by this License.

*7. Liability.*

7.1 Infringement. Should any of the Original Code, Upgraded Code, TCK or
Specifications ("Materials") become the subject of a claim of
infringement, Original Contributor may, at its sole option, (i) attempt
to procure the rights necessary for You to continue using the Materials,
(ii) modify the Materials so that they are no longer infringing, or
(iii) terminate Your right to use the Materials, immediately upon
written notice, and refund to You the amount, if any, having then
actually been paid by You to Original Contributor for the Original Code,
Upgraded Code and TCK, depreciated on a straight line, five year basis.

7.2 LIMITATION OF LIABILITY. TO THE FULL EXTENT ALLOWED BY APPLICABLE
LAW, ORIGINAL CONTRIBUTOR'S LIABILITY TO YOU FOR CLAIMS RELATING TO THIS
LICENSE, WHETHER FOR BREACH OR IN TORT, SHALL BE LIMITED TO ONE HUNDRED
PERCENT (100%) OF THE AMOUNT HAVING THEN ACTUALLY BEEN PAID BY YOU TO
ORIGINAL CONTRIBUTOR FOR ALL COPIES LICENSED HEREUNDER OF THE PARTICULAR
ITEMS GIVING RISE TO SUCH CLAIM, IF ANY, DURING THE TWELVE MONTHS
PRECEDING THE CLAIMED BREACH. IN NO EVENT WILL YOU (RELATIVE TO YOUR
SHARED MODIFICATIONS OR ERROR CORRECTIONS) OR ORIGINAL CONTRIBUTOR BE
LIABLE FOR ANY INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
DAMAGES IN CONNECTION WITH OR RISING OUT OF THIS LICENSE (INCLUDING,
WITHOUT LIMITATION, LOSS OF PROFITS, USE, DATA, OR OTHER ECONOMIC
ADVANTAGE), HOWEVER IT ARISES AND ON ANY THEORY OF LIABILITY, WHETHER IN
AN ACTION FOR CONTRACT, STRICT LIABILITY OR TORT (INCLUDING NEGLIGENCE)
OR OTHERWISE, WHETHER OR NOT YOU OR ORIGINAL CONTRIBUTOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE AND NOTWITHSTANDING THE
FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY.

*8. Miscellaneous.*

8.1 Trademark.

You shall not use any Trademark unless You and Original Contributor
execute a copy of the Commercial Use and Trademark License Agreement
attached hereto as Attachment D. Except as expressly provided in the
License, You are granted no right, title or license to, or interest in,
any Trademarks. Whether or not You and Original Contributor enter into
the Trademark License, You agree not to (i) challenge Original
Contributor's ownership or use of Trademarks; (ii) attempt to register
any Trademarks, or any mark or logo substantially similar thereto; or
(iii) incorporate any Trademarks into Your own trademarks, product
names, service marks, company names, or domain names.

8.2 Integration.

This License represents the complete agreement concerning the subject
matter hereof.

8.3 Assignment.

Original Contributor may assign this License, and its rights and
obligations hereunder, in its sole discretion. You may assign the
Research Use portions of this License and the TCK license to a third
party upon prior written notice to Original Contributor (which may be
provided electronically via the Community Web-Server). You may not
assign the Commercial Use and Trademark license, the Add-On Technology
License, or the Add-On Technology Source Code Porting License, including
by way of merger (regardless of whether You are the surviving entity) or
acquisition, without Original Contributor's prior written consent.

8.4 Severability.

If any provision of this License is held to be unenforceable, such
provision shall be reformed only to the extent necessary to make it
enforceable. Notwithstanding the foregoing, if You are prohibited by law
from fully and specifically complying with Sections 2.2 or 3, this
License will immediately terminate and You must immediately discontinue
any use of Covered Code.

8.5 Governing Law.

This License shall be governed by the laws of the United States and the
State of Washington, as applied to contracts entered into and to be
performed in Washington between Washington residents. The application of
the United Nations Convention on Contracts for the International Sale of
Goods is expressly excluded. You agree that the state and federal courts
located in Seattle, Washington have exclusive jurisdiction over any
claim relating to the License, including contract and tort claims.

8.6 Dispute Resolution.

a) Arbitration. Any dispute arising out of or relating to this License
shall be finally settled by arbitration as set out herein, except that
either party may bring any action, in a court of competent jurisdiction
(which jurisdiction shall be exclusive), with respect to any dispute
relating to such party's Intellectual Property Rights or with respect to
Your compliance with the TCK license. Arbitration shall be administered:
(i) by the American Arbitration Association (AAA), (ii) in accordance
with the rules of the United Nations Commission on International Trade
Law (UNCITRAL) (the "Rules") in effect at the time of arbitration as
modified herein; and (iii) the arbitrator will apply the substantive
laws of Washington and the United States. Judgment upon the award
rendered by the arbitrator may be entered in any court having
jurisdiction to enforce such award.

b) Arbitration language, venue and damages. All arbitration proceedings
shall be conducted in English by a single arbitrator selected in
accordance with the Rules, who must be fluent in English and be either a
retired judge or practicing attorney having at least ten (10) years
litigation experience and be reasonably familiar with the technology
matters relative to the dispute. Unless otherwise agreed, arbitration
venue shall be in Seattle, Washington. The arbitrator may award monetary
damages only and nothing shall preclude either party from seeking
provisional or emergency relief from a court of competent jurisdiction.
The arbitrator shall have no authority to award damages in excess of
those permitted in this License and any such award in excess is void.
All awards will be payable in U.S. dollars and may include, for the
prevailing party (i) pre-judgment award interest, (ii) reasonable
attorneys' fees incurred in connection with the arbitration, and (iii)
reasonable costs and expenses incurred in enforcing the award. The
arbitrator will order each party to produce identified documents and
respond to no more than twenty-five single question interrogatories.

8.7 Construction.

Any law or regulation, which provides that the language of a contract
shall be construed against the drafter, shall not apply to this License.

8.8 U.S. Government End Users.

The Covered Code is a "commercial item," as that term is defined in 48
C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software"
and "commercial computer software documentation," as such terms are used
in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and
48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government
End Users acquire Covered Code with only those rights set forth herein.
You agree to pass this notice to our licensees.

8.9 Marketing Activities.

Licensee hereby grants Original Contributor a non-exclusive,
non-transferable, limited license to use the Licensee's company name and
logo ("Licensee Marks") in any presentations, press releases, or
marketing materials solely for the purpose of identifying Licensee as a
member of the Helix Community. Licensee shall provide samples of
Licensee Marks to Original Contributor upon request by Original
Contributor. Original Contributor acknowledges that the Licensee Marks
are the trademarks of Licensee. Original Contributor shall not use the
Licensee Marks in a way that may imply that Original Contributor is an
agency or branch of Licensee. Original Contributor understands and
agrees that the use of any Licensee Marks in connection with this
Agreement shall not create any right, title or interest, in, or to the
Licensee Marks or any Licensee trademarks and that all such use and
goodwill associated with any such trademarks will inure to the benefit
of Licensee. Further the Original Contributor will stop usage of the
Licensee Marks upon Licensee's request.

8.10 Press Announcements.

You may make press announcements or other public statements regarding
this License without the prior written consent of the Original
Contributor, if Your statement is limited to announcing the licensing of
the Covered Code or the availability of Your Product and its
compatibility with the Covered Code. All other public announcements
regarding this license require the prior written consent of the Original
Contributor. Consent requests are welcome at press@helixcommunity.org.

8.11 International Use.

a) Export/Import laws. Covered Code is subject to U.S. export control
laws and may be subject to export or import regulations in other
countries. Each party agrees to comply strictly with all such laws and
regulations and acknowledges their responsibility to obtain such
licenses to export, re-export, or import as may be required. You agree
to pass these obligations to Your licensees.

b) Intellectual Property Protection. Due to limited intellectual
property protection and enforcement in certain countries, You agree not
to redistribute the Original Code, Upgraded Code, TCK and Specifications
to any country on the list of restricted countries on the Community Web
Server.

8.12 Language.

This License is in the English language only, which language shall be
controlling in all respects, and all versions of this License in any
other language shall be for accommodation only and shall not be binding
on the parties to this License. All communications and notices made or
given pursuant to this License, and all documentation and support to be
provided, unless otherwise noted, shall be in the English language.

PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE
"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND
CONDITIONS OF THIS LICENSE WITH REALNETWORKS, INC. IF YOU ARE AGREEING
TO THIS LICENSE ON BEHALF OF A COMPANY, YOU REPRESENT THAT YOU ARE
AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE. WHETHER YOU ARE ACTING
ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY, YOU MUST BE OF MAJORITY
AGE AND BE OTHERWISE COMPETENT TO ENTER INTO CONTRACTS. IF YOU DO NOT
MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY OF THE TERMS AND
CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON TO EXIT.


    GLOSSARY

1. *"Added Value"* means code which:

(i) has a principal purpose which is substantially different from that
of the stand-alone Technology;

(ii) represents a significant functional and value enhancement to the
Technology;

(iii) operates in conjunction with the Technology; and

(iv) is not marketed as a technology which replaces or substitutes for
the Technology

2. "*Applicable Patent Rights*" mean: (a) in the case where Original
Contributor is the grantor of rights, claims of patents that (i) are now
or hereafter acquired, owned by or assigned to Original Contributor and
(ii) are necessarily infringed by using or making the Original Code or
Upgraded Code, including Modifications provided by Original Contributor,
alone and not in combination with other software or hardware; and (b) in
the case where Licensee is the grantor of rights, claims of patents that
(i) are now or hereafter acquired, owned by or assigned to Licensee and
(ii) are infringed (directly or indirectly) by using or making
Licensee's Modifications or Error Corrections, taken alone or in
combination with Covered Code.

3. "*Application Programming Interfaces (APIs)"* means the interfaces,
associated header files, service provider interfaces, and protocols that
enable a device, application, Operating System, or other program to
obtain services from or make requests of (or provide services in
response to requests from) other programs, and to use, benefit from, or
rely on the resources, facilities, and capabilities of the relevant
programs using the APIs. APIs includes the technical documentation
describing the APIs, the Source Code constituting the API, and any
Header Files used with the APIs.

4. "*Commercial Use*" means any use (internal or external), copying,
sublicensing or distribution (internal or external), directly or
indirectly of Covered Code by You other than Your Research Use of
Covered Code within Your business or organization or in conjunction with
other Licensees with equivalent Research Use rights. Commercial Use
includes any use of the Covered Code for direct or indirect commercial
or strategic gain, advantage or other business purpose. Any Commercial
Use requires execution of Attachment D by You and Original Contributor.

5. "*Community Code*" means the Original Code, Upgraded Code, Error
Corrections, Shared Modifications, or any combination thereof.

6. "*Community Webserver(s)"* means the webservers designated by
Original Contributor for access to the Original Code, Upgraded Code, TCK
and Specifications and for posting Error Corrections and Shared
Modifications.

7. "*Compliant Covered Code*" means Covered Code that complies with the
requirements of the TCK.

8. "*Contributor*" means each Licensee that creates or contributes to
the creation of any Error Correction or Shared Modification.

9. "*Covered Code*" means the Original Code, Upgraded Code,
Modifications, or any combination thereof.

10. "*Error Correction*" means any change made to Community Code which
conforms to the Specification and corrects the adverse effect of a
failure of Community Code to perform any function set forth in or
required by the Specifications.

11. "*Executable*" means Covered Code that has been converted from
Source Code to the preferred form for execution by a computer or digital
processor (e.g. binary form).

12. "*Extension(s)"* means any additional Interfaces developed by or for
You which: (i) are designed for use with the Technology; (ii) constitute
an API for a library of computing functions or services; and (iii) are
disclosed or otherwise made available to third party software developers
for the purpose of developing software which invokes such additional
Interfaces. The foregoing shall not apply to software developed by Your
subcontractors to be exclusively used by You.

13. "*Header File(s)"* means that portion of the Source Code that
provides the names and types of member functions, data members, class
definitions, and interface definitions necessary to implement the APIs
for the Covered Code. Header Files include, files specifically
designated by Original Contributor as Header Files. Header Files do not
include the code necessary to implement the functionality underlying the
Interface.

14. *"Helix DNA Server Technology"* means the program(s) that implement
the Helix Universal Server streaming engine for the Technology as
defined in the Specification.

15. *"Helix DNA Client Technology"* means the Covered Code that
implements the RealOne Player engine as defined in the Specification.

16. *"Helix DNA Producer Technology"* means the Covered Code that
implements the Helix Producer engine as defined in the Specification.

17. *"Helix DNA Technology"* means the Helix DNA Server Technology, the
Helix DNA Client Technology, the Helix DNA Producer Technology and other
Helix technologies designated by Original Contributor.

18. "*Intellectual Property Rights*" means worldwide statutory and
common law rights associated solely with (i) Applicable Patent Rights;
(ii) works of authorship including copyrights, copyright applications,
copyright registrations and "moral rights"; (iii) the protection of
trade and industrial secrets and confidential information; and (iv)
divisions, continuations, renewals, and re-issuances of the foregoing
now existing or acquired in the future.

19. *"Interface*" means interfaces, functions, properties, class
definitions, APIs, Header Files, GUIDs, V-Tables, and/or protocols
allowing one piece of software, firmware or hardware to communicate or
interoperate with another piece of software, firmware or hardware.

20. "*Internal Deployment Use*" means use of Compliant Covered Code
(excluding Research Use) within Your business or organization only by
Your employees and/or agents on behalf of Your business or organization,
but not to provide services, including content distribution, to third
parties, subject to execution of Attachment D by You and Original
Contributor, if required.

21. "*Licensee*" means any party that has entered into and has in effect
a version of this License with Original Contributor.

22. "*MIME type*" means a description of what type of media or other
content is in a file, including by way of example but not limited to
'audio/x-pn-realaudio-plugin.'

23. "*Modification(s)"* means (i) any addition to, deletion from and/or
change to the substance and/or structure of the Covered Code, including
Interfaces; (ii) the combination of any Covered Code and any previous
Modifications; (iii) any new file or other representation of computer
program statements that contains any portion of Covered Code; and/or
(iv) any new Source Code implementing any portion of the Specifications.

24. "*MP3 Patents*" means any patents necessary to make, use or sell
technology implementing any portion of the specification developed by
the Moving Picture Experts Group known as MPEG-1 Audio Layer-3 or MP3,
including but not limited to all past and future versions, profiles,
extensions, parts and amendments relating to the MP3 specification.

25. "*MPEG-4 Patents*" means any patents necessary to make, use or sell
technology implementing any portion of the specification developed by
the Moving Pictures Experts Group known as MPEG-4, including but not
limited to all past and future versions, profiles, extensions, parts and
amendments relating to the MPEG-4 specification.

26. "*Original Code*" means the initial Source Code for the Technology
as described on the Community Web Server.

27. "*Original Contributor*" means RealNetworks, Inc., its affiliates
and its successors and assigns.

28. "*Original Contributor MIME Type*" means the MIME registry, browser
preferences, or local file/protocol associations invoking any Helix DNA
Client-based application, including the RealOne Player, for playback of
RealAudio, RealVideo, other RealMedia MIME types or datatypes (e.g.,
.ram, .rnx, .rpm, .ra, .rm, .rp, .rt, .rf, .prx, .mpe, .rmp, .rmj, .rav,
.rjs, .rmx, .rjt, .rms), and any other Original Contributor-specific or
proprietary MIME types that Original Contributor may introduce in the
future.

29. "*Personal Use*" means use of Covered Code by an individual solely
for his or her personal, private and non-commercial purposes. An
individual's use of Covered Code in his or her capacity as an officer,
employee, member, independent contractor or agent of a corporation,
business or organization (commercial or non-commercial) does not qualify
as Personal Use.

30. "*RealMedia File Format*" means the file format designed and
developed by RealNetworks for storing multimedia data and used to store
RealAudio and RealVideo encoded streams. Valid RealMedia File Format
extensions include: .rm, .rmj, .rmc, .rmvb, .rms.

31. "*RCSL Webpage*" means the RealNetworks Community Source License
webpage located at https://www.helixcommunity.org/content/rcsl or such
other URL that Original Contributor may designate from time to time.

32. "*Reformatted Specifications*" means any revision to the
Specifications which translates or reformats the Specifications (as for
example in connection with Your documentation) but which does not alter,
subset or superset * *the functional or operational aspects of the
Specifications.

33. "*Research Use*" means use and distribution of Covered Code only for
Your Personal Use, research or development use and expressly excludes
Internal Deployment Use and Commercial Use. Research Use also includes
use of Covered Code to teach individuals how to use Covered Code.

34. "*Shared Modifications*" means Modifications that You distribute or
use for a Commercial Use, in addition to any Modifications provided by
You, at Your option, pursuant to Section 2.2, or received by You from a
Contributor pursuant to Section 2.3.

35. "*Source Code*" means the preferred form of the Covered Code for
making modifications to it, including all modules it contains, plus any
associated interface definition files, scripts used to control
compilation and installation of an Executable, or source code
differential comparisons against either the Original Code or another
well known, available Covered Code of the Contributor's choice. The
Source Code can be in a compressed or archival form, provided the
appropriate decompression or de-archiving software is widely available
for no charge.

36. "*Specifications*" means the specifications for the Technology and
other documentation, as designated on the Community Web Server, as may
be revised by Original Contributor from time to time.

37. "*Trademarks*" means Original Contributor's trademarks and logos,
including, but not limited to, RealNetworks, RealAudio, RealVideo,
RealOne, RealSystem, SureStream, Helix, Helix DNA and other trademarks
whether now used or adopted in the future.

38. "*Technology*" means the technology described in Attachment B, and
Upgrades.

39. "*Technology Compatibility Kit"* or *"TCK*" means the test programs,
procedures, acceptance criteria and/or other requirements, designated by
Original Contributor for use in verifying compliance of Covered Code
with the Specifications, in conjunction with the Original Code and
Upgraded Code. Original Contributor may, in its sole discretion and from
time to time, revise a TCK to correct errors and/or omissions and in
connection with Upgrades.

40. "*Upgrade(s)"* means new versions of Technology designated
exclusively by Original Contributor as an "Upgrade" and released by
Original Contributor from time to time under the terms of the License.

41. "*Upgraded Code*" means the Source Code and/or Executables for
Upgrades, possibly including Modifications made by Contributors.

42. *"User's Guide"* means the users guide for the TCK which Original
Contributor makes available to You to provide direction in how to run
the TCK and properly interpret the results, as may be revised by
Original Contributor from time to time.

43. "*You(r)*" means an individual, or a legal entity acting by and
through an individual or individuals, exercising rights either under
this License or under a future version of this License issued pursuant
to Section 4.1. For legal entities, "You(r)" includes any entity that by
majority voting interest controls, is controlled by, or is under common
control with You.

44. "*Your Products*" means any (i) hardware products You distribute
integrating the Covered Code; (ii) any software products You distribute
with the Covered Code that utilize the APIs of the Covered Code; or
(iii) any services You provide using the Covered Code.


  ATTACHMENT A

REQUIRED NOTICES


    ATTACHMENT A-1

REQUIRED IN ALL CASES

Notice to be included in header file of all Error Corrections and Shared
Modifications:

Portions Copyright 1994-2003 © RealNetworks, Inc. All rights reserved.

The contents of this file, and the files included with this file, are
subject to the current version of RealNetworks Community Source License
Version 1.1 (the "License"). You may not use this file except in
compliance with the License executed by both You and RealNetworks. You
may obtain a copy of the License at *
https://www.helixcommunity.org/content/rcsl.* You may also obtain a copy
of the License by contacting RealNetworks directly. Please see the
License for the rights, obligations and limitations governing use of the
contents of the file.

This file is part of the Helix DNA technology. RealNetworks, Inc., is
the developer of the Original code and owns the copyrights in the
portions it created.

This file, and the files included with this file, are distributed on an
'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.

Contributor(s):

_______________________________________________

Technology Compatibility Kit Test Suite(s) Location:

________________________________


    ATTACHMENT A-2

SAMPLE LICENSEE CERTIFICATION

"By clicking the `Agree' button below, You certify that You are a
Licensee in good standing under the RealNetworks Community Source
License, ("License") and that Your access, use and distribution of code
and information You may obtain at this site is subject to the License.
If You are not a Licensee under the RealNetworks Community Source
License You agree not to download, copy or use the Helix DNA technology.


    ATTACHMENT A-3

REQUIRED STUDENT NOTIFICATION

"This software and related documentation has been obtained by Your
educational institution subject to the RealNetworks Community Source
License. You have been provided access to the software and related
documentation for use only in connection with your course work and
research activities as a matriculated student of Your educational
institution. Any other use is expressly prohibited.

THIS SOFTWARE AND RELATED DOCUMENTATION CONTAINS PROPRIETARY MATERIAL OF
REALNETWORKS, INC, WHICH ARE PROTECTED BY VARIOUS INTELLECTUAL PROPERTY
RIGHTS.

You may not use this file except in compliance with the License. You may
obtain a copy of the License on the web at
https://www.helixcommunity.org/content/rcsl.

*
*


  ATTACHMENT B

Description of Technology

Helix DNA, which consists of Helix DNA Client, Helix DNA Server and
Helix DNA Producer.

Description of "Technology"

Helix DNA Technology v1.0 as described on the Community Web Server.


  ATTACHMENT C

TECHNOLOGY COMPATIBILITY KIT LICENSE

The following license is effective for the *Helix DNA* Technology
Compatibility Kit - as described on the Community Web Server. The
Technology Compatibility Kit(s) for the Technology specified in
Attachment B may be accessed at the Community Web Server.

1. TCK License.

1.1 Grants to use TCK

Subject to the terms and restrictions set forth below and the
RealNetworks Community Source License, and the Research Use license,
Original Contributor grants to You a worldwide, non-exclusive,
non-transferable license, to the extent of Original Contributor's
Intellectual Property Rights in the TCK (without the right to
sublicense), to use the TCK to develop and test Covered Code.

1.2 TCK Use Restrictions.

You are not authorized to create derivative works of the TCK or use the
TCK to test any implementation of the Specification that is not Covered
Code. You may not publish Your test results or make claims of
comparative compatibility with respect to other implementations of the
Specification. In consideration for the license grant in Section 1.1
above You agree not to develop Your own tests that are intended to
validate conformation with the Specification.

2. Test Results.

You agree to provide to Original Contributor or the third party test
facility if applicable, Your test results that demonstrate that Covered
Code is Compliant Covered Code and that Original Contributor may publish
or otherwise distribute such test results.

PLEASE READ THE TERMS OF THIS LICENSE CAREFULLY. BY CLICKING ON THE
"ACCEPT" BUTTON BELOW YOU ARE ACCEPTING AND AGREEING TO THE TERMS AND
CONDITIONS OF THIS LICENSE WITH THE ORIGINAL CONTRIBUTOR, REALNETWORKS,
INC. IF YOU ARE AGREEING TO THIS LICENSE ON BEHALF OF A COMPANY, YOU
REPRESENT THAT YOU ARE AUTHORIZED TO BIND THE COMPANY TO SUCH A LICENSE.
WHETHER YOU ARE ACTING ON YOUR OWN BEHALF, OR REPRESENTING A COMPANY,
YOU MUST BE OF MAJORITY AGE AND BE OTHERWISE COMPETENT TO ENTER INTO
CONTRACTS. IF YOU DO NOT MEET THIS CRITERIA OR YOU DO NOT AGREE TO ANY
OF THE TERMS AND CONDITIONS OF THIS LICENSE, CLICK ON THE REJECT BUTTON
TO EXIT.

*ACCEPT / REJECT
*

*
*

*To agree to the R&D/academic terms of this license, please register
<https://www.helixcommunity.org/2002/intro/why-register> on the site --
you will then be given a chance to agree to the clickwrap RCSL
<https://reguseronly.helixcommunity.org/2002/clickwrap/rcsl-clickwrap>
R&D License
<https://reguseronly.helixcommunity.org/2002/clickwrap/rcsl-clickwrap>
and gain access to the RCSL-licensed source code.  To build or deploy
commercial applications based on the RCSL, you will need to agree to the
Commercial Use license attachments
<https://www.helixcommunity.org/content/rcsl-attachments>*




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

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: help.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

/* 	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"				: "setup.htm#ports"
	,"config_binding"			: "setup.htm#ipaddr"
	,"config_mimetypes"			: "setup.htm#mime_types"
	,"config_cc"				: "setup.htm#connections"
	,"config_altserv"			: "large.htm#redundant_servers"
	,"config_localFS"			: "links.htm#add_point"
	,"config_alias"				: "links.htm#create_alias"
	,"config_delivery"			: "setup.htm#http_delivery"
	,"config_pc_cache"			: "large.htm#proxy_restrict"
	,"config_license_pub"		: "setup.htm#distributed_publish"
	,"config_license_sub"		: "setup.htm#distributed_subscribe"
	,"config_setid"				: "setup.htm#unix_user"

	,"config_sec_ac"			: "limiting.htm#a_acontrol"
	,"config_sec_db"			: "authentg.htm#new_db"
	,"config_sec_uauth"	   		: "authentg.htm#passwords"
	,"config_sec_rules"	   		: "authentg.htm#commerce_rules"
	,"adduser"	 		  		: "authentg.htm#adduser"
	,"edituser"	 		  		: "authentg.htm#edituser"
	,"removeuser"	 	  		: "authentg.htm#removeuser"
	,"getusers"	 		  		: "authentg.htm#getusers"
	,"grantuser"	 		  	: "authentg.htm#grantuser"
	,"edituserperm"	 		  	: "authentg.htm#edituserperm"
	,"revokeuser"	 	  		: "authentg.htm#revokeuser"
	,"revokealluser"	 		: "authentg.htm#revokealluser"
	,"add_redirect"	 		  	: "authentg.htm#add_redirect"
	
	,"mongraph"					: "monitor.htm#server_monitor"
	,"mongraph_ntperfmon"		: "monitor.htm#NT_performance"
	,"config_logging"			: "report.htm#access_read"
	,"config_logging_error"		: "report.htm#error_read"
	,"config_clog"				: "dynamic_.htm#create_template"
	,"lic_mon0"					: "setup.htm#distributed_start"

	,"config_broad_real"		: "strmlive.htm#broadcast_real"
	,"config_broad_rtp"			: "strmlive.htm#rtp_encode"
	,"config_broad_wm"			: "strmlive.htm#brdcst_wmt"
	,"config_broad_wm_asxgen"  	: "links.htm#asxgen"
	,"config_broad_archive"		: "strmlive.htm#archive_setup"
	,"config_broad_redun"		: "strmlive.htm#redundant_setup"

	,"config_spl_dist"			: "spliting.htm#transmitter"
	,"config_spl_recv"			: "spliting.htm#receiver"
	,"config_mc_scale"			: "multicst.htm#scalable"
	,"config_mc_bc"				: "multicst.htm#bchannel"
	,"config_mc_wm"				: "multicst.htm#wmpcast"
	,"config_mc_sap"			: "multicst.htm#sap_announce"

	,"config_cdist"				: "large.htm#content_subscribe"
	,"config_isp"				: "isp.htm#setup"
	,"config_content_browsing"	: "links.htm#browse"
	,"config_viewsrc"	   		: "links.htm#view_change"

	,"config_adserv"			: "adserve.htm#ad_mountpoint"
	,"config_smilgen"	   		: "adserve.htm#ad_smilpoint"
	,"config_smilgen_limits"	: "adserve.htm#limitations"
	,"config_admisc"			: "adserve.htm#ad_timeout"
	,"config_qos"				: "setup.htm#differentiated_services"
	,"config_rate"				: "setup.htm#rate_control"

};

function getHelpPath ( context )
{
	var path = "";

	// look in the linkmap for physical link associated with startPage
	if ( adminLinkMap && adminLinkMap[ context ] )
	{
		 path = "htmfiles/" + adminLinkMap[ context ];
	}
	else if ( context )
	{
    	path = "htmfiles/" + context ;
	}
	else
	{
    	path = "htmfiles/title.htm" ;
	}

	return path;
}

function contextHelp ( helpLink )
{

	
	var docPath = "Docs/Manual/" ;

	var helpFrameset = "realsrvr.htm" ;

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

		pos = helpLink.indexOf( '.' );
		if ( pos == -1 ) 
			pos = helpLink.indexOf( '#' );
		if ( pos == -1 ) 
			pos = helpLink.indexOf( '?' );

		if ( pos != -1 ) 
			helpLink = helpLink.slice( 0, pos );
	}

	helpLink = getHelpPath( helpLink );

	// 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 )) )
	{
		
		win.body.location = docPath + helpLink ;
		win.focus();
	}
	else	// open help win and load help frameset, pass helpLink in querystring
	{
		if ( helpLink )
			helpFrameset += "?goto=" + escape( helpLink );

		
		launchHelp( docPath + helpFrameset );
	}

}	// contextHelp ()

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


--- NEW FILE: config_pending.nc.html ---




<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_pending.nc.html,v 1.2 2007/05/25 19:28:21 \
                dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->






<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 DNA Administrator - Pending Changes</TITLE> <!--! SET DIALOG TITLE HERE \
-->

</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="#759B00">  <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="#759B00">  <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[ "34" ] = "Advanced Logging";
aTabTitles[ "6" ] = "HTTP Delivery";
aTabTitles[ "3" ] = "IP Binding";
aTabTitles[ "13" ] = "MIME Types";
aTabTitles[ "7" ] = "Mount Points";
aTabTitles[ "33" ] = "Content Caching";
aTabTitles[ "31" ] = "URL Aliasing";
aTabTitles[ "25" ] = "Proxy Routing";
aTabTitles[ "1" ] = "Connection Control";
aTabTitles[ "2" ] = "Bandwidth Management";
aTabTitles[ "21" ] = "User/Group Name";
aTabTitles[ "35" ] = "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[ "38" ] = "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[ "39" ] = "Redundant Servers";
aTabTitles[ "45" ] = "Player Setup";
aTabTitles[ "46" ] = "Player Update";
aTabTitles[ "24" ] = "Welcome";
aTabTitles[ "47" ] = "Browse Content";
aTabTitles[ "36" ] = "Proxy Monitor";
aTabTitles[ "37" ] = "Media Samples";
aTabTitles[ "40" ] = "Capability Exchange";
aTabTitles[ "41" ] = "Differentiated Services";
aTabTitles[ "42" ] = "Rate Management";
aTabTitles[ "43" ] = "Delayed Shutdown";
aTabTitles[ "44" ] = "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>

--- NEW FILE: enumlist.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: enumlist.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

/*

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_sec_uauth.html ---




<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: config_sec_uauth.html,v 1.2 2007/05/25 19:28:21 \
                dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->






<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">

/*! more odious kshoop legacy code to deal \
with!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!		  for SOME reason the realm \
authentication properties are stuffed under a sublist  (as thought there could be \
more then one authentication plugin/database per realm)  and the name of the sublist \
may be different based on the plugin used, here's an example from the default  \
configuration file: <!-- A U T H E N T I C A T I O N -->
<List Name="AuthenticationRealms">
    <List Name="SecureAdmin">
        <Var Realm="myserver.AdminRealm"/>
        <List Name="BasicAuthenticator">
            <Var PluginID="rn-auth-basic"/>
            <Var DatabaseID="Admin_Basic"/>
        </List>
    </List>
    <List Name="SecureEncoder">
        <Var Realm="myserver.EncoderRealm"/>
        <List Name="RN5Authenticator">
            <Var PluginID="rn-auth-rn5"/>
            <Var DatabaseID="Encoder_RN5"/>
        </List>
    </List>
    <List Name="SecureWMEncoder">
        <Var Realm="myserver.WMEncoderRealm"/>
        <List Name="DigestAuthenticator">
            <Var PluginID="rn-auth-digest"/>
            <Var DatabaseID="Encoder_Digest"/>
        </List>
    </List>
    <List Name="Realm1">
        <List Name="Authenticator">
            <Var Group="MyGroup"/>
            <Var PluginID="rn-auth-sspi"/>
            <Var Provider="NTLM"/>
        </List>
        <Var Realm="myserver.NTLMTest"/>
    </List>
</List>
*/

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) )
	{
	//! FOOOOOOOD
		// 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 )

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

/*! this code causes "too much recursion" error in Nav4 so its commented out
	for now - see if we can live without it [bg 7/11/01]
*/	

	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 ;

	//! FOOOOOOOD

	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 )
{
	//! FOOOOOOOD

	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) )
				{
					/*! 
						BIG NASTY WORAROUND!!
						Nav 6.2.2 or Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.4.1) \
Gecko/20020314 Netscape6/6.2.2  has a problem setting the Realm after switching from \
a  Player to a User Authenticated Rule (the Realm ctrl goes from 
						hidden to visible. This work around seems to work. Also used in
						config_sec_rules
					*/
					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 )
{
	//! FOOOOOOOD

	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 ()
{
	//! FOOOOOOOD

	return true ;
}

RealmPropView.prototype.postValidateSubList = function ( subListName )
{
	//! FOOOOOOOD

	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 )
	{
		//! skooch it over a smidge it account for table padding;
		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 ; //! skooch it over a smidge it \
account for output table padding

					//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 the authenticated user names will be stored.
Helix DNA Server has two methods of authenticating the identity
of visitors - Basic 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></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="">




		<!--! no RN5 authentication -->
		Authentication Protocol
		<BR>
		<select CLASS="longInput" NAME="_Type" ONCHANGE="onProtocolChg()" SIZE="1" \
WIDTH="226">  <OPTION value="BasicAuthenticator">Basic</OPTION>
		    <OPTION value="Authenticator">Windows NT LAN Manager</OPTION>
		</SELECT>


		<DIV ID="ANCHOR_FORMS_IE" class="Units">
			The Basic authentication protocol requires 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%">
		<!--! 
			the dummy option list [0,0...] is needed for Netscape else it 
			won't render the drop down list correctly after it's 
			filled in with options during fillSelectCtrls(). The dummy
			options are deleted... 
		-->
		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%">
		<!--! 
			the dummy option list [0,0...] is needed for Netscape else it 
			won't render the drop down list correctly after it's 
			filled in with options during fillSelectCtrls(). The dummy
			options are deleted... 
		-->
		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%">
		<!--! 
			the dummy option list [0,0...] is needed for Netscape else it 
			won't render the drop down list correctly after it's 
			filled in with options during fillSelectCtrls(). The dummy
			options are deleted... 
		-->
		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: edituserperm.html ---

<!--
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: edituserperm.html,v 1.2 2007/05/25 19:28:21 dcollins \
                Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
-->

<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="#759B00">  <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="#759B00">  <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"></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: datachn.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: datachn.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

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: port.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: port.js,v 1.2 2007/05/25 19:28:21 dcollins Exp $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

//<SCRIPT>

var allPorts = [];

var excludePaths = 
[
	 "BroadcastDistribution.Destinations"
	,"AccessControl"
	,"ProxyRoutingTable"
	,"WebServerPort"
	,"SplitterSourceList"
	,"LicensePublishers"
	,"Windows Media Live Broadcast Source"
	,"ProxyAlternates"
	,"ServerAlternates"
	,"ContentSubscription"
	,"Multicast.PNAPort"
	,"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: 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:			#CC3300;
}

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: propview_enum.js ---

/*
 * ***** BEGIN LICENSE BLOCK *****  
 * Source last modified: $Id: propview_enum.js,v 1.2 2007/05/25 19:28:21 dcollins Exp \
                $ 
 *   
 * Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
 *       
 * The contents of this file, and the files included with this file, 
 * are subject to the current version of the RealNetworks Public 
 * Source License (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the current version of the RealNetworks Community 
 * Source License (the "RCSL") available at 
 * http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
 * will apply. You may also obtain the license terms directly from 
 * RealNetworks.  You may not use this file except in compliance with 
 * the RPSL or, if you have a valid RCSL with RealNetworks applicable 
 * to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
 * the rights, obligations and limitations governing use of the 
 * contents of the file. 
 *   
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the 
 * portions it created. 
 *   
 * This file, and the files included with this file, is distributed 
 * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
 * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
 * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
 * ENJOYMENT OR NON-INFRINGEMENT. 
 *  
 * Technology Compatibility Kit Test Suite(s) Location:  
 *    http://www.helixcommunity.org/content/tck  
 *  
 * Contributor(s):  
 *   
 * ***** END LICENSE BLOCK ***** *
*/

//<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>


_______________________________________________
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