<HTML>
<HEAD>

<TITLE>Remote Test Page</TITLE>

<STYLE>

BLOCKQUOTE { margin-top:0; padding-top:0; }

</STYLE>

<SCRIPT>

var aMachines = 
[
	"edsel01", "edsel02", "edsel03", "edsel04", "edsel05", 
	"edsel06", "edsel7", "edsel8", "edsel9", "edsel10", 
	"edsel11", "edsel12", 
	"windshield",
	"EXHAUST",
	"headlight",
	"antenna",
	"studebaker",
	"hound-1",
	"hound-2",
	"upholstry",
	"handbrake",
	"headerpipe",
	"glasspack",
	"jackspc2",
	"jackspc"
];

function ErrorCheck(fn)
{
    try
    {
        eval(fn);
    }
    catch(ex)
    {
        var i;
        var str = '';
        for (i in ex)
        {
            if (typeof(ex[i]) == 'number')
            {
                var value = ex[i];

                if (value < 0)
                {
                    value = value + 0x100000000;
                }

                str += '\t' + i + ': ' + ex[i] + ' (' + value.toString(16) + ')\n';
            }
            else
            {
                str += '\t' + i + ': ' + ex[i] + '\n';
            }
        }
        window.alert("an error occurred while executing '" + fn + "'\n" + str);
    }
}

function Connect()
{
        window.alert("Try 1");
        var g_RemoteObj1  = new ActiveXObject('MTScript.Proxy', "JPORKKA1");
        window.alert("Try 2");
        var g_RemoteObj2  = new ActiveXObject('MTScript.Remote', "JPORKKA1");
        window.alert("Try 3");


    var str = '';
    RemoteObj.Connect(machname.value);
    str = 'Connected to machine ' + RemoteObj.Name + '.<BR>';
    str += '&nbsp;&nbsp;&nbsp;Platform = ' + RemoteObj.Platform + '<BR>';
    str += '&nbsp;&nbsp;&nbsp;OS = ' + RemoteObj.OS + '<BR>';
    str += '&nbsp;&nbsp;&nbsp;MajorVer = ' + RemoteObj.MajorVer + '<BR>';
    str += '&nbsp;&nbsp;&nbsp;MinorVer = ' + RemoteObj.MinorVer + '<BR>';
    str += '&nbsp;&nbsp;&nbsp;BuildNum = ' + RemoteObj.BuildNum + '<BR>';
    str += '&nbsp;&nbsp;&nbsp;PlatformIsNT = ' + RemoteObj.PlatformIsNT + '<BR>';
    str += '&nbsp;&nbsp;&nbsp;ServicePack = ' + RemoteObj.ServicePack + '<BR>&nbsp;';

    Output.innerHTML = str;

    DumpData();

}

function Disconnect()
{
    RemoteObj.Disconnect();

    Output.innerText = '';
    Pub.innerText = '';
}

function SetMode(modename)
{
    cmd.value = 'setmode';
    args.value = modename;
    SendExec();
    DumpData();
}

function Init()
{
    cmd.value = 'setconfig';
//    args.value = 'file://%ScriptPath%\\..\\docs\\config_template.xml';
    args.value = 'file://%ScriptPath%\\config_template.xml';
    SendExec();

    cmd.value = 'setenv';
//    args.value = 'file://%ScriptPath%\\..\\docs\\env_template.xml';
    args.value = 'file://%ScriptPath%\\env_template.xml';
    SendExec();

    DumpData();
}

function SendExec()
{
    var vRet = RemoteObj.Exec(cmd.value, args.value);

    try
    {
        Output.insertAdjacentText('beforeEnd', 'Exec sent. Return value = "' + vRet + '"');

        Output.insertAdjacentHTML('beforeEnd', '<BR>&nbsp;');
    }
    catch(ex)
    {
        // Ignore errors
    }
}

var g_strDump;

function DumpDataPrivate()
{
    g_strDump = '';

	try
	{
		var str = RemoteObj.Exec('getpublic', 'PrivateData');
	    var pd = eval(str);
    	DumpObject(pd, 77);
	}
	catch(ex)
	{
		debugger;
		throw ex;
	}

    Pub.innerHTML = g_strDump;
}

function DumpData()
{
    g_strDump = '';

	try
	{
		var str = RemoteObj.Exec('getpublic', 'root');
	    var pd = eval(str);
    	DumpObject(pd, 77);
	}
	catch(ex)
	{
		debugger;
		throw ex;
	}

    Pub.innerHTML = g_strDump;
}

function OutputDebugString(str)
{
        Output.insertAdjacentText('beforeEnd', str);
        Output.insertAdjacentHTML('beforeEnd', '<BR>&nbsp;');
}

function ExitAllProc()
{
    var m;
    var vRet;
    for( m in aMachines)
    {
	try
	{
	    RemoteObj.Connect(aMachines[m]);
	    str = 'Connected to machine ' + RemoteObj.Name;
	    vRet = RemoteObj.Exec("exitprocess", 0);
	    OutputDebugString("Exit proc on " + aMachines[m] + " returned " + vRet);
	    RemoteObj.Disconnect();
	}
	catch(ex)
	{
	}
    }
}

function ConnectAllProc()
{
    var m;
    for( m in aMachines)
    {
	try
	{
	    RemoteObj.Connect(aMachines[m]);
            var str = RemoteObj.Exec('getpublic', 'nDataVersion');
	    str = RemoteObj.Name + " OK";
	    OutputDebugString(str);
	    RemoteObj.Disconnect();
	}
	catch(ex)
	{
		OutputDebugString(aMachines[m] + " " + ex.description);
	}
    }
}

function Browse()
{
    var opt;
    var strRootTag;
	var strFilePattern = '*PublicData*.log';
	var strTempDir;

    FSObj = new ActiveXObject('Scripting.FileSystemObject');
    strTempDir = FSObj.GetSpecialFolder(2).Path; // Temp Folder


    comdlg.FileName = strFilePattern;
    comdlg.DialogTitle = 'Select Log File';
    comdlg.Flags =  524288 + // Use explorer format
                    4 +      // Hide read-only checkbox
                    2048 +   // Path must exist
                    4096;    // File must exist

    comdlg.Filter = 'LOG Files (*.log)|*PublicData*.log';
	comdlg.InitDir = strTempDir;
    comdlg.ShowOpen();

    if (comdlg.FileName == strFilePattern)
        return;

	return comdlg.FileName;
}

function ViewPDLog()
{
	try
	{
		var strFileName = Browse();
		if (!strFileName)
			return;

	    var FSObj = new ActiveXObject("Scripting.FileSystemObject");
		var logfile = FSObj.OpenTextFile(strFileName, 1, false);
		var strData = logfile.ReadAll();
		logfile.Close();

		var obj = eval(strData);
		DumpObject(obj, 99);
	    Pub.innerHTML = g_strDump;
	}
	catch(ex)
	{
	    Pub.innerHTML = '';
	}
}

function DumpObject(obj, maxdepth)
{
    var TreeResult = DumpObjectWorker(obj, maxdepth);
    var str = UndumpTree(TreeResult);
	g_strDump  = str;
}

function UndumpTree(tree)
{
    var str = '';
    for(var index = 0; index < tree.length; ++index)
    {
        if (typeof(tree[index]) == 'object')
        {
            str += UndumpTree(tree[index]);
        }
        else
            str += tree[index];
    }
    return str;
}

function DumpObjectWorker(obj, maxdepth)
{
    var fHasChildren;
    var j;
    var i;
    var result;

    var tree = new Array();
    var index = 0;

    if (maxdepth == 0)
    {
        tree[index] = '<I>Maximum Depth reached</I><BR>';
        return tree;
    }

    for (i in obj)
    {
        if (typeof(obj[i]) == 'object')
        {
            fHasChildren = false;

            for (j in obj[i])
            {
                if (j != 'length')
                {
                    fHasChildren = true;
                    break;
                }
            }

            if (!fHasChildren)
            {
                tree[index++] = '<STRONG>' + i + '</STRONG> (empty)<BR>';
            }
            else
            {
                tree[index++] = '<SPAN> <B onclick="toggle(this)">' + i + '</B><BR><DIV id=quote style="display:none;margin-left:3em">';

                result = DumpObjectWorker(obj[i], maxdepth-1);
                tree[index++] = result;

                tree[index++] = '</DIV></SPAN>';
            }
        }
        else if (typeof(obj[i]) == 'string')
        {
            tree[index++] = '' + i + ' = "' + obj[i] + '"<BR>';
        }
        else
        {
            tree[index++] = '' + i + ' = ' + obj[i] + '<BR>';
        }
    }
    return tree;
}
function toggle(obj) { with (obj.parentElement.children("quote").style) { if (display=="none") display=""; else display="none"; }}
//======================================================================================================
/*
function DumpObject(obj, maxdepth)
{
    var TreeResult = DumpObjectWorker(obj, maxdepth);
    g_strDump = UndumpTree(TreeResult);
}

function UndumpTree(tree)
{
    var str = '';
    for(var index = 0; index < tree.length; ++index)
    {
        if (typeof(tree[index]) == 'object')
        {
            str += UndumpTree(tree[index]);
        }
        else
            str += tree[index];
    }
    return str;
}

function DumpObjectWorker(obj, maxdepth)
{
    var fHasChildren;
    var j;
    var i;
    var result;

    var tree = new Array();
    var index = 0;

    if (maxdepth == 0)
    {
        tree[index] = '<I>Maximum Depth reached</I><BR>';
        return tree;
    }

    for (i in obj)
    {
        if (typeof(obj[i]) == 'object')
        {
            fHasChildren = false;

            for (j in obj[i])
            {
                if (j == 'length')
                {
                    fHasChildren = true;
                    break;
                }
            }

            if (!fHasChildren)
            {
                tree[index++] = '<STRONG>' + i + '</STRONG> (empty)<BR>';
            }
            else
            {
                tree[index++] = '<SPAN> <B onclick="toggle(this)">' + i + '</B><BR><DIV id=quote style="display:none;margin-left:3em">';

                result = DumpObjectWorker(obj[i], maxdepth-1);
                tree[index++] = result;

                tree[index++] = '</DIV></SPAN>';
            }
        }
        else if (typeof(obj[i]) == 'string')
        {
            tree[index++] = '' + i + ' = "' + obj[i] + '"<BR>';
        }
        else
        {
            tree[index++] = '' + i + ' = ' + obj[i] + '<BR>';
        }
    }
    return tree;
}*/
/*function DumpObject(obj, maxdepth)
{
    if (maxdepth == 0)
        return;

    for (i in obj)
    {
        if (typeof(obj[i]) == 'object')
        {
            g_strDump += '<B>' + i + '</B><BLOCKQUOTE>';

            DumpObject(obj[i], maxdepth-1);

            g_strDump += '</BLOCKQUOTE>';
        }
        else
        {
            g_strDump += i + ' = "' + obj[i] + '"<BR>';
        }
    }
}
*/

</SCRIPT>

<SCRIPT for=RemoteObj event="OnScriptNotify(arg1, arg2)" language=JavaScript>
    try
    {
        Notify.insertAdjacentHTML('beforeEnd', '<B>Notify(' + arg1 + ', ' + arg2 + ')</B><BR>');
	    if (arg1 == 'UpdatePublicData')
	    {
	        DumpData();
	    }
    }
    catch(ex)
    {
        // Ignore errors
    }
</SCRIPT>

<SCRIPT for=RemoteObjWorker event="OnScriptNotify(arg1, arg2)" language=JavaScript>
    try
    {
    }
    catch(ex)
    {
        // Ignore errors
    }
</SCRIPT>

</HEAD>

<BODY>

Machine (leave blank for local machine): <INPUT type=text id=machname>
<INPUT type=button value="Connect" onclick="ErrorCheck('Connect()')">
<INPUT type=button value="Disconnect" onclick="ErrorCheck('Disconnect()')">
<INPUT type=button value="Init" onclick="ErrorCheck('Init()')" style="width:5em">
<TABLE>
<TR>
<INPUT type=button value="SetMode master" onclick="ErrorCheck('SetMode(\'master\')')" style="width:8em">
<INPUT type=button value="SetMode slave" onclick="ErrorCheck('SetMode(\'slave\')')" style="width:8em">
<INPUT type=button value="SetMode test" onclick="ErrorCheck('SetMode(\'test\')')" style="width:8em">
<INPUT type=button value="SetMode idle" onclick="ErrorCheck('SetMode(\'idle\')')" style="width:8em">
</TABLE>

<P>
Command: <INPUT type=text id=cmd> &nbsp;&nbsp;
Args: <INPUT type=text id=args>
<INPUT type=button value="Send" onclick="ErrorCheck('SendExec()')">

<hr>
<TABLE width=100%>
<TR>
<TD valign=top ROWSPAN=2>
<INPUT type=button value="Clear Output" onclick="Output.innerHTML='';Notify.innerHTML='';">
<P>
<SPAN id=Output></SPAN>
</TD>
<TD valign=top>
<SPAN id=Notify></SPAN>
</TD>
</TR>
<TR>
<TD valign=top>
<INPUT type=button value="Exit All Edsel" onclick="ErrorCheck('ExitAllProc()')">
<INPUT type=button value="Connect All Edsel" onclick="ErrorCheck('ConnectAllProc()')">
<INPUT type=button value="View PD Log" onclick="ErrorCheck('ViewPDLog()')">
<INPUT type=button value="Dump PublicData" onclick="ErrorCheck('DumpData()')">
<INPUT type=button value="Dump PrivateData" onclick="ErrorCheck('DumpDataPrivate()')">
<P>
<DIV id=Pub></DIV>
</TD>
</TR>
</TABLE>

<OBJECT id=RemoteObj
        CLASSID="clsid:854c3182-c854-4a77-b189-606859e4391b">
</OBJECT>

<OBJECT id=RemoteObjWorker
        CLASSID="clsid:854c3182-c854-4a77-b189-606859e4391b">
</OBJECT>

<!-- License object which allows us to us the common dialog OCX -->
<object CLASSID="clsid:5220cb21-c88d-11cf-b347-00aa00a28331" VIEWASTEXT>
    <param NAME="LPKPath" VALUE="comdlg.lpk">
</object>

<!-- The common dialog OCX -->
<object classid="clsid:F9043C85-F6F2-101A-A3C9-08002B2F49FB" codeBase="controls/comdlg32.ocx#version=6,0,84,18" id="comdlg" style="LEFT: 0px; TOP: 0px" VIEWASTEXT>
    <param NAME="_ExtentX" VALUE="847">
    <param NAME="_ExtentY" VALUE="847">
    <param NAME="_Version" VALUE="393216">
    <param NAME="CancelError" VALUE="0">
    <param NAME="Color" VALUE="0">
    <param NAME="Copies" VALUE="1">
    <param NAME="DefaultExt" VALUE>
    <param NAME="DialogTitle" VALUE>
    <param NAME="FileName" VALUE>
    <param NAME="Filter" VALUE>
    <param NAME="FilterIndex" VALUE="0">
    <param NAME="Flags" VALUE="0">
    <param NAME="FontBold" VALUE="0">
    <param NAME="FontItalic" VALUE="0">
    <param NAME="FontName" VALUE>
    <param NAME="FontSize" VALUE="8">
    <param NAME="FontStrikeThru" VALUE="0">
    <param NAME="FontUnderLine" VALUE="0">
    <param NAME="FromPage" VALUE="0">
    <param NAME="HelpCommand" VALUE="0">
    <param NAME="HelpContext" VALUE="0">
    <param NAME="HelpFile" VALUE>
    <param NAME="HelpKey" VALUE>
    <param NAME="InitDir" VALUE>
    <param NAME="Max" VALUE="0">
    <param NAME="Min" VALUE="0">
    <param NAME="MaxFileSize" VALUE="260">
    <param NAME="PrinterDefault" VALUE="1">
    <param NAME="ToPage" VALUE="0">
    <param NAME="Orientation" VALUE="1"></object>

</BODY>
</HTML>