src/cm/media/js/lib/yui/yui_3.0.0b1/examples/widget/widget-extend.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: Widget: Extending the base widget class</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
    .yui-spinner-hidden {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
        display:none;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
    .yui-spinner {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
        display:-moz-inline-stack;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
        display:inline-block;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
        zoom:1;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
        *display:inline;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
        vertical-align:middle;
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
    .yui-spinner-content {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
        padding:1px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
        position:relative;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
    .yui-spinner-value {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
        width:2em;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
        height:1.5em;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
        text-align:right;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
        margin-right:22px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
        vertical-align:top;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
        border:1px solid #000;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
        padding:2px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
    .yui-spinner-increment, .yui-spinner-decrement {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
        position:absolute;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
        height:1em;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
        width:22px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
        overflow:hidden;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
        text-indent:-10em;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
        border:1px solid #999;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
        margin:0;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
        padding:0px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
    .yui-spinner-increment {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
        top:1px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
        *top:2px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
        right:1px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
        background:#ddd url(assets/arrows.png) no-repeat 50% 0px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
     .yui-spinner-decrement {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
        bottom:1px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
        *bottom:2px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
        right:1px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
        background:#ddd url(assets/arrows.png) no-repeat 50% -20px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
     }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
    #widget-extend-example {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
        padding:5px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
    #widget-extend-example .hint {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
        margin-top:10px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
        font-size:85%;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
        color:#00a;
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
</style>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
</head>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    85
<body id="yahoo-com" class=" yui-skin-sam">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
<div id="custom-doc" class="yui-t2">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
<div id="hd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
	<div id="ygunav">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
		<p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    90
            <em>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    91
                <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
    92
            </em>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
		</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
		<form action="http://search.yahoo.com/search" id="sitesearchform">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
            <input name="vs" type="hidden" value="developer.yahoo.com">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
            <input name="vs" type="hidden" value="yuiblog.com">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
		    <div id="sitesearch">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
		    	<label for="searchinput">Site Search (YDN &amp; YUIBlog): </label>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
			    <input type="text" id="searchinput" name="p">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
			    <input type="submit" value="Search" id="searchsubmit" class="ygbt">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
		    </div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
		</form>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
    </div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
	<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
   105
	<div id="pagetitle"><h1>YUI Library Examples: Widget: Extending the base widget class</h1></div>
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
<div id="bd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   108
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
	<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
   110
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   111
	<div id="yui-main">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   112
		<div class="yui-b">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   113
		  <div class="yui-ge">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   114
			  <div class="yui-u first example" id="main">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
	<h2>Widget: Extending the base widget class</h2>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   117
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   118
	<div id="example" class="promo">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
	<p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
	This example shows how to extend the base <code>Widget</code> class to create a simple, re-usable spinner control. The <code>Spinner</code> class created in the example is not intended to be a fully featured spinner. It is used here as a concrete example, to convey some of the key concepts to keep in mind when extending the <code>Widget</code> class.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
	</p>	
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 class="module example-container ">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   124
			<div class="hd exampleHd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   125
			<p class="newWindowButton yui-skin-sam">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   126
                <a href="widget-extend_clean.html" target="_blank">View example in new window.</a>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   127
            </p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   128
		</div>		<div id="example-canvas" class="bd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   129
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   130
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   131
	<!--BEGIN SOURCE CODE FOR EXAMPLE =============================== -->
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   132
	
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   133
	<div id="widget-extend-example">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   134
    A basic spinner widget: <div id="numberField"><input type="text" class="yui-spinner-value" value="20" /></div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   135
    <p class="hint">Click the buttons, or the arrow up/down and page up/down keys on your keyboard to change the spinner's value</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   136
</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   137
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   138
<script type="text/javascript">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   139
YUI({base:"../../build/", timeout: 10000}).use("widget", function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   140
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   141
    var Lang = Y.Lang,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   142
        Widget = Y.Widget,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   143
        Node = Y.Node;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   144
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   145
    /* Spinner class constructor */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   146
    function Spinner(config) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   147
        Spinner.superclass.constructor.apply(this, arguments);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   148
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   149
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   150
    /* 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   151
     * Required NAME static field, to identify the Widget class and 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   152
     * used as an event prefix, to generate class names etc. (set to the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   153
     * class name in camel case). 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   154
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   155
    Spinner.NAME = "spinner";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   156
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   157
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   158
     * The attribute configuration for the Spinner widget. Attributes can be
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   159
     * defined with default values, get/set functions and validator functions
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   160
     * as with any other class extending Base.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   161
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   162
    Spinner.ATTRS = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   163
        // The minimum value for the spinner.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   164
        min : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   165
            value:0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   166
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   167
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   168
        // The maximum value for the spinner.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   169
        max : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   170
            value:100
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   171
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   172
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   173
        // The current value of the spinner.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   174
        value : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   175
            value:0,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   176
            validator: function(val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   177
                return this._validateValue(val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   178
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   179
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   180
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   181
        // Amount to increment/decrement the spinner when the buttons or arrow up/down keys are pressed.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   182
        minorStep : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   183
            value:1
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   184
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   185
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   186
        // Amount to increment/decrement the spinner when the page up/down keys are pressed.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   187
        majorStep : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   188
            value:10
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   189
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   190
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   191
        // The localizable strings for the spinner. This attribute is 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   192
        // defined by the base Widget class but has an empty value. The
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   193
        // spinner is simply providing a default value for the attribute.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   194
        strings: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   195
            value: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   196
                tooltip: "Press the arrow up/down keys for minor increments, page up/down for major increments.",
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   197
                increment: "Increment",
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   198
                decrement: "Decrement"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   199
            }
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
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   203
    /* Static constant used to identify the classname applied to the spinners value field */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   204
    Spinner.INPUT_CLASS = Y.ClassNameManager.getClassName(Spinner.NAME, "value");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   205
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   206
    /* Static constants used to define the markup templates used to create Spinner DOM elements */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   207
    Spinner.INPUT_TEMPLATE = '<input type="text" class="' + Spinner.INPUT_CLASS + '">';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   208
    Spinner.BTN_TEMPLATE = '<button type="button"></button>';
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   209
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   210
    /* 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   211
     * The HTML_PARSER static constant is used by the Widget base class to populate 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   212
     * the configuration for the spinner instance from markup already on the page.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   213
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   214
     * The Spinner class attempts to set the value of the spinner widget if it
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   215
     * finds the appropriate input element on the page.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   216
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   217
    Spinner.HTML_PARSER = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   218
        value: function (contentBox) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   219
            var node = contentBox.query("." + Spinner.INPUT_CLASS);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   220
            return (node) ? parseInt(node.get("value")) : null;
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
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   224
    /* Spinner extends the base Widget class */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   225
    Y.extend(Spinner, Widget, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   226
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   227
        /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   228
         * initializer is part of the lifecycle introduced by 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   229
         * the Widget class. It is invoked during construction,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   230
         * and can be used to setup instance specific state.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   231
         * 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   232
         * The Spinner class does not need to perform anything
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   233
         * specific in this method, but it is left in as an example.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   234
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   235
        initializer: function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   236
            // Not doing anything special during initialization
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   237
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   238
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   239
        /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   240
         * destructor is part of the lifecycle introduced by 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   241
         * the Widget class. It is invoked during destruction,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   242
         * and can be used to cleanup instance specific state.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   243
         * 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   244
         * The spinner cleans up any node references it's holding
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   245
         * onto. The Widget classes destructor will purge the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   246
         * widget's bounding box of event listeners, so spinner 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   247
         * only needs to clean up listeners it attaches outside of 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   248
         * the bounding box.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   249
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   250
        destructor : function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   251
            this._documentMouseUpHandle.detach();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   252
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   253
            this.inputNode = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   254
            this.incrementNode = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   255
            this.decrementNode = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   256
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   257
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   258
        /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   259
         * renderUI is part of the lifecycle introduced by the
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   260
         * Widget class. Widget's renderer method invokes:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   261
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   262
         *     renderUI()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   263
         *     bindUI()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   264
         *     syncUI()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   265
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   266
         * renderUI is intended to be used by the Widget subclass
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   267
         * to create or insert new elements into the DOM. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   268
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   269
         * For spinner the method adds the input (if it's not already 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   270
         * present in the markup), and creates the inc/dec buttons
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   271
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   272
        renderUI : function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   273
            this._renderInput();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   274
            this._renderButtons();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   275
        },
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
         * bindUI is intended to be used by the Widget subclass 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   279
         * to bind any event listeners which will drive the Widget UI.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   280
         * 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   281
         * It will generally bind event listeners for attribute change
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   282
         * events, to update the state of the rendered UI in response 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   283
         * to attribute value changes, and also attach any DOM events,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   284
         * to activate the UI.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   285
         * 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   286
         * For spinner, the method:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   287
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   288
         * - Sets up the attribute change listener for the "value" attribute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   289
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   290
         * - Binds key listeners for the arrow/page keys
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   291
         * - Binds mouseup/down listeners on the boundingBox, document respectively.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   292
         * - Binds a simple change listener on the input box.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   293
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   294
        bindUI : function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   295
            this.after("valueChange", this._afterValueChange);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   296
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   297
            var boundingBox = this.get("boundingBox");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   298
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   299
            // Looking for a key event which will fire continously across browsers while the key is held down. 38, 40 = arrow up/down, 33, 34 = page up/down
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   300
            var keyEventSpec = (!Y.UA.opera) ? "down:" : "press:";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   301
            keyEventSpec += "38, 40, 33, 34";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   302
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   303
            Y.on("key", Y.bind(this._onDirectionKey, this), boundingBox, keyEventSpec);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   304
            Y.on("mousedown", Y.bind(this._onMouseDown, this), boundingBox);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   305
            this._documentMouseUpHandle = Y.on("mouseup", Y.bind(this._onDocMouseUp, this), boundingBox.get("ownerDocument"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   306
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   307
            Y.on("change", Y.bind(this._onInputChange, this), this.inputNode);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   308
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   309
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   310
        /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   311
         * syncUI is intended to be used by the Widget subclass to
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   312
         * update the UI to reflect the current state of the widget.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   313
         * 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   314
         * For spinner, the method sets the value of the input field,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   315
         * to match the current state of the value attribute.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   316
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   317
        syncUI : function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   318
            this._uiSetValue(this.get("value"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   319
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   320
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   321
        /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   322
         * Creates the input control for the spinner and adds it to
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   323
         * the widget's content box, if not already in the markup.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   324
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   325
        _renderInput : function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   326
            var contentBox = this.get("contentBox"),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   327
                input = contentBox.query("." + Spinner.INPUT_CLASS),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   328
                strings = this.get("strings");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   329
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   330
            if (!input) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   331
                input = Node.create(Spinner.INPUT_TEMPLATE);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   332
                contentBox.appendChild(input);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   333
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   334
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   335
            input.set("title", strings.tooltip);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   336
            this.inputNode = input;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   337
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   338
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   339
        /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   340
         * Creates the button controls for the spinner and add them to
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   341
         * the widget's content box, if not already in the markup.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   342
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   343
        _renderButtons : function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   344
            var contentBox = this.get("contentBox"),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   345
                strings = this.get("strings");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   346
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   347
            var inc = this._createButton(strings.increment, this.getClassName("increment"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   348
            var dec = this._createButton(strings.decrement, this.getClassName("decrement"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   349
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   350
            this.incrementNode = contentBox.appendChild(inc);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   351
            this.decrementNode = contentBox.appendChild(dec);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   352
        },
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
         * Utility method, to create a spinner button
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   356
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   357
        _createButton : function(text, className) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   358
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   359
            var btn = Y.Node.create(Spinner.BTN_TEMPLATE);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   360
            btn.set("innerHTML", text);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   361
            btn.set("title", text);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   362
            btn.addClass(className);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   363
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   364
            return btn;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   365
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   366
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   367
        /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   368
         * Bounding box mouse down handler. Will determine if the mouse down
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   369
         * is on one of the spinner buttons, and increment/decrement the value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   370
         * accordingly.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   371
         * 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   372
         * The method also sets up a timer, to support the user holding the mouse
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   373
         * down on the spinner buttons. The timer is cleared when a mouse up event
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   374
         * is detected.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   375
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   376
        _onMouseDown : function(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   377
            var node = e.target,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   378
                dir,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   379
                handled = false,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   380
                currVal = this.get("value"),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   381
                minorStep = this.get("minorStep");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   382
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   383
            if (node.hasClass(this.getClassName("increment"))) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   384
                this.set("value", currVal + minorStep);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   385
                dir = 1;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   386
                handled = true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   387
            } else if (node.hasClass(this.getClassName("decrement"))) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   388
                this.set("value", currVal - minorStep);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   389
                dir = -1;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   390
                handled = true;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   391
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   392
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   393
            if (handled) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   394
                this._setMouseDownTimers(dir, minorStep);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   395
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   396
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   397
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   398
        /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   399
         * Document mouse up handler. Clears the timers supporting
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   400
         * the "mouse held down" behavior.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   401
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   402
        _onDocMouseUp : function(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   403
            this._clearMouseDownTimers();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   404
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   405
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   406
        /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   407
         * Bounding box Arrow up/down, Page up/down key listener.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   408
         *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   409
         * Increments/Decrement the spinner value, based on the key pressed.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   410
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   411
        _onDirectionKey : function(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   412
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   413
            e.preventDefault();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   414
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   415
            var currVal = this.get("value"),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   416
                newVal = currVal,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   417
                minorStep = this.get("minorStep"),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   418
                majorStep = this.get("majorStep");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   419
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   420
            switch (e.charCode) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   421
                case 38:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   422
                    newVal += minorStep;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   423
                    break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   424
                case 40:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   425
                    newVal -= minorStep;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   426
                    break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   427
                case 33:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   428
                    newVal += majorStep;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   429
                    newVal = Math.min(newVal, this.get("max"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   430
                    break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   431
                case 34:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   432
                    newVal -= majorStep;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   433
                    newVal = Math.max(newVal, this.get("min"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   434
                    break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   435
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   436
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   437
            if (newVal !== currVal) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   438
                this.set("value", newVal);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   439
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   440
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   441
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   442
        /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   443
         * Simple change handler, to make sure user does not input an invalid value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   444
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   445
        _onInputChange : function(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   446
            if (!this._validateValue(this.inputNode.get("value"))) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   447
                this.syncUI();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   448
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   449
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   450
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   451
        /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   452
         * Initiates mouse down timers, to increment slider, while mouse button
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   453
         * is held down
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   454
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   455
        _setMouseDownTimers : function(dir, step) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   456
            this._mouseDownTimer = Y.later(500, this, function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   457
                this._mousePressTimer = Y.later(100, this, function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   458
                    this.set("value", this.get("value") + (dir * step));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   459
                }, null, true)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   460
            });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   461
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   462
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   463
        /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   464
         * Clears timers used to support the "mouse held down" behavior
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   465
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   466
        _clearMouseDownTimers : function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   467
            if (this._mouseDownTimer) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   468
                this._mouseDownTimer.cancel();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   469
                this._mouseDownTimer = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   470
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   471
            if (this._mousePressTimer) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   472
                this._mousePressTimer.cancel();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   473
                this._mousePressTimer = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   474
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   475
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   476
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   477
        /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   478
         * value attribute change listener. Updates the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   479
         * value in the rendered input box, whenever the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   480
         * attribute value changes.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   481
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   482
        _afterValueChange : function(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   483
            this._uiSetValue(e.newVal);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   484
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   485
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   486
        /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   487
         * Updates the value of the input box to reflect 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   488
         * the value passed in
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   489
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   490
        _uiSetValue : function(val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   491
            this.inputNode.set("value", val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   492
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   493
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   494
        /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   495
         * value attribute default validator. Verifies that
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   496
         * the value being set lies between the min/max value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   497
         */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   498
        _validateValue: function(val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   499
            var min = this.get("min"),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   500
                max = this.get("max");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   501
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   502
            return (Lang.isNumber(val) && val >= min && val <= max);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   503
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   504
    });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   505
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   506
    // Create a new Spinner instance, drawing it's 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   507
    // starting value from an input field already on the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   508
    // page (contained in the #numberField content box)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   509
    var spinner = new Spinner({
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   510
        contentBox: "#numberField",
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   511
        max:100,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   512
        min:0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   513
    });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   514
    spinner.render();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   515
    spinner.focus();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   516
});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   517
</script>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   518
	
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   519
	<!--END SOURCE CODE FOR EXAMPLE =============================== -->
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   520
	
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   521
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   522
		</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   523
	</div>			
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   524
	</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   525
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   526
	<h3>Extending The <code>Widget</code> Class</h3>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   527
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   528
<h4>Basic Class Structure</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   529
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   530
<p>Widgets classes follow the general pattern implemented by the <code>Spinner</code> class, shown in the code snippet below. The basic pattern for setting up a new widget class involves:</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   531
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   532
<ol>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   533
    <li>Defining the constructor function for the new widget class, which invokes the superclass constructor to kick of the initialization chain <em>(line 2)</em></li>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   534
    <li>Defining the static <code>NAME</code> property for the class, which is normally the class name in camel case, and is used to prefix events and CSS classes fired/created by the class <em>(line 11)</em></li>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   535
    <li>Defining the static <code>ATTRS</code> property for the class, which defines the set of attribute which the class will introduce, in addition to the superclass attributes <em>(line 18-57)</em></li>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   536
    <li>Extending the <code>Widget</code> class, and adding/over-riding any prototype properties/methods <em>(line 59)</em></li>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   537
</ol>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   538
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   539
<textarea name="code" class="JScript" rows="1" cols="60">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   540
    /* Spinner class constructor */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   541
    function Spinner(config) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   542
        Spinner.superclass.constructor.apply(this, arguments);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   543
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   544
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   545
    /* 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   546
     * Required NAME static field, to identify the Widget class and 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   547
     * used as an event prefix, to generate class names etc. (set to the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   548
     * class name in camel case). 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   549
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   550
    Spinner.NAME = "spinner";
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
     * The attribute configuration for the Spinner widget. Attributes can be
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   554
     * defined with default values, get/set functions and validator functions
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   555
     * as with any other class extending Base.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   556
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   557
    Spinner.ATTRS = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   558
        // The minimum value for the spinner.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   559
        min : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   560
            value:0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   561
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   562
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   563
        // The maximum value for the spinner.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   564
        max : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   565
            value:100
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   566
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   567
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   568
        // The current value of the spinner.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   569
        value : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   570
            value:0,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   571
            validator: function(val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   572
                return this._validateValue(val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   573
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   574
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   575
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   576
        // Amount to increment/decrement the spinner when the buttons, or arrow up/down keys are pressed.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   577
        minorStep : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   578
            value: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
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   581
        // Amount to increment/decrement the spinner when the page up/down keys are pressed.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   582
        majorStep : {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   583
            value:10
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   584
        },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   585
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   586
        // The localizable strings for the spinner. This attribute is 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   587
        // defined by the base Widget class but has an empty value. The
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   588
        // spinner is simply providing a default value for the attribute.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   589
        strings: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   590
            value: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   591
                tooltip: "Press the arrow up/down keys for minor increments, page up/down for major increments.",
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   592
                increment: "Increment",
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   593
                decrement: "Decrement"
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
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   597
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   598
    Y.extend(Spinner, Widget, {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   599
        // Methods/properties to add to the prototype of the new class
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   600
        ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   601
    });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   602
</textarea>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   603
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   604
<p>Note that these steps are the same for any class which is derived from <a href="http://developer.yahoo.com/yui/3/base/"><code>Base</code></a>, nothing Widget specific is involved yet. 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   605
Widget adds the concept of a rendered UI to the existing Base lifecycle (viz. init, destroy and attribute state configuration), which we'll see show up in Widget specific areas below.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   606
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   607
<h4>The HTML_PARSER Property</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   608
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   609
<p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   610
The first Widget specific property <code>Spinner</code> implements is the static <a href="../../api/Widget.html#property_Widget.HTML_PARSER"><code>HTML_PARSER</code></a> property. It is used to set the initial widget configuration based on markup, providing basic progressive enhancement support.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   611
</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   612
<p> 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   613
The value of the <code>HTML_PARSER</code> property is an object literal, where each property is a widget attribute name, and the value is either a selector string (if the attribute is a node reference) or a function which is executed to provide 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   614
a value for the attribute from the markup on the page. Markup is essentially thought of as an additional data source for the user to set initial attribute values, outside of the configuration object passed to the constructor 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   615
<em>(values passed to the constructor will take precedence over values picked up from markup)</em>.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   616
</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   617
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   618
<p>For <code>Spinner</code>, <code>HTML_PARSER</code> defines a function for the <code>value</code> attribute, which sets the initial value of the spinner based on an input field if present in the markup.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   619
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   620
<textarea name="code" class="JScript" rows="1" cols="60">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   621
    /* 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   622
     * The HTML_PARSER static constant is used by the Widget base class to populate 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   623
     * the configuration for the spinner instance from markup already on the page.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   624
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   625
     * The Spinner class attempts to set the value of the spinner widget if it
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   626
     * finds the appropriate input element on the page.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   627
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   628
    Spinner.HTML_PARSER = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   629
        value: function (contentBox) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   630
            var node = contentBox.query("." + Spinner.INPUT_CLASS);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   631
            return (node) ? parseInt(node.get("value")) : null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   632
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   633
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   634
</textarea>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   635
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   636
<h4>Lifecycle Methods: initializer, destructor</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   637
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   638
<p>The <code>initializer</code> and <code>destructor</code> lifecycle methods are carried over from <code>Base</code>, and can be used to setup initial state during construction, and cleanup state during destruction respectively.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   639
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   640
<p>For <code>Spinner</code>, there is nothing special we need to do in the <code>initializer</code> (attribute setup is already taken care of), but it's left in the example to round out the lifecycle discussion.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   641
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   642
<p>The <code>destructor</code> takes care of detaching any event listeners <code>Spinner</code> adds outside of the bounding box (event listeners on/inside the bounding box are purged by <code>Widget</code>'s <code>destructor</code>).</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   643
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   644
<textarea name="code" class="JScript" rows="1" cols="60">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   645
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   646
     * initializer is part of the lifecycle introduced by 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   647
     * the Widget class. It is invoked during construction,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   648
     * and can be used to setup instance specific state.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   649
     * 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   650
     * The Spinner class does not need to perform anything
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   651
     * specific in this method, but it is left in as an example.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   652
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   653
    initializer: function(config) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   654
        // Not doing anything special during initialization
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   655
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   656
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   657
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   658
     * destructor is part of the lifecycle introduced by 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   659
     * the Widget class. It is invoked during destruction,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   660
     * and can be used to cleanup instance specific state.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   661
     * 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   662
     * The spinner cleans up any node references it's holding
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   663
     * onto. The Widget classes destructor will purge the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   664
     * widget's bounding box of event listeners, so spinner 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   665
     * only needs to clean up listeners it attaches outside of 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   666
     * the bounding box.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   667
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   668
    destructor : function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   669
        this._documentMouseUpHandle.detach();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   670
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   671
        this.inputNode = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   672
        this.incrementNode = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   673
        this.decrementNode = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   674
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   675
</textarea>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   676
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   677
<h4>Rendering Lifecycle Methods: renderer, renderUI, bindUI, syncUI</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   678
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   679
<p>Widget adds a <code>render</code> method to the <code>init</code> and <code>destroy</code> lifecycle methods provided by Base. The <code>init</code> and <code>destroy</code> methods invoke the corresponding <code>initializer</code> and <code>destructor</code> implementations for the widget. Similarly, the <code>render</code> method invokes the <code>renderer</code> implementation for the widget. Note that the <code>renderer</code> method is not chained automatically, unlike the <code>initializer</code> and <code>destructor</code> methods.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   680
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   681
<p>The <code>Widget</code> class already provides a default <code>renderer</code> implementation, which invokes the following abstract methods in the order shown <em>(with their respective responsibilities)</em>:</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   682
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   683
<ol>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   684
    <li><code>renderUI()</code> : responsible for creating/adding elements to the DOM to render the widget.</li>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   685
    <li><code>bindUI()</code> : responsible for binding event listeners (both attribute change and DOM event listeners) to 'activate' the rendered UI.</li>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   686
    <li><code>syncUI()</code> : responsible for updating the rendered UI based on the current state of the widget.</li>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   687
</ol>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   688
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   689
<p>Since the <code>Spinner</code> class has no need to modify the <code>Widget</code> <code>renderer</code> implementation, it simply implements the above 3 methods to handle the render phase:</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   690
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   691
<textarea name="code" class="JScript" rows="1" cols="60">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   692
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   693
     * For spinner the method adds the input (if it's not already 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   694
     * present in the markup), and creates the increment/decrement buttons
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   695
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   696
    renderUI : function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   697
        this._renderInput();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   698
        this._renderButtons();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   699
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   700
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   701
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   702
     * For spinner, the method:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   703
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   704
     * - Sets up the attribute change listener for the "value" attribute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   705
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   706
     * - Binds key listeners for the arrow/page keys
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   707
     * - Binds mouseup/down listeners on the boundingBox, document respectively.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   708
     * - Binds a simple change listener on the input box.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   709
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   710
    bindUI : function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   711
        this.after("valueChange", this._afterValueChange);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   712
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   713
        var boundingBox = this.get("boundingBox");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   714
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   715
        // Looking for a key event which will fire continuously across browsers while the key is held down. 38, 40 = arrow up/down, 33, 34 = page up/down
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   716
        var keyEventSpec = (!Y.UA.opera) ? "down:" : "press:";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   717
        keyEventSpec += "38, 40, 33, 34";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   718
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   719
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   720
        Y.on("change", Y.bind(this._onInputChange, this), this.inputNode);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   721
        Y.on("key", Y.bind(this._onDirectionKey, this), boundingBox, keyEventSpec);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   722
        Y.on("mousedown", Y.bind(this._onMouseDown, this), boundingBox);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   723
        this._documentMouseUpHandle = Y.on("mouseup", Y.bind(this._onDocMouseUp, this), boundingBox.get("ownerDocument"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   724
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   725
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   726
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   727
     * For spinner, the method sets the value of the input field,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   728
     * to match the current state of the value attribute.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   729
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   730
    syncUI : function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   731
        this._uiSetValue(this.get("value"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   732
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   733
</textarea>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   734
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   735
<h5>A Note On Key Event Listeners</h5>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   736
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   737
<p>The PR2 release adds basic support for <code>"key"</code> events, which are used by <code>Spinner</code> to setup a listener for arrow up/down and page up/down keys on the spinner's bounding box (line 30).</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   738
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   739
<p>Event's <code>"key"</code> support allows <code>Spinner</code> to define a single listener, which is only invoked for the key specification provided. The key specification in the above use case is <code>"down:38, 40, 33, 34"</code> for most browsers, indicating that 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   740
the <code>_onDirectionKey</code> method should only be called if the bounding box receives a keydown event with a character code which is either 38, 40, 33 or 34. <code>"key"</code> specifications can also contain more <a href="../../api/YUI.html#event_key">advanced filter criteria</a>, involving modifiers such as CTRL and SHIFT.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   741
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   742
<p>For the Spinner widget, we're looking for a key event which fires repeatedly while the key is held down. This differs for Opera, so we need to fork for the key event we're interested in. Future versions of <code>"key"</code> support will aim to provide this type of higher level cross-browser abstraction also.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   743
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   744
<h4>Attribute Supporting Methods</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   745
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   746
<p>Since all widgets are attribute driven, they all follow a pretty similar pattern when it comes to how those attributes are used. For a given attribute, widgets will generally have:</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   747
<ul>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   748
    <li>A prototype method to listen for changes in the attribute</li>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   749
    <li>A prototype method to update the state of the rendered UI, to reflect the value of an attribute.</li>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   750
    <li>A prototype method used to set/get/validate the attribute.</li>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   751
</ul>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   752
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   753
<p>These methods are kept on the prototype to facilitate customization at any of the levels - event handling, ui updates, set/get/validation logic.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   754
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   755
<p>For <code>Spinner</code>, these corresponding methods for the <code>value</code> attribute are: <code>_afterValueChange</code>, <code>_uiSetValue</code> and <code>_validateValue</code>:</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   756
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   757
<textarea name="code" class="JScript" rows="1" cols="60">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   758
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   759
     * value attribute change listener. Updates the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   760
     * value in the rendered input box, whenever the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   761
     * attribute value changes.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   762
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   763
    _afterValueChange : function(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   764
        this._uiSetValue(e.newVal);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   765
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   766
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   767
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   768
     * Updates the value of the input box to reflect 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   769
     * the value passed in
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   770
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   771
    _uiSetValue : function(val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   772
        this.inputNode.set("value", val);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   773
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   774
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   775
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   776
     * value attribute default validator. Verifies that
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   777
     * the value being set lies between the min/max value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   778
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   779
    _validateValue: function(val) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   780
        var min = this.get("min"),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   781
            max = this.get("max");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   782
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   783
        return (Lang.isNumber(val) && val &gt;= min && val &lt;= max);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   784
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   785
</textarea>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   786
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   787
<p>Since this example focuses on general patterns for widget development, validator/set/get functions are not defined for attributes such as min/max in the interests of keeping the example simple, but could be, in a production ready spinner.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   788
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   789
<h4>Rendering Support Methods</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   790
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   791
<p><code>Spinner</code>'s <code>renderUI</code> method hands off creation of the input field and buttons to the following helpers which use markup templates to generate node instances:</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   792
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   793
<textarea name="code" class="JScript" rows="1" cols="60">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   794
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   795
     * Creates the input field for the spinner and adds it to
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   796
     * the widget's content box, if not already in the markup.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   797
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   798
    _renderInput : function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   799
        var contentBox = this.get("contentBox"),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   800
            input = contentBox.query("." + Spinner.INPUT_CLASS),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   801
            strings = this.get("strings");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   802
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   803
        if (!input) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   804
            input = Node.create(Spinner.INPUT_TEMPLATE);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   805
            contentBox.appendChild(input);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   806
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   807
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   808
        input.set("title", strings.tooltip);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   809
        this.inputNode = input;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   810
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   811
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   812
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   813
     * Creates the button controls for the spinner and add them to
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   814
     * the widget's content box, if not already in the markup.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   815
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   816
    _renderButtons : function() {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   817
        var contentBox = this.get("contentBox"),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   818
            strings = this.get("strings");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   819
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   820
        var inc = this._createButton(strings.increment, this.getClassName("increment"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   821
        var dec = this._createButton(strings.decrement, this.getClassName("decrement"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   822
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   823
        this.incrementNode = contentBox.appendChild(inc);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   824
        this.decrementNode = contentBox.appendChild(dec);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   825
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   826
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   827
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   828
     * Utility method, to create a spinner button
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   829
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   830
    _createButton : function(text, className) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   831
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   832
        var btn = Y.Node.create(Spinner.BTN_TEMPLATE);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   833
        btn.set("innerHTML", text);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   834
        btn.set("title", text);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   835
        btn.addClass(className);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   836
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   837
        return btn;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   838
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   839
</textarea>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   840
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   841
<h4>DOM Event Listeners</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   842
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   843
<p>The DOM event listeners attached during <code>bindUI</code> are straightforward event listeners, which receive the event facade for the DOM event, and update the spinner state accordingly.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   844
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   845
<p>A couple of interesting points worth noting: In the <code>"key"</code> listener we set up, we can call <code>e.preventDefault()</code> without having to check the character code, since the <code>"key"</code> event specifier will only invoke the listener 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   846
if one of the specified keys is pressed (arrow/page up/down)</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   847
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   848
<p>Also, to allow the spinner to update it's value while the mouse button is held down, we setup a timer, which gets cleared out when we receive a mouseup event on the document.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   849
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   850
<textarea name="code" class="JScript" rows="1" cols="60">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   851
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   852
     * Bounding box Arrow up/down, Page up/down key listener.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   853
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   854
     * Increments/Decrement the spinner value, based on the key pressed.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   855
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   856
    _onDirectionKey : function(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   857
        e.preventDefault();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   858
        ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   859
        switch (e.charCode) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   860
            case 38:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   861
                newVal += minorStep;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   862
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   863
            case 40:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   864
                newVal -= minorStep;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   865
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   866
            case 33:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   867
                newVal += majorStep;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   868
                newVal = Math.min(newVal, this.get("max"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   869
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   870
            case 34:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   871
                newVal -= majorStep;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   872
                newVal = Math.max(newVal, this.get("min"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   873
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   874
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   875
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   876
        if (newVal !== currVal) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   877
            this.set("value", newVal);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   878
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   879
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   880
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   881
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   882
     * Bounding box mouse down handler. Will determine if the mouse down
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   883
     * is on one of the spinner buttons, and increment/decrement the value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   884
     * accordingly.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   885
     * 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   886
     * The method also sets up a timer, to support the user holding the mouse
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   887
     * down on the spinner buttons. The timer is cleared when a mouse up event
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   888
     * is detected.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   889
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   890
    _onMouseDown : function(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   891
        var node = e.target
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   892
        ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   893
        if (node.hasClass(this.getClassName("increment"))) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   894
            this.set("value", currVal + minorStep);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   895
            ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   896
        } else if (node.hasClass(this.getClassName("decrement"))) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   897
            this.set("value", currVal - minorStep);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   898
            ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   899
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   900
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   901
        if (handled) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   902
            this._setMouseDownTimers(dir);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   903
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   904
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   905
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   906
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   907
     * Document mouse up handler. Clears the timers supporting
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   908
     * the "mouse held down" behavior.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   909
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   910
    _onDocMouseUp : function(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   911
        this._clearMouseDownTimers();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   912
    },
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   913
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   914
    /*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   915
     * Simple change handler, to make sure user does not input an invalid value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   916
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   917
    _onInputChange : function(e) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   918
        if (!this._validateValue(this.inputNode.get("value"))) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   919
            // If the entered value is not valid, re-display the stored value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   920
            this.syncUI();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   921
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   922
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   923
</textarea>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   924
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   925
<h4>ClassName Support Methods</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   926
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   927
<p>A key part of developing widgets which work with the DOM, is defining class names which it will use to mark the nodes it renders. These class names could be used to mark a node for later retrieval/lookup, for CSS application (both functional as well as cosmetic) or to indicate the current state of the widget.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   928
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   929
<p>The widget infrastructure uses the <code>ClassNameManager</code> utility, to generate consistently named classes to apply to the nodes it adds to the page:</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   930
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   931
<textarea name="code" class="JScript" rows="1" cols="60">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   932
    Y.ClassNameManager.getClassName(Spinner.NAME, "value");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   933
    ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   934
    this.getClassName("increment");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   935
</textarea>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   936
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   937
<p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   938
Class names generated by the Widget's <code>getClassName</code> prototype method use the NAME field of the widget, to generate a prefixed classname through <code>ClassNameManager</code> - e.g. for spinner the <code>this.getClassName("increment")</code> above will generate the class name <code>yui-spinner-increment</code> ("yui" being the system level prefix, "spinner" being the widget name).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   939
When you need to generate standard class names in static code (where you don't have a reference to <code>this.getClassName()</code>), you can use the ClassNameManager directly, as shown in line 1 above, to achieve the same results.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   940
</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   941
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   942
<h4>CSS Considerations</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   943
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   944
<p>Since widget uses the <code>getClassName</code> method to generate state related class names and to mark the bounding box/content box of the widget (e.g. "yui-[widgetname]-content", "yui-[widgetname]-hidden", "yui-[widgetname]-disabled"), we need to provide the default CSS handling for states we're interested in handling for the new Spinner widget. The "yui-[widgetname]-hidden" class is probably one state class, which all widgets will provide implementations for.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   945
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   946
<textarea name="code" class="CSS" rows="1" cols="60">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   947
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   948
    /* Controlling show/hide state using display (since this control is inline-block) */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   949
    .yui-spinner-hidden {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   950
        display:none;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   951
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   952
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   953
    /* Bounding Box - Set the bounding box to be "inline block" for spinner */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   954
    .yui-spinner {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   955
        display:-moz-inline-stack;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   956
        display:inline-block;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   957
        zoom:1;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   958
        *display:inline;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   959
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   960
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   961
    /* Content Box - Start adding visual treatment for the spinner */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   962
    .yui-spinner-content {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   963
        padding:1px;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   964
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   965
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   966
    /* Input Text Box, generated through getClassName("value") */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   967
    .yui-spinner-value {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   968
        ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   969
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   970
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   971
    /* Button controls, generated through getClassName("increment") */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   972
    .yui-spinner-increment, .yui-spinner-decrement {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   973
        ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   974
    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   975
</textarea>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   976
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   977
<h4>Using The Spinner Widget</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   978
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   979
<p>For the example, we have an input field already on the page, which we'd like to enhance to create a Spinner instance:</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   980
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   981
<textarea name="code" class="HTML" rows="1" cols="60">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   982
    <div id="numberField">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   983
        <input type="text" class="yui-spinner-value" value="20" />
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   984
    </div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   985
</textarea>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   986
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   987
<p>We provide the constructor for the Spinner with the <code>contentBox</code> which contains the input field with our initial value. The <code>HTML_PARSER</code> code we saw earlier, will extract the value from the input field, and use it as the initial value for the Spinner instance:</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   988
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   989
<textarea name="code" class="JScript" rows="1" cols="60">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   990
    // Create a new Spinner instance, drawing it's 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   991
    // starting value from an input field already on the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   992
    // page (contained in the #numberField content box)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   993
    var spinner = new Spinner({
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   994
        contentBox: "#numberField",
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   995
        max:100,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   996
        min:0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   997
    });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   998
    spinner.render();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   999
    spinner.focus();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1000
</textarea>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1001
				</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1002
				<div class="yui-u sidebar">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1003
					
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1004
				
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1005
					<div id="examples" class="mod box4">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1006
                        <div class="hd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1007
						<h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1008
    Widget Examples:</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1009
                        </div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1010
						<div class="bd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1011
							<ul>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1012
								<li class='selected'><a href='../widget/widget-extend.html'>Extending the base widget class</a></li><li><a href='../widget/widget-build.html'>Creating custom widget classes</a></li><li><a href='../widget/widget-tooltip.html'>Creating a simple Tooltip widget</a></li>							</ul>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1013
						</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1014
					</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1015
					
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1016
					<div class="mod box4">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1017
                        <div class="hd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1018
						<h4>More Widget Resources:</h4>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1019
                        </div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1020
                        <div class="bd">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1021
						<ul>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1022
							<!-- <li><a href="http://developer.yahoo.com/yui/widget/">User's Guide</a> (external)</li> -->
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1023
						<li><a href="../../api/module_widget.html">API Documentation</a></li>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1024
</ul>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1025
                        </div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1026
					</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1027
			  </div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1028
		</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1029
		
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1030
		</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1031
	</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1032
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1033
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1034
<div class="yui-b toc3" id="tocWrapper">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1035
<!-- TABLE OF CONTENTS -->
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1036
<div id="toc">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1037
	
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1038
<ul>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1039
<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="item"><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="selected "><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
  1040
</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1041
</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1042
	</div><!--closes bd-->
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1043
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1044
	<div id="ft">
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1045
        <p class="first">Copyright &copy; 2009 Yahoo! Inc. All rights reserved.</p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1046
        <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
  1047
            <a href="http://docs.yahoo.com/info/terms/">Terms of Service</a> - 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1048
            <a href="http://docs.yahoo.com/info/copyright/copyright.html">Copyright Policy</a> - 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1049
            <a href="http://careers.yahoo.com/">Job Openings</a></p>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1050
	</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1051
</div>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1052
<script src="../../assets/dpSyntaxHighlighter.js"></script>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1053
<script language="javascript"> 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1054
dp.SyntaxHighlighter.HighlightAll('code'); 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1055
</script>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1056
</body>
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
  1057
</html>