src/cm/media/js/lib/yui/yui_3.0.0b1/examples/attribute/attribute-getset.html
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 0 40c8f766c9b8
permissions -rw-r--r--
add link to "privacy policy" in the header test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
<html>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
<head>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
	<title>YUI Library Examples: Attribute: Getters, Setters and Validators</title>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
    	<link rel="stylesheet" type="text/css" href="../../assets/yui.css" >
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
<style>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
    /*Supplemental CSS for the YUI distribution*/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
    #custom-doc { width: 95%; min-width: 950px; }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
    #pagetitle {background-image: url(../../assets/bg_hd.gif);}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
/*    #pagetitle h1 {background-image: url(../../assets/title_h_bg.gif);}*/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
</style>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
<link rel="stylesheet" type="text/css" href="../../assets/dpSyntaxHighlighter.css">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
<link type="text/css" rel="stylesheet" href="../../build/cssfonts/fonts-min.css" />
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
<script type="text/javascript" src="../../build/yui/yui-min.js"></script>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
<style type="text/css">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
    #boxParent {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
        overflow:hidden;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
        background-color:#004c6d;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
        height:25em;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
        padding:10px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
        margin:5px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
    #boxParent .yui-box p, #attrs p {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
        margin:2px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
    .attrs {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
        border:1px solid #000;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
        background-color:#cdcdcd;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
        margin:5px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
    .attrs .header {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
        font-weight:bold;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
        background-color:#aaa;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
        padding:5px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
    .attrs .body {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
        padding:10px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
    .attrs .body .hints li {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
        padding-bottom:10px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
    .attrs .footer {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
        padding:0px 20px 10px 20px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
    .attrs label {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
        font-weight:bold;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
        display:block;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
        float:left;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
        width:4em;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
    .attrs .hint {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
        font-size:85%;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
        color: #004c6d;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
    .attrs .fields {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
        border-top:1px solid #aaa;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
        padding:10px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
    .yui-box {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
        padding:5px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
        border:1px solid #000;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
        width:8em;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
        height:8em;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
        text-align:center;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
        color:#000;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
    .yui-box .color, .yui-box .coord {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
        font-family:courier;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    85
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
</style>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
</head>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    90
<body id="yahoo-com" class=" yui-skin-sam">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    91
<div id="custom-doc" class="yui-t2">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    92
<div id="hd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
	<div id="ygunav">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
		<p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
            <em>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
                <a href="http://developer.yahoo.com/yui/3/">YUI 3.x Home</a> <i> - </i>	
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
            </em>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
		</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
		<form action="http://search.yahoo.com/search" id="sitesearchform">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
            <input name="vs" type="hidden" value="developer.yahoo.com">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
            <input name="vs" type="hidden" value="yuiblog.com">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
		    <div id="sitesearch">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
		    	<label for="searchinput">Site Search (YDN &amp; YUIBlog): </label>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
			    <input type="text" id="searchinput" name="p">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   105
			    <input type="submit" value="Search" id="searchsubmit" class="ygbt">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   106
		    </div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   107
		</form>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   108
    </div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
	<div id="ygma"><a href="../../"><img src="../../assets/logo.gif"  border="0" width="200" height="93"></a></div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   110
	<div id="pagetitle"><h1>YUI Library Examples: Attribute: Getters, Setters and Validators</h1></div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   111
</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   112
<div id="bd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   113
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   114
	<div id="bar-note"><p><strong>Note:</strong> This is YUI 3.x. Looking for <a href="http://developer.yahoo.com/yui/">YUI 2.x</a>?</p></div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
	<div id="yui-main">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   117
		<div class="yui-b">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   118
		  <div class="yui-ge">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
			  <div class="yui-u first example" id="main">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
	<h2>Attribute: Getters, Setters and Validators</h2>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   122
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   123
	<div id="example" class="promo">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   124
	<p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   125
	The <a href="attribute-basic.html">Basic Configuration</a> example shows how we can add attributes to a host class, and set up default values for them using the attribute configuration object. This example explores how you can configure <code>setter</code>, <code>getter</code> and <code>validator</code> functions for individual attributes, which can be used to modify or normalize attribute values during get and set invocations, and prevent invalid values from being stored. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   126
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   127
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   128
	</p>	
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   129
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   130
	<div class="module example-container ">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   131
			<div class="hd exampleHd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   132
			<p class="newWindowButton yui-skin-sam">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   133
                <a href="attribute-getset_clean.html" target="_blank">View example in new window.</a>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   134
            </p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   135
		</div>		<div id="example-canvas" class="bd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   136
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   137
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   138
	<!--BEGIN SOURCE CODE FOR EXAMPLE =============================== -->
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   139
	
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   140
	<div id="attrs" class="attrs">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   141
    <div class="header">Enter new values and click the "Set" buttons</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   142
    <div class="body">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   143
        <ul class="hints">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   144
            <li>Try entering valid and invalid values for x, y; or values which attempt to position the box outside it's parent (parent box co-ordinates are displayed next to the text box).</li>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   145
            <li>Try entering rgb, hex or keyword color values [ <code>rgb(255,0,0)</code>, <code>#ff0000</code>, <code>red</code> ].</li>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   146
        </ul>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   147
        <div class="fields">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   148
            <p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   149
                <label for="x">x:</label>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   150
                <input type="text" name="x" id="x" />
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   151
                <button type="button" class="action" id="setX">Set</button>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   152
                <span id="xhint" class="hint"></span>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   153
            </p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   154
            <p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   155
                <label for="y">y:</label>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   156
                <input type="text" name="y" id="y" />
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   157
                <button type="button" class="action" id="setY">Set</button>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   158
                <span id="yhint" class="hint"></span>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   159
            </p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   160
            <p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   161
                <label for="color">color:</label>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   162
                <input type="text" name="color" id="color" />
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   163
                <button type="button" class="action" id="setColor">Set</button>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   164
            </p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   165
        </div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   166
    </div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   167
    <div class="footer">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   168
        <button type="button" class="action" id="setXY">Set XY</button>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   169
        <button type="button" class="action" id="setAll">Set All</button>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   170
        <button type="button" class="action" id="getAll">Get All</button>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   171
    </div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   172
</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   173
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   174
<div id="boxParent"></div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   175
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   176
<script type="text/javascript">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   177
// Get a new YUI instance 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   178
YUI({base:"../../build/", timeout: 10000}).use("node", "attribute", function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   179
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   180
    // Shortcut for Y.Lang;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   181
    var L = Y.Lang;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   182
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   183
    var boxParent = Y.Node.get("#boxParent");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   184
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   185
    // Setup a custom class with attribute support
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   186
    function Box(cfg) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   187
        this._createNode(cfg);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   188
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   189
        this.addAttrs(Y.merge(Box.ATTRIBUTES), cfg);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   190
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   191
        this._sync();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   192
        this._bind();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   193
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   194
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   195
    Box.BUFFER = 5;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   196
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   197
    // Create the box node
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   198
    Box.prototype._createNode = function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   199
        this._node = Y.Node.create('<div class="yui-box"><p>Positioned Box</p><p class="coord"></p><p class="color">None</p></div>');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   200
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   201
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   202
    // Update rendered state to match the attribute state
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   203
    Box.prototype._sync = function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   204
        this._syncParent();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   205
        this._syncXY();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   206
        this._syncColor();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   207
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   208
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   209
    Box.prototype._syncParent = function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   210
        this.get("parent").appendChild(this._node);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   211
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   212
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   213
    Box.prototype._syncXY = function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   214
        this._node.setXY(this.get("xy"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   215
        this._node.query("p.coord").set("innerHTML", "[" + this.get("x") + "," + this.get("y") + "]");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   216
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   217
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   218
    Box.prototype._syncColor = function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   219
        this._node.setStyle("backgroundColor", this.get("color"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   220
        this._node.query("p.color").set("innerHTML", this.get("color"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   221
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   222
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   223
    // Bind listeners for attribute change events
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   224
    Box.prototype._bind = function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   225
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   226
        // Reflect any changes in xy, to the rendered Node
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   227
        this.after("xyChange", this._syncXY);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   228
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   229
        // Reflect any changes in color, to the rendered Node
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   230
        // and output the color value received from get
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   231
        this.after("colorChange", this._syncColor);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   232
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   233
        // Append the rendered node to the parent provided
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   234
        this.after("parentChange", this._syncParent);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   235
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   236
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   237
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   238
    // Get min, max unconstrained values for X. Using Math.round to handle FF3's sub-pixel region values
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   239
    Box.prototype.getXConstraints = function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   240
        var parentRegion = this.get("parent").get("region");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   241
        return [Math.round(parentRegion.left + Box.BUFFER), Math.round(parentRegion.right - this._node.get("offsetWidth") - Box.BUFFER)];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   242
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   243
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   244
    // Get min, max unconstrained values for Y.  Using Math.round to handle FF3's sub-pixel region values
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   245
    Box.prototype.getYConstraints = function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   246
        var parentRegion = this.get("parent").get("region");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   247
        return [Math.round(parentRegion.top + Box.BUFFER), Math.round(parentRegion.bottom - this._node.get("offsetHeight") - Box.BUFFER)];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   248
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   249
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   250
    // Constrain the x,y value provided
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   251
    Box.prototype.constrain = function(val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   252
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   253
        // If the X value places the box outside it's parent,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   254
        // modify it's value to place the box inside it's parent.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   255
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   256
        var xConstraints = this.getXConstraints();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   257
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   258
        if (val[0] < xConstraints[0]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   259
            val[0] = xConstraints[0];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   260
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   261
            if (val[0] > xConstraints[1]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   262
                val[0] = xConstraints[1];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   263
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   264
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   265
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   266
        // If the Y value places the box outside it's parent,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   267
        // modify it's value to place the box inside it's parent.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   268
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   269
        var yConstraints = this.getYConstraints();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   270
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   271
        if (val[1] < yConstraints[0]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   272
            val[1] = yConstraints[0];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   273
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   274
            if (val[1] > yConstraints[1]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   275
                val[1] = yConstraints[1];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   276
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   277
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   278
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   279
        return val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   280
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   281
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   282
    // Setup attribute configuration
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   283
    Box.ATTRIBUTES = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   284
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   285
        "parent" : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   286
            value: null
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   287
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   288
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   289
        "x" : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   290
            setter: function(val, name) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   291
                // Pass through x value to xy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   292
                this.set("xy", [parseInt(val), this.get("y")]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   293
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   294
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   295
            getter: function(val, name) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   296
                // Get x value from xy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   297
                return this.get("xy")[0];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   298
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   299
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   300
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   301
        "y" : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   302
            setter: function(val, name) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   303
                // Pass through y value to xy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   304
                this.set("xy", [this.get("x"), parseInt(val)]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   305
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   306
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   307
            getter: function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   308
                // Get y value from xy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   309
                return this.get("xy")[1];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   310
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   311
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   312
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   313
        "xy" : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   314
            // Actual stored xy co-ordinates
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   315
            value: [0, 0],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   316
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   317
            setter: function(val, name) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   318
                // Constrain XY value to the parent element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   319
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   320
                // Returns the constrained xy value, which will
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   321
                // be the final value stored.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   322
                return this.constrain(val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   323
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   324
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   325
            validator: function(val, name) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   326
                // Ensure we only store a valid data value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   327
                return (L.isArray(val) && val.length == 2 && L.isNumber(val[0]) && L.isNumber(val[1]));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   328
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   329
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   330
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   331
        "color" : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   332
            value: "olive",
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   333
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   334
            getter: function(val, name) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   335
                // Always normalize the returned value to 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   336
                // a hex color value,  even if the stored 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   337
                // value is a keyword, or an rgb value.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   338
                if (val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   339
                    return Y.Color.toHex(val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   340
                } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   341
                    return null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   342
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   343
            },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   344
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   345
            validator: function(val, name) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   346
                // Ensure we only store rgb, hex or keyword values.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   347
                return (Y.Color.re_RGB.test(val) || Y.Color.re_hex.test(val) || Y.Color.KEYWORDS[val]); 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   348
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   349
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   350
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   351
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   352
    Y.augment(Box, Y.Attribute);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   353
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   354
    // ------
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   355
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   356
    // Create a new instance of Box
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   357
    var box = new Box({
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   358
        parent : boxParent 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   359
    });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   360
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   361
    // Set references to form controls
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   362
    var xTxt = Y.Node.get("#x");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   363
    var yTxt = Y.Node.get("#y");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   364
    var colorTxt = Y.Node.get("#color");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   365
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   366
    var xHint = Y.Node.get("#xhint");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   367
    var yHint = Y.Node.get("#yhint");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   368
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   369
    function getAll() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   370
        xTxt.set("value", box.get("x"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   371
        yTxt.set("value", box.get("y"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   372
        colorTxt.set("value", box.get("color"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   373
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   374
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   375
    // Bind DOM events for Form Controls
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   376
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   377
    // Use event delegation for the action button clicks
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   378
    Y.on("delegate", function(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   379
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   380
        // Get Node target from the event object
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   381
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   382
        // We already know it's a button which has an action because
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   383
        // of our selector (button.action), so all we need to do is 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   384
        // route it based on the id.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   385
        var id = e.currentTarget && e.currentTarget.get("id");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   386
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   387
        switch (id) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   388
            case "setXY":
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   389
                box.set("xy", [parseInt(xTxt.get("value")), parseInt(yTxt.get("value"))]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   390
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   391
            case "setX":
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   392
                box.set("x", parseInt(xTxt.get("value")));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   393
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   394
            case "setY":
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   395
                box.set("y", parseInt(yTxt.get("value")));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   396
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   397
            case "setColor":
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   398
                box.set("color", L.trim(colorTxt.get("value")));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   399
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   400
            case "setAll":
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   401
                box.set("xy", [parseInt(xTxt.get("value")), parseInt(yTxt.get("value"))]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   402
                box.set("color", L.trim(colorTxt.get("value")));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   403
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   404
            case "getAll":
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   405
                getAll();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   406
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   407
            default:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   408
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   409
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   410
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   411
    }, "#attrs", "click", "button.action");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   412
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   413
    // Bind listeners to provide min, max unconstrained value hints for x, y
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   414
    // (focus/blur doesn't bubble, so bind individual listeners)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   415
    Y.on("focus", function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   416
        var minmax = box.getXConstraints();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   417
        xHint.set("innerHTML", "Valid values: " + minmax[0] + " to " + minmax[1]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   418
    }, xTxt);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   419
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   420
    Y.on("focus", function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   421
        var minmax = box.getYConstraints();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   422
        yHint.set("innerHTML", "Valid values: " + minmax[0] + " to " + minmax[1]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   423
    }, yTxt);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   424
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   425
    Y.on("blur", function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   426
        xHint.set("innerHTML", "");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   427
    }, xTxt);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   428
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   429
    Y.on("blur", function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   430
        yHint.set("innerHTML", "");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   431
    }, yTxt);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   432
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   433
    getAll();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   434
});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   435
</script>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   436
	
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   437
	<!--END SOURCE CODE FOR EXAMPLE =============================== -->
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   438
	
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   439
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   440
		</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   441
	</div>			
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   442
	</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   443
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   444
	<h3>Getter, Setter And Validator Functions</h3>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   445
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   446
<p>Attribute lets you configure <code>getter</code> and <code>setter</code> functions for each attribute. These functions are invoked when the user calls Attribute's <code>get</code> and <code>set</code> methods, and provide a way to modify the value returned or the value stored respectively.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   447
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   448
<p>You can also define a <code>validator</code> function for each attribute, which is used to validate the final value before it gets stored.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   449
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   450
<p>All these functions receive the value and name of the attribute being set or retrieved, as shown in the example code below. The name is not used in this example, but is provided to support use cases where you may wish to share the same function between different attributes.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   451
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   452
<h4>Creating The Box Class - The X, Y And XY Attributes</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   453
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   454
<p>In this example, we'll set up a custom <code>Box</code> class representing a positionable element, with <code>x</code>, <code>y</code> and <code>xy</code> attributes.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   455
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   456
<p>Only the <code>xy</code> attribute will actually store the page co-ordinate position of the box. The <code>x</code> and <code>y</code> attributes provide the user a convenient way to set only one of the co-ordinates. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   457
However we don't want to store the actual values in the <code>x</code> and <code>y</code> attributes, to avoid having to constantly synchronize all three. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   458
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   459
The <code>getter</code> and <code>setter</code> functions provide us with an easy way to achieve this. We'll define <code>getter</code> and <code>setter</code> functions for both the <code>x</code> and <code>y</code> attributes, which simply pass through to the <code>xy</code> attribute to store and retrieve values:</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   460
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   461
<textarea name="code" class="JScript" cols="60" rows="1">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   462
// Setup a custom Box class
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   463
function Box(cfg) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   464
    ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   465
    this.addAttrs(Y.merge(Box.ATTRIBUTES), cfg);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   466
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   467
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   468
// Setup Box's attribute configuration
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   469
Box.ATTRIBUTES = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   470
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   471
    ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   472
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   473
    "x" : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   474
        setter: function(val, name) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   475
            // Pass through x value to xy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   476
            this.set("xy", [parseInt(val), this.get("y")]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   477
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   478
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   479
        getter: function(val, name) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   480
            // Get x value from xy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   481
            return this.get("xy")[0];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   482
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   483
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   484
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   485
    "y" : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   486
        setter: function(val, name) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   487
            // Pass through y value to xy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   488
            this.set("xy", [this.get("x"), parseInt(val)]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   489
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   490
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   491
        getter: function(val, name) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   492
            // Get x value from xy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   493
            return this.get("xy")[1];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   494
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   495
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   496
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   497
    "xy" : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   498
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   499
        // Actual stored xy co-ordinates
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   500
        value: [0, 0],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   501
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   502
        setter: function(val, name) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   503
            // Constrain XY value to the parent element.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   504
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   505
            // Returns the constrained xy value, which will
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   506
            // be the final value stored.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   507
            return this.constrain(val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   508
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   509
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   510
        validator: function(val, name) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   511
            // Ensure we're storing a valid data value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   512
            return (L.isArray(val) && val.length == 2 && L.isNumber(val[0]) && L.isNumber(val[1]));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   513
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   514
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   515
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   516
    ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   517
}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   518
</textarea>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   519
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   520
<p>The <code>validator</code> function for <code>xy</code> ensures that only valid values finally end up being stored.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   521
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   522
<p>The <code>xy</code> attribute also has a <code>setter</code> function configured, which makes sure that the box is always constrained to it's parent element. The <code>constrain</code> method which it delegates to, takes the xy value the user is trying to set and returns a constrained value if the x or y values fall outside the parent box. The value which is returned by the <code>setter</code> is the value which is ultimately stored for the <code>xy</code> attribute:</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   523
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   524
<textarea name="code" class="JScript" cols="60" rows="1">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   525
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   526
    // Get min, max unconstrained values for X. Using Math.round to handle FF3's sub-pixel region values
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   527
    Box.prototype.getXConstraints = function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   528
        var parentRegion = this.get("parent").get("region");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   529
        return [Math.round(parentRegion.left + Box.BUFFER), Math.round(parentRegion.right - this._node.get("offsetWidth") - Box.BUFFER)];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   530
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   531
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   532
    // Get min, max unconstrained values for Y.  Using Math.round to handle FF3's sub-pixel region values
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   533
    Box.prototype.getYConstraints = function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   534
        var parentRegion = this.get("parent").get("region");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   535
        return [Math.round(parentRegion.top + Box.BUFFER), Math.round(parentRegion.bottom - this._node.get("offsetHeight") - Box.BUFFER)];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   536
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   537
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   538
    // Constrains given x,y values
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   539
    Box.prototype.constrain = function(val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   540
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   541
        // If the X value places the box outside it's parent,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   542
        // modify it's value to place the box inside it's parent.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   543
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   544
        var xConstraints = this.getXConstraints();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   545
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   546
        if (val[0] < xConstraints[0]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   547
            val[0] = xConstraints[0];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   548
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   549
            if (val[0] > xConstraints[1]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   550
                val[0] = xConstraints[1];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   551
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   552
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   553
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   554
        // If the Y value places the box outside it's parent,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   555
        // modify it's value to place the box inside it's parent.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   556
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   557
        var yConstraints = this.getYConstraints();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   558
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   559
        if (val[1] < yConstraints[0]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   560
            val[1] = yConstraints[0];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   561
        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   562
            if (val[1] > yConstraints[1]) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   563
                val[1] = yConstraints[1];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   564
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   565
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   566
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   567
        return val;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   568
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   569
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   570
</textarea>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   571
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   572
<p>The <code>setter</code>, <code>getter</code> and <code>validator</code> functions are invoked with the host object as the context, so that they can refer to the host object using "<code>this</code>", as we see in the <code>setter</code> function for <code>xy</code>.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   573
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   574
<h4>The Color Attribute - Normalizing Stored Values Through Get</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   575
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   576
<p>The <code>Box</code> class also has a <code>color</code> attribute which also has a <code>getter</code> and <code>validator</code> functions defined:</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   577
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   578
<textarea name="code" class="JScript" cols="60" rows="1">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   579
    ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   580
    "color" : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   581
        value: "olive",
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   582
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   583
        getter: function(val, name) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   584
            if (val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   585
                return Y.Color.toHex(val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   586
            } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   587
                return null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   588
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   589
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   590
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   591
        validator: function(val, name) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   592
            return (Y.Color.re_RGB.test(val) || Y.Color.re_hex.test(val) || Y.Color.KEYWORDS[val]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   593
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   594
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   595
    ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   596
</textarea>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   597
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   598
<p>The role of the <code>getter</code> handler in this case is to normalize the actual stored value of the <code>color</code> attribute, so that users always receive the hex value, regardless of the actual value stored, which maybe a color keyword (e.g. <code>"red"</code>), an rgb value (e.g.<code>rbg(255,0,0)</code>), or a hex value (<code>#ff0000</code>). The <code>validator</code> ensures the the stored value is one of these three formats.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   599
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   600
<h4>Syncing Changes Using Attribute Change Events</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   601
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   602
<p>Another interesting aspect of this example, is it's use of attribute change events to listen for changes to the attribute values. <code>Box</code>'s <code>_bind</code> method configures a set of attribute change event listeners which monitor changes to the <code>xy</code>, <code>color</code> and <code>parent</code> attributes and update the rendered DOM for the Box in response:</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   603
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   604
<textarea name="code" class="JScript" cols="60" rows="1">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   605
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   606
    // Bind listeners for attribute change events
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   607
    Box.prototype._bind = function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   608
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   609
        // Reflect any changes in xy, to the rendered Node
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   610
        this.after("xyChange", this._syncXY);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   611
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   612
        // Reflect any changes in color, to the rendered Node
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   613
        // and output the color value received from get
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   614
        this.after("colorChange", this._syncColor);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   615
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   616
        // Append the rendered node to the parent provided
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   617
        this.after("parentChange", this._syncParent);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   618
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   619
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   620
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   621
</textarea>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   622
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   623
<p>Since only <code>xy</code> stores the final co-ordinates, we don't need to monitor the <code>x</code> and <code>y</code> attributes individually for changes.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   624
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   625
<h4>DOM Event Listeners And Delegation</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   626
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   627
<p>Although not an integral part of the example, it's worth highlighting the code which is used to setup the DOM event listeners for the form elements used by the example:</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   628
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   629
<textarea name="code" class="JScript" cols="60" rows="1">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   630
    // Set references to form controls
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   631
    var xTxt = Y.Node.get("#x");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   632
    var yTxt = Y.Node.get("#y");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   633
    var colorTxt = Y.Node.get("#color");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   634
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   635
    // Use event delegation for the action button clicks
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   636
    Y.on("delegate", function(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   637
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   638
        // Get Node target from the event object. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   639
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   640
        // We already know it's a button which has an action because
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   641
        // of our selector (button.action), so all we need to do is 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   642
        // route it based on the id.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   643
        var id = e.currentTarget && e.currentTarget.get("id");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   644
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   645
        switch (id) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   646
            case "setXY":
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   647
                box.set("xy", [parseInt(xTxt.get("value")), parseInt(yTxt.get("value"))]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   648
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   649
            case "setX":
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   650
                box.set("x", parseInt(xTxt.get("value")));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   651
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   652
            case "setY":
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   653
                box.set("y", parseInt(yTxt.get("value")));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   654
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   655
            case "setColor":
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   656
                box.set("color", L.trim(colorTxt.get("value")));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   657
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   658
            case "setAll":
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   659
                box.set("xy", [parseInt(xTxt.get("value")), parseInt(yTxt.get("value"))]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   660
                box.set("color", L.trim(colorTxt.get("value")));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   661
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   662
            case "getAll":
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   663
                getAll();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   664
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   665
            default:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   666
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   667
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   668
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   669
    }, "#attrs", "click", "button.action");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   670
</textarea>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   671
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   672
<p>Rather than attach individual listeners to each button, the above code uses YUI 3's <code>delegate</code> support, to listen for clicks from <code>buttons</code> with an <code>action</code> class which bubble up to the <code>attrs</code> element.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   673
<p>The delegate listener uses the <a href="../../api/DOMEventFacade.html">Event Facade</a> which normalizes cross-browser access to DOM event properties, such as <code>currentTarget</code>, to route to the appropriate button handler. Note the use of selector syntax when we specify the elements for the listener (e.g. <code>#attrs</code>, <code>button.actions</code>) and the use of the <a href="../../api/Node.html">Node</a> facade when dealing with references to HTML elements (e.g. <code>xTxt, yTxt, colorTxt</code>).</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   674
				</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   675
				<div class="yui-u sidebar">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   676
					
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   677
				
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   678
					<div id="examples" class="mod box4">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   679
                        <div class="hd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   680
						<h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   681
    Attribute Examples:</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   682
                        </div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   683
						<div class="bd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   684
							<ul>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   685
								<li><a href='../attribute/attribute-basic.html'>Basic Configuration</a></li><li><a href='../attribute/attribute-event.html'>Change Events</a></li><li class='selected'><a href='../attribute/attribute-getset.html'>Getters, Setters and Validators</a></li><li><a href='../attribute/attribute-rw.html'>readOnly and writeOnce Configuration</a></li>							</ul>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   686
						</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   687
					</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   688
					
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   689
					<div class="mod box4">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   690
                        <div class="hd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   691
						<h4>More Attribute Resources:</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   692
                        </div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   693
                        <div class="bd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   694
						<ul>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   695
							<!-- <li><a href="http://developer.yahoo.com/yui/attribute/">User's Guide</a> (external)</li> -->
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   696
						<li><a href="../../api/module_attribute.html">API Documentation</a></li>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   697
</ul>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   698
                        </div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   699
					</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   700
			  </div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   701
		</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   702
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   703
		</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   704
	</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   705
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   706
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   707
<div class="yui-b toc3" id="tocWrapper">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   708
<!-- TABLE OF CONTENTS -->
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   709
<div id="toc">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   710
	
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   711
<ul>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   712
<li class="sect first">YUI 3.x Project</li><li class="item"><a title="The Yahoo! User Interface (YUI) Library, 3.x Branch, " href="http://developer.yahoo.com/yui/3/">YUI 3 Web Site (external)</a></li><li class="item"><a title="Examples of every YUI utility and control in action" href="../../examples/">YUI 3 Examples</a></li><li class="item"><a title="Instantly searchable API documentation for the entire YUI library." href="../../api/">YUI 3 API Docs</a></li><li class="item"><a title="The YUI Library can be downloaded from SourceForge" href="http://sourceforge.net/projects/yui/">YUI 3 on Sourceforge (external)</a></li><li class="item"><a title="YUI is free and open, offered under a BSD license." href="http://developer.yahoo.com/yui/3/license.html">YUI License (external)</a></li><li class="sect">YUI 3 Core - Examples</li><li class="item"><a title="YUI (Global Prerequisite) - Functional Examples" href="../../examples/yui/index.html">YUI (Global Prerequisite)</a></li><li class="item"><a title="Event - Functional Examples" href="../../examples/event/index.html">Event</a></li><li class="item"><a title="Node - Functional Examples" href="../../examples/node/index.html">Node</a></li><li class="sect">YUI 3 Component Infrastructure - Examples</li><li class="selected "><a title="Attribute - Functional Examples" href="../../examples/attribute/index.html">Attribute</a></li><li class="item"><a title="Plugin - Functional Examples" href="../../examples/plugin/index.html">Plugin</a></li><li class="item"><a title="Widget - Functional Examples" href="../../examples/widget/index.html">Widget</a></li><li class="sect">YUI 3 Utilities - Examples</li><li class="item"><a title="Animation - Functional Examples" href="../../examples/anim/index.html">Animation</a></li><li class="item"><a title="Cache - Functional Examples" href="../../examples/cache/index.html">Cache</a></li><li class="item"><a title="Cookie - Functional Examples" href="../../examples/cookie/index.html">Cookie</a></li><li class="item"><a title="DataSchema - Functional Examples" href="../../examples/dataschema/index.html">DataSchema</a></li><li class="item"><a title="DataSource - Functional Examples" href="../../examples/datasource/index.html">DataSource</a></li><li class="item"><a title="DataType - Functional Examples" href="../../examples/datatype/index.html">DataType</a></li><li class="item"><a title="Drag &amp; Drop - Functional Examples" href="../../examples/dd/index.html">Drag &amp; Drop</a></li><li class="item"><a title="Get - Functional Examples" href="../../examples/get/index.html">Get</a></li><li class="item"><a title="History - Functional Examples" href="../../examples/history/index.html">History</a></li><li class="item"><a title="ImageLoader - Functional Examples" href="../../examples/imageloader/index.html">ImageLoader</a></li><li class="item"><a title="IO - Functional Examples" href="../../examples/io/index.html">IO</a></li><li class="item"><a title="JSON (JavaScript Object Notation) - Functional Examples" href="../../examples/json/index.html">JSON</a></li><li class="item"><a title="Queue - Functional Examples" href="../../examples/queue/index.html">Queue</a></li><li class="item"><a title="Stylesheet - Functional Examples" href="../../examples/stylesheet/index.html">Stylesheet</a></li><li class="sect">YUI 3 Widgets - Examples</li><li class="item"><a title="Overlay - Functional Examples" href="../../examples/overlay/index.html">Overlay</a></li><li class="item"><a title="Slider - Functional Examples" href="../../examples/slider/index.html">Slider</a></li><li class="sect">YUI 3 Node Plugins - Examples</li><li class="item"><a title="FocusManager Node Plugin - Functional Examples" href="../../examples/node-focusmanager/index.html">FocusManager Node Plugin</a></li><li class="item"><a title="MenuNav Node Plugin - Functional Examples" href="../../examples/node-menunav/index.html">MenuNav Node Plugin</a></li><li class="sect">YUI 3 CSS - Examples</li><li class="item"><a title="YUI CSS Reset - Functional Examples" href="../../examples/cssreset/index.html">CSS Reset</a></li><li class="item"><a title="YUI Fonts - Functional Examples" href="../../examples/cssfonts/index.html">CSS Fonts</a></li><li class="item"><a title="YUI Base - Functional Examples" href="../../examples/cssbase/index.html">CSS Base</a></li><li class="sect">YUI 3 Developer Tools - Examples</li><li class="item"><a title="Console - Functional Examples" href="../../examples/console/index.html">Console</a></li><li class="item"><a title="Profiler - Functional Examples" href="../../examples/profiler/index.html">Profiler</a></li><li class="item"><a title="Test - Functional Examples" href="../../examples/test/index.html">Test</a></li><li class="sect">The YUI Community</li><li class="item"><a title="The Yahoo! User Interface Blog" href="http://yuiblog.com">YUI Blog (external)</a></li><li class="item"><a title="The Yahoo! Group YDN-JavaScript hosts the YUI community forum" href="http://tech.groups.yahoo.com/group/ydn-javascript/">YUI Forum (external)</a></li><li class="item"><a title="The Yahoo! Group yui3 is dedicated to the 3.x branch of the Yahoo! User Interface (YUI) Library." href="http://tech.groups.yahoo.com/group/yui3/">YUI 3 Forum (external)</a></li><li class="item"><a title="YUI is used by Yahoo! and by hundreds of other sites, including many you know and love." href="/yui/poweredby/">YUI Sightings (external)</a></li><li class="item"><a title="Videos and podcasts from the YUI Team and from the Yahoo! frontend engineering community." href="http://developer.yahoo.com/yui/theater/">YUI Theater (external)</a></li><li class="sect">YUI Articles on the YUI Website</li><li class="item"><a title="Answers to Frequently Asked Questions about the YUI Library" href="http://developer.yahoo.com/yui/articles/faq/">YUI FAQ (external)</a></li><li class="item"><a title="Yahoo!'s philosophy of Graded Browser Support" href="http://developer.yahoo.com/yui/articles/gbs/">Graded Browser Support (external)</a></li><li class="item"><a title="Reporting Bugs and Making Feature Requests for YUI Components" href="http://developer.yahoo.com/yui/articles/reportingbugs/">Bug Reports/Feature Requests (external)</a></li><li class="item"><a title="Serve YUI source files from Yahoo! -- free, fast, and simple" href="http://developer.yahoo.com/yui/3/articles/hosting/">Serving YUI Files from Yahoo! (external)</a></li></ul>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   713
</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   714
</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   715
	</div><!--closes bd-->
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   716
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   717
	<div id="ft">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   718
        <p class="first">Copyright &copy; 2009 Yahoo! Inc. All rights reserved.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   719
        <p><a href="http://privacy.yahoo.com/privacy/us/devel/index.html">Privacy Policy</a> - 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   720
            <a href="http://docs.yahoo.com/info/terms/">Terms of Service</a> - 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   721
            <a href="http://docs.yahoo.com/info/copyright/copyright.html">Copyright Policy</a> - 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   722
            <a href="http://careers.yahoo.com/">Job Openings</a></p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   723
	</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   724
</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   725
<script src="../../assets/dpSyntaxHighlighter.js"></script>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   726
<script language="javascript"> 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   727
dp.SyntaxHighlighter.HighlightAll('code'); 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   728
</script>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   729
</body>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   730
</html>