Essay preview
THE EXPERT’S VOICE ® IN WEB DEVELOPMENT
Beginning
JavaScript with DOM Scripting and Ajax
From Novice to Professional
The ultimate guide to modern JavaScript development!
Christian Heilmann
Foreword by Simon Willison, Technology Development at Yahoo!
Beginning JavaScript with DOM Scripting and Ajax
From Novice to Professional
■■■
Christian Heilmann
Beginning JavaScript with DOM Scripting and Ajax: From Novice to Professional Copyright © 2006 by Christian Heilmann All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright owner and the publisher. ISBN-13 (pbk): 978-1-59059-680-7 ISBN-10 (pbk): 1-59059-680-3 Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1 Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark. Lead Editors: Charles Brown, Chris Mills Technical Reviewer: Jon Stephens Editorial Board: Steve Anglin, Ewan Buckingham, Gary Cornell, Jason Gilmore, Jonathan Gennick, Jonathan Hassell, James Huddleston, Chris Mills, Matthew Moodie, Dominic Shakeshaft, Jim Sumser, Keir Thomas, Matt Wade Project Manager: Beth Christmas Copy Edit Manager: Nicole LeClerc Copy Editor: Ami Knox Assistant Production Director: Kari Brooks-Copony Production Editor: Katie Stence Compositor: Pat Christenson Proofreader: Lori Bring Indexer: Broccoli Information Management Artist: April Milne Cover Designer: Kurt Krames Manufacturing Director: Tom Debolski Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail [email protected], or visit http://www.springeronline.com. For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley, CA 94710. Phone 510-549-5930, fax 510-549-5939, e-mail [email protected], or visit http://www.apress.com. The information in this book is distributed on an “as is” basis, without warranty. Although every precaution has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly by the information contained in this work. The source code for this book is available to readers at http://www.beginningjavascript.com and http:// www.apress.com.
To Ioanna, who can sleep and look like an angel while some geek next to her hacks on the keyboard of a laptop and constantly mutters “Why won’t you work” under his breath.
Contents at a Glance
Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi
■CHAPTER 1 ■CHAPTER 2 ■CHAPTER 3 ■CHAPTER 4 ■CHAPTER 5 ■CHAPTER 6 ■CHAPTER 7 ■CHAPTER 8 ■CHAPTER 9 ■CHAPTER 10 ■CHAPTER 11 ■APPENDIX
Getting Started with JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Data and Decisions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 From DHTML to DOM Scripting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 HTML and JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Presentation and Behavior (CSS and Event Handling) . . . . . . . . . . 123 Common Uses of JavaScript: Images and Windows . . . . . . . . . . . 183 JavaScript and User Interaction: Navigation and Forms . . . . . . . . . . 241 Back-End Interaction with Ajax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 Data Validation Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 Modern JavaScript Case Study: A Dynamic Gallery . . . . . . . . . . . . 387 Using Third-Party JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 Debugging JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
v
Contents
Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi
■CHAPTER 1
Getting Started with JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
The Why of JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 What Is JavaScript? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Problems and Merits of JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Why Use JavaScript If It Cannot Be Relied On? . . . . . . . . . . . . . . . . . . . . . . . 6 JavaScript in a Web Page and Essential Syntax . . . . . . . . . . . . . . . . . . . . . . 7 JavaScript Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Code Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 An Aside About Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Simple JavaScript Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
■CHAPTER 2
Data and Decisions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Data, Data Types, and Data Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The String Data Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JavaScript Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Converting Different Types of Data . . . . . . . . . . . . . . . . . . . . . . . . . . . The Composite Data Types: Array and Object . . . . . . . . . . . . . . . . . . . . . . . Objects JavaScript Supplies You with: String, Date, and Math . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Array Object’s Methods and Properties . . . . . . . . . . . . . . . . . .
17 18 18 21 23 26 30 30 39 42
vii
viii
■C O N T E N T S
Making Decisions in JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Logical and Comparison Operators . . . . . . . . . . . . . . . . . . . . . . . Conditional Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Testing Multiple Values: the switch Statement . . . . . . . . . . . . . . . . Repeating Things: Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45 45 49 52 54 59
■CHAPTER 3
From DHTML to DOM Scripting
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 63 65 68 69 71 71 72 74 76 79 80 80 81 83 85
JavaScript As “the Behavior Layer” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Object Detection vs. Browser Dependence . . . . . . . . . . . . . . . . . . . . Progressive Enhancement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JavaScript and Accessibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Good Coding Practices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Naming Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Code Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Commenting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Short Code via Ternary Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sorting and Reuse of Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variable and Function Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Keeping Scripts Safe with the Object Literal . . . . . . . . . . . . . . . . . . . Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
■CHAPTER 4
HTML and JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Anatomy of an HTML Document. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Providing Feedback in Web Pages via JavaScript: The Old School Ways . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Using window Methods: prompt(), alert(), and confirm() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Accessing the Document via the DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Of Children, Parents, Siblings, and Values . . . . . . . . . . . . . . . . . . . . . . . . . . 99 From the Parents to the Children . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 From the Children to the Parents . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Among Siblings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Changing Attributes of Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
■C O N T E N T S
ix
Creating, Removing, and Replacing Elements . . . . . . . . . . . . . . . . . . . . . . Avoiding NOSCRIPT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Shortening Your Scripts via InnerHTML. . . . . . . . . . . . . . . . . . . . . . . DOM Summary: Your Cheat Sheet . . . . . . . . . . . . . . . . . . . . . . . . . . . DOMhelp: Our Own Helper Library . . . . . . . . . . . . . . . . . . . . . . . . . . . Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
109 113 115 116 118 122
■CHAPTER 5
Presentation and Behavior (CSS and Event Handling)
. . 123 123 131 153 156 165 172 173 174 179 180
Changing the Presentation Layer via JavaScript . . . . . . . . . . . . . . . . . . . . Helping the CSS Designer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Changing the Document’s Behavior via Event Handling . . . . . . . . . . . . . Events in the W3C-Compliant World . . . . . . . . . . . . . . . . . . . . . . . . . Fixing Events for the Non-W3C-Compliant World . . . . . . . . . . . . . . Never Stop Optimizing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Ugly Page Load Problem and Its Ugly Solutions . . . . . . . . . . . . Reading and Filtering Keyboard Entries . . . . . . . . . . . . . . . . . . . . . . The Dangers of Event Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
■CHAPTER 6
Common Uses of JavaScript: Images and Windows
. . . . 183 183 184 186 187 196 211 212 213 215 238 239
Images and JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Basics of Image Scripting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Preloading Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rollover Effects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Slide Shows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Summary of Images and JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . Windows and JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Window Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Window Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Summary: Windows and JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
x
■C O N T E N T S
■CHAPTER 7
JavaScript and User Interaction: Navigation and Forms. . .
Navigation and JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Fear of the Page Reload . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Basics of Navigation and JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . Browser Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . In-Page Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Site Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pagination . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Summary of Navigation with JavaScript . . . . . . . . . . . . . . . . . . . . . . Forms and JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Basics of Forms with JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . Form Elements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Interactive Forms: Hiding and Showing Dependent Elements. . . . Custom Form Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Summary of Forms and JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
241 241 242 242 245 246 255 263 272 272 274 275 291 297 297 297
■CHAPTER 8
Back-End Interaction with Ajax
. . . . . . . . . . . . . . . . . . . . . . . . . . 299
Household Cleaning Liquid, Football Club, or Flash Gordon’s Spacecraft: What Is Ajax? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Et Tu, Cache? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Putting the X Back into Ajax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Replacing XML with JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using Server-Side Scripts to Reach Third-Party Content . . . . . . . . XHR on Slow Connections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A Larger Ajax Example: Connected Select Boxes . . . . . . . . . . . . . . Optional Dynamic Ajax Menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
300 309 309 314 316 320 323 331 340 343
■CHAPTER 9
Data Validation Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Pros and Cons of Client-Side JavaScript Validation . . . . . . . . . . . . . . . . . 343 A Quick Reminder About Protecting Content with JavaScript . . . . . . . . . 344 The One-Size-Fits-All Validation Myth . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
■C O N T E N T S
xi
Basic JavaScript Validation with String and Numeric Methods . . . . . . . String Validation Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Numeric Validation Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Syntax and Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wildcard Searches, Constraining Scope, and Alternatives . . . . . . Restricting the Number of Characters with Quantifiers . . . . . . . . . Word Boundaries, Whitespace, and Other Shortcuts . . . . . . . . . . . Methods Using Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . . The Power of Parenthesis Grouping . . . . . . . . . . . . . . . . . . . . . . . . . . Regular Expression Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Summary of Validation Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Form Validation Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Designating Mandatory Fields. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Hidden Field Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Indicator Element Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The CSS Classes Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Custom Attribute Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Failures of These Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sharing Validation Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Giving Users Validation Feedback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Showing a List of Erroneous Fields . . . . . . . . . . . . . . . . . . . . . . . . . . Replacing the Main Form with a Clickable Error Message. . . . . . . Highlighting Erroneous Fields Individually . . . . . . . . . . . . . . . . . . . . Instant Validation Feedback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Other Dynamic Validation Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
346 346 352 357 357 358 359 360 361 361 363 363 364 364 364 365 366 366 367 367 369 369 374 376 379 381 385 387 387 388 388 389 396 401 406 414
■CHAPTER 10
Modern JavaScript Case Study: A Dynamic Gallery . . . . .
Basics of Thumbnail Galleries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . What Is a Thumbnail Gallery and What Should It Do? . . . . . . . . . . . . . . . Static Thumbnail Galleries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Faking Dynamic Galleries with JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . Displaying Captions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dynamic Thumbnail Galleries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Creating an Image Badge from a Folder . . . . . . . . . . . . . . . . . . . . . . . . . . . Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
xii
■C O N T E N T S
■CHAPTER 11
Using Third-Party JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . What the Web Offers You . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Code Snippets, RSS Feeds, APIs, and Libraries . . . . . . . . . . . . . . . . . . . . RSS Feeds and REST APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examples of REST APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using a Library: Short, Shorter, jQuery . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dangers of jQuery and Other Libraries Using Their Own Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Using an API: Adding a Map to Your Site with Google Maps . . . . . . . . . . Full Service: The Yahoo Developer Network and User Interface Library. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bouncy Headlines Using YUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Replacing Pop-Up Windows Using the YUI Connection Manager and Container Components . . . . . . . . . . . . . . . . . . . . . . Yahoo User Interface Library Summary . . . . . . . . . . . . . . . . . . . . . . . Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
415 415 416 417 418 419 426 427 438 439 444 449 450 451 451 451 452 454 456 458 458 459 462 463 463 464 466 466 470 ...