• Interesting!

    From Angus McLeod@VERT/ANJO to All on Tuesday, May 29, 2007 22:53:00
    I'm using XMLHttpRequest to generate a request object, and fetch some
    data from the server.

    // fuck you, Bill Gates!
    function GetXMLHttpRequestObject() {
    if (window.XMLHttpRequest) {
    // branch for native XMLHttpRequest object
    req = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
    // branch for IE/Windows ActiveX version
    req = new ActiveXObject("Microsoft.XMLHTTP");
    }
    return req;
    }

    var request; // request object

    // process data when it is ready
    function process_it() {
    if (request.readyState==4) {
    if (request.status==200) {
    // process the returned data here!
    }
    }
    }

    // request the data
    request = GetXMLHttpRequestObject();
    request.onreadystatechange = process_it;
    request.open( "GET", "/xml_generate_it.php", true );
    request.send( null );

    This is all working well. However, I want to create a JS object that does this internally. Essentially, I am creating the JS object, declaring 'request' as a property of the object, declaring process_it() as a method
    of the object, and using 'this.request' instead of 'request' thruought.
    But it doesn't work. I get

    this.request has no properties

    when I try to execute the if() statements at the top of process_it().

    Any ideas?






    ---
    Playing: "Keep it alive" by "Nina Hagen" from the "Street" album
    þ Synchronet þ With my ISP it's the InterNOT at The ANJO BBS
  • From Deuce@VERT/SYNCNIX to Angus McLeod on Wednesday, May 30, 2007 03:11:00
    Re: Interesting!
    By: Angus McLeod to All on Tue May 29 2007 10:53 pm

    This is all working well. However, I want to create a JS object that does this internally. Essentially, I am creating the JS object, declaring 'request' as a property of the object, declaring process_it() as a method
    of the object, and using 'this.request' instead of 'request' thruought.
    But it doesn't work. I get

    Sounds like the constructor isn't setting the request property...

    Using the existing code, and changing request to this.request in process_it, the constructor would look like this:

    function MyObject()
    {
    this.request = GetXMLHttpRequestObject();
    this.process_it = process_it;
    }

    And usage would be:

    var obj = new MyObject();
    obj.process_it();

    I'd need to see the code that's not working to help more.

    ---
    Synchronet - Jump on the Web 0.2 bandwagon!

    ---
    þ Synchronet þ My Brand-New BBS (All the cool SysOps run STOCK!)
  • From Tracker1@VERT/TRN to Angus McLeod on Wednesday, May 30, 2007 10:52:00
    Angus McLeod wrote:
    I'm using XMLHttpRequest to generate a request object, and fetch some
    data from the server.
    --snip-- <
    This is all working well. However, I want to create a JS object that does this internally. Essentially, I am creating the JS object, declaring 'request' as a property of the object, declaring process_it() as a method
    of the object, and using 'this.request' instead of 'request' thruought.
    But it doesn't work. I get

    this.request has no properties

    when I try to execute the if() statements at the top of process_it().

    Any ideas?

    I would honestly suggest looking into something like prototype.js or jquery, which does a lot of handling for encapsulation... "this" in the context of the handler will refer to the request object itself... you will want to extend off of the request object, something like request.handler = this, when creating the request object, you can then refer back through request.handler.something etc...

    For more info on Ajax.Request in prototype...
    see: http://www.prototypejs.org/api/ajax/request
    and.. http://www.prototypejs.org/api/ajax/options

    Hope this helps. :)

    Something else worth looking at for some gee wiz factor is ExtJS... http://extjs.com/ ... see the API and examples here... http://extjs.com/deploy/ext/docs/index.html

    I used some of this on http://artrazo.com/ mainly in the guestbook signing, and the fade effects on the main page.. I didn't dig too deep, just enough to get my feet wet... if you are on freenode, ask around in #extjs there's usually a few knowledgeable people in there.

    --
    Michael J. Ryan - tracker1(at)theroughnecks(dot)net - www.theroughnecks.net icq: 4935386 - AIM/AOL: azTracker1 - Y!: azTracker1 - MSN/Win: (email)

    ... Ferengi Rule of Acquisition #239: Ambition knows no family

    ---
    þ Synchronet þ theroughnecks.net - you know you want it
  • From Tracker1@VERT/TRN to Deuce on Wednesday, May 30, 2007 11:52:00
    Deuce wrote:
    I'd need to see the code that's not working to help more.

    I believe he's having trouble with the parent reference, in the referenced function "this" refers directly to the request object, not the containing object, you can work around this, by creating a back-reference to the containing object request.parent = this; for example... there's a lot of mentions of similar issues out there.

    In flash's object model for an xml request object, it's far worse to have a self-referenced object...

    --
    Michael J. Ryan - tracker1(at)theroughnecks(dot)net - www.theroughnecks.net icq: 4935386 - AIM/AOL: azTracker1 - Y!: azTracker1 - MSN/Win: (email)

    ... Ferengi Rule of Acquisition #243: If you got something nice to say, then SHOUT

    ---
    þ Synchronet þ theroughnecks.net - you know you want it
  • From Angus McLeod@VERT/ANJO to Tracker1 on Wednesday, May 30, 2007 22:05:00
    Re: Re: Interesting!
    By: Tracker1 to Angus McLeod on Wed May 30 2007 10:52:00

    I would honestly suggest looking into something like prototype.js or jquery, which does a lot of handling for encapsulation... "this" in the context of the handler will refer to the request object itself... you will want to exte off of the request object, something like request.handler = this, when creating the request object, you can then refer back through request.handler.something etc...

    What I'm trying to do is pretty straightforward. I want to use the XMLHttpRequest mechanism within a user-defined class, to retrieve data. Obviously, I don't want to rely on a fscking GLOBAL variable to hold the request object, because it completely breaks the class.

    I'm going to have to give it some more thought.

    ---
    Playing: "Damn I wish I was your lover" by "Sophie B. Hawkins"
    from the "Tongues & tails" album

    ---
    þ Synchronet þ With my ISP it's the InterNOT at The ANJO BBS
  • From Angus McLeod@VERT/ANJO to Tracker1 on Wednesday, May 30, 2007 22:09:00
    Re: Re: Interesting!
    By: Tracker1 to Deuce on Wed May 30 2007 11:52:00

    I believe he's having trouble with the parent reference, in the referenced function "this" refers directly to the request object, not the containing object,

    In the handler, "this" refers to the handler function itself.

    you can work around this, by creating a back-reference to the
    containing object request.parent = this; for example... there's a lot
    of mentions of similar issues out there.

    In the context of the handler, "this.parent" is undefined. "request" is a global, and the whole point is to get away from having to use a global, because using a global means I can only safely instantiate the class ONCE
    if I am to avoid the various class instances clobbering the shared/global request object.

    ---
    Playing: "Damn I wish I was your lover" by "Sophie B. Hawkins"
    from the "Tongues & tails" album
    þ Synchronet þ With my ISP it's the InterNOT at The ANJO BBS
  • From Tracker1@VERT/TRN to Angus McLeod on Thursday, May 31, 2007 01:55:00
    Angus McLeod wrote:
    In the context of the handler, "this.parent" is undefined. "request" is a global, and the whole point is to get away from having to use a global, because using a global means I can only safely instantiate the class ONCE
    if I am to avoid the various class instances clobbering the shared/global request object.

    see live at.. http://www.theroughnecks.net/temp/

    The following sample works, note: I am including prototype.js before this script gets called... data.txt is a simple text file, with a short "done now" text in it... Event.observe, and Ajax.Request are both part of the prototype.js framework script... it's *REALLY* useful. http://prototypejs.org


    function TestObject() {
    //private variable(s)
    var _internalValue = Math.random();

    //private method(s)
    function _loadRemote_success(request) {
    alert("before: " + _internalValue);
    _internalValue = request.responseText;
    alert("after: " + _internalValue);
    }

    function _loadRemote_failure(request) {
    alert('failed ' + request);
    }

    function _loadRemote_exception(request, exception) {
    alert('exception ' + request + ' ' + exception.toString());
    }


    //public api
    return {
    loadRemote:function() {
    new Ajax.Request(
    "data.txt",
    {
    method: 'get',
    onSuccess:_loadRemote_success,
    onFailure:_loadRemote_failure,
    onException:_loadRemote_exception
    }
    );
    },
    getValue:function() {
    return _internalValue;
    }
    }
    }

    var test = new TestObject();

    Event.observe(
    window,
    'load',
    function() {
    alert("loading... " + test.getValue());
    test.loadRemote();
    window.setTimeout(
    function(){
    alert("should be done: " + test.getValue());
    },
    3000
    );
    },
    false
    );

    --
    Michael J. Ryan - tracker1(at)theroughnecks(dot)net - www.theroughnecks.net icq: 4935386 - AIM/AOL: azTracker1 - Y!: azTracker1 - MSN/Win: (email)

    ... Ferengi Rule of Acquisition #58: Friendship is seldom cheap

    ---
    þ Synchronet þ theroughnecks.net - you know you want it
  • From Angus McLeod@VERT/ANJO to Tracker1 on Thursday, May 31, 2007 08:30:00
    Re: Re: Interesting!
    By: Tracker1 to Angus McLeod on Thu May 31 2007 01:55:00

    see live at.. http://www.theroughnecks.net/temp/

    The following sample works, note: I am including prototype.js before this script gets called... data.txt is a simple text file, with a short "done no text in it... Event.observe, and Ajax.Request are both part of the prototype.js framework script... it's *REALLY* useful. http://prototypejs.or

    I had hoped there was a way to use the festure withOUT including 3,200
    lines of someone elses code. :-(

    ---
    Playing: "A time & a place" by "Emerson, Lake & Palmer"
    from the "Tarkus" album
    þ Synchronet þ With my ISP it's the InterNOT at The ANJO BBS
  • From Tracker1@VERT/TRN to Angus McLeod on Friday, June 01, 2007 00:03:00
    Angus McLeod wrote:
    see live at.. http://www.theroughnecks.net/temp/

    The following sample works, note: I am including prototype.js before this
    script gets called... data.txt is a simple text file, with a short "done no >> text in it... Event.observe, and Ajax.Request are both part of the
    prototype.js framework script... it's *REALLY* useful. http://prototypejs.or

    I had hoped there was a way to use the festure withOUT including 3,200
    lines of someone elses code. :-(

    you probably can, you just need to assign the XmlHttpRequest object to a variable created in the parent object's creation, and you can access it as a localized variable.. same as the _internalValue or whatever I called it.

    I just referenced prototype because there is a lot of value there. between $A().each(function() {}); and a few other niceties, it makes it well worth the inclusion...

    Also, it's 2600 lines, and you can get a "compressed" version of it (whitespace trimmed up). (gets down to 25k) with gzip compression from the server stream, it's about 13K of actual data transfer to the client, or a fraction of a second for most connections... beyond that, if you use this functionality as an include on multiple pages, it will be cached client side for most browsers.

    --
    Michael J. Ryan - tracker1(at)theroughnecks(dot)net - www.theroughnecks.net icq: 4935386 - AIM/AOL: azTracker1 - Y!: azTracker1 - MSN/Win: (email)

    ... Ferengi Rule of Acquisition #65: Don't talk ship; talk shipping

    ---
    þ Synchronet þ theroughnecks.net - you know you want it
  • From Angus McLeod@VERT/ANJO to Tracker1 on Friday, June 01, 2007 17:52:00
    Re: Re: Interesting!
    By: Tracker1 to Angus McLeod on Fri Jun 01 2007 00:03:00

    I just referenced prototype because there is a lot of value there. between $A().each(function() {}); and a few other niceties, it makes it well worth t inclusion...

    The JSON support is good. I just seem to be having trouble using the
    object properties and methods from inside the handler function.

    Say I do

    var zoo = new Menagerie();

    then later I do

    zoo.populate();

    This requests a list of animals in the menagerie. The onSuccess: handler
    will asynchronously process the list of animals returned from the server.
    For each animal, I want to call zoo.add_animal() maybe something like
    this:

    for (i=0; i<json.animals.length; i++) {
    this.add_animal( json.animals[i] );
    }

    now the add_animal() method might be doing something like:

    this.a_list[this.a_count++] = new Animal( animal_name );

    to create Animal objects and add them to a list of animals stored in the Menagerie object. But the handler doesn't seem to have any conception of
    what 'this' means. So it can't call this.add_animal() nor can it
    instantiate the Animal object directly and add it to this.a_list[] because
    it doesn't seem to understand 'this' at all.



    ---
    Playing: "Seconds" by "U2" from the "War" album

    ---
    þ Synchronet þ With my ISP it's the InterNOT at The ANJO BBS
  • From Tracker1@VERT/TRN to Angus McLeod on Friday, June 01, 2007 18:15:00
    Angus McLeod wrote:
    I just referenced prototype because there is a lot of value there. between >> $A().each(function() {}); and a few other niceties, it makes it well worth t >> inclusion...

    The JSON support is good. I just seem to be having trouble using the
    object properties and methods from inside the handler function.

    instantiate private variables, as in my example, then address them without "this"

    from inside the public api, or other methods, the private variables are available without "this." ... it does work... Not sure entirely why "this." has so many issues in xmlhttprequest (I've seen similar issues with other objects as well)... but the addressing works as long as the variable/function is declared.

    function Menagerie() {
    //private variable
    var a_list = new Array();

    //private method - add animal to localized array
    function add_animal(animal_name) {
    a_list[a_list.length] = animal_name;
    }

    //private callback function.
    function populate_callback(jsonResponse) {
    for (var i=0; i<jsonResponse.animals.length; i++)
    add_animal(jsonResponse.animals[i].name);
    }

    //public api
    return {
    function getList() {
    return a_list;
    },
    function populate() {
    //create XmlHttpRequest
    //use private callback ... ex: xr.callback = populate_callback
    }
    }
    }

    --
    Michael J. Ryan - tracker1(at)theroughnecks(dot)net - www.theroughnecks.net icq: 4935386 - AIM/AOL: azTracker1 - Y!: azTracker1 - MSN/Win: (email)

    ... Ferengi Rule of Acquisition #19: Don't lie too soon after a promotion

    ---
    þ Synchronet þ theroughnecks.net - you know you want it
  • From Angus McLeod@VERT/ANJO to Tracker1 on Saturday, June 02, 2007 00:31:00
    Re: Re: Interesting!
    By: Tracker1 to Angus McLeod on Fri Jun 01 2007 18:15:00

    The JSON support is good. I just seem to be having trouble using the object properties and methods from inside the handler function.

    instantiate private variables, as in my example, then address them
    without "this"

    I was declaring my methods external to the constructor like so:

    function Menagerie_get() { . . . }
    function Menagerie_put() { . . . }

    function Menagerie() {
    . . .
    // public methods
    this.get = Menagerie_get;
    this.put = Menagerie_put;
    }

    which is ugly, but that's the way the legacy code i am working with was originally written. I couldn't get them to access private variables
    without using "this". But the response handler function couldn't access private variables with 'this' either.

    Ok, it's working after an ugly fashion, and when I get a chance I'll move
    all the method seclarationss into the constructor and see if I can get it
    to be less ugly.

    ---
    Playing: "Lucy in the sky with diamonds" by "The Beatles"
    from the "1967-1970" album
    þ Synchronet þ With my ISP it's the InterNOT at The ANJO BBS
  • From Angus McLeod@VERT/ANJO to Tracker1 on Saturday, June 02, 2007 10:53:00
    Re: Re: Interesting!
    By: Tracker1 to Angus McLeod on Fri Jun 01 2007 18:15:00

    instantiate private variables, as in my example, then address them
    without "this"

    from inside the public api, or other methods, the private variables are available without "this."

    But apparently, the public *methods* are not available from inside the response handler. Let me expand your example code a bit:

    function Menagerie() {
    //private variable
    var a_list = new Array();

    //private method - add animal to localized array
    function add_animal(animal_name) {
    a_list[a_list.length] = animal_name;
    }

    //private callback function.
    function populate_callback(jsonResponse) {
    for (var i=0; i<jsonResponse.animals.length; i++)
    add_animal(jsonResponse.animals[i].name);
    }

    //public api
    return {
    getList:function() { return a_list; },

    say_hi:function() { alert( "Hi!" );}, // <------------- silly method

    populate:function() {
    say_hi(); // <-------------------------------------- works fine
    new Ajax.Request(
    '/json_animals.php', {
    method: 'get',
    onSuccess: function(request) {
    say_hi(); // <-------------------------------- silently fails

    var json = request.responseText.evalJSON();
    for (i=0; i<json.animals.length; i++) {
    add_animal( json.animals[i].name ); // <----- silently fails
    }
    }
    }
    );
    }
    }
    }

    Obviously, for any non-trivial object, you are almost certainly going to
    need to access the methods defined elsewhere in the object. Yes, you can replicate the code from the body of the methods you need like so:

    populate:function() {
    new Ajax.Request(
    '/json_animals.php', {
    method: 'get',
    onSuccess: function(request) {
    var json = request.responseText.evalJSON();
    for (i=0; i<json.animals.length; i++) {
    a_list[a_list.length] = json.animals[i].name; // <-- dup
    }
    }
    }
    );
    }

    but obviously, as the object and it's methods become complex, you are duplicating more and more code.





    ---
    Playing: "Bleeding me" by "Metallica" from the "Load" album
    þ Synchronet þ With my ISP it's the InterNOT at The ANJO BBS
  • From Tracker1@VERT/TRN to Angus McLeod on Saturday, June 02, 2007 14:02:00
    Angus McLeod wrote:
    The JSON support is good. I just seem to be having trouble using the
    object properties and methods from inside the handler function.

    instantiate private variables, as in my example, then address them
    without "this"

    I was declaring my methods external to the constructor like so:

    function Menagerie_get() { . . . }
    function Menagerie_put() { . . . }

    function Menagerie() {
    . . .
    // public methods
    this.get = Menagerie_get;
    this.put = Menagerie_put;
    }

    which is ugly, but that's the way the legacy code i am working with was originally written. I couldn't get them to access private variables
    without using "this". But the response handler function couldn't access private variables with 'this' either.

    That's because you're assigning them via "this" ... which attaches them to the object, instead of being a part of the object... Object Oriented JavaScript is kinda weird... if you declared the variables, and methods inside the function/class itself, you can return an object that is relative, and accessible as a public interface.

    could probably have done something like...

    function Menagerie() {
    . . .
    // public interface
    return {
    get:Menagerie_get /*method*/,
    put:Menagerie_put /*method*/
    };
    }

    not sure if that would give access to private variables via the methods directly though.

    Ok, it's working after an ugly fashion, and when I get a chance I'll move all the method seclarationss into the constructor and see if I can get it
    to be less ugly.

    Good call, just don't use "this."...

    function MyObject() {
    var _myPrivateVar;

    function _myPrivateFunction() {
    }

    // public interface, json-style literal object.
    return {

    setMyPrivateVar:function(newValue) {
    _myPrivateVar = newValue;
    },

    myPublicFunction:function() {
    if (_myPrivateVar)
    _myPrivateFunction();
    }

    }
    }

    this is both usable, and less ugly (except I don't like nested literal functions, but that's the easiest way to embed a method.. ;)

    --
    Michael J. Ryan - tracker1(at)theroughnecks(dot)net - www.theroughnecks.net icq: 4935386 - AIM/AOL: azTracker1 - Y!: azTracker1 - MSN/Win: (email)

    ... Ferengi Rule of Acquisition #225: Pride comes before a loss

    ---
    þ Synchronet þ theroughnecks.net - you know you want it
  • From Tracker1@VERT/TRN to Angus McLeod on Saturday, June 02, 2007 14:06:00
    Angus McLeod wrote:
    instantiate private variables, as in my example, then address them
    without "this"

    from inside the public api, or other methods, the private variables are
    available without "this."

    But apparently, the public *methods* are not available from inside the response handler. Let me expand your example code a bit:

    function Menagerie() {
    //private variable
    var a_list = new Array();

    //private method - add animal to localized array
    function add_animal(animal_name) {
    a_list[a_list.length] = animal_name;
    }

    //private callback function.
    function populate_callback(jsonResponse) {
    for (var i=0; i<jsonResponse.animals.length; i++)
    add_animal(jsonResponse.animals[i].name);
    }

    //public api
    return {
    getList:function() { return a_list; },

    say_hi:function() { alert( "Hi!" );}, // <------------- silly method

    populate:function() {
    say_hi(); // <-------------------------------------- works fine
    new Ajax.Request(
    '/json_animals.php', {
    method: 'get',
    onSuccess: function(request) {
    ...
    }

    instead of using a literal function, use a reference to the private method...
    onSuccess:populate_callback,

    This *should* work fine.. ;)

    }
    );
    }
    }
    }

    Obviously, for any non-trivial object, you are almost certainly going to need to access the methods defined elsewhere in the object. Yes, you can replicate the code from the body of the methods you need like so:

    populate:function() {
    new Ajax.Request(
    '/json_animals.php', {
    method: 'get',
    onSuccess: function(request) {
    var json = request.responseText.evalJSON();
    for (i=0; i<json.animals.length; i++) {
    a_list[a_list.length] = json.animals[i].name; // <-- dup
    }
    }
    }
    );
    }

    but obviously, as the object and it's methods become complex, you are duplicating more and more code.

    first, don't use a literal function, use a reference to the object's method defined privately.... second, if you want error checking, have a add_animal(name) do the checking internally in a separate method.

    --
    Michael J. Ryan - tracker1(at)theroughnecks(dot)net - www.theroughnecks.net icq: 4935386 - AIM/AOL: azTracker1 - Y!: azTracker1 - MSN/Win: (email)

    ... Ferengi Rule of Acquisition #76: Every once in a while, declare peace. It confuses the hell out of your enemies

    ---
    þ Synchronet þ theroughnecks.net - you know you want it
  • From Angus McLeod@VERT/ANJO to Tracker1 on Saturday, June 02, 2007 22:08:00
    Re: Re: Interesting!
    By: Tracker1 to Angus McLeod on Sat Jun 02 2007 14:06:00

    first, don't use a literal function, use a reference to the object's method defined privately.... second, if you want error checking, have a add_animal(name) do the checking internally in a separate method.

    Hmmm... I tried something close to that. I used a reference to a method thaty was defined as a part of the public API (*not* a private method) and
    it choked.

    Like many languages that had OOP added as an afterthought, JS's support
    for object is a little rough around the edges.

    On a slightly different note, I've been having some trouble generating
    good JSON data to return. If I insert a single \n in the output the
    response won't evaluate. I have to do this:

    var jsontext = request.responseText;
    jsontext.replace( "/\\n/g", ' ' );
    var json = jsontext.evalJSON();

    instead of

    var json = request.responseText.evalJSON();

    or simply using an X-JSON header and a second argument to the onSuccess: handler function. (The reason I put \n in at critical points is to ease
    with the debugging.)

    ---
    Playing: "Ghost" by "Live" from the "Secret samadhi" album
    þ Synchronet þ With my ISP it's the InterNOT at The ANJO BBS
  • From Tracker1@VERT/TRN to Angus McLeod on Sunday, June 03, 2007 03:06:00
    Angus McLeod wrote:
    first, don't use a literal function, use a reference to the object's method >> defined privately.... second, if you want error checking, have a
    add_animal(name) do the checking internally in a separate method.

    Hmmm... I tried something close to that. I used a reference to a method thaty was defined as a part of the public API (*not* a private method) and it choked.

    I don't think it works right on the public api that way... it sucks, I know.

    Like many languages that had OOP added as an afterthought, JS's support
    for object is a little rough around the edges.

    very much so.. it's kind of nice the structure doesn't create too much variance, but it's also kind of difficult to think in those terms... no class/public/private declaration syntax.. etc.

    On a slightly different note, I've been having some trouble generating
    good JSON data to return. If I insert a single \n in the output the response won't evaluate. I have to do this:

    I have no idea on this aspect.. I've only used the Ajax.Request a couple times for classic asp, or in php... in asp.net I use anthem for my communications.

    --
    Michael J. Ryan - tracker1(at)theroughnecks(dot)net - www.theroughnecks.net icq: 4935386 - AIM/AOL: azTracker1 - Y!: azTracker1 - MSN/Win: (email)

    ... Ferengi Rule of Acquisition #88: When the boss comes to dinner, it never hurts to have the wife wear something

    ---
    þ Synchronet þ theroughnecks.net - you know you want it
  • From Tracker1@VERT/TRN to Tracker1 on Sunday, June 03, 2007 14:22:00
    Tracker1 wrote:
    Like many languages that had OOP added as an afterthought, JS's
    support for object is a little rough around the edges.

    very much so.. it's kind of nice the structure doesn't create too much variance, but it's also kind of difficult to think in those terms... no class/public/private declaration syntax.. etc.

    Not that I normally reply to myself, but it's kind of cool, and worth noting that JS 2.x will have a more thought out OOP structure available... moz.org has been working with the adobe/flash guys from the evolving ecma spec to get a nicer system in place, afaik, flash will be using mozilla's 2.x implementation for their actionscript engine. Though will have to wait for khtml/safari and MS to catch up before it will be usable... I'd be happier with simple setters and getters in ie.

    --
    Michael J. Ryan - tracker1(at)theroughnecks(dot)net - www.theroughnecks.net icq: 4935386 - AIM/AOL: azTracker1 - Y!: azTracker1 - MSN/Win: (email)

    ... If Jack Bauer was in a room with Hitler, Stalin, and Nina Meyers, and he had a gun with 2 bullets, he'd shoot Nina twice.

    ---
    þ Synchronet þ theroughnecks.net - you know you want it