<!--***********************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 ***********************************************************-->
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Developer Studio">
<META HTTP-EQUIV="Content-Type" content="text/html; charset=iso-8859-1">
<TITLE>Document Title</TITLE>
</HEAD>
<BODY id=theBody>

<script language="JScript">

function runJScriptTest( Log)
{
document.writeln("================================================================================<br>");
document.writeln("JScript<br>");
document.writeln("================================================================================<p>");

//var name : String = "Fred";
//print(name);
var arr= new Array( 1, 2, 3, 4, 0);
var arrInt= new Array( 1,2,3,4,5);
var arrDouble= new Array( 1.2345, 12.345, 123.45, 1234.5, 12345);
var arrBool= new Array( true, false, true, false, true);
var arrChar= new Array( '1', 'A'," ", 55);

var arrString= new Array("hamburger","cheeseburger", "chicken nuggets", "chicken wings" , "pizza");
var arrAny= new Array( 100, 100.1235,"hallo");
var arrSeq= new Array( arr, arr, arr);
var arrSeq2= new Array( );

var arEventListener= new Array( new XEventListener_Impl(), new XEventListener_Impl(),
	                                new XEventListener_Impl());
var arEventListener2= new Array( new XEventListener_Impl(), new XEventListener_Impl(),
                                 new XEventListener_Impl());
var arArEventListener= new Array( arEventListener, arEventListener2);

var arObj= new Array();
for( i=0; i< 3; i++)
{
    arObj[i]= new Object();
}
var outVal= new Array();
var outVal2= new Array();
var outVal3= new Array();

for( i=0; i < 3; i++)
{
    arrSeq2[i]= new Array();
    for( j= 0; j < 3; j++)
    {
        arrSeq2[i][j]= new Array();
        for( k= 0; k < 5; k++)
        {
            arrSeq2[i][j][k]= (i * 3 * 5) + (j * 5) + k;
//            document.write(arrSeq2[i][j][k] + " ");
        }
//        document.write("<br>");
    }
}

    
ret= oletest.methodByte( arr); 
_ret= new VBArray( ret).toArray();
Log.print( isEqualAr( arr, _ret), "methodByte");

ret= oletest.methodFloat( arrDouble);
_ret= new VBArray( ret).toArray();
bOk= false;
if( (arrDouble.length == _ret.length)
    && (_ret[0] > 1.2344 && _ret[0] < 1.2346)
    && (_ret[1] > 12.344 && _ret[1] < 12.346)
    && (_ret[2] > 123.44 && _ret[2] < 123.46)
    && (_ret[3] > 1234.4 && _ret[3] < 1234.6)
    && (_ret[4] > 12344 && _ret[4] < 12346))
    bOk= true;
Log.print( bOk, "methodFloat");

ret= oletest.methodDouble( arrDouble);
_ret= new VBArray( ret).toArray();
Log.print( isEqualAr( arrDouble, _ret), "methodDouble");

ret= oletest.methodBool( arrBool); 
_ret= new VBArray( ret).toArray();
Log.print( isEqualAr( arrBool, _ret), "methodBool");

ret= oletest.methodShort( arr); 
_ret= new VBArray( ret).toArray();
Log.print( isEqualAr( arr, _ret), "methodShort");

ret= oletest.methodUShort( arr);
_ret= new VBArray( ret).toArray();
Log.print( isEqualAr( arr, _ret), "methodUShort");

ret= oletest.methodLong( arr); 
_ret= new VBArray( ret).toArray();
Log.print( isEqualAr( arr, _ret), "methodLong");

ret= oletest.methodULong( arr);
_ret= new VBArray( ret).toArray();
Log.print( isEqualAr( arr, _ret), "methodULong");

ret= oletest.methodChar( arrChar); 
_ret= new VBArray( ret).toArray();
bOk= false;
if( _ret.length == arrChar.length && _ret[0] == 49 && _ret[1] == 65 && _ret[2] == 32 && _ret[3] == 55)
    bOk= true;
Log.print( bOk, "methodChar");

ret= oletest.methodString( arrString); 
_ret= new VBArray( ret).toArray();	
Log.print( isEqualAr( arrString, _ret), "methodString");

ret= oletest.methodAny( arrAny);
_ret= new VBArray( ret).toArray();
Log.print( isEqualAr( arrAny, _ret), "methodAny");
		
ret= oletest.methodSequence( arrSeq);
_ret= new VBArray( ret).toArray();
for( i=0; i < _ret.length; i++)
{
    sfarray2= new VBArray( _ret[i]);    
    var arr2= sfarray2.toArray();
    if( ! isEqualAr(arrSeq[i], arr2))
    {
        bOk= false;
        break;
    }        
}
Log.print( bOk, "methodSequence");

ret= oletest.methodSequence2( arrSeq2);
arr1= new VBArray( ret).toArray();
for( i=0; i < arr1.length; i++)
{
    var ar2Dim= arrSeq2[i];
    sfarray2= new VBArray( arr1[i]);
    arr2= sfarray2.toArray();
    for ( j=0; j < arr2.length; j++)
    {
        var ar1Dim= ar2Dim[j];
        sfarray3= new VBArray( arr2[j]);
        arr3= sfarray3.toArray();
//        document.write(arr3[j].toString());
        if( ! isEqualAr( arrSeq2[i][j], arr3))
        {
             bOk= false;
             break;
        }
    }
}
Log.print( bOk, "methodSequence2");

ret= oletest.methodXInterface( arObj);
_ret= new VBArray( ret).toArray();
bOk= true;
for(i in _ret)
{
    if( _ret[i] !== arObj[i])
    {
        bOk= false;
        break;
    }
}
Log.print( bOk, "methodXInterface");
			

ret= oletest.methodXEventListeners( arEventListener);
_ret= new VBArray(ret).toArray();
bOk= true;
for ( key in _ret)
{
    if( ! _ret[key].disposingCalled())
    {
        bOk= false;
        break;
    }
}
Log.print( bOk, "methodXEventListeners");

ret= oletest.methodXEventListenersMul( arArEventListener);
_ret= new VBArray(ret).toArray();
bOk= true;
for( key in _ret)
{
    _ret2= new VBArray(_ret[key]).toArray();
    for( key2 in _ret2)
    {
        if( ! _ret2[key2].disposingCalled())
        {
            bOk= false;
            break;
        }
    }
}
Log.print( bOk, "methodXEventListenersMul");

document.writeln("<br>");
oletest.AttrByte = arr;
ret= oletest.AttrByte;
_ret= new VBArray( ret).toArray();
Log.print( isEqualAr( arr, _ret), "AttrByte");

oletest.AttrFloat= arrDouble;
ret= oletest.AttrFloat;
_ret= new VBArray( ret).toArray();
bOk= false;
if( (arrDouble.length == _ret.length)
    && (_ret[0] > 1.2344 && _ret[0] < 1.2346)
    && (_ret[1] > 12.344 && _ret[1] < 12.346)
    && (_ret[2] > 123.44 && _ret[2] < 123.46)
    && (_ret[3] > 1234.4 && _ret[3] < 1234.6)
    && (_ret[4] > 12344 && _ret[4] < 12346))
    bOk= true;
Log.print( bOk, "AttrFloat");

oletest.AttrDouble= arrDouble;
ret= oletest.AttrDouble;
_ret= new VBArray( ret).toArray();
Log.print( isEqualAr( arrDouble, _ret), "AttrDouble");

oletest.AttrBool= arrBool;
ret= oletest.AttrBool;
_ret= new VBArray( ret).toArray();
Log.print( isEqualAr( arrBool, _ret), "AttrBool");

oletest.AttrShort= arr;
ret= oletest.AttrShort;
_ret= new VBArray( ret).toArray();
Log.print( isEqualAr( arr, _ret), "AttrShort");

oletest.AttrUShort= arr;
ret= oletest.AttrUShort;
_ret= new VBArray( ret).toArray();
Log.print( isEqualAr( arr, _ret), "AttrUShort");

oletest.AttrLong= arr;
ret= oletest.AttrLong;
_ret= new VBArray( ret).toArray();
Log.print( isEqualAr( arr, _ret), "AttrLong");

oletest.AttrULong= arr;
ret= oletest.AttrULong;
_ret= new VBArray( ret).toArray();
Log.print( isEqualAr( arr, _ret), "AttrULong");

oletest.AttrChar= arrChar;
ret= oletest.AttrChar;
_ret= new VBArray(ret).toArray();
bOk= false;
if( _ret.length == arrChar.length && _ret[0] == 49 && _ret[1] == 65 && _ret[2] == 32 && _ret[3] == 55)
    bOk= true;
Log.print( bOk, "AttrChar");

oletest.AttrString= arrString;
ret= oletest.AttrString;
_ret= new VBArray( ret).toArray();	
Log.print( isEqualAr( arrString, _ret), "AttrString");

oletest.AttrAny= arrAny;
ret= oletest.AttrAny;
_ret= new VBArray( ret).toArray();
Log.print( isEqualAr( arrAny, _ret), "AttrAny");

oletest.AttrSequence= arrSeq;
ret= oletest.AttrSequence;
_ret= new VBArray( ret).toArray();
for( i=0; i < _ret.length; i++)
{
    sfarray2= new VBArray( _ret[i]);    
    var arr2= sfarray2.toArray();
    if( ! isEqualAr(arrSeq[i], arr2))
    {
        bOk= false;
        break;
    }        
}
Log.print( bOk, "AttrSequence");

oletest.AttrSequence2= arrSeq2;
ret= oletest.AttrSequence2;
arr1= new VBArray( ret).toArray();
for( i=0; i < arr1.length; i++)
{
    var ar2Dim= arrSeq2[i];
    sfarray2= new VBArray( arr1[i]);
    arr2= sfarray2.toArray();
    for ( j=0; j < arr2.length; j++)
    {
        var ar1Dim= ar2Dim[j];
        sfarray3= new VBArray( arr2[j]);
        arr3= sfarray3.toArray();
        if( ! isEqualAr( arrSeq2[i][j], arr3))
        {
             bOk= false;
             break;
        }
    }
}
Log.print( bOk, "AttrSequence2");

oletest.AttrXInterface= arObj;
ret= oletest.AttrXInterface;
_ret= new VBArray( ret).toArray();
bOk= true;
for(i in _ret)
{
    if( _ret[i] !== arObj[i])
    {
        bOk= false;
        break;
    }
}
Log.print( bOk, "AttrXInterface");

ret= oletest.methodXInterface( arObj);
_ret= new VBArray( ret);
_ret= _ret.toArray();
bOk= true;
for(i in _ret)
{
    if( _ret[i] !== arObj[i])
    {
        bOk= false;
        break;
    }
}
Log.print( bOk, "methodXInterface");
//======================================================================================
document.writeln("<br>");
var inVal, outVal, retVal;
outVal = new Array();

inVal = 77;
retVal = oletest.in_methodByte(inVal)
oletest.testout_methodByte( outVal );
Log.print( retVal == inVal, "in_methodByte");
Log.print( outVal[0] == inVal, "testout_methodByte");

inVal = 3.14
retVal = oletest.in_methodFloat(inVal);
oletest.testout_methodFloat( outVal );
Log.print( retVal > 3.14 && retVal < 3.15, "in_methodFloat");
Log.print( outVal[0] > 3.13 && outVal[0] < 3.15, "testout_methodFloat");
//Log.print( outVal[0] == inVal, "testout_methodFloat");

retVal = oletest.in_methodDouble(inVal)
oletest.testout_methodDouble( outVal );
Log.print( retVal == inVal, "in_methodDouble");
Log.print( outVal[0] == 3.14, "testout_methodDouble" );

inVal = true;
retVal = oletest.in_methodBool(inVal);
oletest.testout_methodBool( outVal );
Log.print(retVal == inVal, "in_methodBool");
Log.print( outVal[0] == true, "testout_methodBool");

inVal = 111
retVal = oletest.in_methodShort(inVal);
oletest.testout_methodShort( outVal );
Log.print(retVal == inVal, "in_methodShort");
Log.print( outVal[0] == inVal, "testout_methodShort");

retVal = oletest.in_methodUShort(inVal);
oletest.testout_methodUShort( outVal );
Log.print(retVal == inVal, "in_methodUShort");
Log.print( outVal[0] == inVal, "testout_methodUShort");

retVal = oletest.in_methodLong(inVal); 
oletest.testout_methodLong( outVal );
Log.print(retVal == inVal, "in_methodLong");
Log.print( outVal[0] == inVal, "testout_methodLong");

retVal = oletest.in_methodULong(inVal);
oletest.testout_methodULong( outVal );
Log.print(retVal == inVal, "in_methodULong");
Log.print( outVal[0] == inVal, "testout_methodULong");

retVal = oletest.in_methodChar(inVal);
oletest.testout_methodChar( outVal );
Log.print(retVal == inVal, "in_methodChar");
Log.print( outVal[0] == inVal, "testout_methodChar");

inVal = "Hello World";
retVal = oletest.in_methodString(inVal);
oletest.testout_methodString( outVal );
Log.print(retVal == inVal, "in_methodString");
Log.print( outVal[0] == inVal, "testout_methodString");

retVal = oletest.in_methodAny(inVal);
oletest.testout_methodAny( outVal );
Log.print(retVal == inVal, "in_methodAny");
Log.print( outVal[0] == inVal, "testout_methodAny");

inVal =  new Object();
retVal = oletest.in_methodXInterface(inVal);
oletest.testout_methodXInterface(outVal);
Log.print(retVal === inVal, "in_methodXInterface");
Log.print(outVal[0] === inVal, "testout_methodXInterface");

inVal =  oletest;
retVal = oletest.in_methodXInterface(inVal);
oletest.testout_methodXInterface(outVal);
Log.print(retVal === inVal, "in_methodXInterface");
Log.print(outVal[0] === inVal, "testout_methodXInterface");


oletest.testout_methodSequence( outVal );
var arr= new VBArray( outVal[0]).toArray();
Log.print( isEqualAr(arr, new Array( 0,1,2,3,4,5,6,7,8,9)), "testout_methodSequence");

oletest.testout_methodSequence2( outVal );
var arr= new VBArray( outVal[0]).toArray();
bOk= true;
if( arr.length= 10)
{    
    for( i=0; i < arr.length; i++)
    {
        var arr2= new VBArray( arr[i]).toArray();
        if( ! isEqualAr( arr2, new Array( 0,1,2,3,4,5,6,7,8,9)))
        {
            bOk= false;
            break;
        }
    }
}
Log.print( bOk, "testout_methodSequence2");

oletest.testout_methodMulParams1( outVal, outVal2 );
Log.print( outVal[0] == 999 && outVal2[0] == 1111, "testout_methodMulParams1");

oletest.testout_methodMulParams2( outVal, outVal2, outVal3 );
Log.print( outVal[0] == 1111 && outVal2[0] == 1222 && outVal3[0] == " another string",
     "testout_methodMulParams2");

oletest.testout_methodMulParams3( "hallo", outVal );
Log.print( outVal[0] == "Out Hallo!", "testout_methodMulParams3");

var in1= 3.14;
var in2= 1111;
var in3= -2222;
oletest.testout_methodMulParams4( in1, outVal, in2, outVal2, in3 );
Log.print( (outVal[0] > 4.13 && outVal[0] < 4.15) && (outVal2[0] == 1112), "testout_methodMulParams4");

document.writeln("<p>");

inVal = 100;
outVal[0]= inVal;
oletest.testinout_methodByte( outVal );
oletest.testinout_methodByte( outVal );
Log.print( outVal[0] == inVal, "testinout_methodByte");

inVal = 3.14;
outVal[0]= inVal;
oletest.testinout_methodFloat( outVal );
oletest.testinout_methodFloat( outVal );
Log.print( outVal[0] > 3.13 && outVal[0] < 3.15, "testinout_methodFloat");

inVal = 3.14
outVal[0]= inVal;
oletest.testinout_methodDouble( outVal );
oletest.testinout_methodDouble( outVal );
Log.print( outVal[0] == inVal, "testinout_methodDouble");

inVal = true;
outVal[0]= inVal;
oletest.testinout_methodBool( outVal );
oletest.testinout_methodBool( outVal );
Log.print( outVal[0] == inVal, "testinout_methodBool");

inVal = 200;
outVal[0]= inVal;
oletest.testinout_methodShort( outVal );
oletest.testinout_methodShort( outVal );
Log.print( outVal[0] == inVal, "testinout_methodShort");

inVal = 300;
outVal[0]= inVal;
oletest.testinout_methodUShort( outVal );
oletest.testinout_methodUShort( outVal );
Log.print( outVal[0] == inVal, "testinout_methodUShort");

inVal = 400
outVal[0]= inVal;
oletest.testinout_methodLong( outVal );
oletest.testinout_methodLong( outVal );
Log.print( outVal[0] == inVal, "testinout_methodLong");

inVal = 500;
outVal[0]= inVal;
oletest.testinout_methodULong( outVal );
oletest.testinout_methodULong( outVal );
Log.print( outVal[0] == inVal, "testinout_methodULong");

inVal = "B";
outVal[0]= inVal;
oletest.testinout_methodChar( outVal );
oletest.testinout_methodChar( outVal );

Log.print( outVal[0] == 66, "testinout_methodChar");

inVal = "Hello World 2!";
outVal[0]= inVal;
oletest.testinout_methodString( outVal );
oletest.testinout_methodString( outVal );
Log.print( outVal[0] == inVal, "testinout_methodString");

inVal = new Object();
outVal[0]= inVal;
oletest.testinout_methodAny( outVal ); 
oletest.testinout_methodAny( outVal ); 
Log.print( outVal[0] === inVal, "testinout_methodAny");

inVal = arrInt;
outVal[0] = inVal;
oletest.testinout_methodSequence( outVal );
oletest.testinout_methodSequence( outVal );
retVal = new VBArray(outVal[0]).toArray();

Log.print( isEqualAr(retVal, new Array(3,4,5,6,7)), "testinout_methodSequence");
		 

outVal[0]= arrSeq;
oletest.testinout_methodSequence2( outVal );
var arr= new VBArray( outVal[0]).toArray();
var i;
bOk= true;
if( arr.length == 3)
{
    var tmpArr= new Array(2,4,6,8,0);
    for( i=0; i < arr.length; i++)
    {
        var arr2= new VBArray( arr[i]).toArray();
        if( ! isEqualAr( arr2, tmpArr))
        {
            bOk= false;
            break;
        }
    }
}
Log.print( bOk, "testinout_methodSequence2");


var ob=  new Object();
var sInVal= "this is a string"
ob.value= sInVal;
outVal[0]= ob;
oletest.testinout_methodXInterface( outVal);
Log.print( outVal[0].value == "out", "testinout_methodXInterface");
document.writeln("<p>");

i= 100;
ret= oletest.methodAnyTest1( i);
Log.print( i == ret, "methodAnyTest1");

i= 3.14;
ret= oletest.methodAnyTest1( i);
Log.print( i == ret, "methodAnyTest1");

i= "Hallo"
ret= oletest.methodAnyTest1( i);
Log.print( i == ret, "methodAnyTest1");

i= arrInt;
ret= oletest.methodAnyTest1( i);
var arr= new VBArray( ret).toArray();
Log.print( isEqualAr(arr, arrInt), "methodAnyTest1");

var obj= new Object();
ret= oletest.methodAnyTest1( obj);
Log.print( obj == ret, "methodAnyTest1");


document.writeln("<p>");

i= 100;
oletest.AttrAny2= i;
ret= oletest.AttrAny2;
Log.print( i == ret, "AttrAny2");

i= 3.14;
oletest.AttrAny2= i;
ret= oletest.AttrAny2;
Log.print( i == ret, "AttrAny2");

i= "Hallo"
oletest.AttrAny2= i;
ret= oletest.AttrAny2;
Log.print( i == ret, "AttrAny2");

i= arrInt;
oletest.AttrAny2= i;
ret= oletest.AttrAny2;
var arr= new VBArray( ret).toArray();
Log.print( isEqualAr(arr, arrInt), "AttrAny2");

var obj= new Object();
oletest.AttrAny2= obj;
ret= oletest.AttrAny2;
Log.print( obj == ret, "AttrAny2");


document.writeln("<p>");
// Structs ----------------------------------------------

/* var struct= oletest._GetStruct("com.sun.star.beans.Property"); */
/* struct.Attributes= 1; */
/* struct.Handle= 2; */
/* struct.Name= "some Property" */
/* oletest.methodStruct( struct); */

var ret= oletest.retMethodStruct();
Log.print( ret.Attributes == 127 && ret.Handle == 255 && ret.Name == "OleTest_Property", "retMethodStruct");

var astruct= oletest._GetStruct("com.sun.star.beans.Property");
astruct.Attributes= 1;
astruct.Handle= 2;
astruct.Name= "some Property"
oletest.AttrStruct=  astruct;

var ret= oletest.AttrStruct;
Log.print( ret.Attributes == 127 && ret.Handle == 255 && ret.Name == "OleTest_Property", "AttrStruct");

// The function returns the struct. Since structs are passed by value the returned struct
// will be wrapped in another IDispatch object
astruct.Attributes= 1;
astruct.Handle= 2;
astruct.Name= "Property";
ret= oletest.methodStruct2( astruct);
Log.print( ret.Attributes == 1 && ret.Handle == 2 && ret.Name == "Property", "methodStruct2");


document.writeln("<p>");
// Test Identity from COM objects in UNO
var listener1= new XEventListener_Impl();
oletest.setObject(listener1);
ret= oletest.isSame(listener1);
Log.print2( ret, "Ok Testing identity of COM objects<br>","Failed Testing identity of COM objects<br>");

var oletest2= oletest.getThis();
ret= oletest === oletest2;
Log.print2(ret, "Ok Testing identity of UNO objects<br>","Failed Testing identity of UNO objects<br>");
}



    
function isEqualAr( ar1, ar2)
{
    var bOk= false;
    if( ar1.length == ar2.length)
    {
        bOk= true;
        for( x in ar1)
        {
//            document.writeln( ar1[x] + " ");
//             document.writeln( ar2[x] + " ");
            if( ar1[x] != ar2[x])
            {
                bOk= false;
                break;
            }
        }
    }
    return bOk;
}

/* function isEqualAr2( ar1, ar2) */
/* { */

/*     var bOk= false; */
/*     if( ar1.length == ar2.length) */
/*     { */
/*         bOk= true; */
/*         for( x in ar1) */
/*         { */
/*             document.write( ar1[x]); */
/*             document.write( ar2[x]); */
/*             if( ! isEqualAr( ar1[x], ar2[x])) */
/*            { */
/*                bOk= false; */
/*                break; */
/*            } */
/*         } */
/*     } */
/*     return bOk; */

/* } */
    
function XEventListener_Impl()
{
	this._environment= "JScript";
	this._implementedInterfaces= new Array( "com.sun.star.lang.XEventListener");

	//XEventListener
	this.disposing= XEventListener_disposing;
	
	this.bdisposingCalled= false;
	this.bQuiet= true;
	this.resetDisposing= XEventListener_resetDisposing;
	this.disposingCalled= XEventListener_disposingCalled;
}	

function XEventListener_disposing( source)
{
  if( !this.bQuiet)
        alert("JScript Event Listener \n disposing is being called");
  this.bdisposingCalled= true;
}

function XEventListener_resetDisposing()
{
   this.bdisposingCalled= false;
}

function XEventListener_disposingCalled()
{
     return this.bdisposingCalled;
}
</script>

<script language="VBScript">
Function runVBTest( Log)
document.writeln("================================================================================<br>")
document.writeln("VB Script<br>")
document.writeln("================================================================================<p>")
    
Dim arrInt
arrInt= Array(1,2,3,-4,-5, 0)
arrUInt= Array(1,2,3,4,5)    
arrDouble= Array( 1.2345, 12.345, 123.45, 1234.5, 12345)
arrBool= Array( true, false, true, false, true)
arrChar= Array("A","B",67)
arrString= Array("hamburger","cheeseburger", "chicken nuggets", "chicken wings" , "pizza")
arrAny=  Array( 100, 100.1235,"hallo")

    
Dim arrDim2Int(2,1)
Dim i,j,k
For i= 0 To 1
  For j= 0 To 2
    arrDim2Int(j,i) = i*3 + j
  Next
Next

    
Dim arrDim3Int(3,2,1)
For i= 0 To 1
  For j= 0 To 2
    For k= 0 To 3
      arrDim3Int(k,j,i)= i* 3 + j* 4 + k
    Next
  Next
Next

Dim arrXEvent(2)
For i= 0 To 2
  Set arrXEvent(i)= new VBEventListener
Next

Dim arrXEvent2(2,1)
For i= 0 To 1
  For j= 0 To 2
   Set arrXEvent2(j,i)= new VBEventListener
  Next
Next


    
ret= oletest.methodByte( arrUInt)
Log.print isEqualVBAr( ret, arrUInt), "methodByte"

ret= oletest.methodFloat( arrDouble)
Log.print isEqualVBAr( ret, arrDouble), "methodFloat"

ret= oletest.methodDouble( arrDouble)    
Log.print isEqualVBAr( ret, arrDouble), "methodDouble"

ret= oletest.methodBool( arrBool)
Log.print isEqualVBAr( ret, arrBool), "methodBool"

ret= oletest.methodShort( arrInt)
Log.print isEqualVBAr( ret, arrInt), "methodShort"

ret= oletest.methodUShort( arrUInt)
Log.print isEqualVBAr( ret, arrUInt), "methodUShort"

ret= oletest.methodLong( arrInt)
Log.print isEqualVBAr( ret, arrInt), "methodLong"

ret= oletest.methodULong( arrUInt)
Log.print isEqualVBAr( ret, arrUInt), "methodULong"

ret= oletest.methodChar( arrChar)
bOk= false
if ret(0) = 65 AND ret(1) = 66 AND ret(2) = 67 then
    bOk= true
end if        
Log.print bOk, "methodChar"

ret= oletest.methodString( arrString)
Log.print isEqualVBAr( ret, arrString), "methodString"

ret= oletest.methodAny( arrAny)
Log.print isEqualVBAr( ret, arrAny), "methodAny"

    
ret= oletest.methodSequence( arrDim2Int)    
bOk= true
    
For i= 0 To 1
  Dim arr1
  arr1= ret(i)  
  For j= 0 To 2
    if arr1(j) <> arrDim2Int(j,i)  then
      bOk= false
      exit for
    end if
  Next
Next    
Log.print bOk, "methodSequence"

ret= oletest.methodSequence2( arrDim3Int)
'arrDim3Int(3,2,1)
bOk= true
For i= 0 To 1
  arr1= ret(i)
  For j= 0 To 2
    arr2= arr1(j)
    For k= 0 To 3
       If arr2(k) <> arrDim3Int(k,j,i) then
         bOk= false
         exit for
       End If  
    Next
  Next  
Next
Log.print bOk, "methodSequence2"

ret= oletest.methodXInterface(arrXEvent)
bOk= true
numArg= UBound( arrXEvent) - LBound( arrXEvent) + 1
numRet= UBound( ret) - LBound( ret) + 1
If numArg = numRet then
  For i= 0 To numArg - 1
    If  NOT (arrXEvent(i) Is ret(i))  then
        bOk= false
        Exit For
    End if
  Next   
End If  
Log.print bOk, "methodXInterface"

ret= oletest.methodXEventListeners( arrXEvent)
bOk= true
For i= 0 To 2
  If arrXEvent(i).disposingCalled = false then
    bOk= false
    Exit For
  End If  
Next
Log.print bOk, "methodXEventListeners"

ret= oletest.methodXEventListenersMul(arrXEvent2)
bOk= true
For i= 0 To 1
  For j= 0 To 2
    If arrXEvent2(j,i).disposingCalled = false then
     bOk= false
     Exit For
   End If
  Next
Next
Log.print bOk, "methodXEventListenersMul"

' Attributes ------------------------------------------------------
document.writeln( "<br>" )
oletest.AttrByte= arrUInt
ret= oletest.AttrByte
Log.print isEqualVBAr( arrUInt, ret), "AttrByte"        

oletest.AttrFloat= arrDouble
ret= oletest.AttrFloat
Log.print isEqualVBAr( arrDouble, ret), "AttrFloat"        

oletest.AttrDouble= arrDouble
ret= oletest.AttrDouble
Log.print isEqualVBAr( arrDouble, ret), "AttrDouble"        

oletest.AttrBool= arrBool
ret= oletest.AttrBool
Log.print isEqualVBAr( arrBool, ret), "AttrBool"        

oletest.AttrShort= arrInt
ret= oletest.AttrShort
Log.print isEqualVBAr( arrInt, ret), "AttrShort"

oletest.AttrUShort= arrUInt
ret= oletest.AttrUShort
Log.print isEqualVBAr( arrUInt, ret), "AttrUShort"        
        
oletest.AttrLong= arrInt
ret= oletest.AttrLong
Log.print isEqualVBAr( arrInt, ret), "AttrLong"

oletest.AttrULong= arrUInt
ret= oletest.AttrULong
Log.print isEqualVBAr( arrUInt, ret), "AttrULong"

oletest.AttrChar= arrChar
ret= oletest.AttrChar
bOk= false
if ret(0) = 65 AND ret(1) = 66 AND ret(2) = 67 then
    bOk= true
end if        
Log.print bOk, "AttrChar"

oletest.AttrString= arrString
ret= oletest.AttrString
Log.print isEqualVBAr( arrString, ret), "AttrString"

oletest.AttrSequence= arrDim2Int
ret= oletest.AttrSequence
bOk= true
For i= 0 To 1
  arr1= ret(i)  
  For j= 0 To 2
    if arr1(j) <> arrDim2Int(j,i)  then
      bOk= false
      exit for
    end if
  Next
Next    
Log.print bOk, "AttrSequence"
    
oletest.AttrSequence2= arrDim3Int
ret= oletest.AttrSequence2
'arrDim3Int(3,2,1)
bOk= true
For i= 0 To 1
  arr1= ret(i)
  For j= 0 To 2
    arr2= arr1(j)
    For k= 0 To 3
       If arr2(k) <> arrDim3Int(k,j,i) then
         bOk= false
         exit for
       End If  
    Next
  Next  
Next
Log.print bOk, "AttrSequence2"
        
oletest.AttrXInterface= arrXEvent   
ret= oletest.AttrXInterface
bOk= true
numArg= UBound( arrXEvent) - LBound( arrXEvent) + 1
numRet= UBound( ret) - LBound( ret) + 1
If numArg = numRet then
  For i= 0 To numArg - 1
    If  NOT (arrXEvent(i) Is ret(i))  then
        bOk= false
        Exit For
    End if
  Next   
End If  
Log.print bOk, "AttrXInterface"
        
'out params ================================================================================
document.writeln("<p>")
Dim inVal, outVal, retVal

inVal = 111
retVal = oletest.in_methodByte(inVal)
oletest.testout_methodByte outVal
Log.print inVal = retVal, "in_methodByte"
Log.print outVal = inVal, "testout_methodByte"

inVal = 3.14
retVal = oletest.in_methodFloat(inVal)
oletest.testout_methodFloat outVal 
Log.print inVal = retVal, "in_methodFloat"
Log.print outVal > 3.13 AND outVal < 3.15, "testout_methodFloat"

inVal = 3.14
retVal = oletest.in_methodDouble(inVal)
oletest.testout_methodDouble outVal 
Log.print inVal = retVal, "in_methodDouble"
Log.print outVal = 3.14, "testout_methodDouble"

inVal = true
retVal = oletest.in_methodBool(inVal)
oletest.testout_methodBool outVal 
Log.print inVal = retVal, "in_methodBool"
Log.print outVal = inVal, "testout_methodBool"

inVal = 222
retVal = oletest.in_methodShort(inVal)
oletest.testout_methodShort outVal 
Log.print inVal = retVal, "in_methodShort"
Log.print outVal = inVAl, "testout_methodShort"

inVal = 333
retVal = oletest.in_methodUShort(inVal)
oletest.testout_methodUShort outVal 
Log.print inVal = retVal, "in_methodUShort"
Log.print outVal = inVal, "testout_methodUShort"

inVal = 4444
retVal = oletest.in_methodLong(inVal)
oletest.testout_methodLong outVal 
Log.print inVal = retVal, "in_methodLong"
Log.print outVal = inVal, "testout_methodLong"

inVal = 5555
retVal = oletest.in_methodULong(inVal)
oletest.testout_methodULong outVal 
Log.print inVal = retVal, "in_methodULong"
Log.print outVal = inVal, "testout_methodULong"

inVal = 65
retVal = oletest.in_methodChar(inVal)
oletest.testout_methodChar outVal 
Log.print inVal = retVal, "in_methodChar"
Log.print outVal = 65, "testout_methodChar"

inVal = "Hello World 3!"
retVal = oletest.in_methodString(inVal)
oletest.testout_methodString outVal 
Log.print inVal = retVal, "in_methodString"
Log.print outVal = inVal, "testout_methodString"

inVal = "Hello World 4!"
retVal = oletest.in_methodAny(inVal)
oletest.testout_methodAny outVal 
Log.print outVal = inVal, "testout_methodAny"

oletest.testout_methodSequence outVal 
Log.print isEqualVBAr(outVal, Array( 0,1,2,3,4,5,6,7,8,9)), "testout_methodSequence"

oletest.testout_methodSequence2 outVal
count= UBound( outVal) - LBound( outVal) + 1
ret= False
If count = 10 Then 
  For Each ar In outVal
    ret= isEqualVBAr(ar, Array( 0,1,2,3,4,5,6,7,8,9))
    If ret = false Then
      Exit For
    End If
  Next
End If
Log.print ret, "testout_methodSequence2"

outVal= Empty
outVal2= Empty
oletest.testout_methodMulParams1 outVal, outVal2
ret= false
If outVal = 999 AND outVal2 = 1111 Then
  ret= true
End If
Log.print ret, "testout_methodMulParams1"

outVal= Empty
outVal2= Empty
outVal3= Empty
oletest.testout_methodMulParams2 outVal, outVal2, outVal3
ret = false
If outVal = 1111 AND outVal2 = 1222 AND outVal3 = " another string" Then
  ret= true
End If
Log.print ret, "testout_methodMulParams2"

document.writeln("missing: testout_methodMulParams3 <br>")
document.writeln("missing: testout_methodMulParams4 <br>")

outVal= Empty
oletest.testout_methodXInterface outVal
ret= false
If outVal Is oletest Then
  ret= true
End If
Log.print ret, "testout_methodXInterface"

Set outVal= Nothing
document.writeln("missing: testout_methodXInterface <br>")

inVal = 1
outVal= inVal
oletest.testinout_methodByte outVal
oletest.testinout_methodByte outVal
Log.print inVal = outVal, "testinout_methodByte"


document.writeln("missing: testinout_methodFloat  <br>")
document.writeln("missing: testinout_methodDouble  <br>")
document.writeln("missing: testinout_methodBool  <br>")
document.writeln("missing: testinout_methodShort  <br>")
document.writeln("missing: testinout_methodUShort  <br>")
document.writeln("missing: testinout_methodLong  <br>")
document.writeln("missing: testinout_methodULong  <br>")
document.writeln("missing: testinout_methodChar  <br>")
document.writeln("missing: testinout_methodString  <br>")
document.writeln("missing: testinout_methodAny  <br>")
document.writeln("missing: testinout_methodSequence  <br>")
document.writeln("missing: testinout_methodSequence2  <br>")
document.writeln("missing: testinout_methodXInterface  <br>")
document.writeln("missing: methodAnyTest1  <br>")
document.writeln("missing: methodAnyTest1  <br>")
document.writeln("missing: methodAnyTest1  <br>")
document.writeln("missing: methodAnyTest1  <br>")
document.writeln("missing: methodAnyTest1  <br>")
document.writeln("missing: AttrAny2  <br>")
document.writeln("missing: methodAnyTest1  <br>")
document.writeln("missing: methodAnyTest1  <br>")
document.writeln("missing: methodAnyTest1  <br>")
document.writeln("missing: methodAnyTest1  <br>")
document.writeln("missing: methodAnyTest1  <br>")
document.writeln("missing: retMethodStruct  <br>")
document.writeln("missing: AttrStruct  <br>")
document.writeln("missing: methodStruct2  <br>")

' Test Identity from COM objects in UNO
Dim listener1
Set listener1= new VBEventListener
call oletest.setObject( listener1)
ret= oletest.isSame(listener1)
Log.print2 ret, "Ok Testing identity of COM objects <br>","Failed Testing identity of COM objects<br>"
' Test identity of UNO objects

set oletest2= oletest.getThis()
ret= oletest Is  oletest2
Log.print2 ret, "Ok Testing identity of UNO objects<br>","Failed Testing identity of UNO objects<br>"

End Function    

        
Function isEqualVBAr( arr1, arr2)
    ret = false
    s1= UBound( arr1) - LBound( arr1) + 1
    s2= UBound( arr2) - LBound( arr2) + 1

    if s1 = s2 then
      ret= true
      Dim i
      for i= 0 To s1 - 1
        if arr1(i) <> arr2(i) then
          ret= false
          exit for
        end if
      next
    end if
    isEqualVBar= ret
End Function


'The listener object

Class VBEventListener
  Dim Bridge_ImplementedInterfaces(0)
  Dim bDisposingCalled

'XEventListener::disposing
  Function disposing( source)
    bDisposingCalled= true
  End Function
  
  Sub Class_Initialize()
    bDisposingCalled= false
    Bridge_ImplementedInterfaces(0)= "com.sun.star.lang.XEventListener"
  End Sub
  
  Function resetDisposing()
    bDisposingCalled= false
  End Function

  Function disposingCalled()
    disposingCalled= bDisposingCalled
  End Function
End Class
        

sub callBasic(id)
	
	Dim factory
	Set	factory= GetObject("", "com.sun.star.ServiceManager")

	Set	oletest= factory.createInstance("oletest.OleTest")


	arrInt= Array(1,2,3,4,5)
	arrInt2= Array( -1, -2, 127, 128, 0)
	arrDouble= Array(1.1, 2.2, 3.3, 4.4, 5.5)
	arrBool= Array(0,1,0,2,0)
	arrLong= Array( &Hff, &Hffff, &Hffffff, &Hffffffff)
	arrString= Array("Chicken Wings", "Cheeseburger", "Hamburger")
	arrChar= Array("a",65, "M")
	arrAny= Array("Mickey", 3.14, 100, "A")

	Dim arrDim2Int(1,2)
	For i= 0 To 1
		For j= 0 To 1
			arrDim2Int(i,j) = i*2 + j
		Next
	Next
	
	Dim arrDim3Int(1,1,1)
	For i= 0 To 1
		For j= 0 To 1
			For k=0 To 1
				arrDim3Int(i,j,k) = i*2 + j*2 + k
			Next
		Next
	Next

	
	select case id

	// Out Parameter



 // In Out Parameter --------------------------------------------------
		case 100
			a= 100
			document.write "param: " & CStr(  a) & "<br>"
			oletest.testinout_methodByte a
			document.write a 
		case 101
			a= 1.11
			document.write "param: " & CStr(  a) & "<br>"
			oletest.testinout_methodDouble a
			document.write a 
		case 102
			a= 5
			document.write "param: "& CStr(  a) & "<br>"
			oletest.testinout_methodBool a
			document.write a 
		case 103
			a= -10
			document.write "param: "& CStr(  a) & "<br>"
			oletest.testinout_methodShort a
			document.write a 
		case 104
			a= 128
			document.write "param: "& CStr(  a) & "<br>"
			oletest.testinout_methodUShort a
			document.write a 
		case 105
			a= 65556
			document.write "param: "& CStr(  a) & "<br>"
			oletest.testinout_methodLong a
			document.write a 
		case 106
			a= 65556
			document.write "param: "& CStr(  a) & "<br>"
			oletest.testinout_methodULong a
			document.write a 
		case 107
			a= "ein test string"
			document.write "param: "& CStr(  a) & "<br>"
			oletest.testinout_methodString a
			document.write a 
		case 108
			a= "W"
			document.write "param: "& CStr(  a) & "<br>"
			oletest.testinout_methodChar a
			document.write a 
		case 109
			a= "Ein String im Any"
			document.write "param: "& CStr(  a) & "<br>"
			oletest.other_methodAnyIn a
			document.write a

		case 150
			dim a
			document.write "param: "& CStr(  a) & "<br>"
			oletest.testout_methodByte( a)
			document.write a
// Attributes -----------------------------------------------------------------
		case 200
			document.write "set: " 
			printArray arrInt 
			oletest.AttrByte= arrInt
			b= oletest.AttrByte
			call printArrayEx( "<br> get: ", "<br>", b)
		case 201
			document.write "set: " 
			printArray arrDouble 
			oletest.AttrDouble= arrDouble
			b= oletest.AttrDouble
			call printArrayEx( "<br> get: ", "<br>", b)
		case 202
			document.write "set: " 
			printArray arrBool : 
			oletest.AttrBool= arrBool
			b= oletest.AttrBool
			call printArrayEx( "<br> get: ", "<br>", b)
		case 203
			document.write "set: " 
			printArray arrInt2 : 
			oletest.AttrShort= arrInt2
			b= oletest.AttrShort
			call printArrayEx( "<br> get: ", "<br>", b)
		case 204
			document.write "set: " 
			printArray arrInt 
			oletest.AttrUShort= arrInt
			b= oletest.AttrUShort
			call printArrayEx( "<br> get: ", "<br>", b)
		case 205
			document.write "set: " 
			printArray arrInt2
			oletest.AttrLong= arrInt2
			b= oletest.AttrLong
			call printArrayEx( "<br> get: ", "<br>", b)
		case 206
			document.write "set: " 
			printArray arrInt 
			oletest.AttrULong= arrInt
			b= oletest.AttrULong
			call printArrayEx( "<br> get: ", "<br>", b)
		case 207
			document.write "set: " 
			printArray arrString 
			oletest.AttrString= arrString
			b= oletest.AttrString
			call printArrayEx( "<br> get: ", "<br>", b)
		case 208
			document.write "set: " 
			printArray arrChar
			oletest.AttrChar= arrChar
			b= oletest.AttrChar
			call printArrayEx( "<br> get: ", "<br>", b)
		case 209
			document.write "set: " 
			printArray arrAny
			oletest.AttrAny= arrAny
			b= oletest.AttrAny
			call printArrayEx( "<br> get: ", "<br>", b)

		case 210
			document.write "set: <br>" 
			printArray2 arrDim2Int : 
			oletest.AttrSequence= arrDim2Int
			ret= oletest.AttrSequence
			document.write "get: "
			for each val in ret
				document.write "<br> array: "
				for each val2 in val
					document.write val2
				next
			next

		case 300
			dim aByte
			aByte= 100
			call oletest.testinout_methodByte( aByte)
			MsgBox aByte 


		case 400
		
		set  struct= oletest.Bridge_GetStruct("com.sun.star.beans.Property")
		 struct.Attributes= 1
		 struct.Handle= 2
		 struct.Name= "some Property"
		 oletest.methodStruct struct

	case 401
		set struct= oletest.retMethodStruct()
		alert( "Property::Attributes : " & struct.Attributes & vblf & " Property::Handle : " _
		& struct.Handle & vblf & " Property::Name : " & struct.Name)

	case 402
		set struct= oletest.Bridge_GetStruct("com.sun.star.beans.Property")
		 struct.Attributes= 1
		 struct.Handle= 2
		 struct.Name= "some Property"
		 oletest.AttrStruct=  struct

		 set struct2= oletest.AttrStruct
		alert( "property get: " & vblf & "Property::Attributes : " & struct2.Attributes & _
		vblf & " Property::Handle : " &  struct2.Handle & vblf & " Property::Name : " _
		& struct2.Name)
	end select
end sub

sub printArray( arr)
	document.write "array: "
	For Each val In arr
		document.write CStr(val) & " "
	Next
end sub

// print a 2 dimensional Array

sub printArray2( arr)
		elements1= UBound( arr, 1) - LBound( arr, 1) +1
		elements2= UBound( arr, 2) - LBound( arr, 2) +1
		
		For i=0 To elements1 -1
			document.write( "array " & CStr( i) & ": "  )
			For j=0 To elements2 -1
				document.write CStr( arr(i,j))
			Next
			document.write( "<br>")
		Next
end sub

sub printArrayEx( pre, post, array)
	document.write pre
	printArray array
	document.write post
end sub
</script>

<script language="JScript">
var arFunctions= new Array();
arFunctions["methodByte"]= "sequence&lt;byte&gt; methodByte( [in] sequence&lt;byte&gt; aSeq )";
arFunctions["methodFloat"]= "sequence&lt;float&gt; methodFloat( [in] sequence&lt;float&gt; aSeq)";
arFunctions["methodDouble"]= "sequence&lt;double&gt; methodDouble( [in] sequence&lt;double&gt; aSeq)";
arFunctions["methodBool"]= 	"sequence&lt;boolean&gt; methodBool( [in] sequence&lt;boolean&gt; aSeq)";
arFunctions["methodShort"]= "sequence&lt;short&gt; methodShort( [in] sequence&lt;short&gt; aSeq)";
arFunctions["methodUShort"]= "sequence&lt;unsigned short&gt; methodUShort( [in] sequence&lt;unsigned short&gt; aSeq)";
arFunctions["methodLong"]= "sequence&lt;long&gt; methodLong( [in] sequence&lt;long&gt; aSeq)";
arFunctions["methodULong"]= "sequence&lt;unsigned long&gt; methodULong( [in] sequence&lt;unsigned long&gt; aSeq)";
arFunctions["methodString"]= "sequence&lt;string&gt; methodString( [in] sequence&lt;string&gt; aSeq)";
arFunctions["methodChar"]= "sequence&lt;char&gt; methodChar( [in] sequence&lt;char&gt; aSeq)";
arFunctions["methodAny"]= "sequence&lt;any&gt; methodAny	( [in] sequence&lt;any&gt; aSeq)";
arFunctions["methodXInterface"]= "sequence&lt;XInterface&gt; methodXInterface ( [in] sequence&lt;XInterface&gt; aSeq)";
arFunctions["methodSequence"]= "sequence&lt; sequence &lt;long&gt; &gt; methodSequence( [in] sequence&lt; sequence&lt; long &gt; &gt; aSeq)";
arFunctions["methodSequence2"]= "sequence&lt; sequence &lt;sequence &lt;long&gt; &gt; &gt; methodSequence2( [in] sequence&lt; sequence&lt; sequence&lt;long&gt; &gt; &gt; aSeq)";
arFunctions["methodXEventListeners"]= "sequence&lt; com::sun::star::lang::XEventListener &gt; methodXEventListeners( [in] sequence&lt;com::sun::star::lang::XEventListener&gt; aSeq)";
arFunctions["methodXEventListenersMul"]= "sequence&lt; sequence&lt; com::sun::star::lang::XEventListener &gt; &gt; methodXEventListenersMul( [in] sequence&lt; sequence&lt; com::sun::star::lang::XEventListener&gt; &gt; aSeq)";
arFunctions["AttrByte"]="[attribute] sequence<byte> AttrByte";
arFunctions["AttrFloat"]="[attribute] sequence<float> AttrFloat";
arFunctions["AttrDouble"]="[attribute] sequence<double> AttrDouble";
arFunctions["AttrBool"]="[attribute] sequence<boolean> AttrBool";
arFunctions["AttrShort"]="[attribute] sequence<short> AttrShort";
arFunctions["AttrUShort"]="[attribute] sequence<unsigned short> AttrUShort";
arFunctions["AttrLong"]="[attribute] sequence<long> AttrLong";
arFunctions["AttrULong"]="[attribute] sequence<unsigned long> AttrULong";
arFunctions["AttrString"]="[attribute] sequence<string> AttrString";
arFunctions["AttrChar"]="[attribute] sequence<char> AttrChar";
arFunctions["AttrAny"]="[attribute] sequence<any> AttrAny";
arFunctions["AttrSequence"]="[attribute] sequence< sequence<long> > AttrSequence";
arFunctions["AttrSequence2"]="[attribute] sequence< sequence< sequence <long> > > AttrSequence2";
arFunctions["AttrXInterface"]="[attribute] sequence< com::sun::star::uno::XInterface > AttrXInterface";

arFunctions["testout_methodByte"]= " void testout_methodByte( [out] byte rOut )";
arFunctions["testout_methodFloat"]= "void testout_methodFloat( [out] float rOut)";
arFunctions["testout_methodDouble"]= "void testout_methodDouble( [out] double rOut)";
arFunctions["testout_methodBool"]= "void testout_methodBool( [out] boolean rOut)";
arFunctions["testout_methodShort"]= "void testout_methodShort( [out] short rOut)";
arFunctions["testout_methodUShort"]= "void testout_methodUShort( [out] unsigned short rOut)";
arFunctions["testout_methodLong"]= "void testout_methodLong( [out]  long rOut)";
arFunctions["testout_methodULong"]= "void testout_methodULong( [out] unsigned long rOut)";
arFunctions["testout_methodString"]= "void testout_methodString( [out] string rOut)";
arFunctions["testout_methodChar"]= "void testout_methodChar( [out] char rOut)";
arFunctions["testout_methodAny"]= "void testout_methodAny( [out] any rOut)";
arFunctions["testout_methodSequence"]= "void testout_methodSequence( [out] sequence< long > rOut)";
arFunctions["testout_methodSequence2"]= "void testout_methodSequence2( [out] sequence < sequence< long > > rOut)";
arFunctions["testout_methodXInterface"]= "void testout_methodXInterface( [out] com::sun::star::uno::XInterface rOut)";
arFunctions["testout_methodMulParams1"]= "void testout_methodMulParams1( [out] long rout1, [out] long rout2)";
arFunctions["testout_methodMulParams2"]= "void testout_methodMulParams2( [out] long rout1, [out] long rout2, [out] string rout3)";
arFunctions["testout_methodMulParams3"]= "void testout_methodMulParams3( [in] string sin, [out] string sout)";
arFunctions["testout_methodMulParams4"]= "void testout_methodMulParams4( [in] float in1, [out] float out1, [in] long in2, [out] long out2, [in] long in3)";
arFunctions["testinout_methodByte"]="void testinout_methodByte( [inout] byte rOut )";
arFunctions["testinout_methodFloat"]="void testinout_methodFloat( [inout] float rOut)";
arFunctions["testinout_methodDouble"]="void testinout_methodDouble( [inout] double rOut)";
arFunctions["testinout_methodBool"]="void testinout_methodBool( [inout] boolean rOut)";
arFunctions["testinout_methodShort"]="void testinout_methodShort( [inout] short rOut)";
arFunctions["testinout_methodUShort"]="void testinout_methodUShort( [inout] unsigned short rOut)";
arFunctions["testinout_methodLong"]="void testinout_methodLong( [inout]  long rOut)";
arFunctions["testinout_methodULong"]="void testinout_methodULong( [inout] unsigned long rOut)";
arFunctions["testinout_methodString"]="void testinout_methodString( [inout] string rOut)";
arFunctions["testinout_methodChar"]="void testinout_methodChar( [inout] char rOut)";
arFunctions["testinout_methodAny"]="void testinout_methodAny( [inout] any rOut)";
arFunctions["testinout_methodSequence"]="void testinout_methodSequence( [inout] sequence< long > rOut)";
arFunctions["testinout_methodSequence2"]="void testinout_methodSequence2( [inout] sequence < sequence< long > > rOut)";
arFunctions["testinout_methodXInterface"]="void testinout_methodXInterface( [inout] com::sun::star::script::XInvocation rOut)";
arFunctions["testinout_methodXInterface2"]="void testinout_methodXInterface2( [inout] com::sun::star::uno::XInterface rOut)";

arFunctions["in_methodByte"]= "byte in_methodByte( [in] byte rIn )";
arFunctions["in_methodFloat"]= "float in_methodFloat( [in] float rIn);"
arFunctions["in_methodDouble"]= "double in_methodDouble( [in] double rIn)";
arFunctions["in_methodBool"]= "boolean in_methodBool( [in] boolean rIn)";
arFunctions["in_methodShort"]= "short in_methodShort( [in] short rIn)";
arFunctions["in_methodUShort"]= "unsigned short in_methodUShort( [in] unsigned short rIn)";
arFunctions["in_methodLong"]= "long in_methodLong( [in]  long rIn)";
arFunctions["in_methodULong"]= "unsigned long in_methodULong( [in] unsigned long rIn)";
arFunctions["in_methodHyper"]= "hyper in_methodHyper( [in]  hyper rIn)";
arFunctions["in_methodUHyper"]= "unsigned hyper in_methodHyper( [in]  unsigned hyper rIn)";
arFunctions["in_methodString"]= "string in_methodString( [in] string rIn)";
arFunctions["in_methodChar"]= "char in_methodChar( [in] char rIn)";
arFunctions["in_methodAny"]= "any in_methodAny	( [in] any rIn)";
arFunctions["in_methodXInterface"]= "XInterface in_methodXInterface([in] XInterface rIn)";


arFunctions["methodAnyTest1"]="any methodAnyTest1( [in] any rIn)";
arFunctions["AttrAny2"]= "[attribute]  any AttrAny2";
arFunctions["retMethodStruct"]= "com::sun::star::beans::Property retMethodStruct()";
arFunctions["AttrStruct"]= "[attribute] com::sun::star::beans::Property AttrStruct";
arFunctions["methodStruct2"]= "com::sun::star::beans::Property methodStruct2( [in] com::sun::star::beans::Property aProp)";


var factory= new ActiveXObject("com.sun.star.ServiceManager");
var oletest= factory.createInstance("oletest.OleTest");

Log= new Logger();


runJScriptTest(Log);
runVBTest(Log);
Log.summarize();


function Logger()
{
    this.print= logger_print;
    this.print2= logger_print2;
    this.summarize= logger_summarize;
    this.bAllOk= true;
}
function logger_print( bool, method)
{
    this.print2(bool, "Ok &nbsp;&nbsp;&nbsp;&nbsp;" + arFunctions[method] + "<br>",
               "Failed &nbsp;&nbsp;&nbsp;&nbsp;" + arFunctions[method] + "<br>");
}

function logger_print2( bool, okString, failedString)
{
    if( bool)
        document.writeln( okString);
    else
    {
        document.writeln( failedString);    
        this.bAllOk= this.bAllOk && false;
    }
}

function logger_summarize()
{
    document.writeln("<p> ==============================================================================<br>");
    if(this.bAllOk)
        document.writeln("No errors <br>");
    else
        document.writeln("Error ! The test failed! <br>");
}


</script>

</body>
</html>


