//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------

function A(k) 
{
    this.k = k;
}

var x = new A(1);
var y = new A(undefined);

var i = 1;
var j = 2;

with (x)
{
    i = 2;

    with (A.prototype)
    {
        i = 3;
        x.i = 77;
        i = 4;
    }

    with (y)
    {
        i = 4.0;
        j = "y.j";
        y.j = undefined;
        k = null;
    }

    A.prototype.i = undefined;

    with (A.prototype)
    {
        i = 99;
    }

    WScript.Echo(i);
    WScript.Echo(j);
    WScript.Echo(k);


    with (y)
    {
        WScript.Echo(i);
        if (j === undefined)
            WScript.Echo("undefined");
        WScript.Echo(k);
    }

    j = 0;
    k = "x.k";

    var foo = function f() {
                  var i  = 'local.i';
                  WScript.Echo(i);
                  WScript.Echo(foo.length);
              };
    x.foo = 'x.foo';
}


WScript.Echo(i);
WScript.Echo(A.prototype.i);
WScript.Echo(x.i);
WScript.Echo(y.i);
WScript.Echo(j);
if (A.prototype.j === undefined)
    WScript.Echo("undefined");
if (x.j === undefined)
    WScript.Echo("undefined");
if (y.j === undefined)
    WScript.Echo("undefined");
WScript.Echo(x.k);
WScript.Echo(y.k);
WScript.Echo(x.foo);
foo();
try
{
    f(); // doesn't escape the blocks cope
} catch (e) {
    WScript.Echo(e);
}

function foo2() {
        var a1 = new Object();
        a1.foo = 16;
        a1.bar = "abcd";
        with ( a1 ) {
                a1 = new Object();
                a1.foo = 16;
                a1.bar = "dcba";
                WScript.Echo(bar);
        }
}
foo2();

var evalinwith = 'global evalinwith';
(function (){
    var O = {evalinwith:'no'};
    with(O)
    {
        eval('var evalinwith = "O.evalinwith"');
        eval('WScript.Echo(evalinwith + "")');
    }
    evalinwith = 'local evalinwith';
    eval('WScript.Echo(evalinwith + "")');
})();
eval('WScript.Echo(evalinwith + "")');

function verify(act, msg) { WScript.Echo(msg + ': ' + act); } 
var level1Func = function level1FuncIdent() {
    var level1 = "level1";

    with({level1: ""}) {
        try {
            throw "throw";
        } catch(level1) {}

    }
    
    verify(level1, "Value of level1 after assignment at level 1");
}
level1Func();

(function () {
    function a()
    {
        WScript.Echo("a is called");
    }

    (function(){
        try { 
            throw a;
        } 
        catch(x) { 
            with({}){
                x();
            }
        } 
    })();
})();

// Guarantee that function-body-in-array script length heuristic is not broken
// by compat mode named-function-expression-in-with.
with ({}) {
    var arrwithfunc = [(function handlerFactory() { return; })];
}

(function() {
    function outer() {
        function inner(){ WScript.Echo('in inner') }
        with({}) 
        {
            {
                (function(){ inner(); })();
            }
        }
    }
    outer();
})();

(function() {
    {
        function inner() { WScript.Echo('in inner'); }
        function outer() {
            with({}) {
                inner();
            }
        }
    }
    outer();
})();