[Laszlo-checkins] r8108 - in openlaszlo/branches/devildog: . WEB-INF/lps/lfc/compiler WEB-INF/lps/lfc/core WEB-INF/lps/lfc/data WEB-INF/lps/lfc/helpers WEB-INF/lps/lfc/kernel/dhtml WEB-INF/lps/lfc/kernel/swf WEB-INF/lps/lfc/services WEB-INF/lps/lfc/views WEB-INF/lps/server/src/org/openlaszlo/compiler WEB-INF/lps/server/src/org/openlaszlo/css WEB-INF/lps/server/src/org/openlaszlo/data WEB-INF/lps/server/src/org/openlaszlo/sc WEB-INF/lps/server/src/org/openlaszlo/utils demos/youtube docs/component-browser docs/src/deployers docs/src/developers docs/src/developers/programs docs/src/developers/tutorials docs/src/developers/tutorials/programs laszlo-explorer lps/components/extensions lps/components/lzunit test/performance test/style/constraints

dda@openlaszlo.org dda at openlaszlo.org
Tue Feb 26 12:32:46 PST 2008


Author: dda
Date: 2008-02-26 12:32:17 -0800 (Tue, 26 Feb 2008)
New Revision: 8108

Added:
   openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/utils/DeploySOLODHTML.java
   openlaszlo/branches/devildog/test/performance/typeof-instance-of.lzx
Modified:
   openlaszlo/branches/devildog/
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/compiler/LzFormatter.lzs
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/core/LzDefs.lzs
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/core/LzNode.lzs
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/core/UserClass.lzs
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/data/LzDatapointer.lzs
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/data/LzHTTPDataProvider.lzs
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/data/LzReplicationManager.lzs
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/helpers/LzState.lzs
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/kernel/dhtml/LzKeyboardKernel.js
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/kernel/dhtml/LzTextSprite.js
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/kernel/swf/LzInputTextSprite.as
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/services/LzFocus.lzs
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/services/LzModeManager.lzs
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/views/LaszloCanvas.lzs
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/views/LaszloView.lzs
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/views/LzInputText.lzs
   openlaszlo/branches/devildog/WEB-INF/lps/lfc/views/LzText.lzs
   openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/compiler/NodeModel.java
   openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/css/CSSHandler.java
   openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/data/XMLGrabber.java
   openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/sc/Function.java
   openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/sc/ReferenceCollector.java
   openlaszlo/branches/devildog/demos/youtube/youtube.jsp
   openlaszlo/branches/devildog/demos/youtube/youtube.lzx
   openlaszlo/branches/devildog/docs/component-browser/common.lzx
   openlaszlo/branches/devildog/docs/component-browser/formview.lzx
   openlaszlo/branches/devildog/docs/component-browser/listview.lzx
   openlaszlo/branches/devildog/docs/component-browser/menuview.lzx
   openlaszlo/branches/devildog/docs/component-browser/scrollbarview.lzx
   openlaszlo/branches/devildog/docs/component-browser/tabsview.lzx
   openlaszlo/branches/devildog/docs/component-browser/treeview.lzx
   openlaszlo/branches/devildog/docs/component-browser/windowview.lzx
   openlaszlo/branches/devildog/docs/src/deployers/logging.dbk
   openlaszlo/branches/devildog/docs/src/developers/constraints.dbk
   openlaszlo/branches/devildog/docs/src/developers/index.dbk
   openlaszlo/branches/devildog/docs/src/developers/programs/constraints-$1.lzx
   openlaszlo/branches/devildog/docs/src/developers/tutorials/drawview-intro.dbk
   openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$10.lzx
   openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$3.lzx
   openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$4.lzx
   openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$5.lzx
   openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$6.lzx
   openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$7.lzx
   openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$9.lzx
   openlaszlo/branches/devildog/laszlo-explorer/explore-nav.lzx
   openlaszlo/branches/devildog/lps/components/extensions/drawview.lzx
   openlaszlo/branches/devildog/lps/components/lzunit/lzunit.lzx
   openlaszlo/branches/devildog/test/style/constraints/subclassing.lzx
Log:
Merged revisions 8011-8107 via svnmerge from 
http://svn.openlaszlo.org/openlaszlo/trunk

.......
  r8012 | bargull | 2008-02-13 10:30:09 -0500 (Wed, 13 Feb 2008) | 25 lines
  
  Change 20080212-bargull-0 by bargull at dell--p4--2-53 on 2008-02-12 22:59:08
      in /home/Admin/src/svn/openlaszlo/trunk
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: making a view modal
  
  New Features:
  
  Bugs Fixed: LPP-5426
  
  Technical Reviewer: promanik
  QA Reviewer: (pending)
  Doc Reviewer: (pending)
  
  Documentation:
  
  Release Notes:
  
  Details:
  Don't push a view onto the modal-stack more than once.
  
  
  Tests:
.......
  r8014 | hqm | 2008-02-13 11:38:32 -0500 (Wed, 13 Feb 2008) | 1 line
  
  fix race condition in jsp test script
.......
  r8016 | lou | 2008-02-13 15:12:17 -0500 (Wed, 13 Feb 2008) | 16 lines
  
  Change 20080213-lou-v by lou at loumac.local on 2008-02-13 16:06:20 AST
      in /Users/lou/src/svn/openlaszlo/trunk
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: reference: LzView: add definitions for onload, onloadperc, and onvisibile
  
  Bugs Fixed: LPP-5432
  
  Technical Reviewer: Max Carlson
  QA Reviewer: (pending)
  Doc Reviewer: (pending)
      
  
  Tests: verify visually
.......
  r8020 | bargull | 2008-02-13 19:40:55 -0500 (Wed, 13 Feb 2008) | 27 lines
  
  Change 20071116-bargull-2 by bargull at dell--p4--2-53 on 2007-11-16 00:27:11
      in /home/Admin/src/svn/openlaszlo/trunk
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: Add support for retrieving "nodeType" to LzDatapointer
  
  New Features:
  
  Bugs Fixed:
  LPP-5036 - Add getter-method for "nodeType" in LzDatapointer
  
  Technical Reviewer: hminsky
  QA Reviewer: jcrowley
  Doc Reviewer: (pending)
  
  Documentation:
  
  Release Notes:
  
  Details:
  Almost every LzDataNode field/method can be retrieved through a LzDatapointer-method (nodeName -> getNodeName, attrs -> getNodeAttribute, etc.). But you cannot ask for the node-type of the node the datapointer is pointing to through a LzDatapointer-method. That means you need to access the "p"-field of a LzDatapointer directly to get this info (dp.p.nodeType with dp instanceof LzDatapointer and dp.p instanceof LzDataNode). This quite inconsistent compared to the rest of the LzDatapointer-API and should be changed.
  This changeset enhances the LzDatapointer-API by introducing a new method to handle this issue (LzDatapointer#getNodeType()).
  
  
  Tests:
.......
  r8021 | max | 2008-02-13 20:33:32 -0500 (Wed, 13 Feb 2008) | 26 lines
  
  Change 20080213-maxcarlson-o by maxcarlson at Roboto on 2008-02-13 15:13:18 PST
      in /Users/maxcarlson/openlaszlo/trunk
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: Fix youtube video loading, for real this time!
  
  New Features:
  
  Bugs Fixed: LPP-5424 - YouTube demo is broken, clicking on picture does not load video
  
  Technical Reviewer: promanik
  QA Reviewer: mkratt
  Doc Reviewer: (pending)
  
  Documentation:
  
  Release Notes:
  
  Details: youtube.jsp - Parse out Location header from different URL - totally bulletproof now.
  
  youtube.lzx - Proxied loads are no longer supported/required!
      
  
  Tests: Any video will play in youtube.lzx now.
.......
  r8023 | max | 2008-02-13 21:11:33 -0500 (Wed, 13 Feb 2008) | 55 lines
  
  Change 20080213-maxcarlson-4 by maxcarlson at Roboto on 2008-02-13 17:34:25 PST
      in /Users/maxcarlson/openlaszlo/trunk
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: Avoid sending duplicate shift, ctrl, option events in inputtext
  
  New Features:
  
  Bugs Fixed: LPP-4267 - Onkeyup and onkeydown events fire twice in edittext and inputtext
  
  Technical Reviewer: promanik
  QA Reviewer: a.bargull at intensis.de
  Doc Reviewer: (pending)
  
  Documentation:
  
  Release Notes:
  
  Details: Avoid sending shift, ctrl and option keys by preventing the keyboard state from getting dirtied. 
      
  
  Tests: This runs consistently in swf and dhtml (FF osx and IE 6)
  <canvas height="300">
  <simplelayout/>
   <edittext id="ex" width="100">
   <handler name="onkeydown" args="kc">
   Debug.warn('keydown %w', kc);
   </handler>
   <handler name="onkeyup" args="kc">
   Debug.warn('keyup %w', kc);
   </handler>
   </edittext>
  
   <inputtext id="ix" width="100">
   <handler name="onkeydown" args="kc">
   Debug.warn('keydown %w', kc);
   </handler>
   <handler name="onkeyup" args="kc">
   Debug.warn('keyup %w', kc);
   </handler>
   </inputtext>
  
   <button>foo</button>
  
   <handler name="onkeydown" reference="LzKeys" args="kc">
   Debug.warn('global keydown %w', kc);
   </handler>
  
   <handler name="onkeyup" reference="LzKeys" args="kc">
   Debug.warn('global keyup %w', kc);
   </handler>
   </canvas>
.......
  r8032 | ptw | 2008-02-14 17:57:01 -0500 (Thu, 14 Feb 2008) | 65 lines
  
  Change 20080208-ptw-T by ptw at dueling-banjos.local on 2008-02-08 08:18:39 EST
      in /Users/ptw/OpenLaszlo/ringding
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: Unify argument initialization
  
  Bugs Fixed:
  LPP-1587 'ECMA4: Compile LZX declarations as JS declarations' (partial)
  LPP-631 'can't override a constraint with a literal with state attributes'
  
  Technical Reviewer: a.bargull at intensis.de (Message-ID: <47B4B8C7.2020809 at intensis.de>)
  QA Reviewer: henry.minsky at gmail.com (pending)
  
  Details:
  
      Initial values, initial expressions ($once, $path, but not $style,
      yet), and constraints ($always), now are created as a unified list
      in the tag compiler solving several issues with
      overriding/inheritance of attribute values and constraints and
      enabling the solution to an issue with states and constraints.
  
      TextStprite: Update test for constraint on width or height.
  
      LzNode, UserClass: Simplify attribute inheritance/override computation,
      maintain backward-compatible magic-merge of attribute values (for
      now).
  
      LzNode: Update documentation of `construct` to note that
      constraints are now unified in `args`.  __LZapplyArgs uses new
      args organization to sort out initialization expressions and
      constraints.  __LZresolveReferences uses the new information to
      run initialization expressions and install constraints.
      __LZresolveRefs no longer needed.  applyConstraint deprecated, but
      backward-compatible.  New interface: applyConstraintMethod.
      Private releaseConstraint did not work, removed.  New interface:
      releaseConstraintMethod.
  
      LzDefs: Turn LzDeclaredEvent into a singleton class.  Add private
      support classes LzInitExpr and LzConstraintExpr.
  
      LaszloView:  Update test for constraints.  Fix setAlign and
      setValign to work with constraint methods, and to correctly work
      if alignment is changed (to release previous constraint).
  
      LaszloCanvas:  Update __LZcallInit to parallel LzNode more
      closely.
  
      LzState:  Update capturing of held args and constraints.  Use this
      new organization to release constraints the state will override
      (and re-apply them when the state is removed).  Remmove unused
      __LZstoreRefs.
  
      LzReplicationManager:  Fix xpath constraint to work with constraint
      methods.
  
      Function.java:  Make Function#name public.
  
      NodeModel.java:  Coalesce $once, $path, $always into single
      arglist, distinguishing 'binders' by internal type, either
      LzInitExpr or LzConstraintExpr.
  
  Tests:
      smokecheck, amazon, most-components
.......
  r8034 | pbr | 2008-02-14 22:24:39 -0500 (Thu, 14 Feb 2008) | 33 lines
  
  Change 20080214-Philip-4 by Philip at Philip-DC on 2008-02-14 08:54:44 EST
       in /cygdrive/f/laszlo/svn/src/svn/openlaszlo/trunk
       for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: Access text cache as LzTextSprite.prototype._sizecache
  
  New Features:
  
  Bugs Fixed: LPP-5390
  
  Technical Reviewer: max
  QA Reviewer: (pending)
  Doc Reviewer: (pending)
  
  Documentation:
  
  Release Notes:
  
  Details:
  The code used to access the global cache through 'this'. However, once the cache
    is full and is cleared, access through 'this' it not reliable. I changed this._ sizecache to LzTextSprite.prototype._sizecache. Although I only need to do this for the line that actually resets the cache, I changed all references to make it
    clear this is a global.
  
  
  Tests:
  See test in LPP-5390. This is slow to run since you need to wait until the _size cache.counter reaches 1000. During testing I set the cache size to 100 (ie. LzTe xtSprite.prototype.__sizecacheupperbound = 100) to verify the bug and the fix.
  
  Files:
  M      WEB-INF/lps/lfc/kernel/dhtml/LzTextSprite.js
  
  Changeset: http://svn.openlaszlo.org/openlaszlo/patches/20080214-Philip-4.tar
.......
  r8037 | max | 2008-02-14 23:53:11 -0500 (Thu, 14 Feb 2008) | 24 lines
  
  Change 20080214-maxcarlson-9 by maxcarlson at Roboto on 2008-02-14 19:57:57 PST
      in /Users/maxcarlson/openlaszlo/trunk
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: Fix errors on page reloads in IE DHTML
  
  New Features:
  
  Bugs Fixed: LPP-5347 - Using IE, browser reports 'no such interface' javascript error when closing or refreshing the window
  
  Technical Reviewer: promanik
  QA Reviewer: a.bargull at intensis.de
  Doc Reviewer: (pending)
  
  Documentation:
  
  Release Notes:
  
  Details: Check div.nodeType in discardElement()
      
  
  Tests: See LPP-5347
.......
  r8038 | max | 2008-02-15 03:09:54 -0500 (Fri, 15 Feb 2008) | 29 lines
  
  Change 20080214-maxcarlson-B by maxcarlson at Roboto on 2008-02-14 19:19:09 PST
      in /Users/maxcarlson/openlaszlo/trunk
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: Fix states and constrained text in DHTML, fix drawview 
  
  New Features:
  
  Bugs Fixed: LPP-1587 'ECMA4: Compile LZX declarations as JS declarations' (partial)
  
  Technical Reviewer: promanik
  QA Reviewer: ptw
  Doc Reviewer: (pending)
  
  Documentation:
  
  Release Notes:
  
  Details: LzTextSprite.js - Don't store args.text from construct.
  
  LzText.lzs - Default to '' in construct() when args.text instanceof LzConstraintExpr || args.text instanceof LzInitExpr
  
  LzState.lzs - More safety checking when unpacking args.
  
  drawview.lzx - Don't use args.height/width/clip to init drawview.
  
  Tests: drawview works again, no warnings under IE when reloading pages.  Constrained text works again.
.......
  r8042 | pbr | 2008-02-15 09:10:03 -0500 (Fri, 15 Feb 2008) | 41 lines
  
  Change 20080214-Philip-2 by Philip at Philip-DC on 2008-02-14 22:11:53 EST
       in /cygdrive/f/laszlo/svn/src/svn/openlaszlo/trunk
       for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: Fix component links in the component hierarchy
  
  New Features:
  
  Bugs Fixed: LPP-4555
  
  Technical Reviewer: (pending)
  QA Reviewer: (pending)
  Doc Reviewer: lou
  
  Documentation:
  
  Release Notes:
  
  Details:
  Josh fixed LPP-4555. Turns out there are other pages when you click 'See Related Components' on the component hierarchy page. This change fixes those pages to point to the "new" locations of the reference pages.
  
  Tests:
  Visual inspection. The reference guide doesn't build cleanly on Windows. Also, I found a problem with IE6 rendering so the pages need to be tested in that browser. Let me know if you find any pages that aren't correct. I followed the format that the reference page is named lz.<page>.html. For example, the page for base component is called lz.basecomponent.html.
  
  (For IE6 you only need to check one page. The old javascript code to popup a window generated an error on IE6.)
  
  Once this is fixed in trunk we can merge it to the branches.
  
  Files:
  M      docs/component-browser/tabsview.lzx
  M      docs/component-browser/listview.lzx
  M      docs/component-browser/common.lzx
  M      docs/component-browser/treeview.lzx
  M      docs/component-browser/formview.lzx
  M      docs/component-browser/scrollbarview.lzx
  M      docs/component-browser/menuview.lzx
  M      docs/component-browser/windowview.lzx
  
  Changeset: http://svn.openlaszlo.org/openlaszlo/patches/20080214-Philip-2.tar
.......
  r8051 | lou | 2008-02-16 08:45:34 -0500 (Sat, 16 Feb 2008) | 20 lines
  
  Change 20080216-lou-y by lou at loumac.local on 2008-02-16 09:40:34 AST
      in /Users/lou/src/svn/openlaszlo/trunk
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: fix broken links to tomcat doc in the logging chapter of the admin guide
  
  New Features:
  
  Bugs Fixed: LPP-5224
  
  Technical Reviewer: (pending)
  QA Reviewer: (pending)
  Doc Reviewer: (pending)
  
  Details: The 5.0.x documentation no longer exists, so just link
  to the tomcat home page.
      
  Tests: test link
.......
  r8053 | lou | 2008-02-16 10:20:13 -0500 (Sat, 16 Feb 2008) | 20 lines
  
  Change 20080216-lou-B by lou at loumac.local on 2008-02-16 11:04:00 AST
      in /Users/lou/src/svn/openlaszlo/trunk
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: document that size needs to be set for drawview in the intro to drawing
  chapter of the dguide: http://localhost:8080/trunk/docs/developers/tutorials/drawview-intro.html
  
  Bugs Fixed: LPP-5433
  
  Technical Reviewer: (max)
  QA Reviewer: (pending)
  Doc Reviewer: (pending)
  
  
  Details: Add note about size, fix all examples to have size
      
  
  Tests: visual verify
.......
  r8054 | max | 2008-02-16 18:11:03 -0500 (Sat, 16 Feb 2008) | 26 lines
  
  Change 20080215-maxcarlson-I by maxcarlson at Roboto on 2008-02-15 17:43:23 PST
      in /Users/maxcarlson/openlaszlo/trunk
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: Fix IE memory leaks
  
  New Features:
  
  Bugs Fixed: LPP-5429 - IE-leak prevention leaks memory, LPP-5431 - Memory Leak using new and destory with <class> instances, LPP-5176 - When using IE 7: Repeated calls to <text>'s setText() will eventually throw javascript errors
  
  Technical Reviewer: promanik
  QA Reviewer: a.bargull at intensis.de
  Doc Reviewer: (pending)
  
  Documentation:
  
  Release Notes:
  
  Details: LzSprite.js - Delete entries from __sprites cache on destroy().
  
  LzTextSprite.js - Clean up _sizedomcache when the rest of the text size cache is cleared.
      
  
  Tests: Tested case from LPP-5431 and LPP-5176.tar under IE 6 windows.  No errors after 1000 instances, or after a page load and memory usage appears flat for both!
.......
  r8062 | hqm | 2008-02-19 15:40:46 -0500 (Tue, 19 Feb 2008) | 37 lines
  
  Change 20080219-hqm-D by hqm at badtzmaru on 2008-02-19 15:39:03 EST
      in /Users/hqm/openlaszlo/trunk/WEB-INF/lps/server/src
      for http://svn.openlaszlo.org/openlaszlo/trunk/WEB-INF/lps/server/src
  
  
  Summary: make sure LPS server data proxy will close http connection if
  errors occur
  
  New Features:
  
  Bugs Fixed: LPP-5440
  
  Technical Reviewer: max
  QA Reviewer: pkang
  Doc Reviewer: (pending)
  
  Documentation:
  
  Release Notes:
  
  Details:
  
  If an ill-formed or empty document causes an error in the XML proxy
  server, it can
  leave the HTTP connection open, causing hangs on the client.
  
  
  This forces the stream to close on any error.
  
  I don't know how to easily throw an error asynchronously to the parent
  thread in Java, so we are just closing the connection for now.
  
  Tests:
  
  see bug report for test case
.......
  r8066 | lou | 2008-02-19 16:21:43 -0500 (Tue, 19 Feb 2008) | 15 lines
  
  Change 20080219-lou-2 by lou at loumac.local on 2008-02-19 17:16:38 AST
      in /Users/lou/src/svn/openlaszlo/trunk
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: add more information about size
  
  Bugs Fixed: LPP-5448 (subtask of LPP-5433)
  
  Technical Reviewer: (pending)
  QA Reviewer: (pending)
  Doc Reviewer: (pending)
  
  Tests: visual verify
.......
  r8073 | lou | 2008-02-20 10:31:00 -0500 (Wed, 20 Feb 2008) | 18 lines
  
  Change 20080220-lou-O by lou at loumac.local on 2008-02-20 11:25:53 AST
      in /Users/lou/src/svn/openlaszlo/trunk
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: remove Documenting your code chapter from the dguide
  
  Bugs Fixed: LPP-5453
  
  Technical Reviewer: (pending)
  QA Reviewer: (pending)
  Doc Reviewer: (pending)
  
  Details: this chapter contains an outline only. Comment out the code that
  includes it.  
  
  Tests: visual verify
.......
  r8078 | ptw | 2008-02-20 17:25:25 -0500 (Wed, 20 Feb 2008) | 19 lines
  
  Change 20080220-ptw-N by ptw at dueling-banjos.local on 2008-02-20 15:14:43 EST
      in /Users/ptw/OpenLaszlo/ringding
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: Correct syntax errors in navbar
  
  Bugs Fixed:
  LPP-5454 'The nav bar loads, but has no text'
  
  Technical Reviewer: max (message://<47BCA66E.8050008@openlaszlo.org>)
  QA Reviewer: mamye (pending)
  
  Details:
      The attribute `name` of a class is final so can't be databound.
  
  Tests:
      laszlo-explorer/explore-nav.lzx has content now
.......
  r8082 | max | 2008-02-20 19:07:58 -0500 (Wed, 20 Feb 2008) | 1 line
  
  + Add new perf test
.......
  r8083 | max | 2008-02-20 19:22:43 -0500 (Wed, 20 Feb 2008) | 1 line
  
  + Updated perf test
.......
  r8084 | hqm | 2008-02-21 00:17:12 -0500 (Thu, 21 Feb 2008) | 64 lines
  
  Change 20080221-hqm-C by hqm at badtzmaru on 2008-02-21 00:13:47 EST
      in /Users/hqm/openlaszlo/trunk
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: add DHTML SOLO deployer class
  
  New Features:
  
  Adds Java-callable class which deploys a SOLO DHTML app
  
  Bugs Fixed:
  
  Technical Reviewer: max
  QA Reviewer: phillipe
  Doc Reviewer: (pending)
  
  Documentation:
  
  Release Notes:
  
  A new API class, org.openlaszlo.utils.DeploySOLODHTML, will produce a SOLO DHTML deploy archive zipfile for
  an app. It is basically a port of the .jsp deploy wizard script, rewritten so it does not depend on an LPS
  web server being available.
  
  
  Details:
      
  
  Tests:
  
  The testsolo script below invokes a test main() method in the class to produce a /tmp/solo.zip file from
  a test app at test/deploy/hello.lzx
  
  #! /bin/bash -f
  #
  #  lzc -  Bash script to run laszlo compiler.
  #
  # * P_LZ_COPYRIGHT_BEGIN ******************************************************
  # * Copyright 2001-2005, 2007, 2008 Laszlo Systems, Inc.  All Rights Reserved.      *
  # * Use is subject to license terms.                                          *
  # * P_LZ_COPYRIGHT_END ********************************************************
  
  myhome=`dirname "$0"`
  if [ -e "$myhome/../Server" ]; then
    case "$myhome" in
      /*) ;;
      *) myhome=`pwd`/"$myhome" ;;
    esac
    LPS_HOME=`find "$myhome/../Server" -name lps'*' -maxdepth 1`
  fi
  
  if [ "${OS}" == Windows_NT ];  then
    export LPS_HOME=`cygpath -w $LPS_HOME`
      . ${LPS_HOME}\\WEB-INF\\lps\\server\\bin\\lzenv
  else
    export LPS_HOME
    . "${LPS_HOME}/WEB-INF/lps/server/bin/lzenv"
  fi
  
  "${JAVA_HOME}/bin/java" ${JAVA_OPTS} -DLPS_HOME="${LPS_HOME}" -cp "$LZCP" org.openlaszlo.utils.DeploySOLODHTML "$@"
.......
  r8085 | hqm | 2008-02-21 00:19:17 -0500 (Thu, 21 Feb 2008) | 36 lines
  
  Change 20080221-hqm-N by hqm at badtzmaru on 2008-02-21 00:18:41 EST
      in /Users/hqm/openlaszlo/trunk
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: fix for false error condition in SOLO data loading
  
  New Features:
  
  Bugs Fixed: LPP-4602
  
  Technical Reviewer: andre
  QA Reviewer: max
  Doc Reviewer: (pending)
  
  Documentation:
  
  Release Notes:
  
  Details:
  
  Data which is loaded via the LPS proxy service comes wrapped with some
  meta-data
  including an <error> element  which indicates an error condition.
  
  In SOLO data loading, we should no be scanning for this tag, the SOLO
  data loading protocol is to interpret all XML content as user data.
  There is
  no protocol for signalling a SOLO data load error using data in the
  XML content.
  
  
  Tests:
  
  See test case in bug report LPP-4602
.......
  r8088 | hqm | 2008-02-21 14:44:41 -0500 (Thu, 21 Feb 2008) | 29 lines
  
  Change 20080221-hqm-R by hqm at badtzmaru on 2008-02-21 14:43:34 EST
      in /Users/hqm/openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/utils
      for http://svn.openlaszlo.org/openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/utils
  
  Summary: update of DHTML SOLO deployer API class
  
  New Features:
  
  Bugs Fixed:
  
  Technical Reviewer: nexb
  QA Reviewer: (pending)
  Doc Reviewer: (pending)
  
  Documentation:
  
  Release Notes:
  
  Details:
  
  deploy method may be called with new wrapperonly flag, if true, just writes html wrapper to
  output stream
      
  optional Canvas may be supplied
  
  
  Tests:
.......
  r8089 | bargull | 2008-02-21 17:26:37 -0500 (Thu, 21 Feb 2008) | 24 lines
  
  Change 20080215-bargull-4 by bargull at dell--p4--2-53 on 2008-02-15 13:48:49
      in /home/Admin/src/svn/openlaszlo/trunk
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: unregister delegates in inputtext
  
  New Features:
  
  Bugs Fixed: LPP-5438 - "inputtext leaks memory"
  
  Technical Reviewer: ptw
  QA Reviewer: (pending)
  Doc Reviewer: (pending)
  
  Documentation:
  
  Release Notes:
  
  Details:
  Added destroy-method to unregister delegates in LzInputText.
  
  Tests:
.......
  r8090 | ptw | 2008-02-22 14:02:04 -0500 (Fri, 22 Feb 2008) | 52 lines
  
  Change 20080220-ptw-t by ptw at dueling-banjos.local on 2008-02-20 19:36:51 EST
      in /Users/ptw/OpenLaszlo/ringding
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: Handle $style constraints in the unified argument processor
  
  Bugs Fixed:
  LPP-1187 'overriding a literal with a constraint results in wrong value being assigned before constraint is resolved'
  LPP-1587 'ECMA4: Compile LZX declarations as JS declarations' (partial)
  LPP-4451 '$style cannot override other constraints'
  LPP-5444 'Now we've got Super-Constraints!'
  
  
  Technical Reviewer: max (pending)
  QA Reviewer: mamye (pending)
  
  Details:
      subclassing.lzx:  Uncomment test for lpp-4451, add inverse test,
      annotate some assertions for easier debugging.
  
      LzFocus: Fix a type inconsistency that was triggering a warning in
      smokecheck.
  
      LzNode: Delete old $style implementation, add styleBinder, add some
      debug checks, permit constraints with no dependencies.
  
      LzDefs: Add style init expressions and style attribute binders.
  
      LzText: Teeny optimization.
  
      LzState: Simplify cloning.  Back out restoration of constraints
      added in r8032 because it breaks dragstate and resizestate.
  
      LzFormatter: Fix pad to enforce max decimals bug revealed by
      Firefox precision improvements in smokecheck.
  
      CSSHandler: Use style expressions instead of closures.
  
      ReferenceCollector: Correct comment
  
      NodeModel: Move style processing into unified attribute list, add
      some asserts.
  
      lzunit.lzx: fail now will supply file/line for failed assertions
      if backtracing is on.
  
  Tests:
      test/style/constraints/subclassing.lzx
      Test cases from LPP-1187, 4451
      smokecheck, Amazon
.......
  r8092 | max | 2008-02-22 16:03:41 -0500 (Fri, 22 Feb 2008) | 1 line
  
  + Add test for failed instanceof
.......
  r8095 | lou | 2008-02-23 12:25:17 -0500 (Sat, 23 Feb 2008) | 17 lines
  
  Change 20080223-lou-s by lou at loumac.local on 2008-02-23 13:17:10 AST
      in /Users/lou/src/svn/openlaszlo/trunk
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: Constraints chapter of the dguide: replace references to applyContsraint (deprecated) with applyConstraintMethod.
  
  New Features:
  
  Bugs Fixed: LPP-5460
  
  Technical Reviewer: (ptw)
  QA Reviewer: (pending)
  Doc Reviewer: (pending)
  
  Tests: visual verify
.......
  r8096 | ptw | 2008-02-23 16:27:26 -0500 (Sat, 23 Feb 2008) | 15 lines
  
  Change 20080223-ptw-N by ptw at dueling-banjos.local on 2008-02-23 16:21:10 EST
      in /Users/ptw/OpenLaszlo/ringding
      for http://svn.openlaszlo.org/openlaszlo/trunk
  
  Summary: Fix type-oh spotted by Andre in r8090
  
  Bugs Fixed:
  [java] Warning: Assignment to free variable styleValue in core/LzNode.lzs (513)
  
  Technical Reviewer: a.bargull at intensis.de (pending)
  
  Tests:
      Inspection
.......
  r8100 | hqm | 2008-02-25 15:17:25 -0500 (Mon, 25 Feb 2008) | 54 lines
  
  Change 20080225-hqm-q by hqm at badtzmaru.local on 2008-02-25 12:53:53 EST
      in /Users/hqm/openlaszlo/trunk/WEB-INF/lps/lfc
      for http://svn.openlaszlo.org/openlaszlo/trunk/WEB-INF/lps/lfc
  
  Summary: add data to SWF SOLO POST requests, to ensure that Flash does not turn them into GET requests
  
  New Features:
  
  Bugs Fixed: LPP-5368
  
  Technical Reviewer: andre
  QA Reviewer: max
  Doc Reviewer: (pending)
  
  Documentation:
  
  Release Notes:
  
  Details:
      
  SWF has a bug whereby an empty POST request (one with no data in it's post body) is turned into a
   GET request. This behavior used to be masked by the way we forced all query args into the POST
  body for post requests.
  
  When a change was made to  separate  and preserve the query string from the post body, people
  started reporting bugs where their POST requests became GET requests.
  
  This patch forces the "__lzbc__" cache-breaking timestamp arg into the body of SOLO post requests.
  
  I am wondering if I should also force this value into Proxied requests, to ensure that
  the data which is sent to the back-end is consistent between SOLO and proxied requests. This
  patch only forces the __lzbc__ arg into SOLO POST  requests.
  
  
  Tests:
  
  test.lzx:
  <canvas debug="true" height="400" >
      <dataset name="dsGroups" request="true" type="http" src="test.jsp" querytype="POST"/>
      <datapointer name="dpGroups" xpath="dsGroups:/Response">
          <handler name="ondata" args="d"><![CDATA[
              Debug.write(d);
          ]]></handler>
      </datapointer>
  </canvas>
  
  test.jsp:
  <%System.out.println(request.getMethod());%>
  <Response>
  	<Method><%=request.getMethod()%></Method>
  </Response>
.......



Property changes on: openlaszlo/branches/devildog
___________________________________________________________________
Name: svnmerge-integrated
   - /openlaszlo/branches/wafflecone:1-5746,5818-6068,6070-6205,6207-6213,6216-6265,6267-6368,6370-6431,6433-6450,6497 /openlaszlo/trunk:1-8010
   + /openlaszlo/branches/wafflecone:1-5746,5818-6068,6070-6205,6207-6213,6216-6265,6267-6368,6370-6431,6433-6450,6497 /openlaszlo/trunk:1-8107

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/compiler/LzFormatter.lzs
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/compiler/LzFormatter.lzs	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/compiler/LzFormatter.lzs	2008-02-26 20:32:17 UTC (rev 8108)
@@ -117,7 +117,11 @@
         } else {
           var decimals = strlen - (decimal + 1);
         }
-        for (var i = decimals; i < decMax; i++) value += '0';
+        if (decimals > decMax) {
+          value = value.substring(0, strlen - (decimals - decMax));
+        } else {
+          for (var i = decimals; i < decMax; i++) value += '0';
+        }
       } else {
         value = value.substring(0, decMax);
       }

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/core/LzDefs.lzs
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/core/LzDefs.lzs	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/core/LzDefs.lzs	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,7 +1,7 @@
 /**
   * LzDefs.lzs
   *
-  * @copyright Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.
+  * @copyright Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.
   *            Use is subject to license terms.
   * @todo 2006-04-07 hqm This machinery could be removed if all
   * callers to sendEvent can be guaranteed to check if the event slot
@@ -10,41 +10,131 @@
   * @subtopic Runtime
   */
 
-/** no op
+/** Sentinel value for events
   * @access private
   */
-var LzDeclaredEvent = {};
+class LzDeclaredEventClass /* implements LzEvent */ {
+  /**
+   * @access private
+   */
+  /* const */ var ready = false;
+
+  /**
+   * @access private
+   */
+  function sendEvent() {};
+
+  /**
+   * @access private
+   */
+  function clearDelegates() {};
+
+  /**
+   * @access private
+   */
+  function removeDelegate() {};
+
+  /**
+   * @access private
+   */
+  function getDelegateCount () {return 0};
+
+  /**
+   * @access private
+   */
+  function toString() {
+    return "LzDeclaredEvent";
+  }
+}
+
+  var LzDeclaredEvent = new LzDeclaredEventClass;
+
 /**
-  * @access private
-  */
-LzDeclaredEvent.sendEvent = function ( ){ };
+ * Private class used to distinguish an init expression from an
+ * initial value in node attributes.  All forms of 'constraints' are a
+ * subclass of this class
+ * @access private
+ */
+class LzInitExpr {
+}
 
 /**
-  * @access private
-  */
-LzDeclaredEvent.clearDelegates = function ( ){ };
+ * Private class used to define a 'once' or 'path' constraint
+ * @access private
+ */
+class LzOnceExpr extends LzInitExpr {
+  var methodName:String;
+  function LzOnceExpr(initMethod:String) {
+    this.methodName = initMethod;
+  }
+}
 
 /**
-  * @access private
-  */
-LzDeclaredEvent.removeDelegate = function ( ){ };
+ * Private class used to define an 'always' constraint
+ * @access private
+ */
+class LzConstraintExpr extends LzOnceExpr {
+  function LzConstraintExpr(constraintMethod:String) {
+    super(constraintMethod);
+  }
+}
 
 /**
-  * @access private
-  */
-LzDeclaredEvent.getDelegateCount = function ( ){return 0};
+ * Private class used to define a constraint in a style value
+ * @access private
+ */
+class LzStyleExpr extends LzInitExpr {
+  var sourceAttributeName:String;
+  function LzStyleExpr(sourceAttributeName:String) {
+    this.sourceAttributeName = sourceAttributeName;
+  }
+}
 
 /**
-  * @access private
-  */
-LzDeclaredEvent.toString = function ( ){
-    return "LzDeclaredEvent";
+ * Private class used to define an 'attr()' constraint
+ * @access private
+ */
+class LzStyleAttr extends LzStyleExpr {
+  function LzStyleAttr(sourceAttributeName:String) {
+    super(sourceAttributeName);
+  }
+};
+
+/**
+ * Private class used to create the binder for `LzStyleAttr` bindings.
+ *
+ * @param lz.node target: The target node
+ * @param String dest: The destination attribute
+ * @param String source: The source attribute
+ *
+ *@access private
+ */
+class LzStyleAttrBinder {
+  var target:LzNode;
+  var dest:String;
+  var source:String;
+
+  function LzStyleAttrBinder (target:LzNode, dest:String, source:String) {
+    this.target = target;
+    this.dest = dest;
+    this.source = source;
+  }
+
+  function bind() {
+    var target = this.target;
+    target.setAttribute(this.dest, target[this.source]);
+  }
 }
 
 /**
-  * @access private
-  */
-LzDeclaredEvent.ready = false;
+ * Private class used to define an identifier constraint
+ * @access private
+ */
+class LzStyleIdent extends LzStyleExpr {
+  function LzStyleIdent(sourceAttributeName:String) {
+    super(sourceAttributeName);
+  }
+}
 
 /**
   * Used to efficiently clone hashtables using Object's

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/core/LzNode.lzs
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/core/LzNode.lzs	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/core/LzNode.lzs	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,3 +1,4 @@
+/* -*- mode: JavaScript; c-basic-offset: 4; -*- */
 /**
   * LzNode.lzs
   *
@@ -81,56 +82,41 @@
           // Otherwise we create a new hash that inherits the defaults
           iargs = new LzInheritedHash(this.defaultattrs);
           // And merge in our attrs (if any).  Taking care to merge
-          // Array and Object attrs correctly, and noting constraints
-          // that have been overridden so we can clean up $refs when
-          // done.
+          // Array and Object attrs (for back-compatibility).  No
+          // special magic is needed to compute attributes overriding
+          // constraints, because they all come as attrs now and
+          // overriding will be automatic from the InheritedHash
+          // (except for the bizarre merging of arrays and hashes!)
           if (attrs) {
             var dattrs = this.defaultattrs;
-            var dattr$refs = '$refs' in dattrs && dattrs.$refs;
-            var cleanup = null;
-            for ( var k in attrs ){
-              var attrk = attrs[ k ];
-              // Check for literal overriding a constraint
-              if ( dattr$refs && dattr$refs[ k ] ){
-                if (! cleanup) { cleanup = {} };
-                cleanup[k] = true;
-              }
-              // Check for object and array merges
-              if ( attrk instanceof Object ) {
-                var dattrk = dattrs[ k ];
-                if ( dattrk instanceof Object ) {
-                  if ( attrk instanceof Array ) {
-//                     Debug.debug("%w: LzNode.initialize: merging Array %s", this, k);
-                    iargs[ k ] = attrk.concat( dattrk );
-                    continue;
-                  } else if (typeof attrk == 'object') {
-//                     Debug.debug("%w: LzNode.initialize: merging Object %s", this, k);
-                    var tmp = new LzInheritedHash(dattrk);
-                    for (var j in attrk) {
-                      tmp[j] = attrk[j];
+            // Check for object and array merges
+            // NOTE: [2008-01-22 ptw] This is just whacky, but it is
+            // required for back-compatibility.  IWBNI this were
+            // handled at compile-time
+            for ( var k in attrs ) {
+                var attrk = attrs[ k ];
+                if ( attrk instanceof Object && (! (attrk instanceof LzInitExpr))) {
+                    var dattrk = dattrs[ k ];
+                    if ( dattrk instanceof Object && (! (dattrk instanceof LzInitExpr))) {
+                        if ( attrk instanceof Array ) {
+//                             Debug.debug("%w.%s: merging %s (%w)", this, arguments.callee, k, attrk);
+                            iargs[ k ] = attrk.concat( dattrk );
+                            continue;
+                        } else if (typeof attrk == 'object') {
+//                             Debug.debug("%w.%s: merging %s (%w)", this, arguments.callee, k, attrk);
+                            var tmp = new LzInheritedHash(dattrk);
+                            for (var j in attrk) {
+                                tmp[j] = attrk[j];
+                            }
+                            iargs[ k ] = tmp;
+                            continue;
+                        }
                     }
-                    iargs[ k ] = tmp;
-                    continue;
-                  }
                 }
-              }
-              // Just a normal value, install it
-              iargs[ k ] = attrk;
+//                 Debug.debug("%w.%s: NOT merging %s (%w)", this, arguments.callee, k, attrk);
+                // Just a normal value (or LzInitExpr), install it
+                iargs[ k ] = attrk;
             }
-            // Finish literal over constraint processing
-            if (cleanup) {
-              // We are going to shadow some defaults, so create a
-              // clean hash to do that in if we don't already have
-              // one.
-              if (! iargs.hasOwnProperty('$refs')) {
-                //we know the defaultattrs has $refs, so attach it
-                iargs.$refs = new LzInheritedHash(dattr$refs);
-              }
-              var ia = LzNode._ignoreAttribute;
-              for (var k in cleanup) {
-                iargs.$refs[ k ] = ia;
-              }
-            }
           }
         }
 
@@ -170,6 +156,10 @@
 
         this.construct(  parent , maskedargs );
 
+        // Construct may, through many tangled webs of replication and
+        // placement, actually end up deleting us!  Bail out.
+        if (this.__LZdeleted) { return; }
+
         //        this.setClassEvents( this.constructor );
 
         this.__LZapplyArgs( maskedargs , true );
@@ -177,11 +167,6 @@
         // If a replicator was made, we're deleted, if pooling is off.
         if (this.__LZdeleted) { return; }
 
-        var styleMap = this.$styles();
-        if ( styleMap ) {
-            this.__LZstyleConstraints = this.__LZapplyStyleMap( styleMap, attrs );
-        }
-
         /**
           * @todo 2006-05-24 ptw Adam says this is a hack that we should get
           * rid of.
@@ -505,88 +490,52 @@
     }
 }
 
-
-/**
-  * Default style map.  Will be overridden for classes that have $style
-  * constraints.
-  *
-  * @access private
-  */
-function $styles() {
-  return null;
-}
-
-/**
-  * Process the style map.
-  * For each style-constrained attribute, if it does not have an
-  * explicit value defined by the instance, lookup the css value that
-  * it should be constrained to.  If it is a simple value, set it
-  * directly, otherwise save it to be applied after the instance is
-  * fully inited (since the constraint may depend on other attributes).
-  *
-  * @param Object stylemap: a map of attribute names to the css style
-  * they are to be constrained to.
-  * @param Object initialArgs: the attributes specified explicitly for
-  * this instance (which may override style constraints).
-  * @access private
-  */
-function __LZapplyStyleMap( stylemap, initialArgs ){
-    var styleConstraints = {};    
-    for ( var k in stylemap ){
-        //we are going to bypass the CSS API and call the underlying
-        //implementation because we're concerned about speed
-        if (initialArgs[k] != null) {
-            // Don't get CSS value if it would be overridden by a instance/class attribute later
-            continue;
-        }
-        var v = LzCSSStyle.getPropertyValueFor( this , stylemap[ k ] );
-
-        // This is a hack because people want to give color styles as
-        // Ox... which is not valid CSS, so they pass it as a string.
-        // They really should be using #...
-        if ((typeof v == 'string') && (v.length > 2) && (v.indexOf('0x') == 0) && (! isNaN(v))) {
-            if ($debug) {
-                Debug.warn("Invalid CSS value for %w.%s: `%#w`.  Use: `#%06x`.", this, k, v, Number(v));
-            }
-            v = Number(v);
-        }
-
-        // A style does not override an explicit attribute
-        if (! (k in initialArgs)) {
-            // A style that is a function is a constraint
-            if (v instanceof Function) {
-                //Only set styleConstraints[k] if this[k] is null.  See LPP-2894 - CSS: subclasses and instances can't override style constraints set on superclass* 
-                if (this[k] == null) {
-//                    Debug.warn("setting %w[%w] to %w, was %w", this, k, v, this[k]);
-                    styleConstraints[k] = v;
-                }
-            } else {
-//                 Debug.format("%w[%s] (%#w) %#w -> %#w", this, k, stylemap[k], this.k, v);
-                if (v != null) this.setAttribute(k, v);
-            }
-        }
+  /**
+   * Bind an attribute to a (CSS) style property
+   *
+   * @param String attr: The name of the attribute to bind
+   * @param String prop: The name of the CSS property whose value the
+   * attribute will be bound to
+   *
+   * @access private
+   */
+  function __LZstyleBindAttribute(attr, prop) {
+    // we are going to bypass the CSS API and call the underlying
+    // implementation because we're concerned about speed
+    var styleValue = LzCSSStyle.getPropertyValueFor(this, prop);
+    // This is a hack because people want to give color styles as
+    // Ox... which is not valid CSS, so they pass it as a string.
+    // They really should be using #...
+    if ((typeof styleValue == 'string') && (styleValue.length > 2) && (styleValue.indexOf('0x') == 0) && (! isNaN(styleValue))) {
+      if ($debug) {
+        Debug.warn("Invalid CSS value for %w.%s: `%#w`.  Use: `#%06x`.", this, k, styleValue, Number(styleValue));
+      }
+      styleValue = Number(styleValue);
     }
-    return styleConstraints;
-}
-
-
-/**
-  * Process style constraints
-  *
-  * Compute each of the style constraints that were saved above and
-  * apply them
-  *
-  * @keywords private
-  */
-function __LZapplyStyleConstraints() {
-    var styleConstraints = this.__LZstyleConstraints;
-    for ( var k in styleConstraints ) {
-        var fn = styleConstraints[ k ];
-        var v = fn.call(this);
-//             Debug.format("%w[%s] (%#w) %#w -> %#w", this, k, stylemap[k], this.k, v);
-        this.setAttribute(k, v);
+    // Style expressions are constraints
+    if (styleValue instanceof LzStyleExpr) {
+      var source = styleValue.sourceAttributeName;
+      if (styleValue instanceof LzStyleAttr) {
+        // Create a new binder to update the destination attribute,
+        var binder = new LzStyleAttrBinder(this, attr, source);
+        // register it on the source attribute,
+        if (! this.__LZdelegates) { this.__LZdelegates = []; }
+        // TODO: [2008-02-20 ptw] The delegate and binder could be
+        // collapsed into a single object, a custom delegate with the
+        // bind method as its execute method, but I don't think these
+        // are common enough to warrant optimization at this time.
+        this.__LZdelegates.push(new LzDelegate(binder, 'bind', this, 'on' + source));
+        // bind it
+        binder.bind();
+      } else if (styleValue instanceof LzStyleIdent) {
+        this.setAttribute(attr, global[source]);
+      } else if ($debug) {
+        Debug.error("Unknown style expression %w", styleValue);
+      }
+    } else {
+      this.setAttribute(attr, styleValue);
     }
-}
+  };
 
 
 /**
@@ -634,8 +583,14 @@
   * @param Object args: A dictionary of initialization arguments that should
   * be applied
   * to the instance. This contains any arguments that are default arguments
-  * written in the class definition.
-  *
+  * written in the class definition.  Note that initial value
+  * expressions (`$once{...}`) and constraints (`${...}`), are in this
+  * list also, they can be differentiated from initial values by their
+  * type: `LzInitExpr` for the former, and `LzConstraintExpr` for the
+  * latter.  If you handle the installation of any instance attributes
+  * in your construct method, you are responsible for dealing with
+  * these "binders" as well.  Normally, they will be processed by
+  * LzNode.
   */
 function construct ( parent , args ){
 
@@ -746,8 +701,9 @@
     //do this now, so that others know that they're too late
     this.isinited = true;
 
+    // Install computed initializations
     this.__LZresolveReferences();
-    if (this.__LZstyleConstraints) this.__LZapplyStyleConstraints();
+
     var sl = this.subnodes;
     if (sl) {
         var i = 0;
@@ -783,7 +739,7 @@
         this.datapath.__LZApplyDataOnInit();
     }
 
-    // Node node end
+    // Note node end
     if ($profile) {
         var nm = this['_profile_name'];
         if (nm) {
@@ -840,52 +796,89 @@
   */
 function __LZapplyArgs ( args , constcall ){
       var oset = {};
-      var hasset = [];
+      var hasset = null;
       var hasearly = null;
       if ( '$setters' in args && args.$setters ){
           this.__LZsetSetters( args.$setters );
       }
 
       var setrs = this.setters;
+      var inits = null;
+      var constraints = null;
 
       for ( var a in args ){
+          var val = args[a];
           //handle flash bug where objects slots are enumerated multiple times
           if ( oset[a] || args[a] === LzNode._ignoreAttribute ) continue;
           oset[ a ] = true;
 
-          if (setrs &&  setrs[ a ] == null ){
-              this.addProperty( a, args[ a ]);
-              if ( !constcall ){
-                  //then we need to notify the rest of the system that this
-                  //value changed.
-                  var evt = ("on" + a);
-                  if (evt in this) {
-                      if (this[evt].ready) this[ evt ].sendEvent( args[ a ] );
-                  } 
+          if (val instanceof LzInitExpr) {
+            if (val instanceof LzConstraintExpr) {
+              if (constraints == null) { constraints = []; }
+              constraints.push(val);
+            } else if (val instanceof LzOnceExpr) {
+              if (inits == null) { inits = []; }
+              inits.push(val);
+            } else if ($debug) {
+              Debug.debug("Unknown init expr: %w", val);
+            }
+            // NOTE: [2007-05-16 ptw] This check ensures that each
+            // constrained attribute exists in the new instance.
+            // Necessary because of 'implicit this', which will make a
+            // free reference (error in Javascript) otherwise.  We
+            // have to not shadow inherited values because in some
+            // cases (e.g., lz.state), we actually have a method and
+            // an attribute of the same name!  The attribute is
+            // implemented by a setter, so it never clobbers the
+            // method... er, unless you set the attribute to a
+            // function.  YOW!
+            if (! (a in this)) {this[a] = null;}
+          } else if (! (a in setrs)) {
+            // TODO: should already be declared, so we should just be
+            // able to set it
+            this.addProperty( a, val);
+            if (! constcall) {
+              //then we need to notify the rest of the system that this
+              //value changed.
+              var evt = ("on" + a);
+              if (evt in this) {
+                if (this[evt].ready) this[ evt ].sendEvent( args[ a ] );
+              } 
+            }
+          } else if (setrs[ a ] != -1) {
+              if (a in this.earlySetters) {
+                  if (hasearly == null) { hasearly = []; }
+                  hasearly[this.earlySetters[a]] = a;
+              } else {
+                  if (hasset == null) { hasset = []; }
+                  hasset.push(a);
               }
-          } else if (setrs &&  setrs[ a ] != -1 ){
-              if ( this.earlySetters && this.earlySetters[ a ]){
-                  if ( hasearly == null){
-                      hasearly = [];
-                  }
-                  hasearly[ this.earlySetters[ a ] ] = a;
-              } else{
-                  hasset.push( a );
-              }
           }
       }
 
       if (hasearly) {
-          for (var i = 1; i < hasearly.length; i++) {
+          for (var i = 1, l = hasearly.length; i < l; i++) {
+            if (i in hasearly) {
               var a = hasearly[i];
-              if (this[setrs[a]]) this[ setrs[a] ]( args[ a ] , a );
+              this[setrs[a]]( args[a], a);
+            }
           }
       }
 
-      while(  hasset.length ){
-          var a = hasset.pop();
-          this[ setrs[a] ]( args[ a ] , a );
+      if (hasset) {
+        for (var i = hasset.length - 1; i >= 0; i--) {
+          var a = hasset[i];
+          this[setrs[a]]( args[a], a);
+        }
       }
+
+      // process inits and constraints
+      // TODO: [2008-02-06 ptw] This can be much more efficient.  For
+      // now, we just collect the inits and constraints (once their
+      // inheritance has been computed correctly above) and use the
+      // existing $refs-like mechanism to install them.
+      this.__LZstoreAttr(inits, '$inits');
+      this.__LZstoreAttr(constraints, '$constraints');
 }
 
 /**
@@ -1185,6 +1178,12 @@
   * bind the attribute.
   */
 function dataBindAttribute ( attr , path  ) {
+    if ( $debug ){
+      if ( path == null ){
+        Debug.warn( 'No value for %w.%s="$path{%w}"', this, attr, path );
+      }
+    }
+
     if ( !this.datapath ){
         this.setDatapath( "." );
     }
@@ -1243,27 +1242,15 @@
 
 }
 
-
+// TODO: [2008-02-14 ptw] Remove at 4.1 or later
+if ($debug) {
 /**
   * @access private
   */
 function __LZstoreRefs ( val , prop ){
-    //Debug.write('__LZstoreRefs', this, prop, val);
-    // NOTE: [2007-05-16 ptw]
-    // This loop ensures that each constrained attribute exists in the
-    // new instance.  Necessary because of 'implicit this', which will
-    // make a free reference (error in Javascript) otherwise.  We have
-    // to not shadow inherited values because in some cases (e.g.,
-    // lz.state), we actually have a method and an attribute of the
-    // same name!  The attribute is implemented by a setter, so it
-    // never clobbers the method... er, unless you set the attribute
-    // to a function.  YOW!
-    for ( var i in val){
-        if (! (i in this)) {this[i] = null;}
-    }
-
-    this.__LZstoreAttr( val , prop );
+        Debug.error("%w.%s is no longer supported", this, arguments.callee);
 }
+}
 
 /**
   * @access private
@@ -1274,85 +1261,74 @@
     }
 
     this.__LZresolveDict[ prop ] = val;
-}
+};
 
 /**
   * @access private
   */
-function __LZresolveReferences (){
+function __LZresolveReferences () {
     var rdict = this.__LZresolveDict;
-    this.__LZresolveDict = null;
-    for ( var r in rdict ){
-        if ( r == "$delegates" ) continue;
-        this[  this.__LZdelayedSetters[ r ] ] ( rdict[ r ] );
-    }
-    // $delegates : "__LZsetDelegates"
-    if ( rdict && rdict.$delegates ) this.__LZsetDelegates( rdict.$delegates );
-}
-
-/**
-  * Take care to evaluate a path expression in the proper environment
-  * $lzsc$ is the compiler convention for internal variables we resort
-  * to this in hopes that it is not shadowed in the with contexts
-  * because the compiler is not smart enough to use a register
-  * @access private
-  */
-function __LZevalPathExpr ($lzsc$rp) {
-    with (global){
-        with( this ){
-            return eval( $lzsc$rp );
+    if (rdict != null) {
+        this.__LZresolveDict = null;
+        var inits = rdict['$inits'];
+        if (inits != null) {
+            for (var i = 0, l = inits.length; i < l; i++) {
+                // invoke the init method
+                this[inits[i].methodName]();
+            }
         }
-    }
-}
-
-/**
-  * @access private
-  */
-function __LZresolveRefs ( refs ){
-    // $once are applied before $always
-    for ( var p in refs ){
-        var rp = refs[ p ];
-        var pp;
-        if ( "string" == typeof( rp ) ){
-            rp = LzParsedPath.trim( rp );
-            var qc = rp.charAt( 0 );
-            if ( qc =="'" || qc == '"' ){
-                //check, and remove quotes
-                if ( $debug ){
-                    if ( qc != rp.charAt( rp.length -1 ) ){
-                        Debug.warn( "Bad quoting for $path %w in %w", rp, this );
+        // Install constraints
+        // NOTE: [2008-02-13 ptw] Keep in sync with LzState#remove
+        var constraints = rdict['$constraints'];
+        if (constraints != null) {
+            for (var i = 0, l = constraints.length; i < l; i++) {
+                var c = constraints[i];
+                // Apply the constraint method
+                var constraintMethodName = c.methodName;
+                // TODO: [2008-02-06 ptw] the dependency computation needs
+                // to be a method also, probably stored in the
+                // LzConstraintExpr object
+                var cm = this[constraintMethodName];
+                if ($debug) {
+                    if (!(cm && cm instanceof Function)) {
+                        Debug.debug("Bad constraint %w on %w", c, this);
                     }
                 }
-                pp = rp.substring( 1 , rp.length-1 );
-            } else {
-                pp = this.__LZevalPathExpr(rp);
-                if ( $debug ){
-                    if ( pp == null ){
-                        Debug.warn( "No value for $path reference %w in %w",
-                                    rp, this );
-                    }
+                var dependencies = null;
+                if ('dependencies' in cm) {
+                  dependencies = cm.dependencies.call(this);
                 }
+                this.applyConstraintMethod(constraintMethodName , dependencies);
             }
-            this.dataBindAttribute( p , pp );
-        } else if ((rp instanceof Function) &&
-                   // A function with no or null dependencies is a $once
-                   (! ('dependencies' in rp && rp.dependencies))) {
-            rp.call(this);
         }
-    }
-
-    // Functions with dependencies are $always
-    for ( var p in refs ){
-        var rp = refs[ p ];
-        if ((rp instanceof Function) && ('dependencies' in rp)) {
-            this.applyConstraint( p , rp , rp.dependencies.call(this) );
+        // Backward compatibility -- are there any other delayed setters?
+        for ( var r in rdict ){
+            if ( r == "$inits" || r == "$constraints" || r == "$delegates" ) continue;
+            if (r in this.__LZdelayedSetters) {
+                this[  this.__LZdelayedSetters[ r ] ] ( rdict[ r ] );
+            } else if ($debug) {
+                Debug.warn("No delayed setter for %s", r);
+            }
         }
+        // Install delegates
+        // $delegates : "__LZsetDelegates"
+        if (rdict['$delegates']) this.__LZsetDelegates( rdict.$delegates );
     }
 }
 
+// TODO: [2008-02-14 ptw] Remove at 4.1 or later
+if ($debug) {
 /**
   * @access private
   */
+function __LZresolveRefs ( refs ){
+    Debug.error("$refs: %s is no longer supported", refs);
+}
+}
+
+/**
+  * @access private
+  */
 function __LZsetDelegates ( delarr ){
     if ( delarr.length && !this.__LZdelegates ){
         this.__LZdelegates = [];
@@ -1367,27 +1343,61 @@
         this.__LZdelegates.push( new LzDelegate( this , meth ,sender , delarr[i] ) );
     }
 
-}
+};
 
+    // TODO: [2008-02-12 ptw] Backwards compatibility, remove in next
+    // release
+    /**
+     * Applies a function as a constraint.
+     *
+     * @deprecated: Constraints should be methods and should be applied
+     * using applyConstraintMethod
+     *
+     * @param String attribute: Putatively the attribute being
+     * constrained, but actually ignored
+     * @param Function constraint: A function that will be `call`-ed on
+     * `this` when any of the dependencies change
+     * @param Array dependencies: A property list of (reference,
+     * attribute) that should cause the constraint function to be invoked.
+     */
+    function applyConstraint(attribute, constraint, dependencies) {
+        if ($debug) {
+            Debug.deprecated(this, arguments.callee, this.applyConstraintMethod);
+        }
+        var constraintMethodName = "$cf" + this.$cfn++;
+        this.addProperty(constraintMethodName, constraint);
+        return this.applyConstraintMethod(constraintMethodName, dependencies);
+    }
+
 /**
-  * Applies a constraint for the given attribute.
-  * @param String prop: The attribute to be constrained to the value of the
-  * expression
-  * @param Function cfunc: The function that sets the attribute to the value.
-  * E.g. function () { this.setAttribute( 'foo' , someOtherFunction() ) }
-  * @param Array dep: An array of (reference, attribute) pairs that the
-  * constraint depends on. For instance, if the constraint depends on my x
-  * and my friend's width, the dependencies array would look like this:
-  * [ this, "x" , myfriend, "width" ]
+  * Applies a method as a constraint.
+  *
+  * @param String constraintMethodName: The name of the method that
+  * will be invoked when any of the dependencies changes.  Typically
+  * this method 'constrains' an attribute to a computation on the
+  * dependent attributes.  E.g. `function constrain_foo () {
+  * this.setAttribute( 'foo' , this.x + myfriend.width ) }`.  This
+  * method _must_ be a method on the instance to which you are
+  * applying the constraint.
+  *
+  * @param Array dependencies: An array of (reference, attribute)
+  * pairs that the constraint depends on. For instance, if the
+  * constraint depends on my x and my friend's width, the dependencies
+  * array would look like this: `[ this, "x" , myfriend, "width" ]`
   */
-function applyConstraint ( prop , cfunc, dep ){
-    var l = dep.length;
-    if (l){
+function applyConstraintMethod ( constraintMethodName, dependencies ){
+    if ($debug) {
+        if (! ((arguments.length == 2) &&
+               (typeof constraintMethodName == 'string') &&
+               (this[constraintMethodName] instanceof Function) &&
+               (dependencies == null || (dependencies instanceof Array)))) {
+            Debug.error("%w.%s: invalid arguments %w", this, arguments.callee, arguments);
+        }
+    }
+    if (dependencies && dependencies.length > 0){
         if ( !this.__LZdelegates ){
             this.__LZdelegates = [];
         }
-        var refF = "$cf" + this.$cfn++;
-        this[ refF ] = cfunc;
 
         // NOTE: [2006-05-30 ptw] You may think to yourself 'this is
         // not my large automobile', I can move that `new LzDelegate`
@@ -1401,32 +1411,64 @@
         // a separate delegate for each dependency, and people have
         // written code that only works because of this loophole...
         var dp;
-        for ( var i = 0 ; i < l ; i+=2 ){
-            var d = new LzDelegate( this , refF );
-            this.__LZdelegates.push( d );
-            dp = dep[ i ];
+        for (var i = 0, l = dependencies.length; i < l; i += 2) {
+            dp = dependencies[i];
             if (dp) {
-                d.register( dp, "on" + dep[ i + 1 ] );
+                var d = new LzDelegate(this, constraintMethodName, dp, "on" + dependencies[i + 1]);
+                this.__LZdelegates.push(d);
             }
         }
     }
     // Whether there are dependencies or not, we need to invoke the
     // constraint function (since the dependencies may have 'fired'
     // before the constraint was installed).
-    cfunc.call(this);
+    this[constraintMethodName]();
 }
 
+  /**
+   * Release a constraint on an attribute
+   *
+   * Only works for initial constraints.  Constraints applied at
+   * runtime should be applied and released with
+   * `applyConstraintMethod` and `releaseConstraintMethod`.
+   *
+   * @param String attr: The name of the attribute to release the
+   * constraint from
+   */
+  function releaseConstraint(attr:String) {
+    var c = this._instanceAttrs[attr];
+    if (c instanceof LzConstraintExpr) {
+      var m = c.methodName;
+      return this.releaseConstraintMethod(m);
+    }
+    return false;
+  }
+
 /**
-  * Release the constraint on the named property
-  * This function doesn't seem to work.  Marking private to remove from docs. -sa
-  * @access private
-  * @param prop: The property with the constraint to release.
+  * Release a constraint method
+  *
+  * @param String constraintMethodName: the constraint to release
+  *
+  * @devnote TODO: [2008-02-07 ptw] This could probably be made more
+  * efficient, but at least it should work now.  The previous
+  * implementation was nonesense.
   */
-function releaseConstraint ( prop ){
-
-    var refF = "_SetCons" + prop;
-    if (refF in this)
-        this[ refF ].delegate.unregisterAll();
+function releaseConstraintMethod (constraintMethodName) {
+    var result = false;
+    var dels = this.__LZdelegates;
+    if (dels) {
+        for (var i = 0; i < dels.length; ) {
+            var del = dels[i];
+            if (del.c === this && del.f == constraintMethodName) {
+                del.unregisterAll();
+                dels.splice(i, 1);
+                result = true;
+            } else {
+                i++;
+            }
+        }
+    }
+    return result;
 }
 
 /**

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/core/UserClass.lzs
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/core/UserClass.lzs	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/core/UserClass.lzs	2008-02-26 20:32:17 UTC (rev 8108)
@@ -196,65 +196,60 @@
     // TODO: [2006-05-25 ptw] Share this crud with LzNode
     // LzNode class initializer assures that we already have a
     // defaultattrs property that is an LzInheritedHash
-    var dattrs = newproto.defaultattrs;
     if (attrs) {
-      var dattr$refs = '$refs' in dattrs && dattrs.$refs;
-      var cleanup = null;
+      var dattrs = newproto.defaultattrs;
       var setters = newproto.setters;
       // Could this test be an instanceof test?
       var isstate = (('$isstate' in newproto) && (newproto.$isstate));
       for ( var k in attrs ) {
         var attrk = attrs[k];
-        // Check for literal overriding a constraint
-        if ( dattr$refs && dattr$refs[ k ] ){
-          if (! cleanup ) { cleanup = {} };
-          cleanup[k] = true;
-        }
-        // --- this is different from LzNode, why?
-        // if there's no setter, then attach this to the prototype
-        if (setters[k] == null && (! isstate)) {
-          if ((attrk instanceof Object) && (! (attrk instanceof Function))) {
-//             Debug.debug("%w: LzUserClass.initialize: NOT merging %s", this, k);
+
+        if (! (attrk instanceof LzInitExpr)) {
+          // if there's no setter, then attach this to the prototype
+          // TODO: [2008-02-11 ptw] this is different from LzNode, why?
+          // It means things without setters won't get the magic merge
+          // treatment (which is a hack, but it seems wrong to not merge
+          // just because you don't have a setter).  I guess the
+          // intent here is to save setting constant values in each
+          // instance so this is a micro-optimization, somewhat
+          // broken.
+          if (setters[k] == null && (! isstate)) {
+            newproto.addProperty( k, attrk );
+            // If there is a property that would have been shadowed,
+            // you have to hide that from applyArgs, or you will get
+            // clobbered!
+            if (k in dattrs) {
+              dattrs[k] = LzNode._ignoreAttribute;
+            }
+            continue;
           }
-          newproto.addProperty( k, attrk );
-          continue;
-        }
-        // Check for object and array merges
-        if (attrk instanceof Object) {
-          var dattrk = dattrs[k];
-          if (dattrk instanceof Object) {
-            if ( attrk instanceof Array ) {
-//               Debug.debug("%w: LzUserClass.initialize: merging Array %s", this, k);
-              dattrs[ k ] = attrk.concat( dattrk );
-              continue;
-            } else if (typeof attrk == 'object') {
-//               Debug.debug("%w: LzUserClass.initialize: merging Object %s", this, k);
-              var tmp = new LzInheritedHash(dattrk);
-              for (var j in attrk) {
-                tmp[j] = attrk[j];
+          // Check for object and array merges
+          // NOTE: [2008-01-22 ptw] This is just whacky, but it is
+          // required for back-compatibility.  IWBNI this were
+          // handled at compile-time
+          if (attrk instanceof Object) {
+            var dattrk = dattrs[k];
+            if (dattrk instanceof Object && (! (dattrk instanceof LzInitExpr))) {
+              if ( attrk instanceof Array ) {
+//                 Debug.debug("%w.%s: merging %s (%w)", this, arguments.callee, k, attrk);
+                dattrs[ k ] = attrk.concat( dattrk );
+                continue;
+              } else if (typeof attrk == 'object') {
+//                 Debug.debug("%w.%s: merging %s (%w)", this, arguments.callee, k, attrk);
+                var tmp = new LzInheritedHash(dattrk);
+                for (var j in attrk) {
+                  tmp[j] = attrk[j];
+                }
+                dattrs[ k ] = tmp;
+                continue;
               }
-              dattrs[ k ] = tmp;
-              continue;
             }
           }
         }
-        // Just a normal value, install it
+//         Debug.debug("%w.%s: NOT merging %s (%w)", this, arguments.callee, k, attrk);
+        // Just a normal value (or LzInitExpr), install it
         dattrs[k] = attrk;
       }
-      // Finish literal over constraint processing
-      if (cleanup) {
-        // We are going to shadow some defaults, so create a
-        // clean hash to do that in if we don't already have
-        // one.
-        if (! dattrs.hasOwnProperty('$refs')) {
-          //we know the defaultattrs has $refs, so attach it
-          dattrs.$refs = new LzInheritedHash(dattr$refs);
-        }
-        var ia = LzNode._ignoreAttribute;
-        for (var k in cleanup) {
-          dattrs.$refs[ k ] = ia;
-        }
-      }
     }
 }
 

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/data/LzDatapointer.lzs
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/data/LzDatapointer.lzs	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/data/LzDatapointer.lzs	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,6 +1,6 @@
 /**
   *
-  * @copyright Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.
+  * @copyright Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.
   *            Use is subject to license terms.
   *
   * @topic LFC
@@ -892,6 +892,23 @@
 }
 
 /**
+  * Gets the nodeType of the node that the datapointer is pointing to.
+  * @return Integer: one of LzDataNode.ELEMENT_NODE, LzDataNode.TEXT_NODE, 
+  * LzDataNode.DOCUMENT_NODE or <code>undefined</code> if this datapointer 
+  * does not point to a valid node
+  */
+function getNodeType (){
+    if ( ! this.p ) {
+        if ( $debug ) {
+            Debug.info("%s: p is null in %s", arguments.callee, this);
+        }
+        return;
+    }
+    
+    return this.p.nodeType;
+}
+
+/**
   * Gets the name of the node that the datapointer is pointing to.
   * @return String: The name of the datapointer's node
   */

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/data/LzHTTPDataProvider.lzs
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/data/LzHTTPDataProvider.lzs	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/data/LzHTTPDataProvider.lzs	2008-02-26 20:32:17 UTC (rev 8108)
@@ -132,6 +132,9 @@
         
         // If an explicit post body content arg wasn't supplied, make
         // a url-form-encoded string from the queryparams data.
+
+        var cachebreak = "__lzbc__="+(new Date()).getTime();
+
         var postbody = dreq.postbody;
         if (postbody == null && qparams != null) {
             var names = qparams.getNames();
@@ -140,6 +143,15 @@
                 q += sep + name + '=' + encodeURIComponent(qparams.getValue(name));
                 sep = '&';
             }
+
+            // [LPP-5368] If this is a SOLO POST request, put the
+            // 'cache-breaking' arg into this post body. This prevents
+            // the case of an empty POST body, which would cause the
+            // Flash player to turn it into a GET request.
+            if (!proxied && (dreq.method == "POST") &&  !dreq.clientcacheable) {
+                q += cachebreak;
+            }
+
             postbody = q;
         }
 
@@ -155,7 +167,6 @@
             postbody = null;
         }
 
-        var cachebreak = "__lzbc__="+(new Date()).getTime();
         // convert url back to string
         url = lzurl.toString();
         var url;
@@ -175,10 +186,16 @@
         }  else {
             // break the browser cache by adding a unique string to the url
             if (!dreq.clientcacheable) {
-                if (lzurl.query == null) {
-                    lzurl.query = cachebreak;
+                if (dreq.method == "POST") {
+                    //POST case:
+                    // cache break arg already added to post body
                 } else {
-                    lzurl.query += ("&" + cachebreak);
+                    // GET case: add to url query portion
+                    if (lzurl.query == null) {
+                        lzurl.query = cachebreak;
+                    } else {
+                        lzurl.query += ("&" + cachebreak);
+                    }
                 }
             }
 
@@ -234,7 +251,7 @@
 
         var proxied = dreq.proxied;
 
-        if (data.childNodes[0].nodeName == "error") {
+        if (proxied && data.childNodes[0].nodeName == "error") {
             this.setRequestError(dreq, data.childNodes[0].attributes['msg']);
             dreq.onstatus.sendEvent( dreq );
             return;

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/data/LzReplicationManager.lzs
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/data/LzReplicationManager.lzs	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/data/LzReplicationManager.lzs	2008-02-26 20:32:17 UTC (rev 8108)
@@ -207,31 +207,44 @@
     }
 
     var hadxpathconstraint = false;
-    if ( view._instanceAttrs.$refs && view._instanceAttrs.$refs.datapath ) {
-        //<view datapath="${ ... }"/>
-        //we need to mask this
-        this.cloneAttrs.$refs = new LzInheritedHash( this.cloneAttrs.$refs );
-        this.cloneAttrs.$refs.datapath = LzNode._ignoreAttribute;
-        //but, we want the constraint to apply to this object instead
-        var cons = view._instanceAttrs.$refs.datapath;
-
-        this._t = cons.dependencies;
+    var ia = view._instanceAttrs;
+    var oa = odp._instanceAttrs;
+    if (ia && 'datapath' in ia && ia.datapath instanceof LzConstraintExpr) {
+        // <view datapath="${ ... }"/>
         hadxpathconstraint = true;
+        // we need to mask this constraint
+        // NOTE: [2008-02-07 ptw] Why?  Why can't this just execute as
+        // a constraint on the clone via the normal mechanism?
+        this.cloneAttrs = new LzInheritedHash(this.cloneAttrs);
+        this.cloneAttrs.datapath = LzNode._ignoreAttribute;
+        // but, we want the constraint to apply to this object instead
+        var constraintMethodName = ia.datapath.methodName;
+        // TODO: [2008-02-06 ptw] the dependency computation needs
+        // to be a method also, probably stored in the
+        // LzConstraintExpr object
+        var dependencyMethod = view[constraintMethodName].dependencies;
 
         this.__LZpreventXPathUpdate = true;
-        this.applyConstraint( 'xpath', cons, this._t != null ? this._t() : [] );
+        // NOTE: [2008-02-07 ptw] The method had better be available
+        // on the clone (which means we really want a clone class here
+        // to instantiate, rather than an instance to clone).
+        this.applyConstraintMethod(constraintMethodName, dependencyMethod != null ? dependencyMethod.call(this) : []);
         this.__LZpreventXPathUpdate = false;
-    } else if ( odp._instanceAttrs.$refs && odp._instanceAttrs.$refs.xpath ){
+    } else if (oa && 'xpath' in oa && oa.xpath instanceof LzConstraintExpr){
         //<view><datapath xpath="${ ... }"/>
-
+        hadxpathconstraint = true;
         //we want the constraint to apply to this object instead
-        var cons = odp._instanceAttrs.$refs.xpath;
+        var constraintMethodName = oa.xpath.methodName;
+        // TODO: [2008-02-06 ptw] the dependency computation needs
+        // to be a method also, probably stored in the
+        // LzConstraintExpr object
+        var dependencyMethod = odp[constraintMethodName].dependencies;
 
-        this._t = cons.dependencies;
-        hadxpathconstraint = true;
-
         this.__LZpreventXPathUpdate = true;
-        this.applyConstraint( 'xpath', cons, this._t != null ? this._t() : [] );
+        // NOTE: [2008-02-07 ptw] The method had better be available
+        // on the clone (which means the compiler really has to move
+        // it from the datapath subnode to the clone class).
+        this.applyConstraintMethod(constraintMethodName, dependencyMethod != null ? dependencyMethod.call(this) : []);
         this.__LZpreventXPathUpdate = false;
     }
 

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/helpers/LzState.lzs
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/helpers/LzState.lzs	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/helpers/LzState.lzs	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,6 +1,6 @@
 /**
   *
-  * @copyright Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.
+  * @copyright Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.
   *            Use is subject to license terms.
   *
   * @affects lzstate
@@ -107,7 +107,7 @@
   */
 setters.apply = "setApply";
 setters.$setters = null;
-static var staterefs = { apply : true };
+static var stateprops = { apply : true };
 static var stateevents = { onremove : true , onapply : true };
 prototype.$isstate = true; // Defined in LzNode
 var asyncnew = false;
@@ -127,6 +127,11 @@
   */
 setters.__LZsourceLocation = "__LZsetProperty";
 
+var heldargs;
+var releasedconstraints;
+var appliedchildren;
+var isapplied = false;
+
 /**
   * @access private
   */
@@ -134,7 +139,6 @@
     super.construct.apply(this, arguments);
     this.heldArgs = {};
     this.appliedChildren = [];
-    this.isapplied = false;
 }
 
 /**
@@ -187,32 +191,45 @@
         return;
     }
 
+    var parent = this.parent;
     this.isapplied = true;
 
+    // release any constraints you are about to override
+    var pia = parent._instanceAttrs;
+    for (var key in this.heldArgs) {
+      if (pia && key in pia && pia[key] instanceof LzConstraintExpr) {
+        if (this.releasedconstraints == null) { this.releasedconstraints = []; }
+        var constraintMethodName = pia[key].methodName;
+        if (parent.releaseConstraintMethod(constraintMethodName)) {
+          this.releasedconstraints.push(constraintMethodName);
+        }
+      }
+    }
+
     //capture delegates created by process of applying state
-    var od = this.parent.__LZdelegates;
-    this.parent.__LZdelegates = null;
+    var od = parent.__LZdelegates;
+    parent.__LZdelegates = null;
 
-    this.parent.__LZapplyArgs( this.heldArgs );
+    parent.__LZapplyArgs( this.heldArgs );
 
     if (this.subh) var shl = this.subh.length;
-    this.parent.__LZsetPreventInit();
+    parent.__LZsetPreventInit();
 
     for ( var i = 0 ; i < shl;  i++ ){
         if ( this.__LZpool && this.__LZpool[ i ] ){
             this.appliedChildren.push( this.__LZretach( this.__LZpool[ i ] ) );
         } else {
-            this.appliedChildren.push( this.parent.makeChild( this.subh[ i ] ,
+            this.appliedChildren.push( parent.makeChild( this.subh[ i ] ,
                                                             this.asyncnew));
         }
     }
 
-    this.parent.__LZclearPreventInit();
+    parent.__LZclearPreventInit();
 
-    this.parent.__LZresolveReferences();
-    this.__LZstatedelegates = this.parent.__LZdelegates;
+    parent.__LZresolveReferences();
+    this.__LZstatedelegates = parent.__LZdelegates;
 
-    this.parent.__LZdelegates = od;
+    parent.__LZdelegates = od;
 
     if (this.onapply.ready) this.onapply.sendEvent( this );
 }
@@ -254,9 +271,33 @@
             ac.destroy();
         }
     }
-    
+
     this.appliedChildren = [];
 
+    // This sounds good in theory, but breaks dragstate and
+    // resizestate which expect their effect to stick when they are
+    // removed.
+    if (this.releasedconstraints != null) {
+//       // re-apply any constraints you released
+//       var parent = this.parent;
+//       // NOTE: [2008-02-13 ptw] Keep in sync with LzNode#__LZresolveReferences
+//       var rc = this.releasedconstraints;
+//       for (var i = 0, l = rc.length; i < l; i++) {
+//         var constraintMethodName = rc[i];
+//         // TODO: [2008-02-06 ptw] the dependency computation needs
+//         // to be a method also, probably stored in the
+//         // LzConstraintExpr object
+//         var cm = parent[constraintMethodName];
+//         if ($debug) {
+//           if (!(cm && cm instanceof Function)) {
+//             Debug.debug("Bad constraint %w on %w", c, this);
+//           }
+//         }
+//         var dependencyMethod = cm.dependencies;
+//         parent.applyConstraintMethod(constraintMethodName , dependencyMethod.call(parent));
+//       }
+      this.releasedconstraints = null;
+    }
 }
 
 /**
@@ -274,57 +315,70 @@
 
 /**
  * @devnote We override some methods of LzNode to filter out
- * attributes, setters, and handlers that belong to the state,
- * capturing those that do not for later application/removal to the
- * parent node
+ * attributes, and handlers that belong to the state, capturing those
+ * that do not for later application/removal to the parent node
  */
 
 /**
   * @access private
-  * Capture attributes that don't belong to the state for later
+  * Filter out attributes that don't belong to the state for later
   * application to parent.
+  *
   * @devnote NOTE: [2006-12-09 ptw] Currently the only args that apply to the
-  * state are args that have setters (which will be intercepted by
-  * __LZstoreRefs, q.v.), hence we can just intercept
-  * addProperty to capture the 'held args'.
-  *
-* override */ function __LZapplyArgs ( args ){
-  var ap = this.addProperty;
-  this.addProperty = function (prop, val) {
-    this.heldArgs[prop] = val;
+  * state are args that have setters
+  */
+/* override */ function __LZapplyArgs ( args ){
+  var stateArgs = {};
+  var held = this.heldArgs;
+  for (var key in args) {
+    var val = args[key];
+    if (key in this.setters) {
+      stateArgs[key] = val;
+    } else {
+      held[key] = val;
+    }
   }
-  super.__LZapplyArgs(args);
-  this.addProperty = ap;
-}
-
-/**
-  * @access private
-  * Capture setters that don't belong to the state for later
-  * application to the parent (and pass the ones that do apply to the
-  * state on to your superclass).
-* override */ function __LZstoreRefs ( refs, prop ){
-    var parrefs = {};
-    var myrefs = {};
-
-    for ( var p in refs ){
-        // Does this belong to the state?
-        if ( LzState.staterefs[ p ] ){
-            myrefs[ p ] = refs[ p ]
-            var havemyrefs = true;
-        } else {
-            parrefs[ p ] = refs[ p ];
-            var haveparrefs = true;
-        }
+  // If any stateArgs are LzInitExpr's, we need to move the
+  // methods they call from held to stateArgs
+  for (var key in stateArgs) {
+    var val = stateArgs[key];
+    if (val instanceof LzInitExpr) {
+      var methodName = val.methodName;
+      if (methodName in held) {
+        stateArgs[methodName] = held[methodName];
+        delete held[methodName];
+      }
     }
+  }
 
-    if ( havemyrefs ){
-        // Install state setters
-        super.__LZstoreRefs( myrefs , prop );
+  // If any held args are LzInitExprs, we need to rename their methods
+  // so they do not clober the parent's methods
+  // TODO: [2008-02-13 ptw] This should take place at compile time.
+  var rename = null;
+  for (var key in held) {
+    var val = held[key];
+    if (val instanceof LzInitExpr) {
+      var methodName = val.methodName;
+      if (methodName in held) {
+        if (rename == null) { rename = []; }
+        rename.push(key);
+      }
     }
+  }
+  if (rename != null) {
+    for (var i = 0, l = rename.length; i < l; i++) {
+      var key = rename[i];
+      var val = held[key];
+      var methodName = val.methodName;
+      var newMethodName = methodName + this.__LZUID;
+      // Clone the init expr with the new name
+      held[key] = new (val.constructor)(newMethodName);
+      held[newMethodName] = held[methodName];
+      delete held[methodName];
+    }
+  }
 
-    if ( haveparrefs ){
-        this.heldArgs[prop] = parrefs;
-    }
+  super.__LZapplyArgs(stateArgs);
 }
 
 /**
@@ -332,7 +386,8 @@
   * Capture handlers that don't belong to the state for later
   * application to the parent (and pass the ones that do apply to the
   * state on to your superclass).
-* override */ function __LZstoreDelegates ( delarr ){
+  */
+/* override */ function __LZstoreDelegates ( delarr ){
     var pardels = [];
     var mydels = [];
 

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/kernel/dhtml/LzKeyboardKernel.js
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/kernel/dhtml/LzKeyboardKernel.js	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/kernel/dhtml/LzKeyboardKernel.js	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,7 +1,7 @@
 /**
   * LzKeyboardKernel.js
   *
-  * @copyright Copyright 2007 Laszlo Systems, Inc.  All Rights Reserved.
+  * @copyright Copyright 2007,2008 Laszlo Systems, Inc.  All Rights Reserved.
   *            Use is subject to license terms.
   *
   * @topic Kernel
@@ -18,7 +18,9 @@
         var dirty = false;
         var k = e['keyCode'];
         var dh = LzKeyboardKernel.__downKeysHash;
-        if (k >= 0) {
+        // skip shift, ctrl, option keys to prevent duplicate sending - see LPP-4267
+        // really, all control characters should be skipped...
+        if (k >= 0 && k != 16 && k != 17 && k != 18) {
             // TODO: add mapping to flash character codes?
             var s = String.fromCharCode(k).toLowerCase();
             var t = e.type; 

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1255,6 +1255,10 @@
         this.__discardElement(this.__LZcanvas);
     }
     this.__ImgPool = null;
+
+    if (this.quirks.ie_leak_prevention) {
+        delete this.__sprites[this.uid];
+    }
 }
 
 /**
@@ -1527,19 +1531,22 @@
     if (LzSprite.prototype.quirks.ie_leak_prevention) {
         // Used instead of node.removeChild to eliminate 'pseudo-leaks' in IE - see http://outofhanwell.com/ieleak/index.php?title=Fixing_Leaks
         //alert('__discardElement' + element);
-        if (element.owner) element.owner = null;
-        var garbageBin = document.getElementById('__LZIELeakGarbageBin');
-        if (!garbageBin) {
-            garbageBin = document.createElement('DIV');
-            garbageBin.id = '__LZIELeakGarbageBin';
-            garbageBin.style.display = 'none';
-            document.body.appendChild(garbageBin);
+        if( ( element.nodeType >= 1 ) && ( element.nodeType < 13 ) )  {
+            // ensures element is valid node 
+            if (element.owner) element.owner = null;
+            var garbageBin = document.getElementById('__LZIELeakGarbageBin');
+            if (!garbageBin) {
+                garbageBin = document.createElement('DIV');
+                garbageBin.id = '__LZIELeakGarbageBin';
+                garbageBin.style.display = 'none';
+                document.body.appendChild(garbageBin);
+            }
+
+            // move the element to the garbage bin
+            garbageBin.appendChild(element);
+            garbageBin.innerHTML = '';
+            //garbageBin.outerHTML = '';
         }
-
-        // move the element to the garbage bin
-        garbageBin.appendChild(element);
-        garbageBin.innerHTML = '';
-        //garbageBin.outerHTML = '';
     } else {
         if (element.parentNode) element.parentNode.removeChild(element);
     }

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/kernel/dhtml/LzTextSprite.js
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/kernel/dhtml/LzTextSprite.js	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/kernel/dhtml/LzTextSprite.js	2008-02-26 20:32:17 UTC (rev 8108)
@@ -41,7 +41,6 @@
     this.setFontName(args.font);
     this.setFontStyle(args.fontstyle);
     this.setFontSize(args.fontsize);
-    this.text = args.text;
 }
 
 // Should reflect CSS defaults in LzSprite.js
@@ -269,15 +268,21 @@
 
     var root = document.getElementById('lzTextSizeCache');
 
-    // Empty the cache when full, but do not reset the counter because
-    // IE holds onto the object.
-    if (this._sizecache.counter > 0 && this._sizecache.counter % this.__sizecacheupperbound == 0) {
-        this._sizecache = {counter: this._sizecache.counter};
+    if (LzTextSprite.prototype._sizecache.counter > 0 && LzTextSprite.prototype._sizecache.counter % LzTextSprite.prototype.__sizecacheupperbound == 0) {
+        LzTextSprite.prototype._sizecache = {counter: 0};
+        if (LzSprite.prototype.quirks.ie_leak_prevention) {
+            var obj = LzTextSprite.prototype._sizedomcache;
+            var f = LzSprite.prototype.__discardElement;
+            for( var i in obj ) {
+                f( obj[i] );
+            }
+            LzTextSprite.prototype._sizedomcache = {}
+        }
         if (root) {
             root.innerHTML = '';
         }
     }
-    if (this._sizecache[style] == null) this._sizecache[style] = {};
+    if (LzTextSprite.prototype._sizecache[style] == null) LzTextSprite.prototype._sizecache[style] = {};
 
     if (! root) {
         root = document.createElement('div');
@@ -286,7 +291,7 @@
         document.body.appendChild(root);
     }
 
-    var _textsizecache = this._sizecache[style];
+    var _textsizecache = LzTextSprite.prototype._sizecache[style];
     if (! _textsizecache[string]) {
         var size = {};
 
@@ -297,13 +302,13 @@
             var tagname = 'span';
             var mdiv = _textsizecache['lzdiv~~~' + tagname];
             if (mdiv == null) {
-                var html = '<' + tagname + ' id="testSpan' + this._sizecache.counter + '"';
+                var html = '<' + tagname + ' id="testSpan' + LzTextSprite.prototype._sizecache.counter + '"';
                 html += ' style="' + style + '">';
                 html += string;
                 html += '</' + tagname + '>';
                 root.insertAdjacentHTML('beforeEnd', html);
 
-                mdiv = document.all['testSpan' + this._sizecache.counter];
+                mdiv = document.all['testSpan' + LzTextSprite.prototype._sizecache.counter];
                 _textsizecache['lzdiv~~~' + tagname] = mdiv;
             }
         } else {
@@ -342,7 +347,7 @@
             }
         }    
         _textsizecache[string] = size;
-        this._sizecache.counter++;
+        LzTextSprite.prototype._sizecache.counter++;
     }
     return _textsizecache[string];
 }

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/kernel/swf/LzInputTextSprite.as
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/kernel/swf/LzInputTextSprite.as	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/kernel/swf/LzInputTextSprite.as	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,7 +1,7 @@
 /**
   * LzInputTextSprite.as
   *
-  * @copyright Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.
+  * @copyright Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.
   *            Use is subject to license terms.
   *
   * @topic Kernel
@@ -96,8 +96,10 @@
     //        if empty text content was supplied, use DEFAULT_WIDTH
 
 
-    //(args.width == null && typeof(args.$refs.width) != "function")
-
+    //(args.width == null || args.width instanceof LzInitExpr)
+    // NOTE: [2008-02-13 ptw] No one will fess up to understanding why
+    // we treat the presence of a constraint on width differently than
+    // height.
     if (args.width == null) {
         // if there's text content, measure it's width
         if (this.text != null && this.text.length > 0) {
@@ -114,7 +116,7 @@
     //    if  single line, use font line height
     //    else get height from flash textobject.textHeight 
     // 
-    if (args.height == null && typeof(args.$refs.height) != "function") {
+    if (args.height == null || args.height instanceof LzInitExpr) {
         this.sizeToHeight = true;
         // set autoSize to get text measured
         textclip.autoSize = true;

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/services/LzFocus.lzs
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/services/LzFocus.lzs	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/services/LzFocus.lzs	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,6 +1,6 @@
 /**
   *
-  * @copyright Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.
+  * @copyright Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.
   *            Use is subject to license terms.
   *
   * @affects lzbrowser
@@ -43,7 +43,7 @@
   * unchanged from its last value.
   * @type Boolean
   */
-LzFocus.focuswithkey = null;
+LzFocus.focuswithkey = false;
 
 /** @access private */
 LzFocus.__LZskipblur = false;

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/services/LzModeManager.lzs
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/services/LzModeManager.lzs	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/services/LzModeManager.lzs	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,6 +1,6 @@
 /**
   *
-  * @copyright Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.
+  * @copyright Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.
   *            Use is subject to license terms.
   *
   * @affects lzmodemanager
@@ -69,11 +69,13 @@
   * @param LzView view: The view intending to have modal iteraction
   */
 LzModeManager.makeModal = function ( view ) {
-    this.modeArray.push( view );
-    if (this.onmode.ready) this.onmode.sendEvent( view );
-    var f = LzFocus.getFocus();
-    if ( f && ! f.childOf( view ) ){
-        LzFocus.clearFocus();
+    if (this.modeArray.length == 0 || !this.hasMode( view )) {
+        this.modeArray.push( view );
+        if (this.onmode.ready) this.onmode.sendEvent( view );
+        var f = LzFocus.getFocus();
+        if ( f && ! f.childOf( view ) ){
+            LzFocus.clearFocus();
+        }
     }
 }
 

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/views/LaszloCanvas.lzs
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/views/LaszloCanvas.lzs	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/views/LaszloCanvas.lzs	2008-02-26 20:32:17 UTC (rev 8108)
@@ -477,12 +477,14 @@
   * @devnote N.B.: replaces LzNode.__LZcallInit, so must be kept in sync with that
   */
 function __LZcallInit ( an ){
+    // Canvas-only:  Don't bother with preventSubInit
     if (this.isinited) return;
 
     //do this now, so that others know that they're too late
     this.isinited = true;
 
     this.__LZresolveReferences();
+    if (this.__LZstyleConstraints) this.__LZapplyStyleConstraints();
     var sl = this.subnodes;
     if (sl) {
         var i = 0;
@@ -505,14 +507,22 @@
         }
     }
 
+    // Register in the source locator table, if debugging
+    if ($debug) {
+        if (this.__LZsourceLocation) {
+            LzNode.sourceLocatorTable[this.__LZsourceLocation] = this;
+        }
+    }
+
     this.init();
+    // Canvas-only: Why? TODO: [2008-02-01 ptw] Ask max
     this.sprite.init(true);
     if (this.oninit.ready) this.oninit.sendEvent( this );
     if (this.datapath && this.datapath.__LZApplyDataOnInit) {
         this.datapath.__LZApplyDataOnInit();
     }
     
-    // Note canvas end
+    // Canvas-only: Note _canvas_ end, stop startup profiler
     if ($profile) {
         Profiler.event('done: #canvas');
         // Default is to start the Profiler ASAP, and stop it in

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/views/LaszloView.lzs
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/views/LaszloView.lzs	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/views/LaszloView.lzs	2008-02-26 20:32:17 UTC (rev 8108)
@@ -130,12 +130,14 @@
   * @access public
   */
 var onlastframe = LzDeclaredEvent;
-/** @lzxtype event
+/** Send when the view finishes loading media.
+  * @lzxtype event
   * @access public
   */
 var onload = LzDeclaredEvent;
 
-/** @lzxtype event
+/** Sends a percentage (0-1) reflecting the amount of a media file that's been downloaded.
+* @lzxtype event
   * @access public
   */
 var onloadperc = LzDeclaredEvent;
@@ -249,7 +251,8 @@
   */
 var onunstretchedwidth = LzDeclaredEvent;
 
-/** @lzxtype event
+/** Sent when the view changes visibility (true/false)
+  * @lzxtype event
   * @access public
   */
 var onvisible = LzDeclaredEvent;
@@ -326,17 +329,17 @@
 
     this.__makeSprite(args);
 
-    if ( 'width' in args || (('$refs' in args) && ('width' in args.$refs) && args.$refs.width) ){
+    if ( 'width' in args ){
         this.hassetwidth = true;
         this.__LZcheckwidth = false;
     }
-    if ( 'height' in args || (('$refs' in args) && ('height' in args.$refs) && args.$refs.height) ){
+    if ( 'height' in args ){
         this.hassetheight = true;
         this.__LZcheckheight = false;
     }
 
     var r =null;
-    if ('resource' in args && args['resource'] != null ){
+    if ('resource' in args && args['resource'] != null && (! (args.resource instanceof LzInitExpr)) ){
         r = args.resource;
         args.resource = LzNode._ignoreAttribute;
     }
@@ -1544,31 +1547,56 @@
 }
 
 /**
-  * Sets the <attribute>alignment</attribute> for the view to the given
-  * value. The alignment is based on the size of this view as compared
-  * to the size of the view's immediate parenbgRef.
-  * @param String align : The <attribute>alignment</attribute> for the view. This is one of "left",
-  * "center", and "right"
+  * Sets the <attribute>alignment</attribute> for the view to the
+  * given value. The alignment is based on the size of this view as
+  * compared to the size of the view's immediate parenbgRef.
+  *
+  * @param String align: The <attribute>alignment</attribute> for the
+  * view. This is one of "left", "center", and "right"
+  *
+  * @devnote TODO: [2008-02-07 ptw] Apparently we never supported
+  * 'onalign', should we?
   */
 function setAlign ( align ){
-    if ( align == "left" ) {
-        this.releaseConstraint('x');
-        this.setAttribute('x', 0);
-    } else if ( align == "center" ){
-        var f = function (){
-            this.setAttribute( "x" , this.immediateparent.width /2
-                                - this.width /2);
+  if (this.align == align) return;
+  function map (align) {
+    switch (align) {
+      case "center": return "__LZalignCenter";
+      case "right": return "__LZalignRight";
+      case "left": return null;
+      default:
+        if ($debug) {
+          Debug.error("%w.%s(%w): Invalid argument.  Valid choices are: 'left', 'center', or 'right'.",
+                      this, arguments.callee, align);
         }
-        this.setPosConstraint( this.immediateparent , f , "width" );
-    } else if ( align == "right" ){
-        var f = function (){
-            this.setAttribute( "x" , this.immediateparent.width
-                                 - this.width );
-        }
-        this.setPosConstraint( this.immediateparent , f , "width" );
     }
+  }
+  var from = map(this.align);
+  var to = map(align);
+  if (from != null) {
+    this.releaseConstraintMethod(from);
+  }
+  if (to != null) {
+    this.applyConstraintMethod(to, [this.immediateparent, "width", this, "width"]);
+  } else {
+    this.setAttribute('x', 0);
+  }
+  this.align = align;
 }
 
+/** @access private */
+function __LZalignCenter () {
+  this.setAttribute( "x" , this.immediateparent.width /2
+                     - this.width /2);
+}
+
+/** @access private */
+function __LZalignRight () {
+  this.setAttribute( "x" , this.immediateparent.width
+                     - this.width);
+}
+
+
 /**
   * Sets the x offset  
   * @param Integer o: The x offset
@@ -1671,37 +1699,55 @@
 }
 
 /**
-  * Sets the vertical alignment for the view to the given value. The alignment
-  * is based on the height of this view as compared to the height of the view's
-  * <attribute>immediateparent</attribute>.
-  * @param String valign : The vertical alignment for the view. This is one of "top",
-  * "middle", and "bottom"
+  * Sets the vertical alignment for the view to the given value. The
+  * alignment is based on the height of this view as compared to the
+  * height of the view's <attribute>immediateparent</attribute>.
+  *
+  * @param String valign: The vertical alignment for the view. This is
+  * one of "top", "middle", and "bottom"
+  *
+  * @devnote TODO: [2008-02-07 ptw] Apparently we never supported
+  * 'onvalign', should we?
   */
 function setValign ( valign ){
-    if ( valign == "top" ) {
-        this.releaseConstraint('y');
-        this.setAttribute('y', 0);
-    } else if ( valign == "middle" ){
-        var f = function (){
-            this.setAttribute( "y" , this.immediateparent.height /2
-                                - this.height /2);
+  if (this.valign == valign) return;
+  function map (align) {
+    switch (align) {
+      case "middle": return "__LZvalignMiddle";
+      case "bottom": return "__LZvalignBottom";
+      case "top": return null;
+      default:
+        if ($debug) {
+          Debug.error("%w.%s(%w): Invalid argument.  Valid choices are: 'top', 'middle', or 'bottom'.",
+                      this, arguments.callee, valign);
         }
-        this.setPosConstraint( this.immediateparent , f ,"height" );
-    } else if ( valign == "bottom" ){
-        var f = function (){
-            this.setAttribute( "y" , this.immediateparent.height
-                                - this.height);
-        }
-        this.setPosConstraint( this.immediateparent , f , "height" );
     }
+  }
+  var from = map(this.valign);
+  var to = map(valign);
+  if (from != null) {
+    this.releaseConstraintMethod(from);
+  }
+  if (to != null) {
+    this.applyConstraintMethod(to, [this.immediateparent, "height", this, "height"]);
+  } else {
+    this.setAttribute('y', 0);
+  }
+  this.valign = valign;
 }
 
 /** @access private */
-function setPosConstraint ( v , f , widthorheight ){
-    var d = [ v , widthorheight  , this , widthorheight ];
-    this.applyConstraint( widthorheight == "width" ? "x" : "y" , f , d );
+function __LZvalignMiddle () {
+  this.setAttribute( "y" , this.immediateparent.height /2
+                     - this.height /2);
 }
 
+/** @access private */
+function __LZvalignBottom () {
+  this.setAttribute( "y" , this.immediateparent.height
+                     - this.height);
+}
+
 /**
   * Sets the color of the view (the view's resource and any subviews) to the
   * the color given. This will completely override any color information in the

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/views/LzInputText.lzs
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/views/LzInputText.lzs	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/views/LzInputText.lzs	2008-02-26 20:32:17 UTC (rev 8108)
@@ -83,6 +83,15 @@
   */
 var ontext = LzDeclaredEvent;
 
+/** @access private */
+var _onfocusDel = null;
+
+/** @access private */
+var _onblurDel = null;
+
+/** @access private */
+var _modemanagerDel = null;
+
 /** @access private
   * @modifiers override 
   */
@@ -114,6 +123,28 @@
 }
 
 /**
+  * @access private
+  */
+function destroy (recursiveCall) {
+    if (this._onfocusDel) {
+        this._onfocusDel.unregisterAll();
+        this._onfocusDel = null;
+    }
+    
+    if (this._onblurDel) {
+        this._onblurDel.unregisterAll();
+        this._onblurDel = null;
+    }
+    
+    if (this._modemanagerDel) {
+        this._modemanagerDel.unregisterAll();
+        this._modemanagerDel = null;
+    }
+    
+    super.destroy.apply(this, arguments);
+}
+
+/**
   * Called to create the sprite object.  May be overridden to use a specific 
   * version, e.g. LzTextSprite();
   * @access private

Modified: openlaszlo/branches/devildog/WEB-INF/lps/lfc/views/LzText.lzs
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/lfc/views/LzText.lzs	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/lfc/views/LzText.lzs	2008-02-26 20:32:17 UTC (rev 8108)
@@ -221,7 +221,7 @@
         this.setMaxLength(args.maxlength);
     }
 
-    this.text =  (!('text' in args) || args.text == null) ? "" : args.text;
+    this.text =  (!('text' in args) || args.text == null || args.text instanceof LzInitExpr) ? "" : args.text;
     if(this.maxlength != null && this.text.length > this.maxlength){
         this.text = this.text.substring(0, this.maxlength);
     }

Modified: openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/compiler/NodeModel.java
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/compiler/NodeModel.java	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/compiler/NodeModel.java	2008-02-26 20:32:17 UTC (rev 8108)
@@ -724,7 +724,9 @@
                       ComparisonMap attrs, ComparisonMap events,
                       ComparisonMap references, ComparisonMap paths,
                       ComparisonMap styles) {
-        if (cattr.type == cattr.ATTRIBUTE || cattr.type == cattr.EVENT) {
+        if (cattr.type == cattr.ATTRIBUTE || cattr.type == cattr.EVENT ||
+            (cattr.type == cattr.REFERENCE) || (cattr.type == cattr.PATH) ||
+            (cattr.type == cattr.STYLE)) {
             if (attrs.containsKey(name, caseSensitive)) {
                 env.warn(
 /* (non-Javadoc)
@@ -736,26 +738,8 @@
                     ,element);
             }
             attrs.put(name, cattr.value);
-        } else if ((cattr.type == cattr.REFERENCE) || (cattr.type == cattr.PATH)) {
-            if (references.containsKey(name, caseSensitive)) {
-                env.warn(
-/* (non-Javadoc)
- * @i18n.test
- * @org-mes="redefining reference '" + p[0] + "' which has already been defined on " + p[1]
- */
-            org.openlaszlo.i18n.LaszloMessages.getMessage(
-                NodeModel.class.getName(),"051018-706", new Object[] {name, getMessageName()})
-                    ,element);
-            }
-            references.put(name, cattr.value);
-        } else if (cattr.type == cattr.STYLE) {
-            if (styles.containsKey(name, caseSensitive)) {
-                env.warn(
-                    // TODO [2006-08-22 ptw] i18n this
-                    "duplicate $style binding for '" + name + "' in " + getMessageName(),
-                    element);
-            }
-            styles.put(name, cattr.value);
+        } else {
+            assert false: "Unknown cattr.type: " + cattr.type;
         }
     }
 
@@ -1357,40 +1341,47 @@
             // Handle when cases
             // N.B., $path and $style are not really when values, but
             // there you go...
-            if (when.equals(WHEN_PATH)) {
-                return new CompiledAttribute(
-                    CompiledAttribute.PATH,
-                    srcloc + ScriptCompiler.quote(value) + "\n");
-            } else if (when.equals(WHEN_STYLE)) {
-                return new CompiledAttribute(
-                    CompiledAttribute.STYLE,
-                    srcloc + value + "\n");
-            } else if (when.equals(WHEN_ONCE)) {
-                return new CompiledAttribute(
-                    CompiledAttribute.REFERENCE,
-                    "function " +
-                    parent_name + "_" + name + "_once" +
-                    " () {" +
-                    "\n#pragma 'withThis'\n" +
-                    // Use this.setAttribute so that the compiler
-                    // will recognize it for inlining.
-                    "this.setAttribute(" +
-                    ScriptCompiler.quote(name) + " , " +
-                    "\n#beginAttribute\n" + srcloc + canonicalValue + "\n#endAttribute\n)}");
-            } else if (when.equals(WHEN_ALWAYS)) {
-                return new CompiledAttribute(
-                    CompiledAttribute.REFERENCE,
-                    "function " +
-                    parent_name + "_" + name + "_always" +
-                    " () {" +
-                    "\n#pragma 'constraintFunction'\n" +
-                    "\n#pragma 'withThis'\n" +
-                    // Use this.setAttribute so that the compiler
-                    // will recognize it for inlining.
-                    "this.setAttribute(" +
-                    ScriptCompiler.quote(name) + ", " +
-                    "\n#beginAttribute\n" + srcloc + canonicalValue +
-                    "\n#endAttribute\n)}");
+            if (when.equals(WHEN_PATH) || (when.equals(WHEN_STYLE)) || when.equals(WHEN_ONCE) || when.equals(WHEN_ALWAYS)) {
+                String installer = "setAttribute";
+                String body = "\n#beginAttribute\n" + srcloc + canonicalValue + "\n#endAttribute\n)";
+                String pragmas =
+                        // Should be unnecessary for JS2 methods
+                        "\n#pragma 'withThis'\n";
+                String kind = "LzOnceExpr";
+                if (when.equals(WHEN_ONCE)) {
+                    // default
+                } else if (when.equals(WHEN_PATH)) {
+                    installer = "dataBindAttribute";
+                } else if (when.equals(WHEN_STYLE)) {
+                    // Styles are processed as constraints, although
+                    // they are not compiled as constraints.  Whether
+                    // a style results in a constraint or not cannot
+                    // be determined until the style property value is
+                    // derived (at run time)
+                    kind = "LzConstraintExpr";
+                    installer = "__LZstyleBindAttribute";
+                } else if (when.equals(WHEN_ALWAYS)) {
+                    pragmas =
+                        "\n#pragma 'constraintFunction'\n" +
+                        // Should be unnecessary for JS2 methods
+                        "\n#pragma 'withThis'\n";
+                    kind = "LzConstraintExpr";
+                } else {
+                    assert false : "Unhandled when value: " + when;
+                }
+                String bindername = "$lzc$bind_" + name;
+                Function binder = new Function(
+                    bindername,
+                    "",
+                    pragmas +
+                    "this." + installer + "(" +
+                    ScriptCompiler.quote(name) + "," +
+                    body,
+                    srcloc);
+                // Add the binder as a method
+                attrs.put(bindername, binder);
+                // Return an initExpr as the 'value' of the attribute
+                return new CompiledAttribute("new " + kind + "(" + ScriptCompiler.quote(bindername) +")");
             } else if (when.equals(WHEN_IMMEDIATELY)) {
                 if ((CanvasCompiler.isElement(source) &&
                      ("width".equals(name) || "height".equals(name))) ||
@@ -1675,10 +1666,10 @@
             attrs.put("$delegates", delegateList);
         }
         if (!references.isEmpty()) {
-            attrs.put("$refs", references);
+            assert false : "There should not be any $refs";
         }
         if (!paths.isEmpty()) {
-            attrs.put("$paths", paths);
+            assert false : "There should not be any $paths";
         }
         if (datapath != null) {
             attrs.put("$datapath", datapath.asMap());
@@ -1688,34 +1679,8 @@
             // overridden by an inherited value from the class.
             attrs.put("datapath", "LzNode._ignoreAttribute");
         }
-
         if (!styles.isEmpty()) {
-            String styleMap;
-            try {
-                java.io.Writer writer = new java.io.StringWriter();
-                ScriptCompiler.writeObject(styles, writer);
-                styleMap = writer.toString();
-            } catch (java.io.IOException e) {
-                throw new ChainedException(e);
-            }
-            // NOTE: [2006-09-04 ptw] The $styles method _must_ create
-            // a new map each time, because the sub-class or instance
-            // may modify it.
-            attrs.put("$styles",
-                      new
-                      Function(
-                          "",
-                          "",
-                          "\n#beginContent" +
-                          "\n#pragma 'withThis'" +
-                          "\n#pragma 'methodName=$styles'" +
-                          "\nvar map = super.$styles() || (new Object);" +
-                          "\nvar s = " + styleMap + ";" +
-                          "\nfor (var k in s) { map[k] = s[k]; };" +
-                          "\nreturn map;" +
-                          "\n#endContent" +
-                          "\n")
-                      );
+            assert false : "There should not be any $styles";
         }
     }
 

Modified: openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/css/CSSHandler.java
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/css/CSSHandler.java	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/css/CSSHandler.java	2008-02-26 20:32:17 UTC (rev 8108)
@@ -3,7 +3,7 @@
 * ****************************************************************************/
 
 /* J_LZ_COPYRIGHT_BEGIN *******************************************************
-* Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.              *
+* Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.              *
 * Use is subject to license terms.                                            *
 * J_LZ_COPYRIGHT_END *********************************************************/
 
@@ -298,11 +298,11 @@
          switch (lu.getLexicalUnitType()) {
 
          case LexicalUnit.SAC_ATTR:
-             str = "function () { return this['" + processEscapes(lu.getStringValue()) + "']; }";
+             str = "new LzStyleAttr('" + processEscapes(lu.getStringValue()) + "')";
            break;
 
          case LexicalUnit.SAC_IDENT:
-             str = "function () { return global['" + processEscapes(lu.getStringValue()) + "']; }";
+             str = "new LzStyleIdent('" + processEscapes(lu.getStringValue()) + "')";
            break;
 
          case LexicalUnit.SAC_STRING_VALUE:

Modified: openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/data/XMLGrabber.java
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/data/XMLGrabber.java	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/data/XMLGrabber.java	2008-02-26 20:32:17 UTC (rev 8108)
@@ -8,7 +8,7 @@
 * ****************************************************************************/
 
 /* J_LZ_COPYRIGHT_BEGIN *******************************************************
-* Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.              *
+* Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.              *
 * Use is subject to license terms.                                            *
 * J_LZ_COPYRIGHT_END *********************************************************/
 
@@ -147,12 +147,13 @@
         public void run() {
             try {
                 writeXMLDataToOutputStream();
-                pout.flush();
-                pout.close();
-            } catch (XmlPullParserException ex) {
-                throw new RuntimeException(ex);
-            } catch (IOException ex) {
-                throw new RuntimeException(ex);
+            } catch (Exception e) {
+            } finally {
+                try {
+                    pout.flush();
+                    pout.close();
+                } catch (Exception e) {
+                }
             }
         }
 

Modified: openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/sc/Function.java
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/sc/Function.java	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/sc/Function.java	2008-02-26 20:32:17 UTC (rev 8108)
@@ -8,7 +8,7 @@
 package org.openlaszlo.sc;
 
 public class Function {
-  private String name;
+  public String name;
   private final String args;
   private final String body;
   private final String sourceLocation;
@@ -43,6 +43,6 @@
 }
 
 /**
- * @copyright Copyright 2001-2007 Laszlo Systems, Inc.  All Rights
+ * @copyright Copyright 2001-2008 Laszlo Systems, Inc.  All Rights
  * Reserved.  Use is subject to license terms.
  */

Modified: openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/sc/ReferenceCollector.java
===================================================================
--- openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/sc/ReferenceCollector.java	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/sc/ReferenceCollector.java	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,7 +1,7 @@
 /* -*- mode: Java; c-basic-offset: 2; -*- */
 
 /* J_LZ_COPYRIGHT_BEGIN *******************************************************
-* Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.              *
+* Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.              *
 * Use is subject to license terms.                                            *
 * J_LZ_COPYRIGHT_END *********************************************************/
 
@@ -64,8 +64,8 @@
     return s;
   }
 
-  // f(args...) -> f["dependencies"](undefined, args...)
-  // a.f(args...) -> f["dependencies"](a, args...)
+  // f(args...) -> f["dependencies"](this, undefined, args...)
+  // a.f(args...) -> f["dependencies"](this, a, args...)
   private SimpleNode fsubst(SimpleNode node) {
     SimpleNode fn = node.get(0);
     SimpleNode callee;

Copied: openlaszlo/branches/devildog/WEB-INF/lps/server/src/org/openlaszlo/utils/DeploySOLODHTML.java (from rev 8100, openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/utils/DeploySOLODHTML.java)

Modified: openlaszlo/branches/devildog/demos/youtube/youtube.jsp
===================================================================
--- openlaszlo/branches/devildog/demos/youtube/youtube.jsp	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/demos/youtube/youtube.jsp	2008-02-26 20:32:17 UTC (rev 8108)
@@ -11,7 +11,7 @@
 <%!
 
 /* X_LZ_COPYRIGHT_BEGIN ****************************************************
- * Copyright 2007 Laszlo Systems, Inc.  All Rights Reserved.               *
+ * Copyright 2007, 2008 Laszlo Systems, Inc.  All Rights Reserved.         *
  * Use is subject to license terms.                                        *
  * X_LZ_COPYRIGHT_END ******************************************************/
 
@@ -199,18 +199,22 @@
         Document result)
     {
         String pageUrl =
-            "http://www.YouTube.com/watch?v=";
-        pageUrl += id;
+            "http://www.youtube.com/v/" + id;
 
-        BufferedReader inputFile = null;
+        // Based on http://www.jeroenwijering.com/?thread=5484#msg50818
+        // Get Location header and parse strings from that...
+        String redirURL = null;
         try {
             URL u = new URL(pageUrl);
-            inputFile =
-                new BufferedReader(
-                    new InputStreamReader(
-                        u.openStream()));
+            HttpURLConnection redir = (java.net.HttpURLConnection)u.openConnection();
+            redir.setFollowRedirects(false);
+            redir.connect();
+            redirURL = redir.getHeaderField("Location");
+            if (redirURL == null) {
+                throw new Exception("No Location header found");
+            }
         } catch (Exception e) {
-            reportError("Could not load url.", result);
+            reportError("Could not load url " + redirURL + ": " + e.toString(), result);
             return;
         } // try
 
@@ -219,57 +223,34 @@
 
         String videoId = "";
         String tId = "";
-        while (true) {
-            String line = null;
 
-            try {
-                line = inputFile.readLine();
-            } catch (IOException e) {
-                line = null;
-            }
-
-            if (line == null) {
-                break;
-            }
-
-            int start =
-                line.indexOf("swfArgs");
-            if (start == -1) {
-                continue;
-            } else {
-                // Extract the video_id from the args line
-                Pattern vidpat = Pattern.compile("video_id:'[\\w\\d]+'?");
-                Pattern tpat = Pattern.compile("t:'[\\w\\d]+'?");
-                Matcher vidmatcher = vidpat.matcher(line);
-                Matcher tmatcher = tpat.matcher(line);
-                if ( vidmatcher.find() ) {
-                    videoId = (line.substring(vidmatcher.start(), vidmatcher.end()));
-                    videoId = videoId.substring(10, videoId.length()-1);
-                } else {
-                    reportError("video_id argument not found in HTML page", result);
-                    return;
-                }
-                if ( tmatcher.find() ) {
-                    tId = (line.substring(tmatcher.start(), tmatcher.end()));
-                    tId = tId.substring(3, tId.length()-1);
-                } else {
-                    reportError("t argument not found in HTML page", result);
-                    return;
-                }
-            }
-
-            String url =
-                "http://www.youtube.com/get_video?video_id=" + videoId + "&t=" + tId;
-            
-            resultEl.setAttribute("id", videoId);
-            resultEl.setAttribute("t", tId);
-            resultEl.setAttribute("url", url);
-            result.setRootElement(resultEl);
-
+        // Extract the video_id and t fields from 
+        Pattern vidpat = Pattern.compile("video_id=[\\w\\d]+'?");
+        Pattern tpat = Pattern.compile("t=[\\w\\d\\-]+'?");
+        Matcher vidmatcher = vidpat.matcher(redirURL);
+        Matcher tmatcher = tpat.matcher(redirURL);
+        if ( vidmatcher.find() ) {
+            videoId = (redirURL.substring(vidmatcher.start(), vidmatcher.end()));
+            videoId = videoId.substring(9, videoId.length());
+        } else {
+            reportError("video_id argument not found in HTML page", result);
             return;
         }
+        if ( tmatcher.find() ) {
+            tId = (redirURL.substring(tmatcher.start(), tmatcher.end()));
+            tId = tId.substring(2, tId.length());
+        } else {
+            reportError("t argument not found in URL", result);
+            return;
+        }
 
-        reportError("Could not find SWFObject at url " + pageUrl, result);
+        String url =
+            "http://www.youtube.com/get_video?video_id=" + videoId + "&t=" + tId;
+
+        resultEl.setAttribute("id", videoId);
+        resultEl.setAttribute("t", tId);
+        resultEl.setAttribute("url", url);
+        result.setRootElement(resultEl);
     }
 
 

Modified: openlaszlo/branches/devildog/demos/youtube/youtube.lzx
===================================================================
--- openlaszlo/branches/devildog/demos/youtube/youtube.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/demos/youtube/youtube.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,5 +1,5 @@
 <!-- X_LZ_COPYRIGHT_BEGIN ************************************************
-* Copyright 2007 Laszlo Systems, Inc.  All Rights Reserved.              *
+* Copyright 2007, 2008 Laszlo Systems, Inc.  All Rights Reserved.        *
 * Use is subject to license terms.                                       *
 * X_LZ_COPYRIGHT_END ************************************************** -->
 
@@ -7,7 +7,6 @@
 <canvas
   width="100%"
   height="100%"
-  proxied="true"
 >
     
     <include href="av/videoutils.lzx"/>

Modified: openlaszlo/branches/devildog/docs/component-browser/common.lzx
===================================================================
--- openlaszlo/branches/devildog/docs/component-browser/common.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/component-browser/common.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -67,9 +67,9 @@
         <attribute name="textcolor" value="0x000000" type="number" />
         <attribute name="textselectedcolor" value="0xFFFFFF" type="number" />
         <method event="onclick">
-            var file = (this.file != '' ? this.file : this.text + '.html');
+            var file = (this.file != '' ? this.file : 'lz.' + this.text + '.html');
             var url = canvas.urlprefix + file;
-            LzBrowser.loadURL('javascript: var wptr = window.open("' + url + '","laszlo-reference","resizable=1,width=1000,height=700,left=0,top=0,screenX=0,screenY=0,menubar,location,status,scrollbars,toolbar,address"); wptr.focus(); void(0);');
+            LzBrowser.loadURL('javascript: var wptr = window.open("' + url + '","laszlo_reference","resizable=1,width=1000,height=700,left=0,top=0,screenX=0,screenY=0,menubar,location,status,scrollbars,toolbar,address"); wptr.focus(); void(0);');
         </method>
         <method event="onmouseup">
             setAttribute('fgcolor', this.texthilitecolor)
@@ -85,6 +85,6 @@
 
 </library>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.              *
+* Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.              *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/branches/devildog/docs/component-browser/formview.lzx
===================================================================
--- openlaszlo/branches/devildog/docs/component-browser/formview.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/component-browser/formview.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -7,15 +7,15 @@
             <view width="50%">
                 <border width="${parent.width}" height="50" cbgcolor="${canvas.lcdcolor}">
                     <view layout="axis: y" align="center">
-                        <textlink file="lz-checkbox.html">checkbox</textlink>
-                        <textlink file="lz-edittext.html">edittext</textlink>
-                        <textlink file="lz-combobox.html">combobox</textlink>
+                        <textlink>checkbox</textlink>
+                        <textlink>edittext</textlink>
+                        <textlink>combobox</textlink>
                     </view>
                 </border>
             </view>
             <view width="50%" layout="axis: y">
                 <border width="${parent.width}" height="25" cbgcolor="${canvas.lcdcolor}">
-                    <textlink file="lz-radiogroup.html">radiogroup</textlink>
+                    <textlink>radiogroup</textlink>
                 </border>
                 <border width="${parent.width}" height="25" cbgcolor="${canvas.basecolor}">
                     <textlink>baselist</textlink>
@@ -29,7 +29,7 @@
 
     <class name="baselistitemview" layout="axis: y">
         <border width="${parent.width}" height="50" cbgcolor="${canvas.lcdcolor}">
-            <textlink y="10" file="lz-radio.html">radiobutton</textlink>
+            <textlink y="10">radiobutton</textlink>
         </border>
         <border width="${parent.width}" height="20" cbgcolor="${canvas.basecolor}">
             <textlink>baselistitem</textlink>
@@ -48,7 +48,7 @@
 
     <class name="basebuttonview" layout="axis: y">
         <border width="${parent.width}" height="70" cbgcolor="${canvas.lcdcolor}">
-            <textlink y="10" file="lz-button.html">button</textlink>
+            <textlink y="10">button</textlink>
         </border>
         <border width="${parent.width}" height="20" cbgcolor="${canvas.basecolor}">
             <view align="center" layout="axis: x">
@@ -69,7 +69,7 @@
 
     <class name="baseformview" layout="axis: y">
         <border width="${parent.width}" height="70" cbgcolor="${canvas.lcdcolor}">
-            <textlink y="10" file="lz-form.html">form</textlink>
+            <textlink y="10">form</textlink>
         </border>
         <border width="${parent.width}" height="40" cbgcolor="${canvas.basecolor}">
             <textlink y="10">baseform</textlink>
@@ -82,7 +82,7 @@
             <baseformview width="20%"/>
         </view>
         <border width="${parent.width}" height="20" cbgcolor="${canvas.lfccolor}">
-            <textlink>view</textlink>
+            <textlink file="LzView.html">view</textlink>
         </border>
     </class>
 
@@ -94,12 +94,12 @@
             </border>
         </view>
         <border width="${parent.width}" height="20" cbgcolor="${canvas.lfccolor}">
-            <textlink>node</textlink>
+            <textlink file="LzNode.html">node</textlink>
         </border>
     </class>
 
 </library>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.              *
+* Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.              *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/branches/devildog/docs/component-browser/listview.lzx
===================================================================
--- openlaszlo/branches/devildog/docs/component-browser/listview.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/component-browser/listview.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -6,19 +6,19 @@
         
         <view width="${parent.width}" layout="axis: x">
             <border width="50%" height="40" cbgcolor="${canvas.lcdcolor}">
-                <textlink y="10" file="lz-floatinglist.html">floatinglist</textlink>
+                <textlink y="10">floatinglist</textlink>
             </border>
             <border width="50%" height="40" cbgcolor="${canvas.lcdcolor}">
-                <textlink y="10" file="lz-textlistitem.html">textlistitem</textlink>
+                <textlink y="10">textlistitem</textlink>
             </border>
         </view>
 
         <view width="${parent.width}" layout="axis: x">
             <border width="50%" height="40" cbgcolor="${canvas.lcdcolor}">
-                <textlink y="10" file="lz-list.html">list</textlink>
+                <textlink y="10">list</textlink>
             </border>
             <border width="50%" height="40" cbgcolor="${canvas.lcicolor}">
-                <textlink y="10" file="lz-listitem.html">listitem</textlink>
+                <textlink y="10">listitem</textlink>
             </border>
         </view>
 
@@ -34,6 +34,6 @@
     </class>
 </library>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.              *
+* Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.              *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/branches/devildog/docs/component-browser/menuview.lzx
===================================================================
--- openlaszlo/branches/devildog/docs/component-browser/menuview.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/component-browser/menuview.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -4,13 +4,13 @@
 
     <class name="menuitemview" layout="axis: y">
         <border width="100%" height="20" cbgcolor="${canvas.lcdcolor}">
-            <textlink file="lz-menuitem.html">menuitem</textlink>
+            <textlink>menuitem</textlink>
         </border>
         <border width="100%" height="20" cbgcolor="${canvas.lcdcolor}">
-            <textlink file="lz-textlistitem.html">textlistitem</textlink>
+            <textlink>textlistitem</textlink>
         </border>
         <border width="100%" height="20" cbgcolor="${canvas.lcicolor}">
-            <textlink file="lz-listitem.html">listitem</textlink>
+            <textlink>listitem</textlink>
         </border>
         <border width="100%" height="20" cbgcolor="${canvas.basecolor}">
             <textlink>baselistitem</textlink>
@@ -24,9 +24,9 @@
         <border width="50%" height="100" cbgcolor="${canvas.lcdcolor}">
             <view width="100%" y="10">
                 <simplelayout axis="y" />
-                <textlink file="lz-menu.html">menu</textlink>
-                <textlink file="lz-menubar.html">menubar</textlink>
-                <textlink file="lz-menuseparator.html">menuseparator</textlink>
+                <textlink>menu</textlink>
+                <textlink>menubar</textlink>
+                <textlink>menuseparator</textlink>
             </view>
         </border>
         <menuitemview width="50%" />
@@ -41,6 +41,6 @@
 
 </library>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.              *
+* Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.              *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/branches/devildog/docs/component-browser/scrollbarview.lzx
===================================================================
--- openlaszlo/branches/devildog/docs/component-browser/scrollbarview.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/component-browser/scrollbarview.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -4,7 +4,7 @@
 
     <class name="scrollbarview" layout="axis: y">
         <border width="100%" height="40" cbgcolor="${canvas.lcdcolor}">
-            <textlink y="10" file="lz-scrollbar.html">scrollbar</textlink>
+            <textlink y="10">scrollbar</textlink>
         </border>
         <border width="100%" height="40" cbgcolor="${canvas.basecolor}">
             <textlink y="10">basescrollbar</textlink>
@@ -16,6 +16,6 @@
 
 </library>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.              *
+* Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.              *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/branches/devildog/docs/component-browser/tabsview.lzx
===================================================================
--- openlaszlo/branches/devildog/docs/component-browser/tabsview.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/component-browser/tabsview.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -5,10 +5,10 @@
     <class name="tabsbarview1" layout="axis: y">
         <view width="50%" layout="axis: x">
             <border width="${parent.width}" height="20" cbgcolor="${canvas.lcdcolor}">
-                <textlink file="lz-tabsbar.html">tabsbar</textlink>
+                <textlink>tabsbar</textlink>
             </border>
             <border width="${parent.width}" height="20" cbgcolor="${canvas.lcdcolor}">
-                <textlink file="lz-tabsbar.html">tab</textlink>
+                <textlink>tab</textlink>
             </border>
         </view>
         <view width="50%" layout="axis: x">
@@ -54,7 +54,7 @@
     <class name="tabsview1" layout="axis: x">
         <view width="25%" layout="axis: y">
             <border width="${parent.width}" height="20" cbgcolor="${canvas.lcdcolor}">
-                <textlink file="lz-tabs.html">tabs</textlink>
+                <textlink>tabs</textlink>
             </border>
             <border width="${parent.width}" height="80" cbgcolor="${canvas.basecolor}">
                 <textlink>basetabs</textlink>
@@ -62,7 +62,7 @@
         </view>
         <view width="25%" layout="axis: y">
             <border width="${parent.width}" height="20" cbgcolor="${canvas.lcdcolor}">
-                <textlink file="lz-tabpane.html">tabpane</textlink>
+                <textlink>tabpane</textlink>
             </border>
             <border width="${parent.width}" height="80" cbgcolor="${canvas.basecolor}">
                 <textlink>basetabpane</textlink>
@@ -81,6 +81,6 @@
     </class>
 </library>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.              *
+* Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.              *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/branches/devildog/docs/component-browser/treeview.lzx
===================================================================
--- openlaszlo/branches/devildog/docs/component-browser/treeview.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/component-browser/treeview.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -4,7 +4,7 @@
 
     <class name="treeview" layout="axis: y">
         <border width="100%" height="40" cbgcolor="${canvas.lcdcolor}">
-            <textlink y="10" file="lz-tree.html">tree</textlink>
+            <textlink y="10">tree</textlink>
         </border>
         <border width="100%" height="40" cbgcolor="${canvas.basecolor}">
             <textlink y="10">basetree</textlink>
@@ -16,6 +16,6 @@
 
 </library>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.              *
+* Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.              *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/branches/devildog/docs/component-browser/windowview.lzx
===================================================================
--- openlaszlo/branches/devildog/docs/component-browser/windowview.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/component-browser/windowview.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -6,18 +6,18 @@
         <view width="100%" layout="axis: x">
             <view width="50%" layout="axis: y">
                 <border width="100%" height="20" cbgcolor="${canvas.lcdcolor}">
-                    <textlink file="lz-alert.html">alert</textlink>
+                    <textlink>alert</textlink>
                 </border>
                 <border width="100%" height="20" cbgcolor="${canvas.lcdcolor}">
-                    <textlink file="lz-modaldialog.html">modaldialog</textlink>
+                    <textlink>modaldialog</textlink>
                 </border>
             </view>
             <border width="50%" height="40" cbgcolor="${canvas.lcdcolor}">
-                <textlink y="10" file="lz-window.html">window</textlink>
+                <textlink y="10">window</textlink>
             </border>
         </view>
         <border width="100%" height="20" cbgcolor="${canvas.lcicolor}">
-            <textlink file="lz-windowpanel.html">windowpanel</textlink>
+            <textlink>windowpanel</textlink>
         </border>
         <border width="100%" height="20" cbgcolor="${canvas.basecolor}">
             <textlink>basewindow</textlink>
@@ -29,6 +29,6 @@
 
 </library>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.              *
+* Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.              *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/branches/devildog/docs/src/deployers/logging.dbk
===================================================================
--- openlaszlo/branches/devildog/docs/src/deployers/logging.dbk	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/src/deployers/logging.dbk	2008-02-26 20:32:17 UTC (rev 8108)
@@ -39,8 +39,8 @@
 The Jakarta Tomcat 5.0 container, by default, keeps its logs 
 in <literal>$TOMCAT_HOME/logs</literal>.   Depending on how tomcat was started, it may also display some of its
 logs in a console or terminal window as well.
-The <ulink url="http://jakarta.apache.org/tomcat/tomcat-5.0-doc/config/index.html">Tomcat 5.0 configuration guide</ulink> 
-has details on its <ulink url="http://jakarta.apache.org/tomcat/tomcat-5.0-doc/config/logger.html">Logger</ulink> configuration.  
+See the <ulink url="http://tomcat.apache.org/">Tomcat web site</ulink> 
+for more information.  
 In general, see the documentation on your container for details on how to locate and configure these logs.
 </para>
 

Modified: openlaszlo/branches/devildog/docs/src/developers/constraints.dbk
===================================================================
--- openlaszlo/branches/devildog/docs/src/developers/constraints.dbk	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/src/developers/constraints.dbk	2008-02-26 20:32:17 UTC (rev 8108)
@@ -15,8 +15,8 @@
 as well.</para>
 
 <para/></section><section><title>Syntax for creating and removing constraints</title>
-<para>Constraints may be created in either of two ways:</para>
-<itemizedlist spacing="compact"><listitem><para>in a tag, using the ${} syntax to tie the value of one attribute to that of another</para></listitem><listitem><para>in script, using the <indexterm><primary><literal>applyConstraint()</literal></primary></indexterm><methodname>applyConstraint()</methodname> method</para></listitem><listitem><para>in script, using delegates</para></listitem></itemizedlist>
+<para>Constraints may be created as follows:</para>
+<itemizedlist spacing="compact"><listitem><para>in a tag, using the ${} syntax to tie the value of one attribute to that of another</para></listitem><listitem><para>in script, using the <indexterm><primary><literal>applyConstraintMethod()</literal></primary></indexterm><methodname>applyConstraintMethod()</methodname> method</para></listitem><listitem><para>in script, using delegates</para></listitem></itemizedlist>
 <para>These are described in turn below.</para>
 <para>There is no method for removing constraints.  Therefore if you have a constraint that you wish to sometimes be in force and other times not be in force, you should use <indexterm><primary>state</primary></indexterm><sgmltag class="element">&lt;state&gt;</sgmltag><remark role="fixme">[unknown tag]</remark>
 <!--unknown tag: state-->
@@ -38,20 +38,20 @@
 
 <para role="fixme"><remark role="fixme"><emphasis role="para-label">FIXME: </emphasis> note the lousy explanation below </remark></para>
 
-<para>The following example uses the <indexterm><primary><literal>applyConstraint()</literal></primary></indexterm><methodname>applyConstraint()</methodname> method inherited from <indexterm><primary>LzNode</primary></indexterm><classname>LzNode</classname> in order to create a constraint at
+<para>The following example uses the <indexterm><primary><literal>applyConstraintMethod()</literal></primary></indexterm><methodname>applyConstraintMethod()</methodname> method inherited from <indexterm><primary>LzNode</primary></indexterm><classname>LzNode</classname> in order to create a constraint at
 runtime. You'll see that the <literal>setConstraint</literal> method has the same effect as the simple expression <literal>y=${m.y}</literal>
 </para>
 
 
 <example role="live-example">
-   <title>Runtime constraintes with applyConstraint</title>
+   <title>Runtime constraintes with applyConstraintMethod</title>
    <programlisting language="lzx">
    <textobject><textdata fileref="programs/constraints-$1.lzx"/></textobject> 
    </programlisting>
 </example>
 
 
-<para><literal>f</literal> is a callback function that is required for the <indexterm><primary><literal>applyConstraint()</literal></primary></indexterm><methodname>applyConstraint()</methodname> method. <varname>d</varname> 
+<para><literal>f</literal> is a callback function that is required for the <indexterm><primary><literal>applyConstraintMethod()</literal></primary></indexterm><methodname>applyConstraintMethod()</methodname> method. <varname>d</varname> 
 is an array consisting of a pointer to a reference node, and the attribute to bind to.</para>
 <para/></section><section><title>Delegates and constraints</title> 
 <para>Laszlo applications can use something called a <glossterm>delegate</glossterm> in script to associate a 

Modified: openlaszlo/branches/devildog/docs/src/developers/index.dbk
===================================================================
--- openlaszlo/branches/devildog/docs/src/developers/index.dbk	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/src/developers/index.dbk	2008-02-26 20:32:17 UTC (rev 8108)
@@ -167,9 +167,9 @@
       <xi:fallback><para>Missing: Docbook Local Style Guide</para></xi:fallback>
     </xi:include>
     
-    <xi:include href="docbook-code.dbk">
+<!--    <xi:include href="docbook-code.dbk">
       <xi:fallback><para>Missing: Docbook Code Comment Style Guide</para></xi:fallback>
-    </xi:include>
+    </xi:include>-->
     
     <xi:include href="js2doc-ref.dbk">
       <xi:fallback><para>Missing: JS2Doc Reference</para></xi:fallback>

Modified: openlaszlo/branches/devildog/docs/src/developers/programs/constraints-$1.lzx
===================================================================
--- openlaszlo/branches/devildog/docs/src/developers/programs/constraints-$1.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/src/developers/programs/constraints-$1.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,22 +1,18 @@
-
-<canvas>
-  <view x="250" width="20" height="20" bgcolor="red"
-        y="${m.y}"/>
-
-  <view x="300" width="20" height="20" bgcolor="blue">  
-    <handler name="oninit">
-      var f = function () {   
-        this.setAttribute("y", m.y);       
-      }
-      var d = [m, "y"];
-      this.applyConstraint("y", f, d);
-    </handler>
-  </view>
-
-  <window id="m" x="10" title="Drag me" width="160" height="20"/>  
+<canvas> 
+  <view x="250" width="20" height="20" bgcolor="red" y="${m.y}"/> 
+  <view x="300" width="20" height="20" bgcolor="blue"> 
+    <handler name="oninit"> 
+      var d = [m, "y"]; 
+      this.applyConstraintMethod("myConstraintMethod", d); 
+    </handler> 
+    <method name="myConstraintMethod" > 
+      this.setAttribute("y", m.y); 
+    </method> 
+  </view> 
+  <window id="m" x="10" title="Drag me" width="160" height="20"/> 
 </canvas>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2007 Laszlo Systems, Inc.  All Rights Reserved.                   *
+* Copyright 2008 Laszlo Systems, Inc.  All Rights Reserved.                   *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->
 

Modified: openlaszlo/branches/devildog/docs/src/developers/tutorials/drawview-intro.dbk
===================================================================
--- openlaszlo/branches/devildog/docs/src/developers/tutorials/drawview-intro.dbk	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/src/developers/tutorials/drawview-intro.dbk	2008-02-26 20:32:17 UTC (rev 8108)
@@ -30,20 +30,11 @@
    <textobject><textdata fileref="programs/drawview-intro-$1.lzx"/></textobject> 
    </programlisting>
 </example>
-<?example role="live-example"><title>view and drawview</title><programlisting role="lzx-embednew"><filename>drawview-intro-$1.lzx</filename><parameter/><code>
-    &lt;canvas height="75" proxied="false"&gt;
-      &lt;simplelayout spacing="5" axis="x"/&gt;
-      &lt;view height="50" width="50" bgcolor="red"/&gt;
-      &lt;drawview height="50" width="50" bgcolor="blue"/&gt;
-    &lt;/canvas&gt;
-</code></programlisting><programlisting>
-    &lt;canvas height="75" proxied="false"&gt;
-      &lt;simplelayout spacing="5" axis="x"/&gt;
-      &lt;view height="50" width="50" bgcolor="red"/&gt;
-      &lt;drawview height="50" width="50" bgcolor="blue"/&gt;
-    &lt;/canvas&gt;
-</programlisting><?lzx-edit programs/drawview-intro-$1.lzx></example?>
+
 <para>
+<note>
+  <para>Previously, <literal>&lt;drawview&gt;</literal> auto-sized when OpenLaszlo only supported Flash. To make this work in DHTML and Flash consistently, <literal>size</literal> must now be explicitly set, because DHTML doesn't support autosize. <literal>size</literal> can be changed at runtime, but it may clear the canvas, in which case a new <literal>oncontext</literal> event is sent to signal a redraw is needed.  <literal>size</literal> need not be a fixed value; it can also be set to percentage values or constraint values.</para>
+</note>
 There are no additional tag attributes in the <literal>drawview</literal> class beyond those of <literal>view</literal>.  However, <literal>drawview</literal> has four attributes in addition to those it inherits:
 </para>
 <itemizedlist spacing="compact"><listitem><para>fillStyle</para></listitem><listitem><para>globalAlpha</para></listitem><listitem><para>lineWidth</para></listitem><listitem><para>strokeStyle</para></listitem></itemizedlist>
@@ -61,7 +52,7 @@
 For example, this code produces nothing visible:</para>
 <example role="live-example"><title>invisble drawing</title><programlisting>
     &lt;canvas height="200" proxied="false"&gt;
-      &lt;drawview&gt;
+      &lt;drawview height="50" width="50"&gt;
         &lt;handler name="oninit"&gt;
          this.moveTo(100,100)
          this.lineTo(200,100)

Modified: openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$10.lzx
===================================================================
--- openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$10.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$10.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,6 +1,6 @@
     
 <canvas height="200" proxied="false">
-        <drawview>
+        <drawview height="200" width="200">
             <handler name="oninit">
             this.moveTo(40,40)
             this.lineTo(80,40)
@@ -16,6 +16,6 @@
        </drawview>
     </canvas>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2007 Laszlo Systems, Inc.  All Rights Reserved.                   *
+* Copyright 2008 Laszlo Systems, Inc.  All Rights Reserved.                   *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$3.lzx
===================================================================
--- openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$3.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$3.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,5 +1,5 @@
 <canvas height="200" proxied="false">
-  <drawview>
+  <drawview height="200" width="200">
     <handler name="oninit">
      this.moveTo(100,100);
      this.lineTo(200,100);
@@ -9,6 +9,6 @@
   </drawview>
 </canvas>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2007 Laszlo Systems, Inc.  All Rights Reserved.                   *
+* Copyright 2008 Laszlo Systems, Inc.  All Rights Reserved.                   *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$4.lzx
===================================================================
--- openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$4.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$4.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,6 +1,6 @@
 
   <canvas height="200" proxied="false">
-      <drawview>
+      <drawview height="200" width="200">
         <handler name="oninit">
          this.moveTo(100,100);
          this.lineTo(200,100);
@@ -11,6 +11,6 @@
       </drawview>
     </canvas>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2007 Laszlo Systems, Inc.  All Rights Reserved.                   *
+* Copyright 2008 Laszlo Systems, Inc.  All Rights Reserved.                   *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$5.lzx
===================================================================
--- openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$5.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$5.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,6 +1,6 @@
 
   <canvas height="200" proxied="false">
-      <drawview>
+      <drawview height="200" width="200">
         <handler name="oninit">
          this.moveTo(100,100);
          this.lineTo(200,100);
@@ -13,6 +13,6 @@
       </drawview>
     </canvas>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2007 Laszlo Systems, Inc.  All Rights Reserved.                   *
+* Copyright 2008 Laszlo Systems, Inc.  All Rights Reserved.                   *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$6.lzx
===================================================================
--- openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$6.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$6.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,6 +1,6 @@
  
 <canvas height="200" proxied="false">
-      <drawview>
+      <drawview height="200" width="200">
         <handler name="oninit">
          this.moveTo(100,100);
          this.lineTo(200,100);
@@ -13,6 +13,6 @@
       </drawview>
     </canvas>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2007 Laszlo Systems, Inc.  All Rights Reserved.                   *
+* Copyright 2008 Laszlo Systems, Inc.  All Rights Reserved.                   *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$7.lzx
===================================================================
--- openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$7.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$7.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,6 +1,6 @@
     
 <canvas height="200" proxied="false">
-      <drawview>
+      <drawview height="200" width="200">
         <handler name="oninit">
          this.moveTo(100,100);
          this.lineTo(200,100);
@@ -22,6 +22,6 @@
       </drawview>
     </canvas>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2007 Laszlo Systems, Inc.  All Rights Reserved.                   *
+* Copyright 2008 Laszlo Systems, Inc.  All Rights Reserved.                   *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$9.lzx
===================================================================
--- openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$9.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/docs/src/developers/tutorials/programs/drawview-intro-$9.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,6 +1,6 @@
   
 <canvas height="200" proxied="false">
-      <drawview>
+      <drawview height="200" width="200">
         <handler name="oninit">
          this.moveTo(100,100);
          this.lineTo(200,100);
@@ -17,6 +17,6 @@
       </drawview>
     </canvas>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2007 Laszlo Systems, Inc.  All Rights Reserved.                   *
+* Copyright 2008 Laszlo Systems, Inc.  All Rights Reserved.                   *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->

Modified: openlaszlo/branches/devildog/laszlo-explorer/explore-nav.lzx
===================================================================
--- openlaszlo/branches/devildog/laszlo-explorer/explore-nav.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/laszlo-explorer/explore-nav.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -148,7 +148,7 @@
     </method>
 
     <method name="openSequence" args="seq">
-        if (seq[0] == this.name) {
+        if (seq[0] == this.title) {
             // first, open self
             this.header.open();
             if (seq.length > 1) {
@@ -181,7 +181,7 @@
         </simplelayout>
     </view>
     <itembutton name="header" level="$once{classroot.level}"
-       text="$once{classroot.name}" width="${classroot.width}"/>
+       text="$once{classroot.title}" width="${classroot.width}"/>
   </class>
 
   <!-- ItemButton class the visible portion of navButtons -->
@@ -265,7 +265,7 @@
                 
               } else {
                 if (title ==null){
-                   title = classroot.name;
+                   title = classroot.title;
                 }
                 LzBrowser.loadURL('content.jsp?src=' + src + '&tag=' + tagline +
                                   '&title=' + title + '&action=' + action + '&lzr=' + runtime, 
@@ -312,7 +312,7 @@
   </class>
 
   <class name="navbutton" extends="menubutton" width="${immediateparent.width}">
-      <attribute name="name" value="$path{'@name'}"/>
+      <attribute name="title" value="$path{'@name'}"/>
   </class>
 
   <!-- APPLICATION -->
@@ -357,7 +357,7 @@
 
 </canvas>
 <!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.              *
+* Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.              *
 * Use is subject to license terms.                                            *
 * X_LZ_COPYRIGHT_END ****************************************************** -->
 <!-- @LZX_VERSION@                                                         -->

Modified: openlaszlo/branches/devildog/lps/components/extensions/drawview.lzx
===================================================================
--- openlaszlo/branches/devildog/lps/components/extensions/drawview.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/lps/components/extensions/drawview.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,6 +1,6 @@
 <!---
    
-    @copyright Copyright 2001-2007 Laszlo Systems, Inc.  All Rights Reserved.
+    @copyright Copyright 2001-2008 Laszlo Systems, Inc.  All Rights Reserved.
                Use is subject to license terms.
    
     @access public
@@ -564,9 +564,6 @@
             var oncontext = LzDeclaredEvent;
     
             function construct(parent,args) {
-                args['width'] = args['width'] > -1 ? args.width : null;
-                args['height'] = args['height'] > -1 ? args.height : null;
-                args['clip'] = args['clip'] == true ? args.clip : null;
                 super.construct(parent, args);
                 this.context = this.getMCRef();
                 this.context.cacheAsBitmap = args['cachebitmap'] != null ? args['cachebitmap'] : this.cachebitmap;

Modified: openlaszlo/branches/devildog/lps/components/lzunit/lzunit.lzx
===================================================================
--- openlaszlo/branches/devildog/lps/components/lzunit/lzunit.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/lps/components/lzunit/lzunit.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -342,9 +342,17 @@
           Debug.debug('result is null on fail call: "' + message + '"');
         }
         if ($debug) {
+          var file = null, line = null;
+          // Find the failing test, which is four frames up
+          var bt = Debug.backtrace(4);
+          if (bt != null) {
+            var sf = bt[bt.length - 1];
+            file = sf.filename();
+            line = sf.lineno();
+          }
           Debug.freshLine();
           // create an error, which will include a backtrace, if applicable
-          Debug.__write(new LzError(null, null, message));
+          Debug.__write(new LzError(file, line, message));
         }
     </method>
 

Copied: openlaszlo/branches/devildog/test/performance/typeof-instance-of.lzx (from rev 8100, openlaszlo/trunk/test/performance/typeof-instance-of.lzx)

Modified: openlaszlo/branches/devildog/test/style/constraints/subclassing.lzx
===================================================================
--- openlaszlo/branches/devildog/test/style/constraints/subclassing.lzx	2008-02-26 19:26:26 UTC (rev 8107)
+++ openlaszlo/branches/devildog/test/style/constraints/subclassing.lzx	2008-02-26 20:32:17 UTC (rev 8108)
@@ -1,4 +1,4 @@
-<!-- Copyright 2007 Laszlo Systems -->
+<!-- Copyright 2007, 2008 Laszlo Systems -->
 <library>
 
     <!-- [bshine 10.06.2006] This test validates (LPP-2894) The
@@ -15,8 +15,6 @@
         }
     </stylesheet>
 
-    <simplelayout axis="y" spacing="5" />
-
     <!-- This class has a bgcolor defined by a style and an inner view
          whose bgcolor is defined by a style that references an
          attribute of the view that is constrained to an attribute of
@@ -46,41 +44,45 @@
     </class>
 
     <class name="lpp_4451" extends="happystyledbox" width="${parent.width/2}" />
+    <class name="lpp_4451_inverse" extends="happystyledbox" width="$style{'stylewidth'}" />
 
-    <happystyledbox id="sb0" />
+    <view id="testing" width="400" layout="axis: y; spacing: 5">
 
-    <!-- This box is maroon with an inner view of red -->
-    <happystyledbox id="sb1" bgcolor="maroon" innerColor="red" />
+      <happystyledbox id="sb0" />
 
-    <subclassbox id="sb2" />
-    <otherlassbox id="sb3" width="$style{'stylewidth'}"/>
+      <!-- This box is maroon with an inner view of red -->
+      <happystyledbox id="sb1" bgcolor="maroon" innerColor="red" />
 
-    <subclassbox id="sb4" />
+      <subclassbox id="sb2" />
+      <otherlassbox id="sb3" width="$style{'stylewidth'}"/>
 
-    <lpp_4451 id="sb5" width="$style{'stylewidth'}"/>
+      <subclassbox id="sb4" />
 
+      <lpp_4451 id="sb5" width="$style{'stylewidth'}"/>
+      <lpp_4451_inverse id="sb6" width="${parent.width/2}"/>
+    </view>
     <class name="CSSSubclassingTestCase" extends="TestCase" >
 
          <method name="testClassConstraint">
-             this.assertEquals(purple, sb0.getAttribute("bgcolor"));
-             this.assertEquals(fuchsia, sb0.inner.getAttribute("bgcolor"));
+             this.assertEquals(purple, sb0.getAttribute("bgcolor"), "Class CSS value");
+             this.assertEquals(fuchsia, sb0.inner.getAttribute("bgcolor"), "Class CSS attr");
          </method>
 
          <method name="testInstanceOverrideConstraint">
-             this.assertEquals(maroon, sb1.getAttribute("bgcolor"));
-             this.assertEquals(red, sb1.inner.getAttribute("bgcolor"));
+             this.assertEquals(maroon, sb1.getAttribute("bgcolor"), "Instance override CSS value");
+             this.assertEquals(red, sb1.inner.getAttribute("bgcolor"), "Instance override CSS attr");
          </method>
 
          <method name="testSubclassOverrideConstraint">
              <![CDATA[
-             this.assertEquals("150", sb2.getAttribute("width"));
-             this.assertEquals(navy, sb2.getAttribute("bgcolor")); // fails! [2007.05.28 bshine]
-             this.assertEquals(blue, sb2.inner.getAttribute("bgcolor"));
-             this.assertEquals(green, sb3.getAttribute("bgcolor")); // fails! [2007.05.28 bshine]
-             this.assertEquals(999, sb3.getAttribute("width"));
-             this.assertEquals(lime, sb3.inner.getAttribute("bgcolor"));
-             // FIXME: [2007-08-08 ptw] (LPP-4451) Uncomment when fixed
-             // this.assertEquals(999, sb5.width, "LPP-4451");
+             this.assertEquals("150", sb2.getAttribute("width"), "Subclass override attribute");
+             this.assertEquals(navy, sb2.getAttribute("bgcolor"), "Subclass override CSS value");
+             this.assertEquals(blue, sb2.inner.getAttribute("bgcolor"), "Subclass override CSS attr");
+             this.assertEquals(green, sb3.getAttribute("bgcolor"), "Subclass override CSS value");
+             this.assertEquals(999, sb3.getAttribute("width"), "Subclass CSS value override");
+             this.assertEquals(lime, sb3.inner.getAttribute("bgcolor"), "Subclass override CSS attr attribute");
+             this.assertEquals(999, sb5.width, "LPP-4451");
+             this.assertEquals(testing.width/2, sb6.width, "LPP-4451-inverse");
              ]]>
          </method>
      </class>



More information about the Laszlo-checkins mailing list