Commit ca7b845e5e6479292ba430ffd66ba4abe1f79691

Authored by jarrett
1 parent f27a5197

StoryId: 778896: Late Night Commit

Commited By: Jarrett Jordaan

Reviewed By: Paul Barrett
Showing 51 changed files with 5401 additions and 5238 deletions
setup/wizard/lib/services/unixScheduler.php
@@ -150,7 +150,6 @@ class unixScheduler extends unixService { @@ -150,7 +150,6 @@ class unixScheduler extends unixService {
150 function start() { 150 function start() {
151 // TODO : Write sh on the fly? Not sure the reasoning here 151 // TODO : Write sh on the fly? Not sure the reasoning here
152 $source = $this->getSchedulerSourceLoc(); 152 $source = $this->getSchedulerSourceLoc();
153 - return ;  
154 if($source) { // Source 153 if($source) { // Source
155 $cmd = "nohup ".$source." > ".SYS_LOG_DIR."scheduler.log 2>&1 & echo $!"; 154 $cmd = "nohup ".$source." > ".SYS_LOG_DIR."scheduler.log 2>&1 & echo $!";
156 $response = $this->util->pexec($cmd); 155 $response = $this->util->pexec($cmd);
setup/wizard/lib/services/windowsAgent.php
@@ -42,10 +42,16 @@ @@ -42,10 +42,16 @@
42 42
43 class windowsAgent extends windowsService { 43 class windowsAgent extends windowsService {
44 44
45 -  
46 - public function __construct() {  
47 - $this->name = "KTAgentTest";  
48 - } 45 + /**
  46 + * Service name
  47 + *
  48 + * @author KnowledgeTree Team
  49 + * @access public
  50 + * @param none
  51 + * @return string
  52 + */
  53 + public $name = "KTAgentTest";
  54 +
49 55
50 } 56 }
51 ?> 57 ?>
52 \ No newline at end of file 58 \ No newline at end of file
setup/wizard/lib/services/windowsLucene.php
@@ -122,6 +122,16 @@ class windowsLucene extends windowsService { @@ -122,6 +122,16 @@ class windowsLucene extends windowsService {
122 private $luceneDir; 122 private $luceneDir;
123 123
124 /** 124 /**
  125 + * Service name
  126 + *
  127 + * @author KnowledgeTree Team
  128 + * @access public
  129 + * @param none
  130 + * @return string
  131 + */
  132 + public $name = "KTLuceneTest";
  133 +
  134 + /**
125 * Load defaults needed by service 135 * Load defaults needed by service
126 * 136 *
127 * @author KnowledgeTree Team 137 * @author KnowledgeTree Team
@@ -130,7 +140,7 @@ class windowsLucene extends windowsService { @@ -130,7 +140,7 @@ class windowsLucene extends windowsService {
130 * @return void 140 * @return void
131 */ 141 */
132 public function load() { 142 public function load() {
133 - $this->name = "KTLuceneTest"; 143 +// $this->name = "KTLuceneTest";
134 $this->javaSystem = new Java('java.lang.System'); 144 $this->javaSystem = new Java('java.lang.System');
135 $this->setJavaBin($this->javaSystem->getProperty('java.home').DS."bin"); 145 $this->setJavaBin($this->javaSystem->getProperty('java.home').DS."bin");
136 $this->setLuceneDIR(SYSTEM_DIR."bin".DS."luceneserver"); 146 $this->setLuceneDIR(SYSTEM_DIR."bin".DS."luceneserver");
@@ -352,11 +362,12 @@ class windowsLucene extends windowsService { @@ -352,11 +362,12 @@ class windowsLucene extends windowsService {
352 * @author KnowledgeTree Team 362 * @author KnowledgeTree Team
353 * @access public 363 * @access public
354 * @param none 364 * @param none
355 - * @return array 365 + * @return string
356 */ 366 */
357 - function install() { 367 + public function install() {
358 $state = $this->status(); 368 $state = $this->status();
359 if($state == '') { 369 if($state == '') {
  370 + $this->writeLuceneProperties();
360 $luceneExe = $this->getLuceneExe(); 371 $luceneExe = $this->getLuceneExe();
361 $luceneSource = $this->getLuceneSource(); 372 $luceneSource = $this->getLuceneSource();
362 $luceneDir = $this->getluceneDir(); 373 $luceneDir = $this->getluceneDir();
@@ -371,5 +382,29 @@ class windowsLucene extends windowsService { @@ -371,5 +382,29 @@ class windowsLucene extends windowsService {
371 return $state; 382 return $state;
372 } 383 }
373 384
  385 + /**
  386 + * Write Lucene Service property file
  387 + *
  388 + * @author KnowledgeTree Team
  389 + * @access public
  390 + * @param none
  391 + * @return string
  392 + */
  393 + private function writeLuceneProperties() {
  394 + // Check if bin is readable and writable
  395 + if(is_readable(SYS_BIN_DIR) && is_writable(SYS_BIN_DIR)) {
  396 + if($this->getluceneDir()) {
  397 + $fp = fopen($this->getluceneDir()."KnowledgeTreeIndexer.properties", "w+");
  398 + $content = "server.port=8875\n";
  399 + $content .= "server.paranoid=false\n";
  400 + $content .= "server.accept=127.0.0.1\n";
  401 + $content .= "server.deny=\n";
  402 + $content .= "indexer.directory=../../var/indexes\n";
  403 + $content .= "indexer.analyzer=org.apache.lucene.analysis.standard.StandardAnalyzer\n";
  404 + fwrite($fp, $content);
  405 + fclose($fp);
  406 + }
  407 + }
  408 + }
374 } 409 }
375 ?> 410 ?>
376 \ No newline at end of file 411 \ No newline at end of file
setup/wizard/lib/services/windowsOpenOffice.php
@@ -42,42 +42,118 @@ @@ -42,42 +42,118 @@
42 42
43 class windowsOpenOffice extends windowsService { 43 class windowsOpenOffice extends windowsService {
44 44
45 - // utility 45 + /**
  46 + * Reference to utility object
  47 + *
  48 + * @author KnowledgeTree Team
  49 + * @access protected
  50 + * @var string
  51 + */
46 public $util; 52 public $util;
47 - // path to office 53 +
  54 + /**
  55 + * Path to office executable
  56 + *
  57 + * @author KnowledgeTree Team
  58 + * @access protected
  59 + * @var string
  60 + */
48 private $path; 61 private $path;
49 - // host 62 +
  63 + /**
  64 + * Web server
  65 + *
  66 + * @author KnowledgeTree Team
  67 + * @access protected
  68 + * @var string
  69 + */
50 private $host; 70 private $host;
51 - // pid running 71 +
  72 + /**
  73 + * Path to temp pid file
  74 + *
  75 + * @author KnowledgeTree Team
  76 + * @access protected
  77 + * @var string
  78 + */
52 private $pidFile; 79 private $pidFile;
53 - // port to bind to 80 +
  81 + /**
  82 + * Web server Port
  83 + *
  84 + * @author KnowledgeTree Team
  85 + * @access protected
  86 + * @var string
  87 + */
54 private $port; 88 private $port;
55 - // bin folder 89 +
  90 + /**
  91 + * Web server
  92 + *
  93 + * @author KnowledgeTree Team
  94 + * @access protected
  95 + * @var string
  96 + */
56 private $bin; 97 private $bin;
57 - // office executable 98 +
  99 + /**
  100 + * Office executable name
  101 + *
  102 + * @author KnowledgeTree Team
  103 + * @access protected
  104 + * @var string
  105 + */
58 private $soffice; 106 private $soffice;
59 - // office log file 107 +
  108 + /**
  109 + * Log file
  110 + *
  111 + * @author KnowledgeTree Team
  112 + * @access protected
  113 + * @var string
  114 + */
60 private $log; 115 private $log;
61 - private $options;  
62 - private $winservice;  
63 116
64 - public function __construct() {  
65 - $this->name = "openoffice";  
66 - $this->util = new InstallUtil();  
67 - } 117 + /**
  118 + * Open office options
  119 + *
  120 + * @author KnowledgeTree Team
  121 + * @access protected
  122 + * @var string
  123 + */
  124 + private $options;
68 125
  126 + /**
  127 + * Path to win service
  128 + *
  129 + * @author KnowledgeTree Team
  130 + * @access protected
  131 + * @var string
  132 + */
  133 + private $winservice;
  134 +
  135 + /**
  136 + * Service name
  137 + *
  138 + * @author KnowledgeTree Team
  139 + * @access public
  140 + * @param none
  141 + * @return string
  142 + */
  143 + public $name = "KTOpenOfficeTest";
  144 +
69 public function load() { 145 public function load() {
70 // hack for testing 146 // hack for testing
71 $this->setPort("8100"); 147 $this->setPort("8100");
72 $this->setHost("127.0.0.1"); 148 $this->setHost("127.0.0.1");
73 $this->setLog("openoffice.log"); 149 $this->setLog("openoffice.log");
74 - $this->setBin("C:\Program Files (x86)\OpenOffice.org 3\program\soffice.bin");  
75 - $this->setBin("C:\Program Files (x86)\ktdms\openoffice\program\soffice.bin");  
76 - $this->setBin("C:\Program Files (x86)\ktdms\openoffice.2.4\program\soffice.bin"); 150 +// $this->setBin("C:\Program Files (x86)\OpenOffice.org 3\program\soffice.bin");
  151 +// $this->setBin("C:\Program Files (x86)\ktdms\openoffice\program\soffice.bin");
  152 +// $this->setBin("C:\Program Files (x86)\ktdms\openoffice.2.4\program\soffice.bin");
77 $this->setWinservice("winserv.exe"); 153 $this->setWinservice("winserv.exe");
78 - $this->setOption(); 154 +// $this->setOption();
79 } 155 }
80 - 156 + #rem "%INSTALL_PATH%\bin\winserv.exe" install %OpenofficeServiceName% -displayname "%OpenofficeServiceName%" -start auto %SOFFICE_BIN% -headless -invisible -accept=pipe,name=pypipe;urp;
81 private function setPort($port = "8100") { 157 private function setPort($port = "8100") {
82 $this->port = $port; 158 $this->port = $port;
83 } 159 }
@@ -139,24 +215,5 @@ class windowsOpenOffice extends windowsService { @@ -139,24 +215,5 @@ class windowsOpenOffice extends windowsService {
139 return $status; 215 return $status;
140 } 216 }
141 } 217 }
142 -  
143 -// public function start() {  
144 -// $state = $this->status();  
145 -// if($state != 'STARTED') {  
146 -// $cmd = 'sc start ' . $this->name;  
147 -// $response = $this->util->pexec($cmd);  
148 -//  
149 -// return $response;  
150 -// } elseif ($state == '') {  
151 -// // Start Service  
152 -// return true;  
153 -// } else {  
154 -// // Service Running Already  
155 -// return true;  
156 -// }  
157 -//  
158 -// return false;  
159 -// }  
160 -  
161 } 218 }
162 ?> 219 ?>
163 \ No newline at end of file 220 \ No newline at end of file
setup/wizard/lib/services/windowsScheduler.php
@@ -66,6 +66,16 @@ class windowsScheduler extends windowsService { @@ -66,6 +66,16 @@ class windowsScheduler extends windowsService {
66 * @var string 66 * @var string
67 */ 67 */
68 private $schedulerDir; 68 private $schedulerDir;
  69 +
  70 + /**
  71 + * Service name
  72 + *
  73 + * @author KnowledgeTree Team
  74 + * @access public
  75 + * @param none
  76 + * @return string
  77 + */
  78 + public $name = "KTSchedulerTest";
69 79
70 /** 80 /**
71 * Load defaults needed by service 81 * Load defaults needed by service
@@ -76,62 +86,61 @@ class windowsScheduler extends windowsService { @@ -76,62 +86,61 @@ class windowsScheduler extends windowsService {
76 * @return void 86 * @return void
77 */ 87 */
78 function load() { 88 function load() {
79 - $this->name = "KTSchedulerTest";  
80 $this->setSchedulerDIR(SYSTEM_DIR."bin".DS."win32"); 89 $this->setSchedulerDIR(SYSTEM_DIR."bin".DS."win32");
81 -// $this->setSchedulerScriptPath("taskrunner_test.bat");  
82 $this->setSchedulerScriptPath("taskrunner.bat"); 90 $this->setSchedulerScriptPath("taskrunner.bat");
83 $this->setSchedulerSource("schedulerService.php"); 91 $this->setSchedulerSource("schedulerService.php");
  92 +
84 } 93 }
85 94
86 /** 95 /**
87 - * Set Batch Script path 96 + * Set Scheduler Directory path
88 * 97 *
89 * @author KnowledgeTree Team 98 * @author KnowledgeTree Team
90 * @access private 99 * @access private
91 - * @param string  
92 - * @return void 100 + * @param none
  101 + * @return string
93 */ 102 */
94 - private function setSchedulerScriptPath($schedulerScriptPath) {  
95 - $this->schedulerScriptPath = "{$this->getSchedulerDir()}".DS."$schedulerScriptPath"; 103 + private function setSchedulerDIR($schedulerDIR) {
  104 + $this->schedulerDir = $schedulerDIR;
96 } 105 }
97 106
98 /** 107 /**
99 - * Retrieve Batch Script path 108 + * Retrieve Scheduler Directory path
100 * 109 *
101 * @author KnowledgeTree Team 110 * @author KnowledgeTree Team
102 * @access public 111 * @access public
103 * @param none 112 * @param none
104 * @return string 113 * @return string
105 */ 114 */
106 - public function getSchedulerScriptPath() {  
107 - if(file_exists($this->schedulerScriptPath))  
108 - return $this->schedulerScriptPath; 115 + public function getSchedulerDir() {
  116 + if(file_exists($this->schedulerDir))
  117 + return $this->schedulerDir;
109 return false; 118 return false;
110 } 119 }
111 120
112 /** 121 /**
113 - * Set Scheduler Directory path 122 + * Set Batch Script path
114 * 123 *
115 * @author KnowledgeTree Team 124 * @author KnowledgeTree Team
116 * @access private 125 * @access private
117 - * @param none  
118 - * @return string 126 + * @param string
  127 + * @return void
119 */ 128 */
120 - private function setSchedulerDIR($schedulerDIR) {  
121 - $this->schedulerDir = $schedulerDIR; 129 + private function setSchedulerScriptPath($schedulerScriptPath) {
  130 + $this->schedulerScriptPath = "{$this->getSchedulerDir()}".DS."$schedulerScriptPath";
122 } 131 }
123 132
124 /** 133 /**
125 - * Retrieve Scheduler Directory path 134 + * Retrieve Batch Script path
126 * 135 *
127 * @author KnowledgeTree Team 136 * @author KnowledgeTree Team
128 * @access public 137 * @access public
129 * @param none 138 * @param none
130 * @return string 139 * @return string
131 */ 140 */
132 - public function getSchedulerDir() {  
133 - if(file_exists($this->schedulerDir))  
134 - return $this->schedulerDir; 141 + public function getSchedulerScriptPath() {
  142 + if(file_exists($this->schedulerScriptPath))
  143 + return $this->schedulerScriptPath;
135 return false; 144 return false;
136 } 145 }
137 146
@@ -172,28 +181,33 @@ class windowsScheduler extends windowsService { @@ -172,28 +181,33 @@ class windowsScheduler extends windowsService {
172 public function install() { 181 public function install() {
173 $state = $this->status(); 182 $state = $this->status();
174 if($state == '') { 183 if($state == '') {
175 - if(is_readable(SYS_BIN_DIR) && is_writable(SYS_BIN_DIR)) {  
176 - if(!file_exists($this->getSchedulerScriptPath())) {  
177 - $fp = fopen($this->getSchedulerScriptPath(), "w+");  
178 - $content = "@echo off\n";  
179 - $content .= "\"".PHP_DIR."php.exe\" "."\"{$this->getSchedulerSource()}\"";  
180 - fwrite($fp, $content);  
181 - fclose($fp);  
182 - }  
183 - }  
184 - 184 + $this->writeSchedulerTask();
185 // TODO what if it does not exist? check how the dmsctl.bat does this 185 // TODO what if it does not exist? check how the dmsctl.bat does this
186 - if (function_exists('win32_create_service'))  
187 - { 186 + if (function_exists('win32_create_service')) {
188 $response = win32_create_service(array( 187 $response = win32_create_service(array(
189 'service' => $this->name, 188 'service' => $this->name,
190 'display' => $this->name, 189 'display' => $this->name,
191 'path' => $this->getSchedulerScriptPath() 190 'path' => $this->getSchedulerScriptPath()
192 )); 191 ));
193 return $response; 192 return $response;
  193 + } else { // Attempt to use the winserv
  194 +
194 } 195 }
195 } 196 }
196 return $state; 197 return $state;
197 } 198 }
  199 +
  200 + private function writeSchedulerTask() {
  201 + // Check if bin is readable and writable
  202 + if(is_readable(SYS_BIN_DIR) && is_writable(SYS_BIN_DIR)) {
  203 + if(!$this->getSchedulerScriptPath()) {
  204 + $fp = fopen($this->getSchedulerScriptPath(), "w+");
  205 + $content = "@echo off\n";
  206 + $content .= "\"".PHP_DIR."php.exe\" "."\"{$this->getSchedulerSource()}\"";
  207 + fwrite($fp, $content);
  208 + fclose($fp);
  209 + }
  210 + }
  211 + }
198 } 212 }
199 ?> 213 ?>
200 \ No newline at end of file 214 \ No newline at end of file
setup/wizard/lib/services/windowsService.php
@@ -41,7 +41,25 @@ @@ -41,7 +41,25 @@
41 */ 41 */
42 42
43 class windowsService extends Service { 43 class windowsService extends Service {
  44 + /**
  45 + * Service name
  46 + *
  47 + * @author KnowledgeTree Team
  48 + * @access public
  49 + * @param none
  50 + * @return string
  51 + */
44 public $name; 52 public $name;
  53 +
  54 + /**
  55 + * Reference to utility object
  56 + *
  57 + * @author KnowledgeTree Team
  58 + * @access public
  59 + * @param none
  60 + * @return string
  61 + */
  62 +
45 public $util; 63 public $util;
46 64
47 public function __construct() { 65 public function __construct() {
setup/wizard/path.php
@@ -40,6 +40,7 @@ @@ -40,6 +40,7 @@
40 * @version Version 0.1 40 * @version Version 0.1
41 */ 41 */
42 // Define installer environment 42 // Define installer environment
  43 + define('DEBUG', 1);
43 if (substr(php_uname(), 0, 7) == "Windows"){ 44 if (substr(php_uname(), 0, 7) == "Windows"){
44 define('WINDOWS_OS', true); 45 define('WINDOWS_OS', true);
45 define('UNIX_OS', false); 46 define('UNIX_OS', false);
setup/wizard/resources/form.js 0 โ†’ 100644
  1 +/* jQuery */
  2 +
  3 +// prepare the form when the DOM is ready
  4 +$(document).ready(function() {
  5 + var options = {
  6 + target: '#content_container', // target element(s) to be updated with server response
  7 + beforeSubmit: showRequest, // pre-submit callback
  8 + success: showResponse // post-submit callback
  9 +
  10 + // other available options:
  11 + //url: url // override for form's 'action' attribute
  12 + //type: type // 'get' or 'post', override for form's 'method' attribute
  13 + //dataType: null // 'xml', 'script', or 'json' (expected server response type)
  14 + //clearForm: true // clear all form fields after successful submit
  15 + //resetForm: true // reset the form after successful submit
  16 +
  17 + // $.ajax options can be used here too, for example:
  18 + //timeout: 3000
  19 + };
  20 + $.blockUI.defaults.css = {};
  21 + var override = $('form').attr('onsubmit');
  22 + if(override == undefined) { // check if ajax form submit is overridden
  23 + $('form').ajaxForm(options); // bind form using 'ajaxForm' to all forms
  24 + w.adjustMenu($('form').attr('id')); // adjust the side menu accordingly
  25 + } else {
  26 + var options = {
  27 + target: '#content_container', // target element(s) to be updated with server response
  28 + beforeSubmit: w.validateRegistration, // pre-submit callback
  29 + success: w.adjustMenu($('form').attr('id')) // post-submit callback
  30 + };
  31 + $('form').ajaxForm(options); // bind form using 'ajaxForm' to all forms
  32 + }
  33 +});
  34 +
  35 +// pre-submit callback
  36 +function showRequest(formData, jqForm, options) {
  37 + $.blockUI();
  38 + $('#loading').attr('style', 'display:block;');
  39 +}
  40 +
  41 +// post-submit callback
  42 +function showResponse(responseText, statusText) {
  43 + $.unblockUI();
  44 + $('#loading').attr('style', 'display:none;');
  45 +}
  46 +
setup/wizard/resources/graphics/loading.gif 0 โ†’ 100644

1.81 KB

setup/wizard/resources/jquery-tooltip/changelog.txt deleted
1 -1.3  
2 ----  
3 -  
4 -* Added fade option (duration in ms) for fading in/out tooltips; IE <= 6 is excluded when bgiframe plugin is included  
5 -* Fixed imagemaps in IE, added back example  
6 -* Added positionLeft-option - positions the tooltip to the left of the cursor  
7 -* Remove deprecated $.fn.Tooltip in favor of $.fn.tooltip  
8 -  
9 -1.2  
10 ----  
11 -  
12 -* Improved bodyHandler option to accept HTML strings, DOM elements and jQuery objects as the return value  
13 -* Fixed bug in Safari 3 where to tooltip is initially visible, by first appending to DOM then hiding it  
14 -* Improvement for viewport-border-positioning: Add the classes "viewport-right" and "viewport-bottom" when the element is moved at the viewport border.  
15 -* Moved and enhanced documentation to docs.jquery.com  
16 -* Added examples for bodyHandler: footnote-tooltip and thumbnail  
17 -* Added id option, defaults to "tooltip", override to use a different id in your stylesheet  
18 -* Moved demo tooltip style to screen.css  
19 -* Moved demo files to demo folder and dependencies to lib folder  
20 -* Dropped image map example - completely incompatible with IE; image maps aren't supported anymore  
21 -  
22 -1.1  
23 ----  
24 -  
25 -* Use bgiframe-plugin if available  
26 -* Use dimensions-plugin to calculate viewport  
27 -* Expose global blocked-property via $.Tooltip.blocked to programmatically disable all tooltips  
28 -* Fixed image maps in IE by setting the alt-attribute to an empty string  
29 -* Removed event-option (only hover-tooltips now)  
30 -* Simplified event-handling (using hover instead of mouseover und mouseout)  
31 -* Added another "pretty" example  
32 -* Added top and left options to specify tooltip offset  
33 -* Reworked example page: New layout, code examples  
34 -  
35 -1.0  
36 ----  
37 -  
38 -* first release considered stable  
39 \ No newline at end of file 0 \ No newline at end of file
setup/wizard/resources/jquery-tooltip/demo/bg.gif deleted

1.15 KB

setup/wizard/resources/jquery-tooltip/demo/chili-1.7.pack.js deleted
1 -eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('8={3b:"1.6",2o:"1B.1Y,1B.23,1B.2e",2i:"",2H:1a,12:"",2C:1a,Z:"",2a:\'<H V="$0">$$</H>\',R:"&#F;",1j:"&#F;&#F;&#F;&#F;",1f:"&#F;<1W/>",3c:5(){9 $(y).39("1k")[0]},I:{},N:{}};(5($){$(5(){5 1J(l,a){5 2I(A,h){4 3=(1v h.3=="1h")?h.3:h.3.1w;k.1m({A:A,3:"("+3+")",u:1+(3.c(/\\\\./g,"%").c(/\\[.*?\\]/g,"%").3a(/\\((?!\\?)/g)||[]).u,z:(h.z)?h.z:8.2a})}5 2z(){4 1E=0;4 1x=x 2A;Q(4 i=0;i<k.u;i++){4 3=k[i].3;3=3.c(/\\\\\\\\|\\\\(\\d+)/g,5(m,1F){9!1F?m:"\\\\"+(1E+1+1t(1F))});1x.1m(3);1E+=k[i].u}4 1w=1x.3d("|");9 x 1u(1w,(a.3g)?"2j":"g")}5 1S(o){9 o.c(/&/g,"&3h;").c(/</g,"&3e;")}5 1R(o){9 o.c(/ +/g,5(1X){9 1X.c(/ /g,R)})}5 G(o){o=1S(o);7(R){o=1R(o)}9 o}5 2m(2E){4 i=0;4 j=1;4 h;19(h=k[i++]){4 1b=D;7(1b[j]){4 1U=/(\\\\\\$)|(?:\\$\\$)|(?:\\$(\\d+))/g;4 z=h.z.c(1U,5(m,1V,K){4 3f=\'\';7(1V){9"$"}v 7(!K){9 G(1b[j])}v 7(K=="0"){9 h.A}v{9 G(1b[j+1t(K,10)])}});4 1A=D[D.u-2];4 2h=D[D.u-1];4 2G=2h.2v(11,1A);11=1A+2E.u;14+=G(2G)+z;9 z}v{j+=h.u}}}4 R=8.R;4 k=x 2A;Q(4 A 2r a.k){2I(A,a.k[A])}4 14="";4 11=0;l.c(2z(),2m);4 2y=l.2v(11,l.u);14+=G(2y);9 14}5 2B(X){7(!8.N[X]){4 Y=\'<Y 32="1p" 33="p/2u"\'+\' 30="\'+X+\'">\';8.N[X]=1H;7($.31.34){4 W=J.1L(Y);4 $W=$(W);$("2d").1O($W)}v{$("2d").1O(Y)}}}5 1q(e,a){4 l=e&&e.1g&&e.1g[0]&&e.1g[0].37;7(!l)l="";l=l.c(/\\r\\n?/g,"\\n");4 C=1J(l,a);7(8.1j){C=C.c(/\\t/g,8.1j)}7(8.1f){C=C.c(/\\n/g,8.1f)}$(e).38(C)}5 1o(q,13){4 1l={12:8.12,2x:q+".1d",Z:8.Z,2w:q+".2u"};4 B;7(13&&1v 13=="2l")B=$.35(1l,13);v B=1l;9{a:B.12+B.2x,1p:B.Z+B.2w}}7($.2q)$.2q({36:"2l.15"});4 2n=x 1u("\\\\b"+8.2i+"\\\\b","2j");4 1e=[];$(8.2o).2D(5(){4 e=y;4 1n=$(e).3i("V");7(!1n){9}4 q=$.3u(1n.c(2n,""));7(\'\'!=q){1e.1m(e);4 f=1o(q,e.15);7(8.2H||e.15){7(!8.N[f.a]){1D{8.N[f.a]=1H;$.3v(f.a,5(M){M.f=f.a;8.I[f.a]=M;7(8.2C){2B(f.1p)}$("."+q).2D(5(){4 f=1o(q,y.15);7(M.f==f.a){1q(y,M)}})})}1I(3s){3t("a 3w Q: "+q+\'@\'+3z)}}}v{4 a=8.I[f.a];7(a){1q(e,a)}}}});7(J.1i&&J.1i.29){5 22(p){7(\'\'==p){9""}1z{4 16=(x 3A()).2k()}19(p.3x(16)>-1);p=p.c(/\\<1W[^>]*?\\>/3y,16);4 e=J.1L(\'<1k>\');e.3l=p;p=e.3m.c(x 1u(16,"g"),\'\\r\\n\');9 p}4 T="";4 18=1G;$(1e).3j().G("1k").U("2c",5(){18=y}).U("1M",5(){7(18==y)T=J.1i.29().3k});$("3n").U("3q",5(){7(\'\'!=T){2p.3r.3o(\'3p\',22(T));2V.2R=1a}}).U("2c",5(){T=""}).U("1M",5(){18=1G})}})})(1Z);8.I["1Y.1d"]={k:{2M:{3:/\\/\\*[^*]*\\*+(?:[^\\/][^*]*\\*+)*\\//},25:{3:/\\<!--(?:.|\\n)*?--\\>/},2f:{3:/\\/\\/.*/},2P:{3:/2L|2T|2J|2O|2N|2X|2K|2Z|2U|2S|2W|2Y|2Q|51|c-50/},53:{3:/\\/[^\\/\\\\\\n]*(?:\\\\.[^\\/\\\\\\n]*)*\\/[52]*/},1h:{3:/(?:\\\'[^\\\'\\\\\\n]*(?:\\\\.[^\\\'\\\\\\n]*)*\\\')|(?:\\"[^\\"\\\\\\n]*(?:\\\\.[^\\"\\\\\\n]*)*\\")/},27:{3:/\\b[+-]?(?:\\d*\\.?\\d+|\\d+\\.?\\d*)(?:[1r][+-]?\\d+)?\\b/},4X:{3:/\\b(D|1N|1K|1I|2t|2s|4W|1z|v|1a|Q|5|7|2r|4Z|x|1G|9|1Q|y|1H|1D|1v|4|4Y|19|59)\\b/},1y:{3:/\\b(58|2k|2p|5b|5a|55|J|54|57|1t|56|4L|4K|4N|4M|4H|4G|4J)\\b/},1C:{3:/(?:\\<\\w+)|(?:\\>)|(?:\\<\\/\\w+\\>)|(?:\\/\\>)/},26:{3:/\\s+\\w+(?=\\s*=)/},20:{3:/([\\"\\\'])(?:(?:[^\\1\\\\\\r\\n]*?(?:\\1\\1|\\\\.))*[^\\1\\\\\\r\\n]*?)\\1/},21:{3:/&[\\w#]+?;/},4I:{3:/(\\$|1Z)/}}};8.I["23.1d"]={k:{25:{3:/\\<!--(?:.|\\n)*?--\\>/},1h:{3:/(?:\\\'[^\\\'\\\\\\n]*(?:\\\\.[^\\\'\\\\\\n]*)*\\\')|(?:\\"[^\\"\\\\\\n]*(?:\\\\.[^\\"\\\\\\n]*)*\\")/},27:{3:/\\b[+-]?(?:\\d*\\.?\\d+|\\d+\\.?\\d*)(?:[1r][+-]?\\d+)?\\b/},1C:{3:/(?:\\<\\w+)|(?:\\>)|(?:\\<\\/\\w+\\>)|(?:\\/\\>)/},26:{3:/\\s+\\w+(?=\\s*=)/},20:{3:/([\\"\\\'])(?:(?:[^\\1\\\\\\r\\n]*?(?:\\1\\1|\\\\.))*[^\\1\\\\\\r\\n]*?)\\1/},21:{3:/&[\\w#]+?;/}}};8.I["2e.1d"]={k:{4S:{3:/\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\//},2f:{3:/(?:\\/\\/.*)|(?:[^\\\\]\\#.*)/},4V:{3:/\\\'[^\\\'\\\\]*(?:\\\\.[^\\\'\\\\]*)*\\\'/},4U:{3:/\\"[^\\"\\\\]*(?:\\\\.[^\\"\\\\]*)*\\"/},4P:{3:/\\b(?:[4O][2b][1s][1s]|[4R][4Q][2b][1P]|[5c][5v][1s][5u][1P])\\b/},5x:{3:/\\b[+-]?(\\d*\\.?\\d+|\\d+\\.?\\d*)([1r][+-]?\\d+)?\\b/},5y:{3:/\\b(?:5z|5w(?:5A|5E(?:5F(?:17|1c)|5G(?:17|1c))|17|1T|5B|5C|5D(?:17|1T|1c)|1c)|P(?:5h(?:5k|5j)|5e(?:5d|5g(?:5f|5l)|5r|E(?:5t|5s)|5n(?:5m|5p)|L(?:3X|3W)|O(?:S|3Y(?:3T|3S|3V))|3U|S(?:44|47|46)|41))|40)\\b/},1y:{3:/(?:\\$43|\\$42|\\$3R|\\$3G|\\$3F|\\$3I|\\$3H|\\$3C|\\$3B|\\$3D)\\b/},28:{3:/\\b(?:3O|3N|3P|3K|3J|3M|3L|48|4v|1N|1K|1I|4u|V|4x|4w|2t|4r|2s|4q|1z|4t|v|4s|4D|4C|4F|4E|4z|4y|4B|4A|4p|4d|2F|2F|4g|Q|4f|5|1y|7|4a|4m|4l|4o|4i|4k|x|4j|4h|4n|4b|4c|49|4e|3Q|3E|9|45|1Q|y|3Z|1D|5o|5q|4|19|5i)\\b/},2g:{3:/\\$(\\w+)/,z:\'<H V="28">$</H><H V="2g">$1</H>\'},1C:{3:/(?:\\<\\?[24][4T][24])|(?:\\<\\?)|(?:\\?\\>)/}}}',62,353,'|||exp|var|function||if|ChiliBook|return|recipe||replace||el|path||step|||steps|ingredients|||str|text|recipeName||||length|else||new|this|replacement|stepName|settings|dish|arguments||160|filter|span|recipes|document|||recipeLoaded|required|||for|replaceSpace||insidePRE|bind|class|domLink|stylesheetPath|link|stylesheetFolder||lastIndex|recipeFolder|options|perfect|chili|newline|ERROR|downPRE|while|false|aux|WARNING|js|codes|replaceNewLine|childNodes|string|selection|replaceTab|pre|settingsDef|push|elClass|getPath|stylesheet|makeDish|eE|Ll|parseInt|RegExp|typeof|source|exps|global|do|offset|code|tag|try|prevLength|aNum|null|true|catch|cook|case|createElement|mouseup|break|append|Ee|switch|replaceSpaces|escapeHTML|NOTICE|pattern|escaped|br|spaces|mix|jQuery|avalue|entity|preformatted|xml|Pp|htcom|aname|numbers|keyword|createRange|defaultReplacement|Uu|mousedown|head|php|com|variable|input|elementClass|gi|valueOf|object|chef|selectClass|elementPath|window|metaobjects|in|default|continue|css|substring|stylesheetFile|recipeFile|lastUnmatched|knowHow|Array|checkCSS|stylesheetLoading|each|matched|extends|unmatched|recipeLoading|prepareStep|unblockUI|ajaxSubmit|silverlight|jscom|unblock|block|plugin|clearFields|returnValue|fieldValue|blockUI|formSerialize|event|resetForm|ajaxForm|clearForm|fieldSerialize|href|browser|rel|type|msie|extend|selector|data|html|next|match|version|getPRE|join|lt|bit|ignoreCase|amp|attr|parents|htmlText|innerHTML|innerText|body|setData|Text|copy|clipboardData|recipeNotAvailable|alert|trim|getJSON|unavailable|indexOf|ig|recipePath|Date|_SESSION|_SERVER|php_errormsg|require_once|_GET|_FILES|_REQUEST|_POST|__METHOD__|__LINE__|and|abstract|__FILE__|__CLASS__|__FUNCTION__|require|_ENV|END|CONT|PREFIX|START|OCALSTATEDIR|IBDIR|UTPUT_HANDLER_|throw|__COMPILER_HALT_OFFSET__|VERSION|_COOKIE|GLOBALS|API|static|YSCONFDIR|HLIB_SUFFIX|array|protected|implements|print|private|exit|public|foreach|final|or|isset|old_function|list|include_once|include|php_user_filter|interface|exception|die|declare|elseif|echo|cfunction|as|const|clone|endswitch|endif|eval|endwhile|enddeclare|empty|endforeach|endfor|isNaN|NaN|jquery|Infinity|clearTimeout|setTimeout|clearInterval|setInterval|Nn|value|Rr|Tt|mlcom|Hh|string2|string1|delete|keywords|void|instanceof|content|taconite|gim|regexp|escape|constructor|parseFloat|unescape|toString|with|prototype|element|Ff|BINDIR|HP_|PATH|CONFIG_FILE_|EAR_|xor|INSTALL_DIR|EXTENSION_DIR|SCAN_DIR|MAX|INT_|unset|SIZE|use|DATADIR|XTENSION_DIR|OL|Ss|Aa|E_|number|const1|DEFAULT_INCLUDE_PATH|ALL|PARSE|STRICT|USER_|CO|MPILE_|RE_'.split('|'),0,{}))  
setup/wizard/resources/jquery-tooltip/demo/formtip.html deleted
1 -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
2 -<html xmlns="http://www.w3.org/1999/xhtml">  
3 -<head>  
4 -<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />  
5 -<title>jQuery Tooltip Plugin Demo</title>  
6 -  
7 -<link rel="stylesheet" href="../jquery.formtip.css" />  
8 -<link rel="stylesheet" href="screen.css" />  
9 -<script src="../lib/jquery.js" type="text/javascript"></script>  
10 -<script src="../lib/jquery.bgiframe.js" type="text/javascript"></script>  
11 -<script src="../lib/jquery.dimensions.js" type="text/javascript"></script>  
12 -<script src="../lib/jquery.delegate.js" type="text/javascript"></script>  
13 -<script src="../jquery.formtip.js" type="text/javascript"></script>  
14 -  
15 -<script src="chili-1.7.pack.js" type="text/javascript"></script>  
16 -  
17 -<script type="text/javascript">  
18 -$(function() {  
19 - $("form:first").formtip();  
20 - $("form.test").formtip({  
21 - positionParent: function(element) {  
22 - return element.parent();  
23 - },  
24 - left: -5  
25 - });  
26 -});  
27 -</script>  
28 -  
29 -<style type="text/css">  
30 -form.test div {  
31 - width: 250px;  
32 - border: 1px solid black;  
33 - float: left;  
34 - margin: 1em;  
35 -}  
36 -form.test p {  
37 - border: 1px solid #999;  
38 -}  
39 -</style>  
40 -  
41 -</head>  
42 -<body>  
43 -<h1 id="banner"><a href="http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/">jQuery Tooltip Plugin</a> Demo</h1>  
44 -<div id="main">  
45 - <form>  
46 - <fieldset id="set1">  
47 - <legend>Three elements with tooltips, default settings</legend>  
48 - <a title="A tooltip with default settings, the href is displayed below the title" href="http://google.de">Link to google</a>  
49 - <br/>  
50 - <label title="A label with a title and default settings, no href here" for="text1">Input something please!</label>  
51 - <br/>  
52 - <input title="Note that the tooltip disappears when clicking the input elementthe input elementthe input element" type="text" value="Test" name="action" id="text1"/>  
53 -  
54 - <h3>Code</h3>  
55 - <pre><code class="mix">$('#set1 *').tooltip();</code></pre>  
56 - <input title="Another tooltip element I" type="text" value="Test"/>  
57 - </fieldset>  
58 - </form>  
59 -  
60 - <form class="test">  
61 - <div>  
62 - <p>  
63 - <label>II</label><input title="Another tooltip element II" type="text" value="Test"/>  
64 - </p>  
65 - <p>  
66 - <label>III</label><input title="Another tooltip element III" type="text" value="Test"/>  
67 - </p>  
68 - </div>  
69 - <div style="width: 200px">  
70 - <input title="Another tooltip element IV" type="text" value="Test"/>  
71 - <br/>  
72 - <input type="text" value="Test"/>  
73 - <br/>  
74 - <input title="Another tooltip element VI" type="text" value="Test"/>  
75 - </div>  
76 - </form>  
77 -  
78 -</div>  
79 -<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">  
80 -</script>  
81 -<script type="text/javascript">  
82 -_uacct = "UA-2623402-1";  
83 -urchinTracker();  
84 -</script>  
85 -</body>  
86 -</html>  
87 \ No newline at end of file 0 \ No newline at end of file
setup/wizard/resources/jquery-tooltip/demo/image.png deleted

10.9 KB

setup/wizard/resources/jquery-tooltip/demo/index.html deleted
1 -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
2 -<html xmlns="http://www.w3.org/1999/xhtml">  
3 -<head>  
4 -<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />  
5 -<title>jQuery Tooltip Plugin Demo</title>  
6 -  
7 -<link rel="stylesheet" href="../jquery.tooltip.css" />  
8 -<link rel="stylesheet" href="screen.css" />  
9 -<script src="../lib/jquery.js" type="text/javascript"></script>  
10 -<script src="../lib/jquery.bgiframe.js" type="text/javascript"></script>  
11 -<script src="../lib/jquery.dimensions.js" type="text/javascript"></script>  
12 -<script src="../jquery.tooltip.js" type="text/javascript"></script>  
13 -  
14 -<script src="chili-1.7.pack.js" type="text/javascript"></script>  
15 -  
16 -<script type="text/javascript">  
17 -$(function() {  
18 -$('#set1 *').tooltip();  
19 -  
20 -$("#foottip a").tooltip({  
21 - bodyHandler: function() {  
22 - return $($(this).attr("href")).html();  
23 - },  
24 - showURL: false  
25 -});  
26 -  
27 -$('#tonus').tooltip({  
28 - delay: 0,  
29 - showURL: false,  
30 - bodyHandler: function() {  
31 - return $("<img/>").attr("src", this.src);  
32 - }  
33 -});  
34 -  
35 -$('#yahoo a').tooltip({  
36 - track: true,  
37 - delay: 0,  
38 - showURL: false,  
39 - showBody: " - ",  
40 - fade: 250  
41 -});  
42 -  
43 -$("select").tooltip({  
44 - left: 25  
45 -});  
46 -  
47 -$("map > area").tooltip({ positionLeft: true });  
48 -  
49 -$("#fancy, #fancy2").tooltip({  
50 - track: true,  
51 - delay: 0,  
52 - showURL: false,  
53 - fixPNG: true,  
54 - showBody: " - ",  
55 - extraClass: "pretty fancy",  
56 - top: -15,  
57 - left: 5  
58 -});  
59 -  
60 -$('#pretty').tooltip({  
61 - track: true,  
62 - delay: 0,  
63 - showURL: false,  
64 - showBody: " - ",  
65 - extraClass: "pretty",  
66 - fixPNG: true,  
67 - left: -120  
68 -});  
69 -  
70 -$('#right a').tooltip({  
71 - track: true,  
72 - delay: 0,  
73 - showURL: false,  
74 - extraClass: "right"  
75 -});  
76 -$('#right2 a').tooltip({ showURL: false, positionLeft: true });  
77 -  
78 -$("#block").click($.tooltip.block);  
79 -  
80 -});  
81 -</script>  
82 -  
83 -</head>  
84 -<body>  
85 -<h1 id="banner"><a href="http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/">jQuery Tooltip Plugin</a> Demo</h1>  
86 -<div id="main">  
87 - <fieldset id="set1">  
88 - <legend>Three elements with tooltips, default settings</legend>  
89 - <a title="A tooltip with default settings, the href is displayed below the title" href="http://google.de">Link to google</a>  
90 - <br/>  
91 - <label title="A label with a title and default settings, no href here" for="text1">Input something please!</label>  
92 - <br/>  
93 - <input title="Note that the tooltip disappears when clicking the input element" type="text" value="Test" name="action" id="text1"/>  
94 -  
95 - <h3>Code</h3>  
96 - <pre><code class="mix">$('#set1 *').tooltip();</code></pre>  
97 - </fieldset>  
98 -  
99 - <fieldset id="foottip">  
100 - <legend>Using bodyHandler to display footnotes in the tooltip</legend>  
101 - Some text referring to a <a href="#footnote">footnote</a>.  
102 - <br/>  
103 - <br/>  
104 - <br/>  
105 - <br/>  
106 - <br/>  
107 - <div id="footnote"><em>And here</em> is the actual footnote, complete with nested <strong>HTML</strong>.</div>  
108 -  
109 - <h3>Code</h3>  
110 - <pre><code class="mix">$("#foottip a").tooltip({  
111 - bodyHandler: function() {  
112 - return $($(this).attr("href")).html();  
113 - },  
114 - showURL: false  
115 -});</code></pre>  
116 - </fieldset>  
117 -  
118 - <fieldset>  
119 - <legend>An image with a tooltip</legend>  
120 - <img id="tonus" src="image.png" height="80" title="No delay. The src value is displayed below the title" />  
121 - <h3>Code</h3>  
122 - <pre><code class="mix">$('#tonus').tooltip({  
123 - delay: 0,  
124 - showURL: false,  
125 - bodyHandler: function() {  
126 - return $("&lt;img/&gt;").attr("src", this.src);  
127 - }  
128 -});</code></pre>  
129 - </fieldset>  
130 -  
131 - <fieldset>  
132 - <legend>Blocking tooltips</legend>  
133 - <button id="block">Click this button to block/unblock all tooltips</button>  
134 - <pre><code class="mix">$("#block").click($.tooltip.block);</code></pre>  
135 - </fieldset>  
136 -  
137 - <fieldset>  
138 - <legend>The next four links have no delay with tracking and fading, with extra content:</legend>  
139 - <div id="yahoo">  
140 - <a title="Yahoo doo - more content" href="http://yahoo.com">Link to yahoo</a>  
141 - <a title="Yahoo doo2 - wohooo" href="http://yahoo.com">Link to yahoo1</a>  
142 - <a title="Yahoo doo3" href="http://yahoo.com">Link to yahoo2</a>  
143 - <a title="Yahoo doo4 - buga!" href="http://yahoo.com">Link to yahoo3</a>  
144 - </div>  
145 - <select><option>bgiframe test</option></select>  
146 - <h3>Code</h3>  
147 - <pre><code class="mix">$('#yahoo a').tooltip({  
148 - track: true,  
149 - delay: 0,  
150 - showURL: false,  
151 - showBody: " - ",  
152 - fade: 250  
153 -});</code></pre>  
154 - </fieldset>  
155 -  
156 - <fieldset>  
157 - <legend>Tooltips with extra classes. Useful for different tooltip styles on a single page.</legend>  
158 - <em>Note how the one on the right gets a different background image when at the right viewport border.</em>  
159 - <br/>  
160 - <span id="fancy" title="You are dead, this is hell. - Please note the custom positioning here!">A fancy tooltip, now with some custom positioning.</span>  
161 - <span id="fancy2" title="You are dead, this is hell. - Please note the custom positioning here!">A fancy tooltip, now with some custom positioning.</span>  
162 - <p><span id="pretty" title="I am pretty! - I am a very pretty tooltip, I need lot's of attention from buggers like you! Yes!">And now, for the fancy stuff, a tooltip with an extra class for nice shadows, and some extra content</span></p>  
163 - <br/>  
164 - <br/>  
165 - <br/>  
166 - <select><option>bgiframe test</option></select>  
167 - <h3>Code</h3>  
168 - <pre><code class="mix">$("#fancy, #fancy2").tooltip({  
169 - track: true,  
170 - delay: 0,  
171 - showURL: false,  
172 - opacity: 1,  
173 - fixPNG: true,  
174 - showBody: " - ",  
175 - extraClass: "pretty fancy",  
176 - top: -15,  
177 - left: 5  
178 -});  
179 -  
180 -$('#pretty').tooltip({  
181 - track: true,  
182 - delay: 0,  
183 - showURL: false,  
184 - showBody: " - ",  
185 - extraClass: "pretty",  
186 - fixPNG: true,  
187 - opacity: 0.95,  
188 - left: -120  
189 -});</code></pre>  
190 - </fieldset>  
191 -  
192 - <fieldset>  
193 - <legend>Selects</legend>  
194 - <select title="fancy select with a tooltip">  
195 - <option>1. option</option>  
196 - <option>2. option</option>  
197 - <option>3. option</option>  
198 - </select>  
199 - </fieldset>  
200 -  
201 - <fieldset>  
202 - <legend>Image map with tooltips.</legend>  
203 -  
204 - <img id="map" src="karte.png" width="345" height="312" border="0" usemap="#Landkarte">  
205 - <map name="Landkarte">  
206 - <area shape="rect" coords="11,10,59,29"  
207 - href="http://www.koblenz.de/" alt="Koblenz" title="Koblenz">  
208 - <area shape="rect" coords="42,36,96,57"  
209 - href="http://www.wiesbaden.de/" alt="Wiesbaden" title="Wiesbaden">  
210 - <area shape="rect" coords="42,59,78,80"  
211 - href="http://www.mainz.de/" alt="Mainz" title="Mainz">  
212 - <area shape="rect" coords="100,26,152,58"  
213 - href="http://www.frankfurt.de/" alt="Frankfurt" title="Frankfurt">  
214 - <area shape="rect" coords="27,113,93,134"  
215 - href="http://www.mannheim.de/" alt="Mannheim" title="Mannheim">  
216 - <area shape="rect" coords="100,138,163,159"  
217 - href="http://www.heidelberg.de/" alt="Heidelberg" title="Heidelberg">  
218 - <area shape="rect" coords="207,77,266,101"  
219 - href="http://www.wuerzburg.de/" alt="W&uuml;rzburg" title="W&uuml;rzburg">  
220 - <area shape="rect" coords="282,62,344,85"  
221 - href="http://www.bamberg.de/" alt="Bamberg" title="Bamberg">  
222 - <area shape="rect" coords="255,132,316,150"  
223 - href="http://www.nuernberg.de/" alt="N&uuml;rnberg" title="N&uuml;rnberg">  
224 - <area shape="rect" coords="78,182,132,200"  
225 - href="http://www.karlsruhe.de/" alt="Karlsruhe" title="Karlsruhe">  
226 - <area shape="rect" coords="142,169,200,193"  
227 - href="http://www.heilbronn.de/" alt="Heilbronn" title="Heilbronn">  
228 - <area shape="rect" coords="140,209,198,230"  
229 - href="http://www.stuttgart.de/" alt="Stuttgart" title="Stuttgart">  
230 - <area shape="rect" coords="187,263,222,281"  
231 - href="http://www.ulm.de/" alt="Ulm" title="Ulm">  
232 - <area shape="rect" coords="249,278,304,297"  
233 - href="http://www.augsburg.de/" alt="Augsburg" title="Augsburg">  
234 - <area shape="poly" coords="48,311,105,248,96,210,75,205,38,234,8,310"  
235 - href="http://www.baden-aktuell.de/" alt="Baden" title="Baden">  
236 - </map>  
237 - <h3>Code</h3>  
238 - <pre><code class="mix">$("map *").tooltip({ positionLeft: true });</code></pre>  
239 - </fieldset>  
240 -  
241 - <fieldset>  
242 - <legend>Testing repositioning at viewport borders</legend>  
243 - <p id="right">  
244 - Tooltip with fixed width<br/>  
245 - <a title="Short title" href="http://goggle">Google me!</a><br/>  
246 - <a title="Rather a very very long title with no meaning but yet quite long long long" href="http://goggle">Google me!</a>  
247 - </p>  
248 - <p id="right2">  
249 - Tooltip width auto width<br/>  
250 - <a title="Short title" href="http://goggle">Google me!</a><br/>  
251 - <a title="Rather a very very long title with no meaning but yet quite long long long" href="http://goggle">Google me!</a>  
252 - </p>  
253 - <h3>Code</h3>  
254 - <pre><code class="mix">$('#right a').tooltip({  
255 - track: true,  
256 - delay: 0,  
257 - showURL: false,  
258 - extraClass: "right"  
259 -});  
260 -$('#right2 a').tooltip({ showURL: false, positionLeft: true });</code></pre>  
261 - </fieldset>  
262 -</div>  
263 -<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">  
264 -</script>  
265 -<script type="text/javascript">  
266 -_uacct = "UA-2623402-1";  
267 -urchinTracker();  
268 -</script>  
269 -</body>  
270 -</html>  
271 \ No newline at end of file 0 \ No newline at end of file
setup/wizard/resources/jquery-tooltip/demo/karte.png deleted

27.6 KB

setup/wizard/resources/jquery-tooltip/demo/screen.css deleted
1 -html, body, div, span, applet, object, iframe,  
2 -h1, h2, h3, h4, h5, h6, p, blockquote, pre,  
3 -a, abbr, acronym, address, big, cite, code,  
4 -del, dfn, em, font, img, ins, kbd, q, s, samp,  
5 -small, strike, strong, sub, sup, tt, var,  
6 -dl, dt, dd, ol, ul, li,  
7 -fieldset, form, label, legend,  
8 -table, caption, tbody, tfoot, thead, tr, th, td {  
9 - margin: 0;  
10 - padding: 0;  
11 - border: 0;  
12 - outline: 0;  
13 - font-weight: inherit;  
14 - font-style: inherit;  
15 - font-size: 100%;  
16 - font-family: inherit;  
17 - vertical-align: baseline;  
18 -}  
19 -fieldset {  
20 - border: 1px solid black; padding: 8px; margin: 8px 0;  
21 -}  
22 -/* remember to define focus styles! */  
23 -:focus {  
24 - outline: 0;  
25 -}  
26 -body {  
27 - line-height: 1;  
28 - color: black;  
29 - background: white;  
30 -}  
31 -  
32 -body, div { font-family: 'lucida grande', helvetica, verdana, arial, sans-serif }  
33 -body { margin: 0; padding: 0; font-size: small; color: #333 }  
34 -h1, h2 { font-family: 'trebuchet ms', verdana, arial; padding: 10px; margin: 0 }  
35 -h1 { font-size: large }  
36 -#main { padding: 1em; }  
37 -#banner { padding: 15px; background-color: #06b; color: white; font-size: large; border-bottom: 1px solid #ccc;  
38 - background: url(bg.gif) repeat-x; text-align: center }  
39 -#banner a { color: white; }  
40 -legend { font-weight: bold; }  
41 -  
42 -button { padding: 0 6px; margin: 0; }  
43 -  
44 -pre, code { white-space: pre; font-family: "Courier New"; }  
45 -pre { margin: 8px 0; }  
46 -h3 {  
47 - font-size: 110%;  
48 - font-weight: bold;  
49 - margin: .2em 0 .5em 0;  
50 -}  
51 -p { margin: 1em 0; }  
52 -strong { font-weight: bolder; }  
53 -em { font-style: italic; }  
54 -  
55 -.jscom, .mix htcom { color: #4040c2; }  
56 -.com { color: green; }  
57 -.regexp { color: maroon; }  
58 -.string { color: teal; }  
59 -.keywords { color: blue; }  
60 -.global { color: #008; }  
61 -.numbers { color: #880; }  
62 -.comm { color: green; }  
63 -.tag { color: blue; }  
64 -.entity { color: blue; }  
65 -.string { color: teal; }  
66 -.aname { color: maroon; }  
67 -.avalue { color: maroon; }  
68 -.jquery { color: #00a; }  
69 -.plugin { color: red; }  
70 -  
71 -#tooltip.pretty {  
72 - font-family: Arial;  
73 - border: none;  
74 - width: 210px;  
75 - padding:20px;  
76 - height: 135px;  
77 - opacity: 0.8;  
78 - background: url('shadow.png');  
79 -}  
80 -#tooltip.pretty h3 {  
81 - margin-bottom: 0.75em;  
82 - font-size: 12pt;  
83 - width: 220px;  
84 - text-align: center;  
85 -}  
86 -#tooltip.pretty div { width: 220px; text-align: left; }  
87 -  
88 -#tooltip.fancy {  
89 - background: url('shadow2.png');  
90 - padding-top: 5em;  
91 - height: 100px;  
92 -}  
93 -#tooltip.fancy.viewport-right {  
94 - background: url('shadow2-reverse.png');  
95 -}  
96 -  
97 -#extended { margin: 2em 0; }  
98 -#extended label { text-decoration: underline; }  
99 -#yahoo { width: 7em; }  
100 -#right, #right2 { text-align: right; }  
101 -#tooltip.right { width: 250px; }  
102 -#fancy2 { float: right; }  
103 \ No newline at end of file 0 \ No newline at end of file
setup/wizard/resources/jquery-tooltip/demo/shadow.png deleted

4.54 KB

setup/wizard/resources/jquery-tooltip/demo/shadow2-reverse.png deleted

4.91 KB

setup/wizard/resources/jquery-tooltip/demo/shadow2.png deleted

5.23 KB

setup/wizard/resources/jquery-tooltip/jquery.tooltip.css deleted
1 -#tooltip {  
2 - position: absolute;  
3 - z-index: 3000;  
4 - border: 1px solid #111;  
5 - background-color: #eee;  
6 - padding: 5px;  
7 - opacity: 0.85;  
8 -}  
9 -#tooltip h3, #tooltip div { margin: 0; }  
setup/wizard/resources/jquery-tooltip/jquery.tooltip.js deleted
1 -/*  
2 - * jQuery Tooltip plugin 1.3  
3 - *  
4 - * http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/  
5 - * http://docs.jquery.com/Plugins/Tooltip  
6 - *  
7 - * Copyright (c) 2006 - 2008 Jรถrn Zaefferer  
8 - *  
9 - * $Id: jquery.tooltip.js 5741 2008-06-21 15:22:16Z joern.zaefferer $  
10 - *  
11 - * Dual licensed under the MIT and GPL licenses:  
12 - * http://www.opensource.org/licenses/mit-license.php  
13 - * http://www.gnu.org/licenses/gpl.html  
14 - */  
15 -  
16 -;(function($) {  
17 -  
18 - // the tooltip element  
19 - var helper = {},  
20 - // the current tooltipped element  
21 - current,  
22 - // the title of the current element, used for restoring  
23 - title,  
24 - // timeout id for delayed tooltips  
25 - tID,  
26 - // IE 5.5 or 6  
27 - IE = $.browser.msie && /MSIE\s(5\.5|6\.)/.test(navigator.userAgent),  
28 - // flag for mouse tracking  
29 - track = false;  
30 -  
31 - $.tooltip = {  
32 - blocked: false,  
33 - defaults: {  
34 - delay: 200,  
35 - fade: false,  
36 - showURL: true,  
37 - extraClass: "",  
38 - top: 15,  
39 - left: 15,  
40 - id: "tooltip"  
41 - },  
42 - block: function() {  
43 - $.tooltip.blocked = !$.tooltip.blocked;  
44 - }  
45 - };  
46 -  
47 - $.fn.extend({  
48 - tooltip: function(settings) {  
49 - settings = $.extend({}, $.tooltip.defaults, settings);  
50 - createHelper(settings);  
51 - return this.each(function() {  
52 - $.data(this, "tooltip", settings);  
53 - this.tOpacity = helper.parent.css("opacity");  
54 - // copy tooltip into its own expando and remove the title  
55 - this.tooltipText = this.title;  
56 - $(this).removeAttr("title");  
57 - // also remove alt attribute to prevent default tooltip in IE  
58 - this.alt = "";  
59 - })  
60 - .mouseover(save)  
61 - .mouseout(hide)  
62 - .click(hide);  
63 - },  
64 - fixPNG: IE ? function() {  
65 - return this.each(function () {  
66 - var image = $(this).css('backgroundImage');  
67 - if (image.match(/^url\(["']?(.*\.png)["']?\)$/i)) {  
68 - image = RegExp.$1;  
69 - $(this).css({  
70 - 'backgroundImage': 'none',  
71 - 'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"  
72 - }).each(function () {  
73 - var position = $(this).css('position');  
74 - if (position != 'absolute' && position != 'relative')  
75 - $(this).css('position', 'relative');  
76 - });  
77 - }  
78 - });  
79 - } : function() { return this; },  
80 - unfixPNG: IE ? function() {  
81 - return this.each(function () {  
82 - $(this).css({'filter': '', backgroundImage: ''});  
83 - });  
84 - } : function() { return this; },  
85 - hideWhenEmpty: function() {  
86 - return this.each(function() {  
87 - $(this)[ $(this).html() ? "show" : "hide" ]();  
88 - });  
89 - },  
90 - url: function() {  
91 - return this.attr('href') || this.attr('src');  
92 - }  
93 - });  
94 -  
95 - function createHelper(settings) {  
96 - // there can be only one tooltip helper  
97 - if( helper.parent )  
98 - return;  
99 - // create the helper, h3 for title, div for url  
100 - helper.parent = $('<div id="' + settings.id + '"><h3></h3><div class="body"></div><div class="url"></div></div>')  
101 - // add to document  
102 - .appendTo(document.body)  
103 - // hide it at first  
104 - .hide();  
105 -  
106 - // apply bgiframe if available  
107 - if ( $.fn.bgiframe )  
108 - helper.parent.bgiframe();  
109 -  
110 - // save references to title and url elements  
111 - helper.title = $('h3', helper.parent);  
112 - helper.body = $('div.body', helper.parent);  
113 - helper.url = $('div.url', helper.parent);  
114 - }  
115 -  
116 - function settings(element) {  
117 - return $.data(element, "tooltip");  
118 - }  
119 -  
120 - // main event handler to start showing tooltips  
121 - function handle(event) {  
122 - // show helper, either with timeout or on instant  
123 - if( settings(this).delay )  
124 - tID = setTimeout(show, settings(this).delay);  
125 - else  
126 - show();  
127 -  
128 - // if selected, update the helper position when the mouse moves  
129 - track = !!settings(this).track;  
130 - $(document.body).bind('mousemove', update);  
131 -  
132 - // update at least once  
133 - update(event);  
134 - }  
135 -  
136 - // save elements title before the tooltip is displayed  
137 - function save() {  
138 - // if this is the current source, or it has no title (occurs with click event), stop  
139 - if ( $.tooltip.blocked || this == current || (!this.tooltipText && !settings(this).bodyHandler) )  
140 - return;  
141 -  
142 - // save current  
143 - current = this;  
144 - title = this.tooltipText;  
145 -  
146 - if ( settings(this).bodyHandler ) {  
147 - helper.title.hide();  
148 - var bodyContent = settings(this).bodyHandler.call(this);  
149 - if (bodyContent.nodeType || bodyContent.jquery) {  
150 - helper.body.empty().append(bodyContent)  
151 - } else {  
152 - helper.body.html( bodyContent );  
153 - }  
154 - helper.body.show();  
155 - } else if ( settings(this).showBody ) {  
156 - var parts = title.split(settings(this).showBody);  
157 - helper.title.html(parts.shift()).show();  
158 - helper.body.empty();  
159 - for(var i = 0, part; (part = parts[i]); i++) {  
160 - if(i > 0)  
161 - helper.body.append("<br/>");  
162 - helper.body.append(part);  
163 - }  
164 - helper.body.hideWhenEmpty();  
165 - } else {  
166 - helper.title.html(title).show();  
167 - helper.body.hide();  
168 - }  
169 -  
170 - // if element has href or src, add and show it, otherwise hide it  
171 - if( settings(this).showURL && $(this).url() )  
172 - helper.url.html( $(this).url().replace('http://', '') ).show();  
173 - else  
174 - helper.url.hide();  
175 -  
176 - // add an optional class for this tip  
177 - helper.parent.addClass(settings(this).extraClass);  
178 -  
179 - // fix PNG background for IE  
180 - if (settings(this).fixPNG )  
181 - helper.parent.fixPNG();  
182 -  
183 - handle.apply(this, arguments);  
184 - }  
185 -  
186 - // delete timeout and show helper  
187 - function show() {  
188 - tID = null;  
189 - if ((!IE || !$.fn.bgiframe) && settings(current).fade) {  
190 - if (helper.parent.is(":animated"))  
191 - helper.parent.stop().show().fadeTo(settings(current).fade, current.tOpacity);  
192 - else  
193 - helper.parent.is(':visible') ? helper.parent.fadeTo(settings(current).fade, current.tOpacity) : helper.parent.fadeIn(settings(current).fade);  
194 - } else {  
195 - helper.parent.show();  
196 - }  
197 - update();  
198 - }  
199 -  
200 - /**  
201 - * callback for mousemove  
202 - * updates the helper position  
203 - * removes itself when no current element  
204 - */  
205 - function update(event) {  
206 - if($.tooltip.blocked)  
207 - return;  
208 -  
209 - if (event && event.target.tagName == "OPTION") {  
210 - return;  
211 - }  
212 -  
213 - // stop updating when tracking is disabled and the tooltip is visible  
214 - if ( !track && helper.parent.is(":visible")) {  
215 - $(document.body).unbind('mousemove', update)  
216 - }  
217 -  
218 - // if no current element is available, remove this listener  
219 - if( current == null ) {  
220 - $(document.body).unbind('mousemove', update);  
221 - return;  
222 - }  
223 -  
224 - // remove position helper classes  
225 - helper.parent.removeClass("viewport-right").removeClass("viewport-bottom");  
226 -  
227 - var left = helper.parent[0].offsetLeft;  
228 - var top = helper.parent[0].offsetTop;  
229 - if (event) {  
230 - // position the helper 15 pixel to bottom right, starting from mouse position  
231 - left = event.pageX + settings(current).left;  
232 - top = event.pageY + settings(current).top;  
233 - var right='auto';  
234 - if (settings(current).positionLeft) {  
235 - right = $(window).width() - left;  
236 - left = 'auto';  
237 - }  
238 - helper.parent.css({  
239 - left: left,  
240 - right: right,  
241 - top: top  
242 - });  
243 - }  
244 -  
245 - var v = viewport(),  
246 - h = helper.parent[0];  
247 - // check horizontal position  
248 - if (v.x + v.cx < h.offsetLeft + h.offsetWidth) {  
249 - left -= h.offsetWidth + 20 + settings(current).left;  
250 - helper.parent.css({left: left + 'px'}).addClass("viewport-right");  
251 - }  
252 - // check vertical position  
253 - if (v.y + v.cy < h.offsetTop + h.offsetHeight) {  
254 - top -= h.offsetHeight + 20 + settings(current).top;  
255 - helper.parent.css({top: top + 'px'}).addClass("viewport-bottom");  
256 - }  
257 - }  
258 -  
259 - function viewport() {  
260 - return {  
261 - x: $(window).scrollLeft(),  
262 - y: $(window).scrollTop(),  
263 - cx: $(window).width(),  
264 - cy: $(window).height()  
265 - };  
266 - }  
267 -  
268 - // hide helper and restore added classes and the title  
269 - function hide(event) {  
270 - if($.tooltip.blocked)  
271 - return;  
272 - // clear timeout if possible  
273 - if(tID)  
274 - clearTimeout(tID);  
275 - // no more current element  
276 - current = null;  
277 -  
278 - var tsettings = settings(this);  
279 - function complete() {  
280 - helper.parent.removeClass( tsettings.extraClass ).hide().css("opacity", "");  
281 - }  
282 - if ((!IE || !$.fn.bgiframe) && tsettings.fade) {  
283 - if (helper.parent.is(':animated'))  
284 - helper.parent.stop().fadeTo(tsettings.fade, 0, complete);  
285 - else  
286 - helper.parent.stop().fadeOut(tsettings.fade, complete);  
287 - } else  
288 - complete();  
289 -  
290 - if( settings(this).fixPNG )  
291 - helper.parent.unfixPNG();  
292 - }  
293 -  
294 -})(jQuery);  
setup/wizard/resources/jquery-tooltip/jquery.tooltip.min.js deleted
1 -/*  
2 - * jQuery Tooltip plugin 1.3  
3 - *  
4 - * http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/  
5 - * http://docs.jquery.com/Plugins/Tooltip  
6 - *  
7 - * Copyright (c) 2006 - 2008 Jรถrn Zaefferer  
8 - *  
9 - * $Id: jquery.tooltip.js 5741 2008-06-21 15:22:16Z joern.zaefferer $  
10 - *  
11 - * Dual licensed under the MIT and GPL licenses:  
12 - * http://www.opensource.org/licenses/mit-license.php  
13 - * http://www.gnu.org/licenses/gpl.html  
14 - */;(function($){var helper={},current,title,tID,IE=$.browser.msie&&/MSIE\s(5\.5|6\.)/.test(navigator.userAgent),track=false;$.tooltip={blocked:false,defaults:{delay:200,fade:false,showURL:true,extraClass:"",top:15,left:15,id:"tooltip"},block:function(){$.tooltip.blocked=!$.tooltip.blocked;}};$.fn.extend({tooltip:function(settings){settings=$.extend({},$.tooltip.defaults,settings);createHelper(settings);return this.each(function(){$.data(this,"tooltip",settings);this.tOpacity=helper.parent.css("opacity");this.tooltipText=this.title;$(this).removeAttr("title");this.alt="";}).mouseover(save).mouseout(hide).click(hide);},fixPNG:IE?function(){return this.each(function(){var image=$(this).css('backgroundImage');if(image.match(/^url\(["']?(.*\.png)["']?\)$/i)){image=RegExp.$1;$(this).css({'backgroundImage':'none','filter':"progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='"+image+"')"}).each(function(){var position=$(this).css('position');if(position!='absolute'&&position!='relative')$(this).css('position','relative');});}});}:function(){return this;},unfixPNG:IE?function(){return this.each(function(){$(this).css({'filter':'',backgroundImage:''});});}:function(){return this;},hideWhenEmpty:function(){return this.each(function(){$(this)[$(this).html()?"show":"hide"]();});},url:function(){return this.attr('href')||this.attr('src');}});function createHelper(settings){if(helper.parent)return;helper.parent=$('<div id="'+settings.id+'"><h3></h3><div class="body"></div><div class="url"></div></div>').appendTo(document.body).hide();if($.fn.bgiframe)helper.parent.bgiframe();helper.title=$('h3',helper.parent);helper.body=$('div.body',helper.parent);helper.url=$('div.url',helper.parent);}function settings(element){return $.data(element,"tooltip");}function handle(event){if(settings(this).delay)tID=setTimeout(show,settings(this).delay);else  
15 -show();track=!!settings(this).track;$(document.body).bind('mousemove',update);update(event);}function save(){if($.tooltip.blocked||this==current||(!this.tooltipText&&!settings(this).bodyHandler))return;current=this;title=this.tooltipText;if(settings(this).bodyHandler){helper.title.hide();var bodyContent=settings(this).bodyHandler.call(this);if(bodyContent.nodeType||bodyContent.jquery){helper.body.empty().append(bodyContent)}else{helper.body.html(bodyContent);}helper.body.show();}else if(settings(this).showBody){var parts=title.split(settings(this).showBody);helper.title.html(parts.shift()).show();helper.body.empty();for(var i=0,part;(part=parts[i]);i++){if(i>0)helper.body.append("<br/>");helper.body.append(part);}helper.body.hideWhenEmpty();}else{helper.title.html(title).show();helper.body.hide();}if(settings(this).showURL&&$(this).url())helper.url.html($(this).url().replace('http://','')).show();else  
16 -helper.url.hide();helper.parent.addClass(settings(this).extraClass);if(settings(this).fixPNG)helper.parent.fixPNG();handle.apply(this,arguments);}function show(){tID=null;if((!IE||!$.fn.bgiframe)&&settings(current).fade){if(helper.parent.is(":animated"))helper.parent.stop().show().fadeTo(settings(current).fade,current.tOpacity);else  
17 -helper.parent.is(':visible')?helper.parent.fadeTo(settings(current).fade,current.tOpacity):helper.parent.fadeIn(settings(current).fade);}else{helper.parent.show();}update();}function update(event){if($.tooltip.blocked)return;if(event&&event.target.tagName=="OPTION"){return;}if(!track&&helper.parent.is(":visible")){$(document.body).unbind('mousemove',update)}if(current==null){$(document.body).unbind('mousemove',update);return;}helper.parent.removeClass("viewport-right").removeClass("viewport-bottom");var left=helper.parent[0].offsetLeft;var top=helper.parent[0].offsetTop;if(event){left=event.pageX+settings(current).left;top=event.pageY+settings(current).top;var right='auto';if(settings(current).positionLeft){right=$(window).width()-left;left='auto';}helper.parent.css({left:left,right:right,top:top});}var v=viewport(),h=helper.parent[0];if(v.x+v.cx<h.offsetLeft+h.offsetWidth){left-=h.offsetWidth+20+settings(current).left;helper.parent.css({left:left+'px'}).addClass("viewport-right");}if(v.y+v.cy<h.offsetTop+h.offsetHeight){top-=h.offsetHeight+20+settings(current).top;helper.parent.css({top:top+'px'}).addClass("viewport-bottom");}}function viewport(){return{x:$(window).scrollLeft(),y:$(window).scrollTop(),cx:$(window).width(),cy:$(window).height()};}function hide(event){if($.tooltip.blocked)return;if(tID)clearTimeout(tID);current=null;var tsettings=settings(this);function complete(){helper.parent.removeClass(tsettings.extraClass).hide().css("opacity","");}if((!IE||!$.fn.bgiframe)&&tsettings.fade){if(helper.parent.is(':animated'))helper.parent.stop().fadeTo(tsettings.fade,0,complete);else  
18 -helper.parent.stop().fadeOut(tsettings.fade,complete);}else  
19 -complete();if(settings(this).fixPNG)helper.parent.unfixPNG();}})(jQuery);  
20 \ No newline at end of file 0 \ No newline at end of file
setup/wizard/resources/jquery-tooltip/jquery.tooltip.pack.js deleted
1 -/*  
2 - * jQuery Tooltip plugin 1.3  
3 - *  
4 - * http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/  
5 - * http://docs.jquery.com/Plugins/Tooltip  
6 - *  
7 - * Copyright (c) 2006 - 2008 Jรถrn Zaefferer  
8 - *  
9 - * $Id: jquery.tooltip.js 5741 2008-06-21 15:22:16Z joern.zaefferer $  
10 - *  
11 - * Dual licensed under the MIT and GPL licenses:  
12 - * http://www.opensource.org/licenses/mit-license.php  
13 - * http://www.gnu.org/licenses/gpl.html  
14 - */  
15 -eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';(8($){j e={},9,m,B,A=$.2u.2g&&/29\\s(5\\.5|6\\.)/.1M(1H.2t),M=12;$.k={w:12,1h:{Z:25,r:12,1d:19,X:"",G:15,E:15,16:"k"},2s:8(){$.k.w=!$.k.w}};$.N.1v({k:8(a){a=$.1v({},$.k.1h,a);1q(a);g 2.F(8(){$.1j(2,"k",a);2.11=e.3.n("1g");2.13=2.m;$(2).24("m");2.22=""}).21(1e).1U(q).1S(q)},H:A?8(){g 2.F(8(){j b=$(2).n(\'Y\');4(b.1J(/^o\\(["\']?(.*\\.1I)["\']?\\)$/i)){b=1F.$1;$(2).n({\'Y\':\'1D\',\'1B\':"2r:2q.2m.2l(2j=19, 2i=2h, 1p=\'"+b+"\')"}).F(8(){j a=$(2).n(\'1o\');4(a!=\'2f\'&&a!=\'1u\')$(2).n(\'1o\',\'1u\')})}})}:8(){g 2},1l:A?8(){g 2.F(8(){$(2).n({\'1B\':\'\',Y:\'\'})})}:8(){g 2},1x:8(){g 2.F(8(){$(2)[$(2).D()?"l":"q"]()})},o:8(){g 2.1k(\'28\')||2.1k(\'1p\')}});8 1q(a){4(e.3)g;e.3=$(\'<t 16="\'+a.16+\'"><10></10><t 1i="f"></t><t 1i="o"></t></t>\').27(K.f).q();4($.N.L)e.3.L();e.m=$(\'10\',e.3);e.f=$(\'t.f\',e.3);e.o=$(\'t.o\',e.3)}8 7(a){g $.1j(a,"k")}8 1f(a){4(7(2).Z)B=26(l,7(2).Z);p l();M=!!7(2).M;$(K.f).23(\'W\',u);u(a)}8 1e(){4($.k.w||2==9||(!2.13&&!7(2).U))g;9=2;m=2.13;4(7(2).U){e.m.q();j a=7(2).U.1Z(2);4(a.1Y||a.1V){e.f.1c().T(a)}p{e.f.D(a)}e.f.l()}p 4(7(2).18){j b=m.1T(7(2).18);e.m.D(b.1R()).l();e.f.1c();1Q(j i=0,R;(R=b[i]);i++){4(i>0)e.f.T("<1P/>");e.f.T(R)}e.f.1x()}p{e.m.D(m).l();e.f.q()}4(7(2).1d&&$(2).o())e.o.D($(2).o().1O(\'1N://\',\'\')).l();p e.o.q();e.3.P(7(2).X);4(7(2).H)e.3.H();1f.1L(2,1K)}8 l(){B=S;4((!A||!$.N.L)&&7(9).r){4(e.3.I(":17"))e.3.Q().l().O(7(9).r,9.11);p e.3.I(\':1a\')?e.3.O(7(9).r,9.11):e.3.1G(7(9).r)}p{e.3.l()}u()}8 u(c){4($.k.w)g;4(c&&c.1W.1X=="1E"){g}4(!M&&e.3.I(":1a")){$(K.f).1b(\'W\',u)}4(9==S){$(K.f).1b(\'W\',u);g}e.3.V("z-14").V("z-1A");j b=e.3[0].1z;j a=e.3[0].1y;4(c){b=c.2o+7(9).E;a=c.2n+7(9).G;j d=\'1w\';4(7(9).2k){d=$(C).1r()-b;b=\'1w\'}e.3.n({E:b,14:d,G:a})}j v=z(),h=e.3[0];4(v.x+v.1s<h.1z+h.1n){b-=h.1n+20+7(9).E;e.3.n({E:b+\'1C\'}).P("z-14")}4(v.y+v.1t<h.1y+h.1m){a-=h.1m+20+7(9).G;e.3.n({G:a+\'1C\'}).P("z-1A")}}8 z(){g{x:$(C).2e(),y:$(C).2d(),1s:$(C).1r(),1t:$(C).2p()}}8 q(a){4($.k.w)g;4(B)2c(B);9=S;j b=7(2);8 J(){e.3.V(b.X).q().n("1g","")}4((!A||!$.N.L)&&b.r){4(e.3.I(\':17\'))e.3.Q().O(b.r,0,J);p e.3.Q().2b(b.r,J)}p J();4(7(2).H)e.3.1l()}})(2a);',62,155,'||this|parent|if|||settings|function|current||||||body|return|||var|tooltip|show|title|css|url|else|hide|fade||div|update||blocked|||viewport|IE|tID|window|html|left|each|top|fixPNG|is|complete|document|bgiframe|track|fn|fadeTo|addClass|stop|part|null|append|bodyHandler|removeClass|mousemove|extraClass|backgroundImage|delay|h3|tOpacity|false|tooltipText|right||id|animated|showBody|true|visible|unbind|empty|showURL|save|handle|opacity|defaults|class|data|attr|unfixPNG|offsetHeight|offsetWidth|position|src|createHelper|width|cx|cy|relative|extend|auto|hideWhenEmpty|offsetTop|offsetLeft|bottom|filter|px|none|OPTION|RegExp|fadeIn|navigator|png|match|arguments|apply|test|http|replace|br|for|shift|click|split|mouseout|jquery|target|tagName|nodeType|call||mouseover|alt|bind|removeAttr|200|setTimeout|appendTo|href|MSIE|jQuery|fadeOut|clearTimeout|scrollTop|scrollLeft|absolute|msie|crop|sizingMethod|enabled|positionLeft|AlphaImageLoader|Microsoft|pageY|pageX|height|DXImageTransform|progid|block|userAgent|browser'.split('|'),0,{}))  
16 \ No newline at end of file 0 \ No newline at end of file
setup/wizard/resources/jquery-tooltip/lib/jquery.bgiframe.js deleted
1 -/* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net)  
2 - * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)  
3 - * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.  
4 - *  
5 - * $LastChangedDate: 2007-06-20 03:23:36 +0200 (Mi, 20 Jun 2007) $  
6 - * $Rev: 2110 $  
7 - *  
8 - * Version 2.1  
9 - */  
10 -  
11 -(function($){  
12 -  
13 -/**  
14 - * The bgiframe is chainable and applies the iframe hack to get  
15 - * around zIndex issues in IE6. It will only apply itself in IE  
16 - * and adds a class to the iframe called 'bgiframe'. The iframe  
17 - * is appeneded as the first child of the matched element(s)  
18 - * with a tabIndex and zIndex of -1.  
19 - *  
20 - * By default the plugin will take borders, sized with pixel units,  
21 - * into account. If a different unit is used for the border's width,  
22 - * then you will need to use the top and left settings as explained below.  
23 - *  
24 - * NOTICE: This plugin has been reported to cause perfromance problems  
25 - * when used on elements that change properties (like width, height and  
26 - * opacity) a lot in IE6. Most of these problems have been caused by  
27 - * the expressions used to calculate the elements width, height and  
28 - * borders. Some have reported it is due to the opacity filter. All  
29 - * these settings can be changed if needed as explained below.  
30 - *  
31 - * @example $('div').bgiframe();  
32 - * @before <div><p>Paragraph</p></div>  
33 - * @result <div><iframe class="bgiframe".../><p>Paragraph</p></div>  
34 - *  
35 - * @param Map settings Optional settings to configure the iframe.  
36 - * @option String|Number top The iframe must be offset to the top  
37 - * by the width of the top border. This should be a negative  
38 - * number representing the border-top-width. If a number is  
39 - * is used here, pixels will be assumed. Otherwise, be sure  
40 - * to specify a unit. An expression could also be used.  
41 - * By default the value is "auto" which will use an expression  
42 - * to get the border-top-width if it is in pixels.  
43 - * @option String|Number left The iframe must be offset to the left  
44 - * by the width of the left border. This should be a negative  
45 - * number representing the border-left-width. If a number is  
46 - * is used here, pixels will be assumed. Otherwise, be sure  
47 - * to specify a unit. An expression could also be used.  
48 - * By default the value is "auto" which will use an expression  
49 - * to get the border-left-width if it is in pixels.  
50 - * @option String|Number width This is the width of the iframe. If  
51 - * a number is used here, pixels will be assume. Otherwise, be sure  
52 - * to specify a unit. An experssion could also be used.  
53 - * By default the value is "auto" which will use an experssion  
54 - * to get the offsetWidth.  
55 - * @option String|Number height This is the height of the iframe. If  
56 - * a number is used here, pixels will be assume. Otherwise, be sure  
57 - * to specify a unit. An experssion could also be used.  
58 - * By default the value is "auto" which will use an experssion  
59 - * to get the offsetHeight.  
60 - * @option Boolean opacity This is a boolean representing whether or not  
61 - * to use opacity. If set to true, the opacity of 0 is applied. If  
62 - * set to false, the opacity filter is not applied. Default: true.  
63 - * @option String src This setting is provided so that one could change  
64 - * the src of the iframe to whatever they need.  
65 - * Default: "javascript:false;"  
66 - *  
67 - * @name bgiframe  
68 - * @type jQuery  
69 - * @cat Plugins/bgiframe  
70 - * @author Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)  
71 - */  
72 -$.fn.bgIframe = $.fn.bgiframe = function(s) {  
73 - // This is only for IE6  
74 - if ( $.browser.msie && parseInt($.browser.version) <= 6 ) {  
75 - s = $.extend({  
76 - top : 'auto', // auto == .currentStyle.borderTopWidth  
77 - left : 'auto', // auto == .currentStyle.borderLeftWidth  
78 - width : 'auto', // auto == offsetWidth  
79 - height : 'auto', // auto == offsetHeight  
80 - opacity : true,  
81 - src : 'javascript:false;'  
82 - }, s || {});  
83 - var prop = function(n){return n&&n.constructor==Number?n+'px':n;},  
84 - html = '<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+  
85 - 'style="display:block;position:absolute;z-index:-1;'+  
86 - (s.opacity !== false?'filter:Alpha(Opacity=\'0\');':'')+  
87 - 'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';'+  
88 - 'left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';'+  
89 - 'width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';'+  
90 - 'height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';'+  
91 - '"/>';  
92 - return this.each(function() {  
93 - if ( $('> iframe.bgiframe', this).length == 0 )  
94 - this.insertBefore( document.createElement(html), this.firstChild );  
95 - });  
96 - }  
97 - return this;  
98 -};  
99 -  
100 -// Add browser.version if it doesn't exist  
101 -if (!$.browser.version)  
102 - $.browser.version = navigator.userAgent.toLowerCase().match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)[1];  
103 -  
104 -})(jQuery);  
105 \ No newline at end of file 0 \ No newline at end of file
setup/wizard/resources/jquery-tooltip/lib/jquery.delegate.js deleted
1 -/*  
2 - * jQuery delegate plug-in v1.0  
3 - *  
4 - * Copyright (c) 2007 Jรถrn Zaefferer  
5 - *  
6 - * $Id: jquery.delegate.js 4786 2008-02-19 20:02:34Z joern.zaefferer $  
7 - *  
8 - * Dual licensed under the MIT and GPL licenses:  
9 - * http://www.opensource.org/licenses/mit-license.php  
10 - * http://www.gnu.org/licenses/gpl.html  
11 - */  
12 -  
13 -// provides cross-browser focusin and focusout events  
14 -// IE has native support, in other browsers, use event caputuring (neither bubbles)  
15 -  
16 -// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation  
17 -// handler is only called when $(event.target).is(delegate), in the scope of the jQuery-object for event.target  
18 -  
19 -// provides triggerEvent(type: String, target: Element) to trigger delegated events  
20 -;(function($) {  
21 - $.each({  
22 - focus: 'focusin',  
23 - blur: 'focusout'  
24 - }, function( original, fix ){  
25 - $.event.special[fix] = {  
26 - setup:function() {  
27 - if ( $.browser.msie ) return false;  
28 - this.addEventListener( original, $.event.special[fix].handler, true );  
29 - },  
30 - teardown:function() {  
31 - if ( $.browser.msie ) return false;  
32 - this.removeEventListener( original,  
33 - $.event.special[fix].handler, true );  
34 - },  
35 - handler: function(e) {  
36 - arguments[0] = $.event.fix(e);  
37 - arguments[0].type = fix;  
38 - return $.event.handle.apply(this, arguments);  
39 - }  
40 - };  
41 - });  
42 -  
43 - $.extend($.fn, {  
44 - delegate: function(type, delegate, handler) {  
45 - return this.bind(type, function(event) {  
46 - var target = $(event.target);  
47 - if (target.is(delegate)) {  
48 - return handler.apply(target, arguments);  
49 - }  
50 - });  
51 - },  
52 - triggerEvent: function(type, target) {  
53 - return this.triggerHandler(type, [jQuery.event.fix({ type: type, target: target })]);  
54 - }  
55 - })  
56 -})(jQuery);  
setup/wizard/resources/jquery-tooltip/lib/jquery.dimensions.js deleted
1 -/* Copyright (c) 2007 Paul Bakaus (paul.bakaus@googlemail.com) and Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)  
2 - * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)  
3 - * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.  
4 - *  
5 - * $LastChangedDate: 2007-06-22 04:38:37 +0200 (Fr, 22 Jun 2007) $  
6 - * $Rev: 2141 $  
7 - *  
8 - * Version: 1.0b2  
9 - */  
10 -  
11 -(function($){  
12 -  
13 -// store a copy of the core height and width methods  
14 -var height = $.fn.height,  
15 - width = $.fn.width;  
16 -  
17 -$.fn.extend({  
18 - /**  
19 - * If used on document, returns the document's height (innerHeight)  
20 - * If used on window, returns the viewport's (window) height  
21 - * See core docs on height() to see what happens when used on an element.  
22 - *  
23 - * @example $("#testdiv").height()  
24 - * @result 200  
25 - *  
26 - * @example $(document).height()  
27 - * @result 800  
28 - *  
29 - * @example $(window).height()  
30 - * @result 400  
31 - *  
32 - * @name height  
33 - * @type Object  
34 - * @cat Plugins/Dimensions  
35 - */  
36 - height: function() {  
37 - if ( this[0] == window )  
38 - return self.innerHeight ||  
39 - $.boxModel && document.documentElement.clientHeight ||  
40 - document.body.clientHeight;  
41 -  
42 - if ( this[0] == document )  
43 - return Math.max( document.body.scrollHeight, document.body.offsetHeight );  
44 -  
45 - return height.apply(this, arguments);  
46 - },  
47 -  
48 - /**  
49 - * If used on document, returns the document's width (innerWidth)  
50 - * If used on window, returns the viewport's (window) width  
51 - * See core docs on height() to see what happens when used on an element.  
52 - *  
53 - * @example $("#testdiv").width()  
54 - * @result 200  
55 - *  
56 - * @example $(document).width()  
57 - * @result 800  
58 - *  
59 - * @example $(window).width()  
60 - * @result 400  
61 - *  
62 - * @name width  
63 - * @type Object  
64 - * @cat Plugins/Dimensions  
65 - */  
66 - width: function() {  
67 - if ( this[0] == window )  
68 - return self.innerWidth ||  
69 - $.boxModel && document.documentElement.clientWidth ||  
70 - document.body.clientWidth;  
71 -  
72 - if ( this[0] == document )  
73 - return Math.max( document.body.scrollWidth, document.body.offsetWidth );  
74 -  
75 - return width.apply(this, arguments);  
76 - },  
77 -  
78 - /**  
79 - * Returns the inner height value (without border) for the first matched element.  
80 - * If used on document, returns the document's height (innerHeight)  
81 - * If used on window, returns the viewport's (window) height  
82 - *  
83 - * @example $("#testdiv").innerHeight()  
84 - * @result 800  
85 - *  
86 - * @name innerHeight  
87 - * @type Number  
88 - * @cat Plugins/Dimensions  
89 - */  
90 - innerHeight: function() {  
91 - return this[0] == window || this[0] == document ?  
92 - this.height() :  
93 - this.is(':visible') ?  
94 - this[0].offsetHeight - num(this, 'borderTopWidth') - num(this, 'borderBottomWidth') :  
95 - this.height() + num(this, 'paddingTop') + num(this, 'paddingBottom');  
96 - },  
97 -  
98 - /**  
99 - * Returns the inner width value (without border) for the first matched element.  
100 - * If used on document, returns the document's Width (innerWidth)  
101 - * If used on window, returns the viewport's (window) width  
102 - *  
103 - * @example $("#testdiv").innerWidth()  
104 - * @result 1000  
105 - *  
106 - * @name innerWidth  
107 - * @type Number  
108 - * @cat Plugins/Dimensions  
109 - */  
110 - innerWidth: function() {  
111 - return this[0] == window || this[0] == document ?  
112 - this.width() :  
113 - this.is(':visible') ?  
114 - this[0].offsetWidth - num(this, 'borderLeftWidth') - num(this, 'borderRightWidth') :  
115 - this.width() + num(this, 'paddingLeft') + num(this, 'paddingRight');  
116 - },  
117 -  
118 - /**  
119 - * Returns the outer height value (including border) for the first matched element.  
120 - * Cannot be used on document or window.  
121 - *  
122 - * @example $("#testdiv").outerHeight()  
123 - * @result 1000  
124 - *  
125 - * @name outerHeight  
126 - * @type Number  
127 - * @cat Plugins/Dimensions  
128 - */  
129 - outerHeight: function() {  
130 - return this[0] == window || this[0] == document ?  
131 - this.height() :  
132 - this.is(':visible') ?  
133 - this[0].offsetHeight :  
134 - this.height() + num(this,'borderTopWidth') + num(this, 'borderBottomWidth') + num(this, 'paddingTop') + num(this, 'paddingBottom');  
135 - },  
136 -  
137 - /**  
138 - * Returns the outer width value (including border) for the first matched element.  
139 - * Cannot be used on document or window.  
140 - *  
141 - * @example $("#testdiv").outerHeight()  
142 - * @result 1000  
143 - *  
144 - * @name outerHeight  
145 - * @type Number  
146 - * @cat Plugins/Dimensions  
147 - */  
148 - outerWidth: function() {  
149 - return this[0] == window || this[0] == document ?  
150 - this.width() :  
151 - this.is(':visible') ?  
152 - this[0].offsetWidth :  
153 - this.width() + num(this, 'borderLeftWidth') + num(this, 'borderRightWidth') + num(this, 'paddingLeft') + num(this, 'paddingRight');  
154 - },  
155 -  
156 - /**  
157 - * Returns how many pixels the user has scrolled to the right (scrollLeft).  
158 - * Works on containers with overflow: auto and window/document.  
159 - *  
160 - * @example $("#testdiv").scrollLeft()  
161 - * @result 100  
162 - *  
163 - * @name scrollLeft  
164 - * @type Number  
165 - * @cat Plugins/Dimensions  
166 - */  
167 - /**  
168 - * Sets the scrollLeft property and continues the chain.  
169 - * Works on containers with overflow: auto and window/document.  
170 - *  
171 - * @example $("#testdiv").scrollLeft(10).scrollLeft()  
172 - * @result 10  
173 - *  
174 - * @name scrollLeft  
175 - * @param Number value A positive number representing the desired scrollLeft.  
176 - * @type jQuery  
177 - * @cat Plugins/Dimensions  
178 - */  
179 - scrollLeft: function(val) {  
180 - if ( val != undefined )  
181 - // set the scroll left  
182 - return this.each(function() {  
183 - if (this == window || this == document)  
184 - window.scrollTo( val, $(window).scrollTop() );  
185 - else  
186 - this.scrollLeft = val;  
187 - });  
188 -  
189 - // return the scroll left offest in pixels  
190 - if ( this[0] == window || this[0] == document )  
191 - return self.pageXOffset ||  
192 - $.boxModel && document.documentElement.scrollLeft ||  
193 - document.body.scrollLeft;  
194 -  
195 - return this[0].scrollLeft;  
196 - },  
197 -  
198 - /**  
199 - * Returns how many pixels the user has scrolled to the bottom (scrollTop).  
200 - * Works on containers with overflow: auto and window/document.  
201 - *  
202 - * @example $("#testdiv").scrollTop()  
203 - * @result 100  
204 - *  
205 - * @name scrollTop  
206 - * @type Number  
207 - * @cat Plugins/Dimensions  
208 - */  
209 - /**  
210 - * Sets the scrollTop property and continues the chain.  
211 - * Works on containers with overflow: auto and window/document.  
212 - *  
213 - * @example $("#testdiv").scrollTop(10).scrollTop()  
214 - * @result 10  
215 - *  
216 - * @name scrollTop  
217 - * @param Number value A positive number representing the desired scrollTop.  
218 - * @type jQuery  
219 - * @cat Plugins/Dimensions  
220 - */  
221 - scrollTop: function(val) {  
222 - if ( val != undefined )  
223 - // set the scroll top  
224 - return this.each(function() {  
225 - if (this == window || this == document)  
226 - window.scrollTo( $(window).scrollLeft(), val );  
227 - else  
228 - this.scrollTop = val;  
229 - });  
230 -  
231 - // return the scroll top offset in pixels  
232 - if ( this[0] == window || this[0] == document )  
233 - return self.pageYOffset ||  
234 - $.boxModel && document.documentElement.scrollTop ||  
235 - document.body.scrollTop;  
236 -  
237 - return this[0].scrollTop;  
238 - },  
239 -  
240 - /**  
241 - * Returns the top and left positioned offset in pixels.  
242 - * The positioned offset is the offset between a positioned  
243 - * parent and the element itself.  
244 - *  
245 - * @example $("#testdiv").position()  
246 - * @result { top: 100, left: 100 }  
247 - *  
248 - * @name position  
249 - * @param Map options Optional settings to configure the way the offset is calculated.  
250 - * @option Boolean margin Should the margin of the element be included in the calculations? False by default.  
251 - * @option Boolean border Should the border of the element be included in the calculations? False by default.  
252 - * @option Boolean padding Should the padding of the element be included in the calculations? False by default.  
253 - * @param Object returnObject An object to store the return value in, so as not to break the chain. If passed in the  
254 - * chain will not be broken and the result will be assigned to this object.  
255 - * @type Object  
256 - * @cat Plugins/Dimensions  
257 - */  
258 - position: function(options, returnObject) {  
259 - var elem = this[0], parent = elem.parentNode, op = elem.offsetParent,  
260 - options = $.extend({ margin: false, border: false, padding: false, scroll: false }, options || {}),  
261 - x = elem.offsetLeft,  
262 - y = elem.offsetTop,  
263 - sl = elem.scrollLeft,  
264 - st = elem.scrollTop;  
265 -  
266 - // Mozilla and IE do not add the border  
267 - if ($.browser.mozilla || $.browser.msie) {  
268 - // add borders to offset  
269 - x += num(elem, 'borderLeftWidth');  
270 - y += num(elem, 'borderTopWidth');  
271 - }  
272 -  
273 - if ($.browser.mozilla) {  
274 - do {  
275 - // Mozilla does not add the border for a parent that has overflow set to anything but visible  
276 - if ($.browser.mozilla && parent != elem && $.css(parent, 'overflow') != 'visible') {  
277 - x += num(parent, 'borderLeftWidth');  
278 - y += num(parent, 'borderTopWidth');  
279 - }  
280 -  
281 - if (parent == op) break; // break if we are already at the offestParent  
282 - } while ((parent = parent.parentNode) && (parent.tagName.toLowerCase() != 'body' || parent.tagName.toLowerCase() != 'html'));  
283 - }  
284 -  
285 - var returnValue = handleOffsetReturn(elem, options, x, y, sl, st);  
286 -  
287 - if (returnObject) { $.extend(returnObject, returnValue); return this; }  
288 - else { return returnValue; }  
289 - },  
290 -  
291 - /**  
292 - * Returns the location of the element in pixels from the top left corner of the viewport.  
293 - *  
294 - * For accurate readings make sure to use pixel values for margins, borders and padding.  
295 - *  
296 - * Known issues:  
297 - * - Issue: A div positioned relative or static without any content before it and its parent will report an offsetTop of 0 in Safari  
298 - * Workaround: Place content before the relative div ... and set height and width to 0 and overflow to hidden  
299 - *  
300 - * @example $("#testdiv").offset()  
301 - * @result { top: 100, left: 100, scrollTop: 10, scrollLeft: 10 }  
302 - *  
303 - * @example $("#testdiv").offset({ scroll: false })  
304 - * @result { top: 90, left: 90 }  
305 - *  
306 - * @example var offset = {}  
307 - * $("#testdiv").offset({ scroll: false }, offset)  
308 - * @result offset = { top: 90, left: 90 }  
309 - *  
310 - * @name offset  
311 - * @param Map options Optional settings to configure the way the offset is calculated.  
312 - * @option Boolean margin Should the margin of the element be included in the calculations? True by default.  
313 - * @option Boolean border Should the border of the element be included in the calculations? False by default.  
314 - * @option Boolean padding Should the padding of the element be included in the calculations? False by default.  
315 - * @option Boolean scroll Should the scroll offsets of the parent elements be included in the calculations? True by default.  
316 - * When true it adds the totla scroll offets of all parents to the total offset and also adds two properties  
317 - * to the returned object, scrollTop and scrollLeft.  
318 - * @options Boolean lite Will use offsetLite instead of offset when set to true. False by default.  
319 - * @param Object returnObject An object to store the return value in, so as not to break the chain. If passed in the  
320 - * chain will not be broken and the result will be assigned to this object.  
321 - * @type Object  
322 - * @cat Plugins/Dimensions  
323 - */  
324 - offset: function(options, returnObject) {  
325 - var x = 0, y = 0, sl = 0, st = 0,  
326 - elem = this[0], parent = this[0], op, parPos, elemPos = $.css(elem, 'position'),  
327 - mo = $.browser.mozilla, ie = $.browser.msie, sf = $.browser.safari, oa = $.browser.opera,  
328 - absparent = false, relparent = false,  
329 - options = $.extend({ margin: true, border: false, padding: false, scroll: true, lite: false }, options || {});  
330 -  
331 - // Use offsetLite if lite option is true  
332 - if (options.lite) return this.offsetLite(options, returnObject);  
333 -  
334 - if (elem.tagName.toLowerCase() == 'body') {  
335 - // Safari is the only one to get offsetLeft and offsetTop properties of the body "correct"  
336 - // Except they all mess up when the body is positioned absolute or relative  
337 - x = elem.offsetLeft;  
338 - y = elem.offsetTop;  
339 - // Mozilla ignores margin and subtracts border from body element  
340 - if (mo) {  
341 - x += num(elem, 'marginLeft') + (num(elem, 'borderLeftWidth')*2);  
342 - y += num(elem, 'marginTop') + (num(elem, 'borderTopWidth') *2);  
343 - } else  
344 - // Opera ignores margin  
345 - if (oa) {  
346 - x += num(elem, 'marginLeft');  
347 - y += num(elem, 'marginTop');  
348 - } else  
349 - // IE does not add the border in Standards Mode  
350 - if (ie && jQuery.boxModel) {  
351 - x += num(elem, 'borderLeftWidth');  
352 - y += num(elem, 'borderTopWidth');  
353 - }  
354 - } else {  
355 - do {  
356 - parPos = $.css(parent, 'position');  
357 -  
358 - x += parent.offsetLeft;  
359 - y += parent.offsetTop;  
360 -  
361 - // Mozilla and IE do not add the border  
362 - if (mo || ie) {  
363 - // add borders to offset  
364 - x += num(parent, 'borderLeftWidth');  
365 - y += num(parent, 'borderTopWidth');  
366 -  
367 - // Mozilla does not include the border on body if an element isn't positioned absolute and is without an absolute parent  
368 - if (mo && parPos == 'absolute') absparent = true;  
369 - // IE does not include the border on the body if an element is position static and without an absolute or relative parent  
370 - if (ie && parPos == 'relative') relparent = true;  
371 - }  
372 -  
373 - op = parent.offsetParent;  
374 - if (options.scroll || mo) {  
375 - do {  
376 - if (options.scroll) {  
377 - // get scroll offsets  
378 - sl += parent.scrollLeft;  
379 - st += parent.scrollTop;  
380 - }  
381 -  
382 - // Mozilla does not add the border for a parent that has overflow set to anything but visible  
383 - if (mo && parent != elem && $.css(parent, 'overflow') != 'visible') {  
384 - x += num(parent, 'borderLeftWidth');  
385 - y += num(parent, 'borderTopWidth');  
386 - }  
387 -  
388 - parent = parent.parentNode;  
389 - } while (parent != op);  
390 - }  
391 - parent = op;  
392 -  
393 - if (parent.tagName.toLowerCase() == 'body' || parent.tagName.toLowerCase() == 'html') {  
394 - // Safari and IE Standards Mode doesn't add the body margin for elments positioned with static or relative  
395 - if ((sf || (ie && $.boxModel)) && elemPos != 'absolute' && elemPos != 'fixed') {  
396 - x += num(parent, 'marginLeft');  
397 - y += num(parent, 'marginTop');  
398 - }  
399 - // Mozilla does not include the border on body if an element isn't positioned absolute and is without an absolute parent  
400 - // IE does not include the border on the body if an element is positioned static and without an absolute or relative parent  
401 - if ( (mo && !absparent && elemPos != 'fixed') ||  
402 - (ie && elemPos == 'static' && !relparent) ) {  
403 - x += num(parent, 'borderLeftWidth');  
404 - y += num(parent, 'borderTopWidth');  
405 - }  
406 - break; // Exit the loop  
407 - }  
408 - } while (parent);  
409 - }  
410 -  
411 - var returnValue = handleOffsetReturn(elem, options, x, y, sl, st);  
412 -  
413 - if (returnObject) { $.extend(returnObject, returnValue); return this; }  
414 - else { return returnValue; }  
415 - },  
416 -  
417 - /**  
418 - * Returns the location of the element in pixels from the top left corner of the viewport.  
419 - * This method is much faster than offset but not as accurate. This method can be invoked  
420 - * by setting the lite option to true in the offset method.  
421 - *  
422 - * @name offsetLite  
423 - * @param Map options Optional settings to configure the way the offset is calculated.  
424 - * @option Boolean margin Should the margin of the element be included in the calculations? True by default.  
425 - * @option Boolean border Should the border of the element be included in the calculations? False by default.  
426 - * @option Boolean padding Should the padding of the element be included in the calculations? False by default.  
427 - * @option Boolean scroll Should the scroll offsets of the parent elements be included in the calculations? True by default.  
428 - * When true it adds the totla scroll offets of all parents to the total offset and also adds two properties  
429 - * to the returned object, scrollTop and scrollLeft.  
430 - * @param Object returnObject An object to store the return value in, so as not to break the chain. If passed in the  
431 - * chain will not be broken and the result will be assigned to this object.  
432 - * @type Object  
433 - * @cat Plugins/Dimensions  
434 - */  
435 - offsetLite: function(options, returnObject) {  
436 - var x = 0, y = 0, sl = 0, st = 0, parent = this[0], op,  
437 - options = $.extend({ margin: true, border: false, padding: false, scroll: true }, options || {});  
438 -  
439 - do {  
440 - x += parent.offsetLeft;  
441 - y += parent.offsetTop;  
442 -  
443 - op = parent.offsetParent;  
444 - if (options.scroll) {  
445 - // get scroll offsets  
446 - do {  
447 - sl += parent.scrollLeft;  
448 - st += parent.scrollTop;  
449 - parent = parent.parentNode;  
450 - } while(parent != op);  
451 - }  
452 - parent = op;  
453 - } while (parent && parent.tagName.toLowerCase() != 'body' && parent.tagName.toLowerCase() != 'html');  
454 -  
455 - var returnValue = handleOffsetReturn(this[0], options, x, y, sl, st);  
456 -  
457 - if (returnObject) { $.extend(returnObject, returnValue); return this; }  
458 - else { return returnValue; }  
459 - }  
460 -});  
461 -  
462 -/**  
463 - * Handles converting a CSS Style into an Integer.  
464 - * @private  
465 - */  
466 -var num = function(el, prop) {  
467 - return parseInt($.css(el.jquery?el[0]:el,prop))||0;  
468 -};  
469 -  
470 -/**  
471 - * Handles the return value of the offset and offsetLite methods.  
472 - * @private  
473 - */  
474 -var handleOffsetReturn = function(elem, options, x, y, sl, st) {  
475 - if ( !options.margin ) {  
476 - x -= num(elem, 'marginLeft');  
477 - y -= num(elem, 'marginTop');  
478 - }  
479 -  
480 - // Safari and Opera do not add the border for the element  
481 - if ( options.border && ($.browser.safari || $.browser.opera) ) {  
482 - x += num(elem, 'borderLeftWidth');  
483 - y += num(elem, 'borderTopWidth');  
484 - } else if ( !options.border && !($.browser.safari || $.browser.opera) ) {  
485 - x -= num(elem, 'borderLeftWidth');  
486 - y -= num(elem, 'borderTopWidth');  
487 - }  
488 -  
489 - if ( options.padding ) {  
490 - x += num(elem, 'paddingLeft');  
491 - y += num(elem, 'paddingTop');  
492 - }  
493 -  
494 - // do not include scroll offset on the element  
495 - if ( options.scroll ) {  
496 - sl -= elem.scrollLeft;  
497 - st -= elem.scrollTop;  
498 - }  
499 -  
500 - return options.scroll ? { top: y - st, left: x - sl, scrollTop: st, scrollLeft: sl }  
501 - : { top: y, left: x };  
502 -};  
503 -  
504 -})(jQuery);  
505 \ No newline at end of file 0 \ No newline at end of file
setup/wizard/resources/jquery-tooltip/lib/jquery.js deleted
1 -(function(){  
2 -/*  
3 - * jQuery 1.2.2 - New Wave Javascript  
4 - *  
5 - * Copyright (c) 2007 John Resig (jquery.com)  
6 - * Dual licensed under the MIT (MIT-LICENSE.txt)  
7 - * and GPL (GPL-LICENSE.txt) licenses.  
8 - *  
9 - * $Date: 2008-01-14 17:56:07 -0500 (Mon, 14 Jan 2008) $  
10 - * $Rev: 4454 $  
11 - */  
12 -  
13 -// Map over jQuery in case of overwrite  
14 -if ( window.jQuery )  
15 - var _jQuery = window.jQuery;  
16 -  
17 -var jQuery = window.jQuery = function( selector, context ) {  
18 - // The jQuery object is actually just the init constructor 'enhanced'  
19 - return new jQuery.prototype.init( selector, context );  
20 -};  
21 -  
22 -// Map over the $ in case of overwrite  
23 -if ( window.$ )  
24 - var _$ = window.$;  
25 -  
26 -// Map the jQuery namespace to the '$' one  
27 -window.$ = jQuery;  
28 -  
29 -// A simple way to check for HTML strings or ID strings  
30 -// (both of which we optimize for)  
31 -var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;  
32 -  
33 -// Is it a simple selector  
34 -var isSimple = /^.[^:#\[\.]*$/;  
35 -  
36 -jQuery.fn = jQuery.prototype = {  
37 - init: function( selector, context ) {  
38 - // Make sure that a selection was provided  
39 - selector = selector || document;  
40 -  
41 - // Handle $(DOMElement)  
42 - if ( selector.nodeType ) {  
43 - this[0] = selector;  
44 - this.length = 1;  
45 - return this;  
46 -  
47 - // Handle HTML strings  
48 - } else if ( typeof selector == "string" ) {  
49 - // Are we dealing with HTML string or an ID?  
50 - var match = quickExpr.exec( selector );  
51 -  
52 - // Verify a match, and that no context was specified for #id  
53 - if ( match && (match[1] || !context) ) {  
54 -  
55 - // HANDLE: $(html) -> $(array)  
56 - if ( match[1] )  
57 - selector = jQuery.clean( [ match[1] ], context );  
58 -  
59 - // HANDLE: $("#id")  
60 - else {  
61 - var elem = document.getElementById( match[3] );  
62 -  
63 - // Make sure an element was located  
64 - if ( elem )  
65 - // Handle the case where IE and Opera return items  
66 - // by name instead of ID  
67 - if ( elem.id != match[3] )  
68 - return jQuery().find( selector );  
69 -  
70 - // Otherwise, we inject the element directly into the jQuery object  
71 - else {  
72 - this[0] = elem;  
73 - this.length = 1;  
74 - return this;  
75 - }  
76 -  
77 - else  
78 - selector = [];  
79 - }  
80 -  
81 - // HANDLE: $(expr, [context])  
82 - // (which is just equivalent to: $(content).find(expr)  
83 - } else  
84 - return new jQuery( context ).find( selector );  
85 -  
86 - // HANDLE: $(function)  
87 - // Shortcut for document ready  
88 - } else if ( jQuery.isFunction( selector ) )  
89 - return new jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );  
90 -  
91 - return this.setArray(  
92 - // HANDLE: $(array)  
93 - selector.constructor == Array && selector ||  
94 -  
95 - // HANDLE: $(arraylike)  
96 - // Watch for when an array-like object, contains DOM nodes, is passed in as the selector  
97 - (selector.jquery || selector.length && selector != window && !selector.nodeType && selector[0] != undefined && selector[0].nodeType) && jQuery.makeArray( selector ) ||  
98 -  
99 - // HANDLE: $(*)  
100 - [ selector ] );  
101 - },  
102 -  
103 - // The current version of jQuery being used  
104 - jquery: "1.2.2",  
105 -  
106 - // The number of elements contained in the matched element set  
107 - size: function() {  
108 - return this.length;  
109 - },  
110 -  
111 - // The number of elements contained in the matched element set  
112 - length: 0,  
113 -  
114 - // Get the Nth element in the matched element set OR  
115 - // Get the whole matched element set as a clean array  
116 - get: function( num ) {  
117 - return num == undefined ?  
118 -  
119 - // Return a 'clean' array  
120 - jQuery.makeArray( this ) :  
121 -  
122 - // Return just the object  
123 - this[ num ];  
124 - },  
125 -  
126 - // Take an array of elements and push it onto the stack  
127 - // (returning the new matched element set)  
128 - pushStack: function( elems ) {  
129 - // Build a new jQuery matched element set  
130 - var ret = jQuery( elems );  
131 -  
132 - // Add the old object onto the stack (as a reference)  
133 - ret.prevObject = this;  
134 -  
135 - // Return the newly-formed element set  
136 - return ret;  
137 - },  
138 -  
139 - // Force the current matched set of elements to become  
140 - // the specified array of elements (destroying the stack in the process)  
141 - // You should use pushStack() in order to do this, but maintain the stack  
142 - setArray: function( elems ) {  
143 - // Resetting the length to 0, then using the native Array push  
144 - // is a super-fast way to populate an object with array-like properties  
145 - this.length = 0;  
146 - Array.prototype.push.apply( this, elems );  
147 -  
148 - return this;  
149 - },  
150 -  
151 - // Execute a callback for every element in the matched set.  
152 - // (You can seed the arguments with an array of args, but this is  
153 - // only used internally.)  
154 - each: function( callback, args ) {  
155 - return jQuery.each( this, callback, args );  
156 - },  
157 -  
158 - // Determine the position of an element within  
159 - // the matched set of elements  
160 - index: function( elem ) {  
161 - var ret = -1;  
162 -  
163 - // Locate the position of the desired element  
164 - this.each(function(i){  
165 - if ( this == elem )  
166 - ret = i;  
167 - });  
168 -  
169 - return ret;  
170 - },  
171 -  
172 - attr: function( name, value, type ) {  
173 - var options = name;  
174 -  
175 - // Look for the case where we're accessing a style value  
176 - if ( name.constructor == String )  
177 - if ( value == undefined )  
178 - return this.length && jQuery[ type || "attr" ]( this[0], name ) || undefined;  
179 -  
180 - else {  
181 - options = {};  
182 - options[ name ] = value;  
183 - }  
184 -  
185 - // Check to see if we're setting style values  
186 - return this.each(function(i){  
187 - // Set all the styles  
188 - for ( name in options )  
189 - jQuery.attr(  
190 - type ?  
191 - this.style :  
192 - this,  
193 - name, jQuery.prop( this, options[ name ], type, i, name )  
194 - );  
195 - });  
196 - },  
197 -  
198 - css: function( key, value ) {  
199 - // ignore negative width and height values  
200 - if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )  
201 - value = undefined;  
202 - return this.attr( key, value, "curCSS" );  
203 - },  
204 -  
205 - text: function( text ) {  
206 - if ( typeof text != "object" && text != null )  
207 - return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );  
208 -  
209 - var ret = "";  
210 -  
211 - jQuery.each( text || this, function(){  
212 - jQuery.each( this.childNodes, function(){  
213 - if ( this.nodeType != 8 )  
214 - ret += this.nodeType != 1 ?  
215 - this.nodeValue :  
216 - jQuery.fn.text( [ this ] );  
217 - });  
218 - });  
219 -  
220 - return ret;  
221 - },  
222 -  
223 - wrapAll: function( html ) {  
224 - if ( this[0] )  
225 - // The elements to wrap the target around  
226 - jQuery( html, this[0].ownerDocument )  
227 - .clone()  
228 - .insertBefore( this[0] )  
229 - .map(function(){  
230 - var elem = this;  
231 -  
232 - while ( elem.firstChild )  
233 - elem = elem.firstChild;  
234 -  
235 - return elem;  
236 - })  
237 - .append(this);  
238 -  
239 - return this;  
240 - },  
241 -  
242 - wrapInner: function( html ) {  
243 - return this.each(function(){  
244 - jQuery( this ).contents().wrapAll( html );  
245 - });  
246 - },  
247 -  
248 - wrap: function( html ) {  
249 - return this.each(function(){  
250 - jQuery( this ).wrapAll( html );  
251 - });  
252 - },  
253 -  
254 - append: function() {  
255 - return this.domManip(arguments, true, false, function(elem){  
256 - if (this.nodeType == 1)  
257 - this.appendChild( elem );  
258 - });  
259 - },  
260 -  
261 - prepend: function() {  
262 - return this.domManip(arguments, true, true, function(elem){  
263 - if (this.nodeType == 1)  
264 - this.insertBefore( elem, this.firstChild );  
265 - });  
266 - },  
267 -  
268 - before: function() {  
269 - return this.domManip(arguments, false, false, function(elem){  
270 - this.parentNode.insertBefore( elem, this );  
271 - });  
272 - },  
273 -  
274 - after: function() {  
275 - return this.domManip(arguments, false, true, function(elem){  
276 - this.parentNode.insertBefore( elem, this.nextSibling );  
277 - });  
278 - },  
279 -  
280 - end: function() {  
281 - return this.prevObject || jQuery( [] );  
282 - },  
283 -  
284 - find: function( selector ) {  
285 - var elems = jQuery.map(this, function(elem){  
286 - return jQuery.find( selector, elem );  
287 - });  
288 -  
289 - return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?  
290 - jQuery.unique( elems ) :  
291 - elems );  
292 - },  
293 -  
294 - clone: function( events ) {  
295 - // Do the clone  
296 - var ret = this.map(function(){  
297 - if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) {  
298 - // IE copies events bound via attachEvent when  
299 - // using cloneNode. Calling detachEvent on the  
300 - // clone will also remove the events from the orignal  
301 - // In order to get around this, we use innerHTML.  
302 - // Unfortunately, this means some modifications to  
303 - // attributes in IE that are actually only stored  
304 - // as properties will not be copied (such as the  
305 - // the name attribute on an input).  
306 - var clone = this.cloneNode(true),  
307 - container = document.createElement("div"),  
308 - container2 = document.createElement("div");  
309 - container.appendChild(clone);  
310 - container2.innerHTML = container.innerHTML;  
311 - return container2.firstChild;  
312 - } else  
313 - return this.cloneNode(true);  
314 - });  
315 -  
316 - // Need to set the expando to null on the cloned set if it exists  
317 - // removeData doesn't work here, IE removes it from the original as well  
318 - // this is primarily for IE but the data expando shouldn't be copied over in any browser  
319 - var clone = ret.find("*").andSelf().each(function(){  
320 - if ( this[ expando ] != undefined )  
321 - this[ expando ] = null;  
322 - });  
323 -  
324 - // Copy the events from the original to the clone  
325 - if ( events === true )  
326 - this.find("*").andSelf().each(function(i){  
327 - if (this.nodeType == 3)  
328 - return;  
329 - var events = jQuery.data( this, "events" );  
330 -  
331 - for ( var type in events )  
332 - for ( var handler in events[ type ] )  
333 - jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data );  
334 - });  
335 -  
336 - // Return the cloned set  
337 - return ret;  
338 - },  
339 -  
340 - filter: function( selector ) {  
341 - return this.pushStack(  
342 - jQuery.isFunction( selector ) &&  
343 - jQuery.grep(this, function(elem, i){  
344 - return selector.call( elem, i );  
345 - }) ||  
346 -  
347 - jQuery.multiFilter( selector, this ) );  
348 - },  
349 -  
350 - not: function( selector ) {  
351 - if ( selector.constructor == String )  
352 - // test special case where just one selector is passed in  
353 - if ( isSimple.test( selector ) )  
354 - return this.pushStack( jQuery.multiFilter( selector, this, true ) );  
355 - else  
356 - selector = jQuery.multiFilter( selector, this );  
357 -  
358 - var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;  
359 - return this.filter(function() {  
360 - return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;  
361 - });  
362 - },  
363 -  
364 - add: function( selector ) {  
365 - return !selector ? this : this.pushStack( jQuery.merge(  
366 - this.get(),  
367 - selector.constructor == String ?  
368 - jQuery( selector ).get() :  
369 - selector.length != undefined && (!selector.nodeName || jQuery.nodeName(selector, "form")) ?  
370 - selector : [selector] ) );  
371 - },  
372 -  
373 - is: function( selector ) {  
374 - return selector ?  
375 - jQuery.multiFilter( selector, this ).length > 0 :  
376 - false;  
377 - },  
378 -  
379 - hasClass: function( selector ) {  
380 - return this.is( "." + selector );  
381 - },  
382 -  
383 - val: function( value ) {  
384 - if ( value == undefined ) {  
385 -  
386 - if ( this.length ) {  
387 - var elem = this[0];  
388 -  
389 - // We need to handle select boxes special  
390 - if ( jQuery.nodeName( elem, "select" ) ) {  
391 - var index = elem.selectedIndex,  
392 - values = [],  
393 - options = elem.options,  
394 - one = elem.type == "select-one";  
395 -  
396 - // Nothing was selected  
397 - if ( index < 0 )  
398 - return null;  
399 -  
400 - // Loop through all the selected options  
401 - for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {  
402 - var option = options[ i ];  
403 -  
404 - if ( option.selected ) {  
405 - // Get the specifc value for the option  
406 - value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;  
407 -  
408 - // We don't need an array for one selects  
409 - if ( one )  
410 - return value;  
411 -  
412 - // Multi-Selects return an array  
413 - values.push( value );  
414 - }  
415 - }  
416 -  
417 - return values;  
418 -  
419 - // Everything else, we just grab the value  
420 - } else  
421 - return (this[0].value || "").replace(/\r/g, "");  
422 -  
423 - }  
424 -  
425 - return undefined;  
426 - }  
427 -  
428 - return this.each(function(){  
429 - if ( this.nodeType != 1 )  
430 - return;  
431 -  
432 - if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )  
433 - this.checked = (jQuery.inArray(this.value, value) >= 0 ||  
434 - jQuery.inArray(this.name, value) >= 0);  
435 -  
436 - else if ( jQuery.nodeName( this, "select" ) ) {  
437 - var values = value.constructor == Array ?  
438 - value :  
439 - [ value ];  
440 -  
441 - jQuery( "option", this ).each(function(){  
442 - this.selected = (jQuery.inArray( this.value, values ) >= 0 ||  
443 - jQuery.inArray( this.text, values ) >= 0);  
444 - });  
445 -  
446 - if ( !values.length )  
447 - this.selectedIndex = -1;  
448 -  
449 - } else  
450 - this.value = value;  
451 - });  
452 - },  
453 -  
454 - html: function( value ) {  
455 - return value == undefined ?  
456 - (this.length ?  
457 - this[0].innerHTML :  
458 - null) :  
459 - this.empty().append( value );  
460 - },  
461 -  
462 - replaceWith: function( value ) {  
463 - return this.after( value ).remove();  
464 - },  
465 -  
466 - eq: function( i ) {  
467 - return this.slice( i, i + 1 );  
468 - },  
469 -  
470 - slice: function() {  
471 - return this.pushStack( Array.prototype.slice.apply( this, arguments ) );  
472 - },  
473 -  
474 - map: function( callback ) {  
475 - return this.pushStack( jQuery.map(this, function(elem, i){  
476 - return callback.call( elem, i, elem );  
477 - }));  
478 - },  
479 -  
480 - andSelf: function() {  
481 - return this.add( this.prevObject );  
482 - },  
483 -  
484 - domManip: function( args, table, reverse, callback ) {  
485 - var clone = this.length > 1, elems;  
486 -  
487 - return this.each(function(){  
488 - if ( !elems ) {  
489 - elems = jQuery.clean( args, this.ownerDocument );  
490 -  
491 - if ( reverse )  
492 - elems.reverse();  
493 - }  
494 -  
495 - var obj = this;  
496 -  
497 - if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )  
498 - obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") );  
499 -  
500 - var scripts = jQuery( [] );  
501 -  
502 - jQuery.each(elems, function(){  
503 - var elem = clone ?  
504 - jQuery( this ).clone( true )[0] :  
505 - this;  
506 -  
507 - // execute all scripts after the elements have been injected  
508 - if ( jQuery.nodeName( elem, "script" ) ) {  
509 - scripts = scripts.add( elem );  
510 - } else {  
511 - // Remove any inner scripts for later evaluation  
512 - if ( elem.nodeType == 1 )  
513 - scripts = scripts.add( jQuery( "script", elem ).remove() );  
514 -  
515 - // Inject the elements into the document  
516 - callback.call( obj, elem );  
517 - }  
518 - });  
519 -  
520 - scripts.each( evalScript );  
521 - });  
522 - }  
523 -};  
524 -  
525 -// Give the init function the jQuery prototype for later instantiation  
526 -jQuery.prototype.init.prototype = jQuery.prototype;  
527 -  
528 -function evalScript( i, elem ) {  
529 - if ( elem.src )  
530 - jQuery.ajax({  
531 - url: elem.src,  
532 - async: false,  
533 - dataType: "script"  
534 - });  
535 -  
536 - else  
537 - jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );  
538 -  
539 - if ( elem.parentNode )  
540 - elem.parentNode.removeChild( elem );  
541 -}  
542 -  
543 -jQuery.extend = jQuery.fn.extend = function() {  
544 - // copy reference to target object  
545 - var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;  
546 -  
547 - // Handle a deep copy situation  
548 - if ( target.constructor == Boolean ) {  
549 - deep = target;  
550 - target = arguments[1] || {};  
551 - // skip the boolean and the target  
552 - i = 2;  
553 - }  
554 -  
555 - // Handle case when target is a string or something (possible in deep copy)  
556 - if ( typeof target != "object" && typeof target != "function" )  
557 - target = {};  
558 -  
559 - // extend jQuery itself if only one argument is passed  
560 - if ( length == 1 ) {  
561 - target = this;  
562 - i = 0;  
563 - }  
564 -  
565 - for ( ; i < length; i++ )  
566 - // Only deal with non-null/undefined values  
567 - if ( (options = arguments[ i ]) != null )  
568 - // Extend the base object  
569 - for ( var name in options ) {  
570 - // Prevent never-ending loop  
571 - if ( target === options[ name ] )  
572 - continue;  
573 -  
574 - // Recurse if we're merging object values  
575 - if ( deep && options[ name ] && typeof options[ name ] == "object" && target[ name ] && !options[ name ].nodeType )  
576 - target[ name ] = jQuery.extend( target[ name ], options[ name ] );  
577 -  
578 - // Don't bring in undefined values  
579 - else if ( options[ name ] != undefined )  
580 - target[ name ] = options[ name ];  
581 -  
582 - }  
583 -  
584 - // Return the modified object  
585 - return target;  
586 -};  
587 -  
588 -var expando = "jQuery" + (new Date()).getTime(), uuid = 0, windowData = {};  
589 -  
590 -// exclude the following css properties to add px  
591 -var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;  
592 -  
593 -jQuery.extend({  
594 - noConflict: function( deep ) {  
595 - window.$ = _$;  
596 -  
597 - if ( deep )  
598 - window.jQuery = _jQuery;  
599 -  
600 - return jQuery;  
601 - },  
602 -  
603 - // See test/unit/core.js for details concerning this function.  
604 - isFunction: function( fn ) {  
605 - return !!fn && typeof fn != "string" && !fn.nodeName &&  
606 - fn.constructor != Array && /function/i.test( fn + "" );  
607 - },  
608 -  
609 - // check if an element is in a (or is an) XML document  
610 - isXMLDoc: function( elem ) {  
611 - return elem.documentElement && !elem.body ||  
612 - elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;  
613 - },  
614 -  
615 - // Evalulates a script in a global context  
616 - globalEval: function( data ) {  
617 - data = jQuery.trim( data );  
618 -  
619 - if ( data ) {  
620 - // Inspired by code by Andrea Giammarchi  
621 - // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html  
622 - var head = document.getElementsByTagName("head")[0] || document.documentElement,  
623 - script = document.createElement("script");  
624 -  
625 - script.type = "text/javascript";  
626 - if ( jQuery.browser.msie )  
627 - script.text = data;  
628 - else  
629 - script.appendChild( document.createTextNode( data ) );  
630 -  
631 - head.appendChild( script );  
632 - head.removeChild( script );  
633 - }  
634 - },  
635 -  
636 - nodeName: function( elem, name ) {  
637 - return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();  
638 - },  
639 -  
640 - cache: {},  
641 -  
642 - data: function( elem, name, data ) {  
643 - elem = elem == window ?  
644 - windowData :  
645 - elem;  
646 -  
647 - var id = elem[ expando ];  
648 -  
649 - // Compute a unique ID for the element  
650 - if ( !id )  
651 - id = elem[ expando ] = ++uuid;  
652 -  
653 - // Only generate the data cache if we're  
654 - // trying to access or manipulate it  
655 - if ( name && !jQuery.cache[ id ] )  
656 - jQuery.cache[ id ] = {};  
657 -  
658 - // Prevent overriding the named cache with undefined values  
659 - if ( data != undefined )  
660 - jQuery.cache[ id ][ name ] = data;  
661 -  
662 - // Return the named cache data, or the ID for the element  
663 - return name ?  
664 - jQuery.cache[ id ][ name ] :  
665 - id;  
666 - },  
667 -  
668 - removeData: function( elem, name ) {  
669 - elem = elem == window ?  
670 - windowData :  
671 - elem;  
672 -  
673 - var id = elem[ expando ];  
674 -  
675 - // If we want to remove a specific section of the element's data  
676 - if ( name ) {  
677 - if ( jQuery.cache[ id ] ) {  
678 - // Remove the section of cache data  
679 - delete jQuery.cache[ id ][ name ];  
680 -  
681 - // If we've removed all the data, remove the element's cache  
682 - name = "";  
683 -  
684 - for ( name in jQuery.cache[ id ] )  
685 - break;  
686 -  
687 - if ( !name )  
688 - jQuery.removeData( elem );  
689 - }  
690 -  
691 - // Otherwise, we want to remove all of the element's data  
692 - } else {  
693 - // Clean up the element expando  
694 - try {  
695 - delete elem[ expando ];  
696 - } catch(e){  
697 - // IE has trouble directly removing the expando  
698 - // but it's ok with using removeAttribute  
699 - if ( elem.removeAttribute )  
700 - elem.removeAttribute( expando );  
701 - }  
702 -  
703 - // Completely remove the data cache  
704 - delete jQuery.cache[ id ];  
705 - }  
706 - },  
707 -  
708 - // args is for internal usage only  
709 - each: function( object, callback, args ) {  
710 - if ( args ) {  
711 - if ( object.length == undefined ) {  
712 - for ( var name in object )  
713 - if ( callback.apply( object[ name ], args ) === false )  
714 - break;  
715 - } else  
716 - for ( var i = 0, length = object.length; i < length; i++ )  
717 - if ( callback.apply( object[ i ], args ) === false )  
718 - break;  
719 -  
720 - // A special, fast, case for the most common use of each  
721 - } else {  
722 - if ( object.length == undefined ) {  
723 - for ( var name in object )  
724 - if ( callback.call( object[ name ], name, object[ name ] ) === false )  
725 - break;  
726 - } else  
727 - for ( var i = 0, length = object.length, value = object[0];  
728 - i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}  
729 - }  
730 -  
731 - return object;  
732 - },  
733 -  
734 - prop: function( elem, value, type, i, name ) {  
735 - // Handle executable functions  
736 - if ( jQuery.isFunction( value ) )  
737 - value = value.call( elem, i );  
738 -  
739 - // Handle passing in a number to a CSS property  
740 - return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ?  
741 - value + "px" :  
742 - value;  
743 - },  
744 -  
745 - className: {  
746 - // internal only, use addClass("class")  
747 - add: function( elem, classNames ) {  
748 - jQuery.each((classNames || "").split(/\s+/), function(i, className){  
749 - if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )  
750 - elem.className += (elem.className ? " " : "") + className;  
751 - });  
752 - },  
753 -  
754 - // internal only, use removeClass("class")  
755 - remove: function( elem, classNames ) {  
756 - if (elem.nodeType == 1)  
757 - elem.className = classNames != undefined ?  
758 - jQuery.grep(elem.className.split(/\s+/), function(className){  
759 - return !jQuery.className.has( classNames, className );  
760 - }).join(" ") :  
761 - "";  
762 - },  
763 -  
764 - // internal only, use is(".class")  
765 - has: function( elem, className ) {  
766 - return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;  
767 - }  
768 - },  
769 -  
770 - // A method for quickly swapping in/out CSS properties to get correct calculations  
771 - swap: function( elem, options, callback ) {  
772 - var old = {};  
773 - // Remember the old values, and insert the new ones  
774 - for ( var name in options ) {  
775 - old[ name ] = elem.style[ name ];  
776 - elem.style[ name ] = options[ name ];  
777 - }  
778 -  
779 - callback.call( elem );  
780 -  
781 - // Revert the old values  
782 - for ( var name in options )  
783 - elem.style[ name ] = old[ name ];  
784 - },  
785 -  
786 - css: function( elem, name, force ) {  
787 - if ( name == "width" || name == "height" ) {  
788 - var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];  
789 -  
790 - function getWH() {  
791 - val = name == "width" ? elem.offsetWidth : elem.offsetHeight;  
792 - var padding = 0, border = 0;  
793 - jQuery.each( which, function() {  
794 - padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;  
795 - border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;  
796 - });  
797 - val -= Math.round(padding + border);  
798 - }  
799 -  
800 - if ( jQuery(elem).is(":visible") )  
801 - getWH();  
802 - else  
803 - jQuery.swap( elem, props, getWH );  
804 -  
805 - return Math.max(0, val);  
806 - }  
807 -  
808 - return jQuery.curCSS( elem, name, force );  
809 - },  
810 -  
811 - curCSS: function( elem, name, force ) {  
812 - var ret;  
813 -  
814 - // A helper method for determining if an element's values are broken  
815 - function color( elem ) {  
816 - if ( !jQuery.browser.safari )  
817 - return false;  
818 -  
819 - var ret = document.defaultView.getComputedStyle( elem, null );  
820 - return !ret || ret.getPropertyValue("color") == "";  
821 - }  
822 -  
823 - // We need to handle opacity special in IE  
824 - if ( name == "opacity" && jQuery.browser.msie ) {  
825 - ret = jQuery.attr( elem.style, "opacity" );  
826 -  
827 - return ret == "" ?  
828 - "1" :  
829 - ret;  
830 - }  
831 - // Opera sometimes will give the wrong display answer, this fixes it, see #2037  
832 - if ( jQuery.browser.opera && name == "display" ) {  
833 - var save = elem.style.display;  
834 - elem.style.display = "block";  
835 - elem.style.display = save;  
836 - }  
837 -  
838 - // Make sure we're using the right name for getting the float value  
839 - if ( name.match( /float/i ) )  
840 - name = styleFloat;  
841 -  
842 - if ( !force && elem.style && elem.style[ name ] )  
843 - ret = elem.style[ name ];  
844 -  
845 - else if ( document.defaultView && document.defaultView.getComputedStyle ) {  
846 -  
847 - // Only "float" is needed here  
848 - if ( name.match( /float/i ) )  
849 - name = "float";  
850 -  
851 - name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();  
852 -  
853 - var getComputedStyle = document.defaultView.getComputedStyle( elem, null );  
854 -  
855 - if ( getComputedStyle && !color( elem ) )  
856 - ret = getComputedStyle.getPropertyValue( name );  
857 -  
858 - // If the element isn't reporting its values properly in Safari  
859 - // then some display: none elements are involved  
860 - else {  
861 - var swap = [], stack = [];  
862 -  
863 - // Locate all of the parent display: none elements  
864 - for ( var a = elem; a && color(a); a = a.parentNode )  
865 - stack.unshift(a);  
866 -  
867 - // Go through and make them visible, but in reverse  
868 - // (It would be better if we knew the exact display type that they had)  
869 - for ( var i = 0; i < stack.length; i++ )  
870 - if ( color( stack[ i ] ) ) {  
871 - swap[ i ] = stack[ i ].style.display;  
872 - stack[ i ].style.display = "block";  
873 - }  
874 -  
875 - // Since we flip the display style, we have to handle that  
876 - // one special, otherwise get the value  
877 - ret = name == "display" && swap[ stack.length - 1 ] != null ?  
878 - "none" :  
879 - ( getComputedStyle && getComputedStyle.getPropertyValue( name ) ) || "";  
880 -  
881 - // Finally, revert the display styles back  
882 - for ( var i = 0; i < swap.length; i++ )  
883 - if ( swap[ i ] != null )  
884 - stack[ i ].style.display = swap[ i ];  
885 - }  
886 -  
887 - // We should always get a number back from opacity  
888 - if ( name == "opacity" && ret == "" )  
889 - ret = "1";  
890 -  
891 - } else if ( elem.currentStyle ) {  
892 - var camelCase = name.replace(/\-(\w)/g, function(all, letter){  
893 - return letter.toUpperCase();  
894 - });  
895 -  
896 - ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];  
897 -  
898 - // From the awesome hack by Dean Edwards  
899 - // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291  
900 -  
901 - // If we're not dealing with a regular pixel number  
902 - // but a number that has a weird ending, we need to convert it to pixels  
903 - if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {  
904 - // Remember the original values  
905 - var style = elem.style.left, runtimeStyle = elem.runtimeStyle.left;  
906 -  
907 - // Put in the new values to get a computed value out  
908 - elem.runtimeStyle.left = elem.currentStyle.left;  
909 - elem.style.left = ret || 0;  
910 - ret = elem.style.pixelLeft + "px";  
911 -  
912 - // Revert the changed values  
913 - elem.style.left = style;  
914 - elem.runtimeStyle.left = runtimeStyle;  
915 - }  
916 - }  
917 -  
918 - return ret;  
919 - },  
920 -  
921 - clean: function( elems, context ) {  
922 - var ret = [];  
923 - context = context || document;  
924 - // !context.createElement fails in IE with an error but returns typeof 'object'  
925 - if (typeof context.createElement == 'undefined')  
926 - context = context.ownerDocument || context[0] && context[0].ownerDocument || document;  
927 -  
928 - jQuery.each(elems, function(i, elem){  
929 - if ( !elem )  
930 - return;  
931 -  
932 - if ( elem.constructor == Number )  
933 - elem = elem.toString();  
934 -  
935 - // Convert html string into DOM nodes  
936 - if ( typeof elem == "string" ) {  
937 - // Fix "XHTML"-style tags in all browsers  
938 - elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){  
939 - return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?  
940 - all :  
941 - front + "></" + tag + ">";  
942 - });  
943 -  
944 - // Trim whitespace, otherwise indexOf won't work as expected  
945 - var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div");  
946 -  
947 - var wrap =  
948 - // option or optgroup  
949 - !tags.indexOf("<opt") &&  
950 - [ 1, "<select multiple='multiple'>", "</select>" ] ||  
951 -  
952 - !tags.indexOf("<leg") &&  
953 - [ 1, "<fieldset>", "</fieldset>" ] ||  
954 -  
955 - tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&  
956 - [ 1, "<table>", "</table>" ] ||  
957 -  
958 - !tags.indexOf("<tr") &&  
959 - [ 2, "<table><tbody>", "</tbody></table>" ] ||  
960 -  
961 - // <thead> matched above  
962 - (!tags.indexOf("<td") || !tags.indexOf("<th")) &&  
963 - [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||  
964 -  
965 - !tags.indexOf("<col") &&  
966 - [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||  
967 -  
968 - // IE can't serialize <link> and <script> tags normally  
969 - jQuery.browser.msie &&  
970 - [ 1, "div<div>", "</div>" ] ||  
971 -  
972 - [ 0, "", "" ];  
973 -  
974 - // Go to html and back, then peel off extra wrappers  
975 - div.innerHTML = wrap[1] + elem + wrap[2];  
976 -  
977 - // Move to the right depth  
978 - while ( wrap[0]-- )  
979 - div = div.lastChild;  
980 -  
981 - // Remove IE's autoinserted <tbody> from table fragments  
982 - if ( jQuery.browser.msie ) {  
983 -  
984 - // String was a <table>, *may* have spurious <tbody>  
985 - var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?  
986 - div.firstChild && div.firstChild.childNodes :  
987 -  
988 - // String was a bare <thead> or <tfoot>  
989 - wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?  
990 - div.childNodes :  
991 - [];  
992 -  
993 - for ( var j = tbody.length - 1; j >= 0 ; --j )  
994 - if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )  
995 - tbody[ j ].parentNode.removeChild( tbody[ j ] );  
996 -  
997 - // IE completely kills leading whitespace when innerHTML is used  
998 - if ( /^\s/.test( elem ) )  
999 - div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );  
1000 -  
1001 - }  
1002 -  
1003 - elem = jQuery.makeArray( div.childNodes );  
1004 - }  
1005 -  
1006 - if ( elem.length === 0 && (!jQuery.nodeName( elem, "form" ) && !jQuery.nodeName( elem, "select" )) )  
1007 - return;  
1008 -  
1009 - if ( elem[0] == undefined || jQuery.nodeName( elem, "form" ) || elem.options )  
1010 - ret.push( elem );  
1011 -  
1012 - else  
1013 - ret = jQuery.merge( ret, elem );  
1014 -  
1015 - });  
1016 -  
1017 - return ret;  
1018 - },  
1019 -  
1020 - attr: function( elem, name, value ) {  
1021 - // don't set attributes on text and comment nodes  
1022 - if (!elem || elem.nodeType == 3 || elem.nodeType == 8)  
1023 - return undefined;  
1024 -  
1025 - var fix = jQuery.isXMLDoc( elem ) ?  
1026 - {} :  
1027 - jQuery.props;  
1028 -  
1029 - // Safari mis-reports the default selected property of a hidden option  
1030 - // Accessing the parent's selectedIndex property fixes it  
1031 - if ( name == "selected" && jQuery.browser.safari )  
1032 - elem.parentNode.selectedIndex;  
1033 -  
1034 - // Certain attributes only work when accessed via the old DOM 0 way  
1035 - if ( fix[ name ] ) {  
1036 - if ( value != undefined )  
1037 - elem[ fix[ name ] ] = value;  
1038 -  
1039 - return elem[ fix[ name ] ];  
1040 -  
1041 - } else if ( jQuery.browser.msie && name == "style" )  
1042 - return jQuery.attr( elem.style, "cssText", value );  
1043 -  
1044 - else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName( elem, "form" ) && (name == "action" || name == "method") )  
1045 - return elem.getAttributeNode( name ).nodeValue;  
1046 -  
1047 - // IE elem.getAttribute passes even for style  
1048 - else if ( elem.tagName ) {  
1049 -  
1050 - if ( value != undefined ) {  
1051 - // We can't allow the type property to be changed (since it causes problems in IE)  
1052 - if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )  
1053 - throw "type property can't be changed";  
1054 -  
1055 - // convert the value to a string (all browsers do this but IE) see #1070  
1056 - elem.setAttribute( name, "" + value );  
1057 - }  
1058 -  
1059 - if ( jQuery.browser.msie && /href|src/.test( name ) && !jQuery.isXMLDoc( elem ) )  
1060 - return elem.getAttribute( name, 2 );  
1061 -  
1062 - return elem.getAttribute( name );  
1063 -  
1064 - // elem is actually elem.style ... set the style  
1065 - } else {  
1066 - // IE actually uses filters for opacity  
1067 - if ( name == "opacity" && jQuery.browser.msie ) {  
1068 - if ( value != undefined ) {  
1069 - // IE has trouble with opacity if it does not have layout  
1070 - // Force it by setting the zoom level  
1071 - elem.zoom = 1;  
1072 -  
1073 - // Set the alpha filter to set the opacity  
1074 - elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +  
1075 - (parseFloat( value ).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");  
1076 - }  
1077 -  
1078 - return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?  
1079 - (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() :  
1080 - "";  
1081 - }  
1082 -  
1083 - name = name.replace(/-([a-z])/ig, function(all, letter){  
1084 - return letter.toUpperCase();  
1085 - });  
1086 -  
1087 - if ( value != undefined )  
1088 - elem[ name ] = value;  
1089 -  
1090 - return elem[ name ];  
1091 - }  
1092 - },  
1093 -  
1094 - trim: function( text ) {  
1095 - return (text || "").replace( /^\s+|\s+$/g, "" );  
1096 - },  
1097 -  
1098 - makeArray: function( array ) {  
1099 - var ret = [];  
1100 -  
1101 - // Need to use typeof to fight Safari childNodes crashes  
1102 - if ( typeof array != "array" )  
1103 - for ( var i = 0, length = array.length; i < length; i++ )  
1104 - ret.push( array[ i ] );  
1105 - else  
1106 - ret = array.slice( 0 );  
1107 -  
1108 - return ret;  
1109 - },  
1110 -  
1111 - inArray: function( elem, array ) {  
1112 - for ( var i = 0, length = array.length; i < length; i++ )  
1113 - if ( array[ i ] == elem )  
1114 - return i;  
1115 -  
1116 - return -1;  
1117 - },  
1118 -  
1119 - merge: function( first, second ) {  
1120 - // We have to loop this way because IE & Opera overwrite the length  
1121 - // expando of getElementsByTagName  
1122 -  
1123 - // Also, we need to make sure that the correct elements are being returned  
1124 - // (IE returns comment nodes in a '*' query)  
1125 - if ( jQuery.browser.msie ) {  
1126 - for ( var i = 0; second[ i ]; i++ )  
1127 - if ( second[ i ].nodeType != 8 )  
1128 - first.push( second[ i ] );  
1129 -  
1130 - } else  
1131 - for ( var i = 0; second[ i ]; i++ )  
1132 - first.push( second[ i ] );  
1133 -  
1134 - return first;  
1135 - },  
1136 -  
1137 - unique: function( array ) {  
1138 - var ret = [], done = {};  
1139 -  
1140 - try {  
1141 -  
1142 - for ( var i = 0, length = array.length; i < length; i++ ) {  
1143 - var id = jQuery.data( array[ i ] );  
1144 -  
1145 - if ( !done[ id ] ) {  
1146 - done[ id ] = true;  
1147 - ret.push( array[ i ] );  
1148 - }  
1149 - }  
1150 -  
1151 - } catch( e ) {  
1152 - ret = array;  
1153 - }  
1154 -  
1155 - return ret;  
1156 - },  
1157 -  
1158 - grep: function( elems, callback, inv ) {  
1159 - // If a string is passed in for the function, make a function  
1160 - // for it (a handy shortcut)  
1161 - if ( typeof callback == "string" )  
1162 - callback = eval("false||function(a,i){return " + callback + "}");  
1163 -  
1164 - var ret = [];  
1165 -  
1166 - // Go through the array, only saving the items  
1167 - // that pass the validator function  
1168 - for ( var i = 0, length = elems.length; i < length; i++ )  
1169 - if ( !inv && callback( elems[ i ], i ) || inv && !callback( elems[ i ], i ) )  
1170 - ret.push( elems[ i ] );  
1171 -  
1172 - return ret;  
1173 - },  
1174 -  
1175 - map: function( elems, callback ) {  
1176 - var ret = [];  
1177 -  
1178 - // Go through the array, translating each of the items to their  
1179 - // new value (or values).  
1180 - for ( var i = 0, length = elems.length; i < length; i++ ) {  
1181 - var value = callback( elems[ i ], i );  
1182 -  
1183 - if ( value !== null && value != undefined ) {  
1184 - if ( value.constructor != Array )  
1185 - value = [ value ];  
1186 -  
1187 - ret = ret.concat( value );  
1188 - }  
1189 - }  
1190 -  
1191 - return ret;  
1192 - }  
1193 -});  
1194 -  
1195 -var userAgent = navigator.userAgent.toLowerCase();  
1196 -  
1197 -// Figure out what browser is being used  
1198 -jQuery.browser = {  
1199 - version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],  
1200 - safari: /webkit/.test( userAgent ),  
1201 - opera: /opera/.test( userAgent ),  
1202 - msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),  
1203 - mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )  
1204 -};  
1205 -  
1206 -var styleFloat = jQuery.browser.msie ?  
1207 - "styleFloat" :  
1208 - "cssFloat";  
1209 -  
1210 -jQuery.extend({  
1211 - // Check to see if the W3C box model is being used  
1212 - boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",  
1213 -  
1214 - props: {  
1215 - "for": "htmlFor",  
1216 - "class": "className",  
1217 - "float": styleFloat,  
1218 - cssFloat: styleFloat,  
1219 - styleFloat: styleFloat,  
1220 - innerHTML: "innerHTML",  
1221 - className: "className",  
1222 - value: "value",  
1223 - disabled: "disabled",  
1224 - checked: "checked",  
1225 - readonly: "readOnly",  
1226 - selected: "selected",  
1227 - maxlength: "maxLength",  
1228 - selectedIndex: "selectedIndex",  
1229 - defaultValue: "defaultValue",  
1230 - tagName: "tagName",  
1231 - nodeName: "nodeName"  
1232 - }  
1233 -});  
1234 -  
1235 -jQuery.each({  
1236 - parent: "elem.parentNode",  
1237 - parents: "jQuery.dir(elem,'parentNode')",  
1238 - next: "jQuery.nth(elem,2,'nextSibling')",  
1239 - prev: "jQuery.nth(elem,2,'previousSibling')",  
1240 - nextAll: "jQuery.dir(elem,'nextSibling')",  
1241 - prevAll: "jQuery.dir(elem,'previousSibling')",  
1242 - siblings: "jQuery.sibling(elem.parentNode.firstChild,elem)",  
1243 - children: "jQuery.sibling(elem.firstChild)",  
1244 - contents: "jQuery.nodeName(elem,'iframe')?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes)"  
1245 -}, function(name, fn){  
1246 - fn = eval("false||function(elem){return " + fn + "}");  
1247 -  
1248 - jQuery.fn[ name ] = function( selector ) {  
1249 - var ret = jQuery.map( this, fn );  
1250 -  
1251 - if ( selector && typeof selector == "string" )  
1252 - ret = jQuery.multiFilter( selector, ret );  
1253 -  
1254 - return this.pushStack( jQuery.unique( ret ) );  
1255 - };  
1256 -});  
1257 -  
1258 -jQuery.each({  
1259 - appendTo: "append",  
1260 - prependTo: "prepend",  
1261 - insertBefore: "before",  
1262 - insertAfter: "after",  
1263 - replaceAll: "replaceWith"  
1264 -}, function(name, original){  
1265 - jQuery.fn[ name ] = function() {  
1266 - var args = arguments;  
1267 -  
1268 - return this.each(function(){  
1269 - for ( var i = 0, length = args.length; i < length; i++ )  
1270 - jQuery( args[ i ] )[ original ]( this );  
1271 - });  
1272 - };  
1273 -});  
1274 -  
1275 -jQuery.each({  
1276 - removeAttr: function( name ) {  
1277 - jQuery.attr( this, name, "" );  
1278 - if (this.nodeType == 1)  
1279 - this.removeAttribute( name );  
1280 - },  
1281 -  
1282 - addClass: function( classNames ) {  
1283 - jQuery.className.add( this, classNames );  
1284 - },  
1285 -  
1286 - removeClass: function( classNames ) {  
1287 - jQuery.className.remove( this, classNames );  
1288 - },  
1289 -  
1290 - toggleClass: function( classNames ) {  
1291 - jQuery.className[ jQuery.className.has( this, classNames ) ? "remove" : "add" ]( this, classNames );  
1292 - },  
1293 -  
1294 - remove: function( selector ) {  
1295 - if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) {  
1296 - // Prevent memory leaks  
1297 - jQuery( "*", this ).add(this).each(function(){  
1298 - jQuery.event.remove(this);  
1299 - jQuery.removeData(this);  
1300 - });  
1301 - if (this.parentNode)  
1302 - this.parentNode.removeChild( this );  
1303 - }  
1304 - },  
1305 -  
1306 - empty: function() {  
1307 - // Remove element nodes and prevent memory leaks  
1308 - jQuery( ">*", this ).remove();  
1309 -  
1310 - // Remove any remaining nodes  
1311 - while ( this.firstChild )  
1312 - this.removeChild( this.firstChild );  
1313 - }  
1314 -}, function(name, fn){  
1315 - jQuery.fn[ name ] = function(){  
1316 - return this.each( fn, arguments );  
1317 - };  
1318 -});  
1319 -  
1320 -jQuery.each([ "Height", "Width" ], function(i, name){  
1321 - var type = name.toLowerCase();  
1322 -  
1323 - jQuery.fn[ type ] = function( size ) {  
1324 - // Get window width or height  
1325 - return this[0] == window ?  
1326 - // Opera reports document.body.client[Width/Height] properly in both quirks and standards  
1327 - jQuery.browser.opera && document.body[ "client" + name ] ||  
1328 -  
1329 - // Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)  
1330 - jQuery.browser.safari && window[ "inner" + name ] ||  
1331 -  
1332 - // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode  
1333 - document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :  
1334 -  
1335 - // Get document width or height  
1336 - this[0] == document ?  
1337 - // Either scroll[Width/Height] or offset[Width/Height], whichever is greater  
1338 - Math.max(  
1339 - Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),  
1340 - Math.max(document.body["offset" + name], document.documentElement["offset" + name])  
1341 - ) :  
1342 -  
1343 - // Get or set width or height on the element  
1344 - size == undefined ?  
1345 - // Get width or height on the element  
1346 - (this.length ? jQuery.css( this[0], type ) : null) :  
1347 -  
1348 - // Set the width or height on the element (default to pixels if value is unitless)  
1349 - this.css( type, size.constructor == String ? size : size + "px" );  
1350 - };  
1351 -});  
1352 -  
1353 -var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?  
1354 - "(?:[\\w*_-]|\\\\.)" :  
1355 - "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",  
1356 - quickChild = new RegExp("^>\\s*(" + chars + "+)"),  
1357 - quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),  
1358 - quickClass = new RegExp("^([#.]?)(" + chars + "*)");  
1359 -  
1360 -jQuery.extend({  
1361 - expr: {  
1362 - "": "m[2]=='*'||jQuery.nodeName(a,m[2])",  
1363 - "#": "a.getAttribute('id')==m[2]",  
1364 - ":": {  
1365 - // Position Checks  
1366 - lt: "i<m[3]-0",  
1367 - gt: "i>m[3]-0",  
1368 - nth: "m[3]-0==i",  
1369 - eq: "m[3]-0==i",  
1370 - first: "i==0",  
1371 - last: "i==r.length-1",  
1372 - even: "i%2==0",  
1373 - odd: "i%2",  
1374 -  
1375 - // Child Checks  
1376 - "first-child": "a.parentNode.getElementsByTagName('*')[0]==a",  
1377 - "last-child": "jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a",  
1378 - "only-child": "!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')",  
1379 -  
1380 - // Parent Checks  
1381 - parent: "a.firstChild",  
1382 - empty: "!a.firstChild",  
1383 -  
1384 - // Text Check  
1385 - contains: "(a.textContent||a.innerText||jQuery(a).text()||'').indexOf(m[3])>=0",  
1386 -  
1387 - // Visibility  
1388 - visible: '"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',  
1389 - hidden: '"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',  
1390 -  
1391 - // Form attributes  
1392 - enabled: "!a.disabled",  
1393 - disabled: "a.disabled",  
1394 - checked: "a.checked",  
1395 - selected: "a.selected||jQuery.attr(a,'selected')",  
1396 -  
1397 - // Form elements  
1398 - text: "'text'==a.type",  
1399 - radio: "'radio'==a.type",  
1400 - checkbox: "'checkbox'==a.type",  
1401 - file: "'file'==a.type",  
1402 - password: "'password'==a.type",  
1403 - submit: "'submit'==a.type",  
1404 - image: "'image'==a.type",  
1405 - reset: "'reset'==a.type",  
1406 - button: '"button"==a.type||jQuery.nodeName(a,"button")',  
1407 - input: "/input|select|textarea|button/i.test(a.nodeName)",  
1408 -  
1409 - // :has()  
1410 - has: "jQuery.find(m[3],a).length",  
1411 -  
1412 - // :header  
1413 - header: "/h\\d/i.test(a.nodeName)",  
1414 -  
1415 - // :animated  
1416 - animated: "jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length"  
1417 - }  
1418 - },  
1419 -  
1420 - // The regular expressions that power the parsing engine  
1421 - parse: [  
1422 - // Match: [@value='test'], [@foo]  
1423 - /^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,  
1424 -  
1425 - // Match: :contains('foo')  
1426 - /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,  
1427 -  
1428 - // Match: :even, :last-chlid, #id, .class  
1429 - new RegExp("^([:.#]*)(" + chars + "+)")  
1430 - ],  
1431 -  
1432 - multiFilter: function( expr, elems, not ) {  
1433 - var old, cur = [];  
1434 -  
1435 - while ( expr && expr != old ) {  
1436 - old = expr;  
1437 - var f = jQuery.filter( expr, elems, not );  
1438 - expr = f.t.replace(/^\s*,\s*/, "" );  
1439 - cur = not ? elems = f.r : jQuery.merge( cur, f.r );  
1440 - }  
1441 -  
1442 - return cur;  
1443 - },  
1444 -  
1445 - find: function( t, context ) {  
1446 - // Quickly handle non-string expressions  
1447 - if ( typeof t != "string" )  
1448 - return [ t ];  
1449 -  
1450 - // check to make sure context is a DOM element or a document  
1451 - if ( context && context.nodeType != 1 && context.nodeType != 9)  
1452 - return [ ];  
1453 -  
1454 - // Set the correct context (if none is provided)  
1455 - context = context || document;  
1456 -  
1457 - // Initialize the search  
1458 - var ret = [context], done = [], last, nodeName;  
1459 -  
1460 - // Continue while a selector expression exists, and while  
1461 - // we're no longer looping upon ourselves  
1462 - while ( t && last != t ) {  
1463 - var r = [];  
1464 - last = t;  
1465 -  
1466 - t = jQuery.trim(t);  
1467 -  
1468 - var foundToken = false;  
1469 -  
1470 - // An attempt at speeding up child selectors that  
1471 - // point to a specific element tag  
1472 - var re = quickChild;  
1473 - var m = re.exec(t);  
1474 -  
1475 - if ( m ) {  
1476 - nodeName = m[1].toUpperCase();  
1477 -  
1478 - // Perform our own iteration and filter  
1479 - for ( var i = 0; ret[i]; i++ )  
1480 - for ( var c = ret[i].firstChild; c; c = c.nextSibling )  
1481 - if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName) )  
1482 - r.push( c );  
1483 -  
1484 - ret = r;  
1485 - t = t.replace( re, "" );  
1486 - if ( t.indexOf(" ") == 0 ) continue;  
1487 - foundToken = true;  
1488 - } else {  
1489 - re = /^([>+~])\s*(\w*)/i;  
1490 -  
1491 - if ( (m = re.exec(t)) != null ) {  
1492 - r = [];  
1493 -  
1494 - var merge = {};  
1495 - nodeName = m[2].toUpperCase();  
1496 - m = m[1];  
1497 -  
1498 - for ( var j = 0, rl = ret.length; j < rl; j++ ) {  
1499 - var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;  
1500 - for ( ; n; n = n.nextSibling )  
1501 - if ( n.nodeType == 1 ) {  
1502 - var id = jQuery.data(n);  
1503 -  
1504 - if ( m == "~" && merge[id] ) break;  
1505 -  
1506 - if (!nodeName || n.nodeName.toUpperCase() == nodeName ) {  
1507 - if ( m == "~" ) merge[id] = true;  
1508 - r.push( n );  
1509 - }  
1510 -  
1511 - if ( m == "+" ) break;  
1512 - }  
1513 - }  
1514 -  
1515 - ret = r;  
1516 -  
1517 - // And remove the token  
1518 - t = jQuery.trim( t.replace( re, "" ) );  
1519 - foundToken = true;  
1520 - }  
1521 - }  
1522 -  
1523 - // See if there's still an expression, and that we haven't already  
1524 - // matched a token  
1525 - if ( t && !foundToken ) {  
1526 - // Handle multiple expressions  
1527 - if ( !t.indexOf(",") ) {  
1528 - // Clean the result set  
1529 - if ( context == ret[0] ) ret.shift();  
1530 -  
1531 - // Merge the result sets  
1532 - done = jQuery.merge( done, ret );  
1533 -  
1534 - // Reset the context  
1535 - r = ret = [context];  
1536 -  
1537 - // Touch up the selector string  
1538 - t = " " + t.substr(1,t.length);  
1539 -  
1540 - } else {  
1541 - // Optimize for the case nodeName#idName  
1542 - var re2 = quickID;  
1543 - var m = re2.exec(t);  
1544 -  
1545 - // Re-organize the results, so that they're consistent  
1546 - if ( m ) {  
1547 - m = [ 0, m[2], m[3], m[1] ];  
1548 -  
1549 - } else {  
1550 - // Otherwise, do a traditional filter check for  
1551 - // ID, class, and element selectors  
1552 - re2 = quickClass;  
1553 - m = re2.exec(t);  
1554 - }  
1555 -  
1556 - m[2] = m[2].replace(/\\/g, "");  
1557 -  
1558 - var elem = ret[ret.length-1];  
1559 -  
1560 - // Try to do a global search by ID, where we can  
1561 - if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {  
1562 - // Optimization for HTML document case  
1563 - var oid = elem.getElementById(m[2]);  
1564 -  
1565 - // Do a quick check for the existence of the actual ID attribute  
1566 - // to avoid selecting by the name attribute in IE  
1567 - // also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form  
1568 - if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )  
1569 - oid = jQuery('[@id="'+m[2]+'"]', elem)[0];  
1570 -  
1571 - // Do a quick check for node name (where applicable) so  
1572 - // that div#foo searches will be really fast  
1573 - ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];  
1574 - } else {  
1575 - // We need to find all descendant elements  
1576 - for ( var i = 0; ret[i]; i++ ) {  
1577 - // Grab the tag name being searched for  
1578 - var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];  
1579 -  
1580 - // Handle IE7 being really dumb about <object>s  
1581 - if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )  
1582 - tag = "param";  
1583 -  
1584 - r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));  
1585 - }  
1586 -  
1587 - // It's faster to filter by class and be done with it  
1588 - if ( m[1] == "." )  
1589 - r = jQuery.classFilter( r, m[2] );  
1590 -  
1591 - // Same with ID filtering  
1592 - if ( m[1] == "#" ) {  
1593 - var tmp = [];  
1594 -  
1595 - // Try to find the element with the ID  
1596 - for ( var i = 0; r[i]; i++ )  
1597 - if ( r[i].getAttribute("id") == m[2] ) {  
1598 - tmp = [ r[i] ];  
1599 - break;  
1600 - }  
1601 -  
1602 - r = tmp;  
1603 - }  
1604 -  
1605 - ret = r;  
1606 - }  
1607 -  
1608 - t = t.replace( re2, "" );  
1609 - }  
1610 -  
1611 - }  
1612 -  
1613 - // If a selector string still exists  
1614 - if ( t ) {  
1615 - // Attempt to filter it  
1616 - var val = jQuery.filter(t,r);  
1617 - ret = r = val.r;  
1618 - t = jQuery.trim(val.t);  
1619 - }  
1620 - }  
1621 -  
1622 - // An error occurred with the selector;  
1623 - // just return an empty set instead  
1624 - if ( t )  
1625 - ret = [];  
1626 -  
1627 - // Remove the root context  
1628 - if ( ret && context == ret[0] )  
1629 - ret.shift();  
1630 -  
1631 - // And combine the results  
1632 - done = jQuery.merge( done, ret );  
1633 -  
1634 - return done;  
1635 - },  
1636 -  
1637 - classFilter: function(r,m,not){  
1638 - m = " " + m + " ";  
1639 - var tmp = [];  
1640 - for ( var i = 0; r[i]; i++ ) {  
1641 - var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;  
1642 - if ( !not && pass || not && !pass )  
1643 - tmp.push( r[i] );  
1644 - }  
1645 - return tmp;  
1646 - },  
1647 -  
1648 - filter: function(t,r,not) {  
1649 - var last;  
1650 -  
1651 - // Look for common filter expressions  
1652 - while ( t && t != last ) {  
1653 - last = t;  
1654 -  
1655 - var p = jQuery.parse, m;  
1656 -  
1657 - for ( var i = 0; p[i]; i++ ) {  
1658 - m = p[i].exec( t );  
1659 -  
1660 - if ( m ) {  
1661 - // Remove what we just matched  
1662 - t = t.substring( m[0].length );  
1663 -  
1664 - m[2] = m[2].replace(/\\/g, "");  
1665 - break;  
1666 - }  
1667 - }  
1668 -  
1669 - if ( !m )  
1670 - break;  
1671 -  
1672 - // :not() is a special case that can be optimized by  
1673 - // keeping it out of the expression list  
1674 - if ( m[1] == ":" && m[2] == "not" )  
1675 - // optimize if only one selector found (most common case)  
1676 - r = isSimple.test( m[3] ) ?  
1677 - jQuery.filter(m[3], r, true).r :  
1678 - jQuery( r ).not( m[3] );  
1679 -  
1680 - // We can get a big speed boost by filtering by class here  
1681 - else if ( m[1] == "." )  
1682 - r = jQuery.classFilter(r, m[2], not);  
1683 -  
1684 - else if ( m[1] == "[" ) {  
1685 - var tmp = [], type = m[3];  
1686 -  
1687 - for ( var i = 0, rl = r.length; i < rl; i++ ) {  
1688 - var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];  
1689 -  
1690 - if ( z == null || /href|src|selected/.test(m[2]) )  
1691 - z = jQuery.attr(a,m[2]) || '';  
1692 -  
1693 - if ( (type == "" && !!z ||  
1694 - type == "=" && z == m[5] ||  
1695 - type == "!=" && z != m[5] ||  
1696 - type == "^=" && z && !z.indexOf(m[5]) ||  
1697 - type == "$=" && z.substr(z.length - m[5].length) == m[5] ||  
1698 - (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )  
1699 - tmp.push( a );  
1700 - }  
1701 -  
1702 - r = tmp;  
1703 -  
1704 - // We can get a speed boost by handling nth-child here  
1705 - } else if ( m[1] == ":" && m[2] == "nth-child" ) {  
1706 - var merge = {}, tmp = [],  
1707 - // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'  
1708 - test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(  
1709 - m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||  
1710 - !/\D/.test(m[3]) && "0n+" + m[3] || m[3]),  
1711 - // calculate the numbers (first)n+(last) including if they are negative  
1712 - first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0;  
1713 -  
1714 - // loop through all the elements left in the jQuery object  
1715 - for ( var i = 0, rl = r.length; i < rl; i++ ) {  
1716 - var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);  
1717 -  
1718 - if ( !merge[id] ) {  
1719 - var c = 1;  
1720 -  
1721 - for ( var n = parentNode.firstChild; n; n = n.nextSibling )  
1722 - if ( n.nodeType == 1 )  
1723 - n.nodeIndex = c++;  
1724 -  
1725 - merge[id] = true;  
1726 - }  
1727 -  
1728 - var add = false;  
1729 -  
1730 - if ( first == 0 ) {  
1731 - if ( node.nodeIndex == last )  
1732 - add = true;  
1733 - } else if ( (node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0 )  
1734 - add = true;  
1735 -  
1736 - if ( add ^ not )  
1737 - tmp.push( node );  
1738 - }  
1739 -  
1740 - r = tmp;  
1741 -  
1742 - // Otherwise, find the expression to execute  
1743 - } else {  
1744 - var f = jQuery.expr[m[1]];  
1745 - if ( typeof f != "string" )  
1746 - f = jQuery.expr[m[1]][m[2]];  
1747 -  
1748 - // Build a custom macro to enclose it  
1749 - f = eval("false||function(a,i){return " + f + "}");  
1750 -  
1751 - // Execute it against the current filter  
1752 - r = jQuery.grep( r, f, not );  
1753 - }  
1754 - }  
1755 -  
1756 - // Return an array of filtered elements (r)  
1757 - // and the modified expression string (t)  
1758 - return { r: r, t: t };  
1759 - },  
1760 -  
1761 - dir: function( elem, dir ){  
1762 - var matched = [];  
1763 - var cur = elem[dir];  
1764 - while ( cur && cur != document ) {  
1765 - if ( cur.nodeType == 1 )  
1766 - matched.push( cur );  
1767 - cur = cur[dir];  
1768 - }  
1769 - return matched;  
1770 - },  
1771 -  
1772 - nth: function(cur,result,dir,elem){  
1773 - result = result || 1;  
1774 - var num = 0;  
1775 -  
1776 - for ( ; cur; cur = cur[dir] )  
1777 - if ( cur.nodeType == 1 && ++num == result )  
1778 - break;  
1779 -  
1780 - return cur;  
1781 - },  
1782 -  
1783 - sibling: function( n, elem ) {  
1784 - var r = [];  
1785 -  
1786 - for ( ; n; n = n.nextSibling ) {  
1787 - if ( n.nodeType == 1 && (!elem || n != elem) )  
1788 - r.push( n );  
1789 - }  
1790 -  
1791 - return r;  
1792 - }  
1793 -});  
1794 -  
1795 -/*  
1796 - * A number of helper functions used for managing events.  
1797 - * Many of the ideas behind this code orignated from  
1798 - * Dean Edwards' addEvent library.  
1799 - */  
1800 -jQuery.event = {  
1801 -  
1802 - // Bind an event to an element  
1803 - // Original by Dean Edwards  
1804 - add: function(elem, types, handler, data) {  
1805 - if ( elem.nodeType == 3 || elem.nodeType == 8 )  
1806 - return;  
1807 -  
1808 - // For whatever reason, IE has trouble passing the window object  
1809 - // around, causing it to be cloned in the process  
1810 - if ( jQuery.browser.msie && elem.setInterval != undefined )  
1811 - elem = window;  
1812 -  
1813 - // Make sure that the function being executed has a unique ID  
1814 - if ( !handler.guid )  
1815 - handler.guid = this.guid++;  
1816 -  
1817 - // if data is passed, bind to handler  
1818 - if( data != undefined ) {  
1819 - // Create temporary function pointer to original handler  
1820 - var fn = handler;  
1821 -  
1822 - // Create unique handler function, wrapped around original handler  
1823 - handler = function() {  
1824 - // Pass arguments and context to original handler  
1825 - return fn.apply(this, arguments);  
1826 - };  
1827 -  
1828 - // Store data in unique handler  
1829 - handler.data = data;  
1830 -  
1831 - // Set the guid of unique handler to the same of original handler, so it can be removed  
1832 - handler.guid = fn.guid;  
1833 - }  
1834 -  
1835 - // Init the element's event structure  
1836 - var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),  
1837 - handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){  
1838 - // returned undefined or false  
1839 - var val;  
1840 -  
1841 - // Handle the second event of a trigger and when  
1842 - // an event is called after a page has unloaded  
1843 - if ( typeof jQuery == "undefined" || jQuery.event.triggered )  
1844 - return val;  
1845 -  
1846 - val = jQuery.event.handle.apply(arguments.callee.elem, arguments);  
1847 -  
1848 - return val;  
1849 - });  
1850 - // Add elem as a property of the handle function  
1851 - // This is to prevent a memory leak with non-native  
1852 - // event in IE.  
1853 - handle.elem = elem;  
1854 -  
1855 - // Handle multiple events seperated by a space  
1856 - // jQuery(...).bind("mouseover mouseout", fn);  
1857 - jQuery.each(types.split(/\s+/), function(index, type) {  
1858 - // Namespaced event handlers  
1859 - var parts = type.split(".");  
1860 - type = parts[0];  
1861 - handler.type = parts[1];  
1862 -  
1863 - // Get the current list of functions bound to this event  
1864 - var handlers = events[type];  
1865 -  
1866 - // Init the event handler queue  
1867 - if (!handlers) {  
1868 - handlers = events[type] = {};  
1869 -  
1870 - // Check for a special event handler  
1871 - // Only use addEventListener/attachEvent if the special  
1872 - // events handler returns false  
1873 - if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem) === false ) {  
1874 - // Bind the global event handler to the element  
1875 - if (elem.addEventListener)  
1876 - elem.addEventListener(type, handle, false);  
1877 - else if (elem.attachEvent)  
1878 - elem.attachEvent("on" + type, handle);  
1879 - }  
1880 - }  
1881 -  
1882 - // Add the function to the element's handler list  
1883 - handlers[handler.guid] = handler;  
1884 -  
1885 - // Keep track of which events have been used, for global triggering  
1886 - jQuery.event.global[type] = true;  
1887 - });  
1888 -  
1889 - // Nullify elem to prevent memory leaks in IE  
1890 - elem = null;  
1891 - },  
1892 -  
1893 - guid: 1,  
1894 - global: {},  
1895 -  
1896 - // Detach an event or set of events from an element  
1897 - remove: function(elem, types, handler) {  
1898 - // don't do events on text and comment nodes  
1899 - if ( elem.nodeType == 3 || elem.nodeType == 8 )  
1900 - return;  
1901 -  
1902 - var events = jQuery.data(elem, "events"), ret, index;  
1903 -  
1904 - if ( events ) {  
1905 - // Unbind all events for the element  
1906 - if ( types == undefined )  
1907 - for ( var type in events )  
1908 - this.remove( elem, type );  
1909 - else {  
1910 - // types is actually an event object here  
1911 - if ( types.type ) {  
1912 - handler = types.handler;  
1913 - types = types.type;  
1914 - }  
1915 -  
1916 - // Handle multiple events seperated by a space  
1917 - // jQuery(...).unbind("mouseover mouseout", fn);  
1918 - jQuery.each(types.split(/\s+/), function(index, type){  
1919 - // Namespaced event handlers  
1920 - var parts = type.split(".");  
1921 - type = parts[0];  
1922 -  
1923 - if ( events[type] ) {  
1924 - // remove the given handler for the given type  
1925 - if ( handler )  
1926 - delete events[type][handler.guid];  
1927 -  
1928 - // remove all handlers for the given type  
1929 - else  
1930 - for ( handler in events[type] )  
1931 - // Handle the removal of namespaced events  
1932 - if ( !parts[1] || events[type][handler].type == parts[1] )  
1933 - delete events[type][handler];  
1934 -  
1935 - // remove generic event handler if no more handlers exist  
1936 - for ( ret in events[type] ) break;  
1937 - if ( !ret ) {  
1938 - if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false ) {  
1939 - if (elem.removeEventListener)  
1940 - elem.removeEventListener(type, jQuery.data(elem, "handle"), false);  
1941 - else if (elem.detachEvent)  
1942 - elem.detachEvent("on" + type, jQuery.data(elem, "handle"));  
1943 - }  
1944 - ret = null;  
1945 - delete events[type];  
1946 - }  
1947 - }  
1948 - });  
1949 - }  
1950 -  
1951 - // Remove the expando if it's no longer used  
1952 - for ( ret in events ) break;  
1953 - if ( !ret ) {  
1954 - var handle = jQuery.data( elem, "handle" );  
1955 - if ( handle ) handle.elem = null;  
1956 - jQuery.removeData( elem, "events" );  
1957 - jQuery.removeData( elem, "handle" );  
1958 - }  
1959 - }  
1960 - },  
1961 -  
1962 - trigger: function(type, data, elem, donative, extra) {  
1963 - // Clone the incoming data, if any  
1964 - data = jQuery.makeArray(data || []);  
1965 -  
1966 - // Handle a global trigger  
1967 - if ( !elem ) {  
1968 - // Only trigger if we've ever bound an event for it  
1969 - if ( this.global[type] )  
1970 - jQuery("*").add([window, document]).trigger(type, data);  
1971 -  
1972 - // Handle triggering a single element  
1973 - } else {  
1974 - // don't do events on text and comment nodes  
1975 - if ( elem.nodeType == 3 || elem.nodeType == 8 )  
1976 - return undefined;  
1977 -  
1978 - var val, ret, fn = jQuery.isFunction( elem[ type ] || null ),  
1979 - // Check to see if we need to provide a fake event, or not  
1980 - event = !data[0] || !data[0].preventDefault;  
1981 -  
1982 - // Pass along a fake event  
1983 - if ( event )  
1984 - data.unshift( this.fix({ type: type, target: elem }) );  
1985 -  
1986 - // Enforce the right trigger type  
1987 - data[0].type = type;  
1988 -  
1989 - // Trigger the event  
1990 - if ( jQuery.isFunction( jQuery.data(elem, "handle") ) )  
1991 - val = jQuery.data(elem, "handle").apply( elem, data );  
1992 -  
1993 - // Handle triggering native .onfoo handlers  
1994 - if ( !fn && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )  
1995 - val = false;  
1996 -  
1997 - // Extra functions don't get the custom event object  
1998 - if ( event )  
1999 - data.shift();  
2000 -  
2001 - // Handle triggering of extra function  
2002 - if ( extra && jQuery.isFunction( extra ) ) {  
2003 - // call the extra function and tack the current return value on the end for possible inspection  
2004 - ret = extra.apply( elem, val == null ? data : data.concat( val ) );  
2005 - // if anything is returned, give it precedence and have it overwrite the previous value  
2006 - if (ret !== undefined)  
2007 - val = ret;  
2008 - }  
2009 -  
2010 - // Trigger the native events (except for clicks on links)  
2011 - if ( fn && donative !== false && val !== false && !(jQuery.nodeName(elem, 'a') && type == "click") ) {  
2012 - this.triggered = true;  
2013 - try {  
2014 - elem[ type ]();  
2015 - // prevent IE from throwing an error for some hidden elements  
2016 - } catch (e) {}  
2017 - }  
2018 -  
2019 - this.triggered = false;  
2020 - }  
2021 -  
2022 - return val;  
2023 - },  
2024 -  
2025 - handle: function(event) {  
2026 - // returned undefined or false  
2027 - var val;  
2028 -  
2029 - // Empty object is for triggered events with no data  
2030 - event = jQuery.event.fix( event || window.event || {} );  
2031 -  
2032 - // Namespaced event handlers  
2033 - var parts = event.type.split(".");  
2034 - event.type = parts[0];  
2035 -  
2036 - var handlers = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], args = Array.prototype.slice.call( arguments, 1 );  
2037 - args.unshift( event );  
2038 -  
2039 - for ( var j in handlers ) {  
2040 - var handler = handlers[j];  
2041 - // Pass in a reference to the handler function itself  
2042 - // So that we can later remove it  
2043 - args[0].handler = handler;  
2044 - args[0].data = handler.data;  
2045 -  
2046 - // Filter the functions by class  
2047 - if ( !parts[1] || handler.type == parts[1] ) {  
2048 - var ret = handler.apply( this, args );  
2049 -  
2050 - if ( val !== false )  
2051 - val = ret;  
2052 -  
2053 - if ( ret === false ) {  
2054 - event.preventDefault();  
2055 - event.stopPropagation();  
2056 - }  
2057 - }  
2058 - }  
2059 -  
2060 - // Clean up added properties in IE to prevent memory leak  
2061 - if (jQuery.browser.msie)  
2062 - event.target = event.preventDefault = event.stopPropagation =  
2063 - event.handler = event.data = null;  
2064 -  
2065 - return val;  
2066 - },  
2067 -  
2068 - fix: function(event) {  
2069 - // store a copy of the original event object  
2070 - // and clone to set read-only properties  
2071 - var originalEvent = event;  
2072 - event = jQuery.extend({}, originalEvent);  
2073 -  
2074 - // add preventDefault and stopPropagation since  
2075 - // they will not work on the clone  
2076 - event.preventDefault = function() {  
2077 - // if preventDefault exists run it on the original event  
2078 - if (originalEvent.preventDefault)  
2079 - originalEvent.preventDefault();  
2080 - // otherwise set the returnValue property of the original event to false (IE)  
2081 - originalEvent.returnValue = false;  
2082 - };  
2083 - event.stopPropagation = function() {  
2084 - // if stopPropagation exists run it on the original event  
2085 - if (originalEvent.stopPropagation)  
2086 - originalEvent.stopPropagation();  
2087 - // otherwise set the cancelBubble property of the original event to true (IE)  
2088 - originalEvent.cancelBubble = true;  
2089 - };  
2090 -  
2091 - // Fix target property, if necessary  
2092 - if ( !event.target )  
2093 - event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either  
2094 -  
2095 - // check if target is a textnode (safari)  
2096 - if ( event.target.nodeType == 3 )  
2097 - event.target = originalEvent.target.parentNode;  
2098 -  
2099 - // Add relatedTarget, if necessary  
2100 - if ( !event.relatedTarget && event.fromElement )  
2101 - event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;  
2102 -  
2103 - // Calculate pageX/Y if missing and clientX/Y available  
2104 - if ( event.pageX == null && event.clientX != null ) {  
2105 - var doc = document.documentElement, body = document.body;  
2106 - event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);  
2107 - event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);  
2108 - }  
2109 -  
2110 - // Add which for key events  
2111 - if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )  
2112 - event.which = event.charCode || event.keyCode;  
2113 -  
2114 - // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)  
2115 - if ( !event.metaKey && event.ctrlKey )  
2116 - event.metaKey = event.ctrlKey;  
2117 -  
2118 - // Add which for click: 1 == left; 2 == middle; 3 == right  
2119 - // Note: button is not normalized, so don't use it  
2120 - if ( !event.which && event.button )  
2121 - event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));  
2122 -  
2123 - return event;  
2124 - },  
2125 -  
2126 - special: {  
2127 - ready: {  
2128 - setup: function() {  
2129 - // Make sure the ready event is setup  
2130 - bindReady();  
2131 - return;  
2132 - },  
2133 -  
2134 - teardown: function() { return; }  
2135 - },  
2136 -  
2137 - mouseenter: {  
2138 - setup: function() {  
2139 - if ( jQuery.browser.msie ) return false;  
2140 - jQuery(this).bind("mouseover", jQuery.event.special.mouseenter.handler);  
2141 - return true;  
2142 - },  
2143 -  
2144 - teardown: function() {  
2145 - if ( jQuery.browser.msie ) return false;  
2146 - jQuery(this).unbind("mouseover", jQuery.event.special.mouseenter.handler);  
2147 - return true;  
2148 - },  
2149 -  
2150 - handler: function(event) {  
2151 - // If we actually just moused on to a sub-element, ignore it  
2152 - if ( withinElement(event, this) ) return true;  
2153 - // Execute the right handlers by setting the event type to mouseenter  
2154 - arguments[0].type = "mouseenter";  
2155 - return jQuery.event.handle.apply(this, arguments);  
2156 - }  
2157 - },  
2158 -  
2159 - mouseleave: {  
2160 - setup: function() {  
2161 - if ( jQuery.browser.msie ) return false;  
2162 - jQuery(this).bind("mouseout", jQuery.event.special.mouseleave.handler);  
2163 - return true;  
2164 - },  
2165 -  
2166 - teardown: function() {  
2167 - if ( jQuery.browser.msie ) return false;  
2168 - jQuery(this).unbind("mouseout", jQuery.event.special.mouseleave.handler);  
2169 - return true;  
2170 - },  
2171 -  
2172 - handler: function(event) {  
2173 - // If we actually just moused on to a sub-element, ignore it  
2174 - if ( withinElement(event, this) ) return true;  
2175 - // Execute the right handlers by setting the event type to mouseleave  
2176 - arguments[0].type = "mouseleave";  
2177 - return jQuery.event.handle.apply(this, arguments);  
2178 - }  
2179 - }  
2180 - }  
2181 -};  
2182 -  
2183 -jQuery.fn.extend({  
2184 - bind: function( type, data, fn ) {  
2185 - return type == "unload" ? this.one(type, data, fn) : this.each(function(){  
2186 - jQuery.event.add( this, type, fn || data, fn && data );  
2187 - });  
2188 - },  
2189 -  
2190 - one: function( type, data, fn ) {  
2191 - return this.each(function(){  
2192 - jQuery.event.add( this, type, function(event) {  
2193 - jQuery(this).unbind(event);  
2194 - return (fn || data).apply( this, arguments);  
2195 - }, fn && data);  
2196 - });  
2197 - },  
2198 -  
2199 - unbind: function( type, fn ) {  
2200 - return this.each(function(){  
2201 - jQuery.event.remove( this, type, fn );  
2202 - });  
2203 - },  
2204 -  
2205 - trigger: function( type, data, fn ) {  
2206 - return this.each(function(){  
2207 - jQuery.event.trigger( type, data, this, true, fn );  
2208 - });  
2209 - },  
2210 -  
2211 - triggerHandler: function( type, data, fn ) {  
2212 - if ( this[0] )  
2213 - return jQuery.event.trigger( type, data, this[0], false, fn );  
2214 - return undefined;  
2215 - },  
2216 -  
2217 - toggle: function() {  
2218 - // Save reference to arguments for access in closure  
2219 - var args = arguments;  
2220 -  
2221 - return this.click(function(event) {  
2222 - // Figure out which function to execute  
2223 - this.lastToggle = 0 == this.lastToggle ? 1 : 0;  
2224 -  
2225 - // Make sure that clicks stop  
2226 - event.preventDefault();  
2227 -  
2228 - // and execute the function  
2229 - return args[this.lastToggle].apply( this, arguments ) || false;  
2230 - });  
2231 - },  
2232 -  
2233 - hover: function(fnOver, fnOut) {  
2234 - return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut);  
2235 - },  
2236 -  
2237 - ready: function(fn) {  
2238 - // Attach the listeners  
2239 - bindReady();  
2240 -  
2241 - // If the DOM is already ready  
2242 - if ( jQuery.isReady )  
2243 - // Execute the function immediately  
2244 - fn.call( document, jQuery );  
2245 -  
2246 - // Otherwise, remember the function for later  
2247 - else  
2248 - // Add the function to the wait list  
2249 - jQuery.readyList.push( function() { return fn.call(this, jQuery); } );  
2250 -  
2251 - return this;  
2252 - }  
2253 -});  
2254 -  
2255 -jQuery.extend({  
2256 - isReady: false,  
2257 - readyList: [],  
2258 - // Handle when the DOM is ready  
2259 - ready: function() {  
2260 - // Make sure that the DOM is not already loaded  
2261 - if ( !jQuery.isReady ) {  
2262 - // Remember that the DOM is ready  
2263 - jQuery.isReady = true;  
2264 -  
2265 - // If there are functions bound, to execute  
2266 - if ( jQuery.readyList ) {  
2267 - // Execute all of them  
2268 - jQuery.each( jQuery.readyList, function(){  
2269 - this.apply( document );  
2270 - });  
2271 -  
2272 - // Reset the list of functions  
2273 - jQuery.readyList = null;  
2274 - }  
2275 -  
2276 - // Trigger any bound ready events  
2277 - jQuery(document).triggerHandler("ready");  
2278 - }  
2279 - }  
2280 -});  
2281 -  
2282 -var readyBound = false;  
2283 -  
2284 -function bindReady(){  
2285 - if ( readyBound ) return;  
2286 - readyBound = true;  
2287 -  
2288 - // Mozilla, Opera (see further below for it) and webkit nightlies currently support this event  
2289 - if ( document.addEventListener && !jQuery.browser.opera)  
2290 - // Use the handy event callback  
2291 - document.addEventListener( "DOMContentLoaded", jQuery.ready, false );  
2292 -  
2293 - // If IE is used and is not in a frame  
2294 - // Continually check to see if the document is ready  
2295 - if ( jQuery.browser.msie && window == top ) (function(){  
2296 - if (jQuery.isReady) return;  
2297 - try {  
2298 - // If IE is used, use the trick by Diego Perini  
2299 - // http://javascript.nwbox.com/IEContentLoaded/  
2300 - document.documentElement.doScroll("left");  
2301 - } catch( error ) {  
2302 - setTimeout( arguments.callee, 0 );  
2303 - return;  
2304 - }  
2305 - // and execute any waiting functions  
2306 - jQuery.ready();  
2307 - })();  
2308 -  
2309 - if ( jQuery.browser.opera )  
2310 - document.addEventListener( "DOMContentLoaded", function () {  
2311 - if (jQuery.isReady) return;  
2312 - for (var i = 0; i < document.styleSheets.length; i++)  
2313 - if (document.styleSheets[i].disabled) {  
2314 - setTimeout( arguments.callee, 0 );  
2315 - return;  
2316 - }  
2317 - // and execute any waiting functions  
2318 - jQuery.ready();  
2319 - }, false);  
2320 -  
2321 - if ( jQuery.browser.safari ) {  
2322 - var numStyles;  
2323 - (function(){  
2324 - if (jQuery.isReady) return;  
2325 - if ( document.readyState != "loaded" && document.readyState != "complete" ) {  
2326 - setTimeout( arguments.callee, 0 );  
2327 - return;  
2328 - }  
2329 - if ( numStyles === undefined )  
2330 - numStyles = jQuery("style, link[rel=stylesheet]").length;  
2331 - if ( document.styleSheets.length != numStyles ) {  
2332 - setTimeout( arguments.callee, 0 );  
2333 - return;  
2334 - }  
2335 - // and execute any waiting functions  
2336 - jQuery.ready();  
2337 - })();  
2338 - }  
2339 -  
2340 - // A fallback to window.onload, that will always work  
2341 - jQuery.event.add( window, "load", jQuery.ready );  
2342 -}  
2343 -  
2344 -jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +  
2345 - "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," +  
2346 - "submit,keydown,keypress,keyup,error").split(","), function(i, name){  
2347 -  
2348 - // Handle event binding  
2349 - jQuery.fn[name] = function(fn){  
2350 - return fn ? this.bind(name, fn) : this.trigger(name);  
2351 - };  
2352 -});  
2353 -  
2354 -// Checks if an event happened on an element within another element  
2355 -// Used in jQuery.event.special.mouseenter and mouseleave handlers  
2356 -var withinElement = function(event, elem) {  
2357 - // Check if mouse(over|out) are still within the same parent element  
2358 - var parent = event.relatedTarget;  
2359 - // Traverse up the tree  
2360 - while ( parent && parent != elem ) try { parent = parent.parentNode; } catch(error) { parent = elem; }  
2361 - // Return true if we actually just moused on to a sub-element  
2362 - return parent == elem;  
2363 -};  
2364 -  
2365 -// Prevent memory leaks in IE  
2366 -// And prevent errors on refresh with events like mouseover in other browsers  
2367 -// Window isn't included so as not to unbind existing unload events  
2368 -jQuery(window).bind("unload", function() {  
2369 - jQuery("*").add(document).unbind();  
2370 -});  
2371 -jQuery.fn.extend({  
2372 - load: function( url, params, callback ) {  
2373 - if ( jQuery.isFunction( url ) )  
2374 - return this.bind("load", url);  
2375 -  
2376 - var off = url.indexOf(" ");  
2377 - if ( off >= 0 ) {  
2378 - var selector = url.slice(off, url.length);  
2379 - url = url.slice(0, off);  
2380 - }  
2381 -  
2382 - callback = callback || function(){};  
2383 -  
2384 - // Default to a GET request  
2385 - var type = "GET";  
2386 -  
2387 - // If the second parameter was provided  
2388 - if ( params )  
2389 - // If it's a function  
2390 - if ( jQuery.isFunction( params ) ) {  
2391 - // We assume that it's the callback  
2392 - callback = params;  
2393 - params = null;  
2394 -  
2395 - // Otherwise, build a param string  
2396 - } else {  
2397 - params = jQuery.param( params );  
2398 - type = "POST";  
2399 - }  
2400 -  
2401 - var self = this;  
2402 -  
2403 - // Request the remote document  
2404 - jQuery.ajax({  
2405 - url: url,  
2406 - type: type,  
2407 - dataType: "html",  
2408 - data: params,  
2409 - complete: function(res, status){  
2410 - // If successful, inject the HTML into all the matched elements  
2411 - if ( status == "success" || status == "notmodified" )  
2412 - // See if a selector was specified  
2413 - self.html( selector ?  
2414 - // Create a dummy div to hold the results  
2415 - jQuery("<div/>")  
2416 - // inject the contents of the document in, removing the scripts  
2417 - // to avoid any 'Permission Denied' errors in IE  
2418 - .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))  
2419 -  
2420 - // Locate the specified elements  
2421 - .find(selector) :  
2422 -  
2423 - // If not, just inject the full result  
2424 - res.responseText );  
2425 -  
2426 - self.each( callback, [res.responseText, status, res] );  
2427 - }  
2428 - });  
2429 - return this;  
2430 - },  
2431 -  
2432 - serialize: function() {  
2433 - return jQuery.param(this.serializeArray());  
2434 - },  
2435 - serializeArray: function() {  
2436 - return this.map(function(){  
2437 - return jQuery.nodeName(this, "form") ?  
2438 - jQuery.makeArray(this.elements) : this;  
2439 - })  
2440 - .filter(function(){  
2441 - return this.name && !this.disabled &&  
2442 - (this.checked || /select|textarea/i.test(this.nodeName) ||  
2443 - /text|hidden|password/i.test(this.type));  
2444 - })  
2445 - .map(function(i, elem){  
2446 - var val = jQuery(this).val();  
2447 - return val == null ? null :  
2448 - val.constructor == Array ?  
2449 - jQuery.map( val, function(val, i){  
2450 - return {name: elem.name, value: val};  
2451 - }) :  
2452 - {name: elem.name, value: val};  
2453 - }).get();  
2454 - }  
2455 -});  
2456 -  
2457 -// Attach a bunch of functions for handling common AJAX events  
2458 -jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){  
2459 - jQuery.fn[o] = function(f){  
2460 - return this.bind(o, f);  
2461 - };  
2462 -});  
2463 -  
2464 -var jsc = (new Date).getTime();  
2465 -  
2466 -jQuery.extend({  
2467 - get: function( url, data, callback, type ) {  
2468 - // shift arguments if data argument was ommited  
2469 - if ( jQuery.isFunction( data ) ) {  
2470 - callback = data;  
2471 - data = null;  
2472 - }  
2473 -  
2474 - return jQuery.ajax({  
2475 - type: "GET",  
2476 - url: url,  
2477 - data: data,  
2478 - success: callback,  
2479 - dataType: type  
2480 - });  
2481 - },  
2482 -  
2483 - getScript: function( url, callback ) {  
2484 - return jQuery.get(url, null, callback, "script");  
2485 - },  
2486 -  
2487 - getJSON: function( url, data, callback ) {  
2488 - return jQuery.get(url, data, callback, "json");  
2489 - },  
2490 -  
2491 - post: function( url, data, callback, type ) {  
2492 - if ( jQuery.isFunction( data ) ) {  
2493 - callback = data;  
2494 - data = {};  
2495 - }  
2496 -  
2497 - return jQuery.ajax({  
2498 - type: "POST",  
2499 - url: url,  
2500 - data: data,  
2501 - success: callback,  
2502 - dataType: type  
2503 - });  
2504 - },  
2505 -  
2506 - ajaxSetup: function( settings ) {  
2507 - jQuery.extend( jQuery.ajaxSettings, settings );  
2508 - },  
2509 -  
2510 - ajaxSettings: {  
2511 - global: true,  
2512 - type: "GET",  
2513 - timeout: 0,  
2514 - contentType: "application/x-www-form-urlencoded",  
2515 - processData: true,  
2516 - async: true,  
2517 - data: null,  
2518 - username: null,  
2519 - password: null,  
2520 - accepts: {  
2521 - xml: "application/xml, text/xml",  
2522 - html: "text/html",  
2523 - script: "text/javascript, application/javascript",  
2524 - json: "application/json, text/javascript",  
2525 - text: "text/plain",  
2526 - _default: "*/*"  
2527 - }  
2528 - },  
2529 -  
2530 - // Last-Modified header cache for next request  
2531 - lastModified: {},  
2532 -  
2533 - ajax: function( s ) {  
2534 - var jsonp, jsre = /=\?(&|$)/g, status, data;  
2535 -  
2536 - // Extend the settings, but re-extend 's' so that it can be  
2537 - // checked again later (in the test suite, specifically)  
2538 - s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));  
2539 -  
2540 - // convert data if not already a string  
2541 - if ( s.data && s.processData && typeof s.data != "string" )  
2542 - s.data = jQuery.param(s.data);  
2543 -  
2544 - // Handle JSONP Parameter Callbacks  
2545 - if ( s.dataType == "jsonp" ) {  
2546 - if ( s.type.toLowerCase() == "get" ) {  
2547 - if ( !s.url.match(jsre) )  
2548 - s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";  
2549 - } else if ( !s.data || !s.data.match(jsre) )  
2550 - s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";  
2551 - s.dataType = "json";  
2552 - }  
2553 -  
2554 - // Build temporary JSONP function  
2555 - if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {  
2556 - jsonp = "jsonp" + jsc++;  
2557 -  
2558 - // Replace the =? sequence both in the query string and the data  
2559 - if ( s.data )  
2560 - s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");  
2561 - s.url = s.url.replace(jsre, "=" + jsonp + "$1");  
2562 -  
2563 - // We need to make sure  
2564 - // that a JSONP style response is executed properly  
2565 - s.dataType = "script";  
2566 -  
2567 - // Handle JSONP-style loading  
2568 - window[ jsonp ] = function(tmp){  
2569 - data = tmp;  
2570 - success();  
2571 - complete();  
2572 - // Garbage collect  
2573 - window[ jsonp ] = undefined;  
2574 - try{ delete window[ jsonp ]; } catch(e){}  
2575 - if ( head )  
2576 - head.removeChild( script );  
2577 - };  
2578 - }  
2579 -  
2580 - if ( s.dataType == "script" && s.cache == null )  
2581 - s.cache = false;  
2582 -  
2583 - if ( s.cache === false && s.type.toLowerCase() == "get" ) {  
2584 - var ts = (new Date()).getTime();  
2585 - // try replacing _= if it is there  
2586 - var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");  
2587 - // if nothing was replaced, add timestamp to the end  
2588 - s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");  
2589 - }  
2590 -  
2591 - // If data is available, append data to url for get requests  
2592 - if ( s.data && s.type.toLowerCase() == "get" ) {  
2593 - s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;  
2594 -  
2595 - // IE likes to send both get and post data, prevent this  
2596 - s.data = null;  
2597 - }  
2598 -  
2599 - // Watch for a new set of requests  
2600 - if ( s.global && ! jQuery.active++ )  
2601 - jQuery.event.trigger( "ajaxStart" );  
2602 -  
2603 - // If we're requesting a remote document  
2604 - // and trying to load JSON or Script with a GET  
2605 - if ( (!s.url.indexOf("http") || !s.url.indexOf("//")) && ( s.dataType == "script" || s.dataType =="json" ) && s.type.toLowerCase() == "get" ) {  
2606 - var head = document.getElementsByTagName("head")[0];  
2607 - var script = document.createElement("script");  
2608 - script.src = s.url;  
2609 - if (s.scriptCharset)  
2610 - script.charset = s.scriptCharset;  
2611 -  
2612 - // Handle Script loading  
2613 - if ( !jsonp ) {  
2614 - var done = false;  
2615 -  
2616 - // Attach handlers for all browsers  
2617 - script.onload = script.onreadystatechange = function(){  
2618 - if ( !done && (!this.readyState ||  
2619 - this.readyState == "loaded" || this.readyState == "complete") ) {  
2620 - done = true;  
2621 - success();  
2622 - complete();  
2623 - head.removeChild( script );  
2624 - }  
2625 - };  
2626 - }  
2627 -  
2628 - head.appendChild(script);  
2629 -  
2630 - // We handle everything using the script element injection  
2631 - return undefined;  
2632 - }  
2633 -  
2634 - var requestDone = false;  
2635 -  
2636 - // Create the request object; Microsoft failed to properly  
2637 - // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available  
2638 - var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();  
2639 -  
2640 - // Open the socket  
2641 - xml.open(s.type, s.url, s.async, s.username, s.password);  
2642 -  
2643 - // Need an extra try/catch for cross domain requests in Firefox 3  
2644 - try {  
2645 - // Set the correct header, if data is being sent  
2646 - if ( s.data )  
2647 - xml.setRequestHeader("Content-Type", s.contentType);  
2648 -  
2649 - // Set the If-Modified-Since header, if ifModified mode.  
2650 - if ( s.ifModified )  
2651 - xml.setRequestHeader("If-Modified-Since",  
2652 - jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );  
2653 -  
2654 - // Set header so the called script knows that it's an XMLHttpRequest  
2655 - xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");  
2656 -  
2657 - // Set the Accepts header for the server, depending on the dataType  
2658 - xml.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?  
2659 - s.accepts[ s.dataType ] + ", */*" :  
2660 - s.accepts._default );  
2661 - } catch(e){}  
2662 -  
2663 - // Allow custom headers/mimetypes  
2664 - if ( s.beforeSend )  
2665 - s.beforeSend(xml);  
2666 -  
2667 - if ( s.global )  
2668 - jQuery.event.trigger("ajaxSend", [xml, s]);  
2669 -  
2670 - // Wait for a response to come back  
2671 - var onreadystatechange = function(isTimeout){  
2672 - // The transfer is complete and the data is available, or the request timed out  
2673 - if ( !requestDone && xml && (xml.readyState == 4 || isTimeout == "timeout") ) {  
2674 - requestDone = true;  
2675 -  
2676 - // clear poll interval  
2677 - if (ival) {  
2678 - clearInterval(ival);  
2679 - ival = null;  
2680 - }  
2681 -  
2682 - status = isTimeout == "timeout" && "timeout" ||  
2683 - !jQuery.httpSuccess( xml ) && "error" ||  
2684 - s.ifModified && jQuery.httpNotModified( xml, s.url ) && "notmodified" ||  
2685 - "success";  
2686 -  
2687 - if ( status == "success" ) {  
2688 - // Watch for, and catch, XML document parse errors  
2689 - try {  
2690 - // process the data (runs the xml through httpData regardless of callback)  
2691 - data = jQuery.httpData( xml, s.dataType );  
2692 - } catch(e) {  
2693 - status = "parsererror";  
2694 - }  
2695 - }  
2696 -  
2697 - // Make sure that the request was successful or notmodified  
2698 - if ( status == "success" ) {  
2699 - // Cache Last-Modified header, if ifModified mode.  
2700 - var modRes;  
2701 - try {  
2702 - modRes = xml.getResponseHeader("Last-Modified");  
2703 - } catch(e) {} // swallow exception thrown by FF if header is not available  
2704 -  
2705 - if ( s.ifModified && modRes )  
2706 - jQuery.lastModified[s.url] = modRes;  
2707 -  
2708 - // JSONP handles its own success callback  
2709 - if ( !jsonp )  
2710 - success();  
2711 - } else  
2712 - jQuery.handleError(s, xml, status);  
2713 -  
2714 - // Fire the complete handlers  
2715 - complete();  
2716 -  
2717 - // Stop memory leaks  
2718 - if ( s.async )  
2719 - xml = null;  
2720 - }  
2721 - };  
2722 -  
2723 - if ( s.async ) {  
2724 - // don't attach the handler to the request, just poll it instead  
2725 - var ival = setInterval(onreadystatechange, 13);  
2726 -  
2727 - // Timeout checker  
2728 - if ( s.timeout > 0 )  
2729 - setTimeout(function(){  
2730 - // Check to see if the request is still happening  
2731 - if ( xml ) {  
2732 - // Cancel the request  
2733 - xml.abort();  
2734 -  
2735 - if( !requestDone )  
2736 - onreadystatechange( "timeout" );  
2737 - }  
2738 - }, s.timeout);  
2739 - }  
2740 -  
2741 - // Send the data  
2742 - try {  
2743 - xml.send(s.data);  
2744 - } catch(e) {  
2745 - jQuery.handleError(s, xml, null, e);  
2746 - }  
2747 -  
2748 - // firefox 1.5 doesn't fire statechange for sync requests  
2749 - if ( !s.async )  
2750 - onreadystatechange();  
2751 -  
2752 - function success(){  
2753 - // If a local callback was specified, fire it and pass it the data  
2754 - if ( s.success )  
2755 - s.success( data, status );  
2756 -  
2757 - // Fire the global callback  
2758 - if ( s.global )  
2759 - jQuery.event.trigger( "ajaxSuccess", [xml, s] );  
2760 - }  
2761 -  
2762 - function complete(){  
2763 - // Process result  
2764 - if ( s.complete )  
2765 - s.complete(xml, status);  
2766 -  
2767 - // The request was completed  
2768 - if ( s.global )  
2769 - jQuery.event.trigger( "ajaxComplete", [xml, s] );  
2770 -  
2771 - // Handle the global AJAX counter  
2772 - if ( s.global && ! --jQuery.active )  
2773 - jQuery.event.trigger( "ajaxStop" );  
2774 - }  
2775 -  
2776 - // return XMLHttpRequest to allow aborting the request etc.  
2777 - return xml;  
2778 - },  
2779 -  
2780 - handleError: function( s, xml, status, e ) {  
2781 - // If a local callback was specified, fire it  
2782 - if ( s.error ) s.error( xml, status, e );  
2783 -  
2784 - // Fire the global callback  
2785 - if ( s.global )  
2786 - jQuery.event.trigger( "ajaxError", [xml, s, e] );  
2787 - },  
2788 -  
2789 - // Counter for holding the number of active queries  
2790 - active: 0,  
2791 -  
2792 - // Determines if an XMLHttpRequest was successful or not  
2793 - httpSuccess: function( r ) {  
2794 - try {  
2795 - // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450  
2796 - return !r.status && location.protocol == "file:" ||  
2797 - ( r.status >= 200 && r.status < 300 ) || r.status == 304 || r.status == 1223 ||  
2798 - jQuery.browser.safari && r.status == undefined;  
2799 - } catch(e){}  
2800 - return false;  
2801 - },  
2802 -  
2803 - // Determines if an XMLHttpRequest returns NotModified  
2804 - httpNotModified: function( xml, url ) {  
2805 - try {  
2806 - var xmlRes = xml.getResponseHeader("Last-Modified");  
2807 -  
2808 - // Firefox always returns 200. check Last-Modified date  
2809 - return xml.status == 304 || xmlRes == jQuery.lastModified[url] ||  
2810 - jQuery.browser.safari && xml.status == undefined;  
2811 - } catch(e){}  
2812 - return false;  
2813 - },  
2814 -  
2815 - httpData: function( r, type ) {  
2816 - var ct = r.getResponseHeader("content-type");  
2817 - var xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0;  
2818 - var data = xml ? r.responseXML : r.responseText;  
2819 -  
2820 - if ( xml && data.documentElement.tagName == "parsererror" )  
2821 - throw "parsererror";  
2822 -  
2823 - // If the type is "script", eval it in global context  
2824 - if ( type == "script" )  
2825 - jQuery.globalEval( data );  
2826 -  
2827 - // Get the JavaScript object, if JSON is used.  
2828 - if ( type == "json" )  
2829 - data = eval("(" + data + ")");  
2830 -  
2831 - return data;  
2832 - },  
2833 -  
2834 - // Serialize an array of form elements or a set of  
2835 - // key/values into a query string  
2836 - param: function( a ) {  
2837 - var s = [];  
2838 -  
2839 - // If an array was passed in, assume that it is an array  
2840 - // of form elements  
2841 - if ( a.constructor == Array || a.jquery )  
2842 - // Serialize the form elements  
2843 - jQuery.each( a, function(){  
2844 - s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );  
2845 - });  
2846 -  
2847 - // Otherwise, assume that it's an object of key/value pairs  
2848 - else  
2849 - // Serialize the key/values  
2850 - for ( var j in a )  
2851 - // If the value is an array then the key names need to be repeated  
2852 - if ( a[j] && a[j].constructor == Array )  
2853 - jQuery.each( a[j], function(){  
2854 - s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );  
2855 - });  
2856 - else  
2857 - s.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) );  
2858 -  
2859 - // Return the resulting serialization  
2860 - return s.join("&").replace(/%20/g, "+");  
2861 - }  
2862 -  
2863 -});  
2864 -jQuery.fn.extend({  
2865 - show: function(speed,callback){  
2866 - return speed ?  
2867 - this.animate({  
2868 - height: "show", width: "show", opacity: "show"  
2869 - }, speed, callback) :  
2870 -  
2871 - this.filter(":hidden").each(function(){  
2872 - this.style.display = this.oldblock || "";  
2873 - if ( jQuery.css(this,"display") == "none" ) {  
2874 - var elem = jQuery("<" + this.tagName + " />").appendTo("body");  
2875 - this.style.display = elem.css("display");  
2876 - // handle an edge condition where css is - div { display:none; } or similar  
2877 - if (this.style.display == "none")  
2878 - this.style.display = "block";  
2879 - elem.remove();  
2880 - }  
2881 - }).end();  
2882 - },  
2883 -  
2884 - hide: function(speed,callback){  
2885 - return speed ?  
2886 - this.animate({  
2887 - height: "hide", width: "hide", opacity: "hide"  
2888 - }, speed, callback) :  
2889 -  
2890 - this.filter(":visible").each(function(){  
2891 - this.oldblock = this.oldblock || jQuery.css(this,"display");  
2892 - this.style.display = "none";  
2893 - }).end();  
2894 - },  
2895 -  
2896 - // Save the old toggle function  
2897 - _toggle: jQuery.fn.toggle,  
2898 -  
2899 - toggle: function( fn, fn2 ){  
2900 - return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?  
2901 - this._toggle( fn, fn2 ) :  
2902 - fn ?  
2903 - this.animate({  
2904 - height: "toggle", width: "toggle", opacity: "toggle"  
2905 - }, fn, fn2) :  
2906 - this.each(function(){  
2907 - jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();  
2908 - });  
2909 - },  
2910 -  
2911 - slideDown: function(speed,callback){  
2912 - return this.animate({height: "show"}, speed, callback);  
2913 - },  
2914 -  
2915 - slideUp: function(speed,callback){  
2916 - return this.animate({height: "hide"}, speed, callback);  
2917 - },  
2918 -  
2919 - slideToggle: function(speed, callback){  
2920 - return this.animate({height: "toggle"}, speed, callback);  
2921 - },  
2922 -  
2923 - fadeIn: function(speed, callback){  
2924 - return this.animate({opacity: "show"}, speed, callback);  
2925 - },  
2926 -  
2927 - fadeOut: function(speed, callback){  
2928 - return this.animate({opacity: "hide"}, speed, callback);  
2929 - },  
2930 -  
2931 - fadeTo: function(speed,to,callback){  
2932 - return this.animate({opacity: to}, speed, callback);  
2933 - },  
2934 -  
2935 - animate: function( prop, speed, easing, callback ) {  
2936 - var optall = jQuery.speed(speed, easing, callback);  
2937 -  
2938 - return this[ optall.queue === false ? "each" : "queue" ](function(){  
2939 - if ( this.nodeType != 1)  
2940 - return false;  
2941 -  
2942 - var opt = jQuery.extend({}, optall);  
2943 - var hidden = jQuery(this).is(":hidden"), self = this;  
2944 -  
2945 - for ( var p in prop ) {  
2946 - if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )  
2947 - return jQuery.isFunction(opt.complete) && opt.complete.apply(this);  
2948 -  
2949 - if ( p == "height" || p == "width" ) {  
2950 - // Store display property  
2951 - opt.display = jQuery.css(this, "display");  
2952 -  
2953 - // Make sure that nothing sneaks out  
2954 - opt.overflow = this.style.overflow;  
2955 - }  
2956 - }  
2957 -  
2958 - if ( opt.overflow != null )  
2959 - this.style.overflow = "hidden";  
2960 -  
2961 - opt.curAnim = jQuery.extend({}, prop);  
2962 -  
2963 - jQuery.each( prop, function(name, val){  
2964 - var e = new jQuery.fx( self, opt, name );  
2965 -  
2966 - if ( /toggle|show|hide/.test(val) )  
2967 - e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );  
2968 - else {  
2969 - var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),  
2970 - start = e.cur(true) || 0;  
2971 -  
2972 - if ( parts ) {  
2973 - var end = parseFloat(parts[2]),  
2974 - unit = parts[3] || "px";  
2975 -  
2976 - // We need to compute starting value  
2977 - if ( unit != "px" ) {  
2978 - self.style[ name ] = (end || 1) + unit;  
2979 - start = ((end || 1) / e.cur(true)) * start;  
2980 - self.style[ name ] = start + unit;  
2981 - }  
2982 -  
2983 - // If a +=/-= token was provided, we're doing a relative animation  
2984 - if ( parts[1] )  
2985 - end = ((parts[1] == "-=" ? -1 : 1) * end) + start;  
2986 -  
2987 - e.custom( start, end, unit );  
2988 - } else  
2989 - e.custom( start, val, "" );  
2990 - }  
2991 - });  
2992 -  
2993 - // For JS strict compliance  
2994 - return true;  
2995 - });  
2996 - },  
2997 -  
2998 - queue: function(type, fn){  
2999 - if ( jQuery.isFunction(type) || ( type && type.constructor == Array )) {  
3000 - fn = type;  
3001 - type = "fx";  
3002 - }  
3003 -  
3004 - if ( !type || (typeof type == "string" && !fn) )  
3005 - return queue( this[0], type );  
3006 -  
3007 - return this.each(function(){  
3008 - if ( fn.constructor == Array )  
3009 - queue(this, type, fn);  
3010 - else {  
3011 - queue(this, type).push( fn );  
3012 -  
3013 - if ( queue(this, type).length == 1 )  
3014 - fn.apply(this);  
3015 - }  
3016 - });  
3017 - },  
3018 -  
3019 - stop: function(clearQueue, gotoEnd){  
3020 - var timers = jQuery.timers;  
3021 -  
3022 - if (clearQueue)  
3023 - this.queue([]);  
3024 -  
3025 - this.each(function(){  
3026 - // go in reverse order so anything added to the queue during the loop is ignored  
3027 - for ( var i = timers.length - 1; i >= 0; i-- )  
3028 - if ( timers[i].elem == this ) {  
3029 - if (gotoEnd)  
3030 - // force the next step to be the last  
3031 - timers[i](true);  
3032 - timers.splice(i, 1);  
3033 - }  
3034 - });  
3035 -  
3036 - // start the next in the queue if the last step wasn't forced  
3037 - if (!gotoEnd)  
3038 - this.dequeue();  
3039 -  
3040 - return this;  
3041 - }  
3042 -  
3043 -});  
3044 -  
3045 -var queue = function( elem, type, array ) {  
3046 - if ( !elem )  
3047 - return undefined;  
3048 -  
3049 - type = type || "fx";  
3050 -  
3051 - var q = jQuery.data( elem, type + "queue" );  
3052 -  
3053 - if ( !q || array )  
3054 - q = jQuery.data( elem, type + "queue",  
3055 - array ? jQuery.makeArray(array) : [] );  
3056 -  
3057 - return q;  
3058 -};  
3059 -  
3060 -jQuery.fn.dequeue = function(type){  
3061 - type = type || "fx";  
3062 -  
3063 - return this.each(function(){  
3064 - var q = queue(this, type);  
3065 -  
3066 - q.shift();  
3067 -  
3068 - if ( q.length )  
3069 - q[0].apply( this );  
3070 - });  
3071 -};  
3072 -  
3073 -jQuery.extend({  
3074 -  
3075 - speed: function(speed, easing, fn) {  
3076 - var opt = speed && speed.constructor == Object ? speed : {  
3077 - complete: fn || !fn && easing ||  
3078 - jQuery.isFunction( speed ) && speed,  
3079 - duration: speed,  
3080 - easing: fn && easing || easing && easing.constructor != Function && easing  
3081 - };  
3082 -  
3083 - opt.duration = (opt.duration && opt.duration.constructor == Number ?  
3084 - opt.duration :  
3085 - { slow: 600, fast: 200 }[opt.duration]) || 400;  
3086 -  
3087 - // Queueing  
3088 - opt.old = opt.complete;  
3089 - opt.complete = function(){  
3090 - if ( opt.queue !== false )  
3091 - jQuery(this).dequeue();  
3092 - if ( jQuery.isFunction( opt.old ) )  
3093 - opt.old.apply( this );  
3094 - };  
3095 -  
3096 - return opt;  
3097 - },  
3098 -  
3099 - easing: {  
3100 - linear: function( p, n, firstNum, diff ) {  
3101 - return firstNum + diff * p;  
3102 - },  
3103 - swing: function( p, n, firstNum, diff ) {  
3104 - return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;  
3105 - }  
3106 - },  
3107 -  
3108 - timers: [],  
3109 - timerId: null,  
3110 -  
3111 - fx: function( elem, options, prop ){  
3112 - this.options = options;  
3113 - this.elem = elem;  
3114 - this.prop = prop;  
3115 -  
3116 - if ( !options.orig )  
3117 - options.orig = {};  
3118 - }  
3119 -  
3120 -});  
3121 -  
3122 -jQuery.fx.prototype = {  
3123 -  
3124 - // Simple function for setting a style value  
3125 - update: function(){  
3126 - if ( this.options.step )  
3127 - this.options.step.apply( this.elem, [ this.now, this ] );  
3128 -  
3129 - (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );  
3130 -  
3131 - // Set display property to block for height/width animations  
3132 - if ( this.prop == "height" || this.prop == "width" )  
3133 - this.elem.style.display = "block";  
3134 - },  
3135 -  
3136 - // Get the current size  
3137 - cur: function(force){  
3138 - if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )  
3139 - return this.elem[ this.prop ];  
3140 -  
3141 - var r = parseFloat(jQuery.css(this.elem, this.prop, force));  
3142 - return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;  
3143 - },  
3144 -  
3145 - // Start an animation from one number to another  
3146 - custom: function(from, to, unit){  
3147 - this.startTime = (new Date()).getTime();  
3148 - this.start = from;  
3149 - this.end = to;  
3150 - this.unit = unit || this.unit || "px";  
3151 - this.now = this.start;  
3152 - this.pos = this.state = 0;  
3153 - this.update();  
3154 -  
3155 - var self = this;  
3156 - function t(gotoEnd){  
3157 - return self.step(gotoEnd);  
3158 - }  
3159 -  
3160 - t.elem = this.elem;  
3161 -  
3162 - jQuery.timers.push(t);  
3163 -  
3164 - if ( jQuery.timerId == null ) {  
3165 - jQuery.timerId = setInterval(function(){  
3166 - var timers = jQuery.timers;  
3167 -  
3168 - for ( var i = 0; i < timers.length; i++ )  
3169 - if ( !timers[i]() )  
3170 - timers.splice(i--, 1);  
3171 -  
3172 - if ( !timers.length ) {  
3173 - clearInterval( jQuery.timerId );  
3174 - jQuery.timerId = null;  
3175 - }  
3176 - }, 13);  
3177 - }  
3178 - },  
3179 -  
3180 - // Simple 'show' function  
3181 - show: function(){  
3182 - // Remember where we started, so that we can go back to it later  
3183 - this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );  
3184 - this.options.show = true;  
3185 -  
3186 - // Begin the animation  
3187 - this.custom(0, this.cur());  
3188 -  
3189 - // Make sure that we start at a small width/height to avoid any  
3190 - // flash of content  
3191 - if ( this.prop == "width" || this.prop == "height" )  
3192 - this.elem.style[this.prop] = "1px";  
3193 -  
3194 - // Start by showing the element  
3195 - jQuery(this.elem).show();  
3196 - },  
3197 -  
3198 - // Simple 'hide' function  
3199 - hide: function(){  
3200 - // Remember where we started, so that we can go back to it later  
3201 - this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );  
3202 - this.options.hide = true;  
3203 -  
3204 - // Begin the animation  
3205 - this.custom(this.cur(), 0);  
3206 - },  
3207 -  
3208 - // Each step of an animation  
3209 - step: function(gotoEnd){  
3210 - var t = (new Date()).getTime();  
3211 -  
3212 - if ( gotoEnd || t > this.options.duration + this.startTime ) {  
3213 - this.now = this.end;  
3214 - this.pos = this.state = 1;  
3215 - this.update();  
3216 -  
3217 - this.options.curAnim[ this.prop ] = true;  
3218 -  
3219 - var done = true;  
3220 - for ( var i in this.options.curAnim )  
3221 - if ( this.options.curAnim[i] !== true )  
3222 - done = false;  
3223 -  
3224 - if ( done ) {  
3225 - if ( this.options.display != null ) {  
3226 - // Reset the overflow  
3227 - this.elem.style.overflow = this.options.overflow;  
3228 -  
3229 - // Reset the display  
3230 - this.elem.style.display = this.options.display;  
3231 - if ( jQuery.css(this.elem, "display") == "none" )  
3232 - this.elem.style.display = "block";  
3233 - }  
3234 -  
3235 - // Hide the element if the "hide" operation was done  
3236 - if ( this.options.hide )  
3237 - this.elem.style.display = "none";  
3238 -  
3239 - // Reset the properties, if the item has been hidden or shown  
3240 - if ( this.options.hide || this.options.show )  
3241 - for ( var p in this.options.curAnim )  
3242 - jQuery.attr(this.elem.style, p, this.options.orig[p]);  
3243 - }  
3244 -  
3245 - // If a callback was provided, execute it  
3246 - if ( done && jQuery.isFunction( this.options.complete ) )  
3247 - // Execute the complete function  
3248 - this.options.complete.apply( this.elem );  
3249 -  
3250 - return false;  
3251 - } else {  
3252 - var n = t - this.startTime;  
3253 - this.state = n / this.options.duration;  
3254 -  
3255 - // Perform the easing function, defaults to swing  
3256 - this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);  
3257 - this.now = this.start + ((this.end - this.start) * this.pos);  
3258 -  
3259 - // Perform the next step of the animation  
3260 - this.update();  
3261 - }  
3262 -  
3263 - return true;  
3264 - }  
3265 -  
3266 -};  
3267 -  
3268 -jQuery.fx.step = {  
3269 - scrollLeft: function(fx){  
3270 - fx.elem.scrollLeft = fx.now;  
3271 - },  
3272 -  
3273 - scrollTop: function(fx){  
3274 - fx.elem.scrollTop = fx.now;  
3275 - },  
3276 -  
3277 - opacity: function(fx){  
3278 - jQuery.attr(fx.elem.style, "opacity", fx.now);  
3279 - },  
3280 -  
3281 - _default: function(fx){  
3282 - fx.elem.style[ fx.prop ] = fx.now + fx.unit;  
3283 - }  
3284 -};  
3285 -// The Offset Method  
3286 -// Originally By Brandon Aaron, part of the Dimension Plugin  
3287 -// http://jquery.com/plugins/project/dimensions  
3288 -jQuery.fn.offset = function() {  
3289 - var left = 0, top = 0, elem = this[0], results;  
3290 -  
3291 - if ( elem ) with ( jQuery.browser ) {  
3292 - var parent = elem.parentNode,  
3293 - offsetChild = elem,  
3294 - offsetParent = elem.offsetParent,  
3295 - doc = elem.ownerDocument,  
3296 - safari2 = safari && parseInt(version) < 522,  
3297 - fixed = jQuery.css(elem, "position") == "fixed";  
3298 -  
3299 - // Use getBoundingClientRect if available  
3300 - if ( elem.getBoundingClientRect ) {  
3301 - var box = elem.getBoundingClientRect();  
3302 -  
3303 - // Add the document scroll offsets  
3304 - add(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),  
3305 - box.top + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop));  
3306 -  
3307 - // IE adds the HTML element's border, by default it is medium which is 2px  
3308 - // IE 6 and 7 quirks mode the border width is overwritable by the following css html { border: 0; }  
3309 - // IE 7 standards mode, the border is always 2px  
3310 - // This border/offset is typically represented by the clientLeft and clientTop properties  
3311 - // However, in IE6 and 7 quirks mode the clientLeft and clientTop properties are not updated when overwriting it via CSS  
3312 - // Therefore this method will be off by 2px in IE while in quirksmode  
3313 - add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop );  
3314 -  
3315 - // Otherwise loop through the offsetParents and parentNodes  
3316 - } else {  
3317 -  
3318 - // Initial element offsets  
3319 - add( elem.offsetLeft, elem.offsetTop );  
3320 -  
3321 - // Get parent offsets  
3322 - while ( offsetParent ) {  
3323 - // Add offsetParent offsets  
3324 - add( offsetParent.offsetLeft, offsetParent.offsetTop );  
3325 -  
3326 - // Mozilla and Safari > 2 does not include the border on offset parents  
3327 - // However Mozilla adds the border for table or table cells  
3328 - if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 )  
3329 - border( offsetParent );  
3330 -  
3331 - // Add the document scroll offsets if position is fixed on any offsetParent  
3332 - if ( !fixed && jQuery.css(offsetParent, "position") == "fixed" )  
3333 - fixed = true;  
3334 -  
3335 - // Set offsetChild to previous offsetParent unless it is the body element  
3336 - offsetChild = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent;  
3337 - // Get next offsetParent  
3338 - offsetParent = offsetParent.offsetParent;  
3339 - }  
3340 -  
3341 - // Get parent scroll offsets  
3342 - while ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) {  
3343 - // Remove parent scroll UNLESS that parent is inline or a table to work around Opera inline/table scrollLeft/Top bug  
3344 - if ( !/^inline|table.*$/i.test(jQuery.css(parent, "display")) )  
3345 - // Subtract parent scroll offsets  
3346 - add( -parent.scrollLeft, -parent.scrollTop );  
3347 -  
3348 - // Mozilla does not add the border for a parent that has overflow != visible  
3349 - if ( mozilla && jQuery.css(parent, "overflow") != "visible" )  
3350 - border( parent );  
3351 -  
3352 - // Get next parent  
3353 - parent = parent.parentNode;  
3354 - }  
3355 -  
3356 - // Safari <= 2 doubles body offsets with a fixed position element/offsetParent or absolutely positioned offsetChild  
3357 - // Mozilla doubles body offsets with a non-absolutely positioned offsetChild  
3358 - if ( (safari2 && (fixed || jQuery.css(offsetChild, "position") == "absolute")) ||  
3359 - (mozilla && jQuery.css(offsetChild, "position") != "absolute") )  
3360 - add( -doc.body.offsetLeft, -doc.body.offsetTop );  
3361 -  
3362 - // Add the document scroll offsets if position is fixed  
3363 - if ( fixed )  
3364 - add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),  
3365 - Math.max(doc.documentElement.scrollTop, doc.body.scrollTop));  
3366 - }  
3367 -  
3368 - // Return an object with top and left properties  
3369 - results = { top: top, left: left };  
3370 - }  
3371 -  
3372 - function border(elem) {  
3373 - add( jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, "borderTopWidth", true) );  
3374 - }  
3375 -  
3376 - function add(l, t) {  
3377 - left += parseInt(l) || 0;  
3378 - top += parseInt(t) || 0;  
3379 - }  
3380 -  
3381 - return results;  
3382 -};  
3383 -})();  
setup/wizard/resources/jquery-tooltip/todo deleted
1 -1.3  
2 ----  
3 -  
4 -* leverage advanced background-styling, eg. see http://www.google.com/intl/en_ALL/mapfiles/iw2.png  
5 -* add ability to display remote tooltip for other elements, eg. an invalid input  
6 -* Add stop-queue stuff for fadein/out without nasty queues  
7 -* add delay on hide  
8 -* add stick on hover of tooltip (with track:false)  
9 -* offer hoverIntent support  
setup/wizard/resources/jquery.blockUI.js 0 โ†’ 100644
  1 +๏ปฟ/*!
  2 + * jQuery blockUI plugin
  3 + * Version 2.26 (09-SEP-2009)
  4 + * @requires jQuery v1.2.3 or later
  5 + *
  6 + * Examples at: http://malsup.com/jquery/block/
  7 + * Copyright (c) 2007-2008 M. Alsup
  8 + * Dual licensed under the MIT and GPL licenses:
  9 + * http://www.opensource.org/licenses/mit-license.php
  10 + * http://www.gnu.org/licenses/gpl.html
  11 + *
  12 + * Thanks to Amir-Hossein Sobhi for some excellent contributions!
  13 + */
  14 +
  15 +;(function($) {
  16 +
  17 +if (/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) {
  18 + alert('blockUI requires jQuery v1.2.3 or later! You are using v' + $.fn.jquery);
  19 + return;
  20 +}
  21 +
  22 +$.fn._fadeIn = $.fn.fadeIn;
  23 +
  24 +// this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle
  25 +// retarded userAgent strings on Vista)
  26 +var mode = document.documentMode || 0;
  27 +var setExpr = $.browser.msie && (($.browser.version < 8 && !mode) || mode < 8);
  28 +var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent) && !mode;
  29 +
  30 +// global $ methods for blocking/unblocking the entire page
  31 +$.blockUI = function(opts) { install(window, opts); };
  32 +$.unblockUI = function(opts) { remove(window, opts); };
  33 +
  34 +// convenience method for quick growl-like notifications (http://www.google.com/search?q=growl)
  35 +$.growlUI = function(title, message, timeout, onClose) {
  36 + var $m = $('<div class="growlUI"></div>');
  37 + if (title) $m.append('<h1>'+title+'</h1>');
  38 + if (message) $m.append('<h2>'+message+'</h2>');
  39 + if (timeout == undefined) timeout = 3000;
  40 + $.blockUI({
  41 + message: $m, fadeIn: 700, fadeOut: 1000, centerY: false,
  42 + timeout: timeout, showOverlay: false,
  43 + onUnblock: onClose,
  44 + css: $.blockUI.defaults.growlCSS
  45 + });
  46 +};
  47 +
  48 +// plugin method for blocking element content
  49 +$.fn.block = function(opts) {
  50 + return this.unblock({ fadeOut: 0 }).each(function() {
  51 + if ($.css(this,'position') == 'static')
  52 + this.style.position = 'relative';
  53 + if ($.browser.msie)
  54 + this.style.zoom = 1; // force 'hasLayout'
  55 + install(this, opts);
  56 + });
  57 +};
  58 +
  59 +// plugin method for unblocking element content
  60 +$.fn.unblock = function(opts) {
  61 + return this.each(function() {
  62 + remove(this, opts);
  63 + });
  64 +};
  65 +
  66 +$.blockUI.version = 2.26; // 2nd generation blocking at no extra cost!
  67 +
  68 +// override these in your code to change the default behavior and style
  69 +$.blockUI.defaults = {
  70 + // message displayed when blocking (use null for no message)
  71 + message: '<h1>Please wait...</h1>',
  72 +
  73 + title: null, // title string; only used when theme == true
  74 + draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded)
  75 +
  76 + theme: false, // set to true to use with jQuery UI themes
  77 +
  78 + // styles for the message when blocking; if you wish to disable
  79 + // these and use an external stylesheet then do this in your code:
  80 + // $.blockUI.defaults.css = {};
  81 + css: {
  82 + padding: 0,
  83 + margin: 0,
  84 + width: '30%',
  85 + top: '40%',
  86 + left: '35%',
  87 + textAlign: 'center',
  88 + color: '#000',
  89 + border: '3px solid #aaa',
  90 + backgroundColor:'#fff',
  91 + cursor: 'wait'
  92 + },
  93 +
  94 + // minimal style set used when themes are used
  95 + themedCSS: {
  96 + width: '30%',
  97 + top: '40%',
  98 + left: '35%'
  99 + },
  100 +
  101 + // styles for the overlay
  102 + overlayCSS: {
  103 + backgroundColor: '#000',
  104 + opacity: 0.6,
  105 + cursor: 'wait'
  106 + },
  107 +
  108 + // styles applied when using $.growlUI
  109 + growlCSS: {
  110 + width: '350px',
  111 + top: '10px',
  112 + left: '',
  113 + right: '10px',
  114 + border: 'none',
  115 + padding: '5px',
  116 + opacity: 0.6,
  117 + cursor: 'default',
  118 + color: '#fff',
  119 + backgroundColor: '#000',
  120 + '-webkit-border-radius': '10px',
  121 + '-moz-border-radius': '10px'
  122 + },
  123 +
  124 + // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w
  125 + // (hat tip to Jorge H. N. de Vasconcelos)
  126 + iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',
  127 +
  128 + // force usage of iframe in non-IE browsers (handy for blocking applets)
  129 + forceIframe: false,
  130 +
  131 + // z-index for the blocking overlay
  132 + baseZ: 1000,
  133 +
  134 + // set these to true to have the message automatically centered
  135 + centerX: true, // <-- only effects element blocking (page block controlled via css above)
  136 + centerY: true,
  137 +
  138 + // allow body element to be stetched in ie6; this makes blocking look better
  139 + // on "short" pages. disable if you wish to prevent changes to the body height
  140 + allowBodyStretch: true,
  141 +
  142 + // enable if you want key and mouse events to be disabled for content that is blocked
  143 + bindEvents: true,
  144 +
  145 + // be default blockUI will supress tab navigation from leaving blocking content
  146 + // (if bindEvents is true)
  147 + constrainTabKey: true,
  148 +
  149 + // fadeIn time in millis; set to 0 to disable fadeIn on block
  150 + fadeIn: 200,
  151 +
  152 + // fadeOut time in millis; set to 0 to disable fadeOut on unblock
  153 + fadeOut: 400,
  154 +
  155 + // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock
  156 + timeout: 0,
  157 +
  158 + // disable if you don't want to show the overlay
  159 + showOverlay: true,
  160 +
  161 + // if true, focus will be placed in the first available input field when
  162 + // page blocking
  163 + focusInput: true,
  164 +
  165 + // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)
  166 + applyPlatformOpacityRules: true,
  167 +
  168 + // callback method invoked when unblocking has completed; the callback is
  169 + // passed the element that has been unblocked (which is the window object for page
  170 + // blocks) and the options that were passed to the unblock call:
  171 + // onUnblock(element, options)
  172 + onUnblock: null,
  173 +
  174 + // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493
  175 + quirksmodeOffsetHack: 4
  176 +};
  177 +
  178 +// private data and functions follow...
  179 +
  180 +var pageBlock = null;
  181 +var pageBlockEls = [];
  182 +
  183 +function install(el, opts) {
  184 + var full = (el == window);
  185 + var msg = opts && opts.message !== undefined ? opts.message : undefined;
  186 + opts = $.extend({}, $.blockUI.defaults, opts || {});
  187 + opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});
  188 + var css = $.extend({}, $.blockUI.defaults.css, opts.css || {});
  189 + var themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});
  190 + msg = msg === undefined ? opts.message : msg;
  191 +
  192 + // remove the current block (if there is one)
  193 + if (full && pageBlock)
  194 + remove(window, {fadeOut:0});
  195 +
  196 + // if an existing element is being used as the blocking content then we capture
  197 + // its current place in the DOM (and current display style) so we can restore
  198 + // it when we unblock
  199 + if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {
  200 + var node = msg.jquery ? msg[0] : msg;
  201 + var data = {};
  202 + $(el).data('blockUI.history', data);
  203 + data.el = node;
  204 + data.parent = node.parentNode;
  205 + data.display = node.style.display;
  206 + data.position = node.style.position;
  207 + if (data.parent)
  208 + data.parent.removeChild(node);
  209 + }
  210 +
  211 + var z = opts.baseZ;
  212 +
  213 + // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;
  214 + // layer1 is the iframe layer which is used to supress bleed through of underlying content
  215 + // layer2 is the overlay layer which has opacity and a wait cursor (by default)
  216 + // layer3 is the message content that is displayed while blocking
  217 +
  218 + var lyr1 = ($.browser.msie || opts.forceIframe)
  219 + ? $('<iframe class="blockUI" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="'+opts.iframeSrc+'"></iframe>')
  220 + : $('<div class="blockUI" style="display:none"></div>');
  221 + var lyr2 = $('<div class="blockUI blockOverlay" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>');
  222 +
  223 + var lyr3;
  224 + if (opts.theme && full) {
  225 + var s = '<div class="blockUI blockMsg blockPage ui-dialog ui-widget ui-corner-all" style="z-index:'+z+';display:none;position:fixed">' +
  226 + '<div class="ui-widget-header ui-dialog-titlebar blockTitle">'+(opts.title || '&nbsp;')+'</div>' +
  227 + '<div class="ui-widget-content ui-dialog-content"></div>' +
  228 + '</div>';
  229 + lyr3 = $(s);
  230 + }
  231 + else {
  232 + lyr3 = full ? $('<div class="blockUI blockMsg blockPage" style="z-index:'+z+';display:none;position:fixed"></div>')
  233 + : $('<div class="blockUI blockMsg blockElement" style="z-index:'+z+';display:none;position:absolute"></div>');
  234 + }
  235 +
  236 + // if we have a message, style it
  237 + if (msg) {
  238 + if (opts.theme) {
  239 + lyr3.css(themedCSS);
  240 + lyr3.addClass('ui-widget-content');
  241 + }
  242 + else
  243 + lyr3.css(css);
  244 + }
  245 +
  246 + // style the overlay
  247 + if (!opts.applyPlatformOpacityRules || !($.browser.mozilla && /Linux/.test(navigator.platform)))
  248 + lyr2.css(opts.overlayCSS);
  249 + lyr2.css('position', full ? 'fixed' : 'absolute');
  250 +
  251 + // make iframe layer transparent in IE
  252 + if ($.browser.msie || opts.forceIframe)
  253 + lyr1.css('opacity',0.0);
  254 +
  255 + $([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);
  256 +
  257 + if (opts.theme && opts.draggable && $.fn.draggable) {
  258 + lyr3.draggable({
  259 + handle: '.ui-dialog-titlebar',
  260 + cancel: 'li'
  261 + });
  262 + }
  263 +
  264 + // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)
  265 + var expr = setExpr && (!$.boxModel || $('object,embed', full ? null : el).length > 0);
  266 + if (ie6 || expr) {
  267 + // give body 100% height
  268 + if (full && opts.allowBodyStretch && $.boxModel)
  269 + $('html,body').css('height','100%');
  270 +
  271 + // fix ie6 issue when blocked element has a border width
  272 + if ((ie6 || !$.boxModel) && !full) {
  273 + var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');
  274 + var fixT = t ? '(0 - '+t+')' : 0;
  275 + var fixL = l ? '(0 - '+l+')' : 0;
  276 + }
  277 +
  278 + // simulate fixed position
  279 + $.each([lyr1,lyr2,lyr3], function(i,o) {
  280 + var s = o[0].style;
  281 + s.position = 'absolute';
  282 + if (i < 2) {
  283 + full ? s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"')
  284 + : s.setExpression('height','this.parentNode.offsetHeight + "px"');
  285 + full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"')
  286 + : s.setExpression('width','this.parentNode.offsetWidth + "px"');
  287 + if (fixL) s.setExpression('left', fixL);
  288 + if (fixT) s.setExpression('top', fixT);
  289 + }
  290 + else if (opts.centerY) {
  291 + if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"');
  292 + s.marginTop = 0;
  293 + }
  294 + else if (!opts.centerY && full) {
  295 + var top = (opts.css && opts.css.top) ? parseInt(opts.css.top) : 0;
  296 + var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"';
  297 + s.setExpression('top',expression);
  298 + }
  299 + });
  300 + }
  301 +
  302 + // show the message
  303 + if (msg) {
  304 + if (opts.theme)
  305 + lyr3.find('.ui-widget-content').append(msg);
  306 + else
  307 + lyr3.append(msg);
  308 + if (msg.jquery || msg.nodeType)
  309 + $(msg).show();
  310 + }
  311 +
  312 + if (($.browser.msie || opts.forceIframe) && opts.showOverlay)
  313 + lyr1.show(); // opacity is zero
  314 + if (opts.fadeIn) {
  315 + if (opts.showOverlay)
  316 + lyr2._fadeIn(opts.fadeIn);
  317 + if (msg)
  318 + lyr3.fadeIn(opts.fadeIn);
  319 + }
  320 + else {
  321 + if (opts.showOverlay)
  322 + lyr2.show();
  323 + if (msg)
  324 + lyr3.show();
  325 + }
  326 +
  327 + // bind key and mouse events
  328 + bind(1, el, opts);
  329 +
  330 + if (full) {
  331 + pageBlock = lyr3[0];
  332 + pageBlockEls = $(':input:enabled:visible',pageBlock);
  333 + if (opts.focusInput)
  334 + setTimeout(focus, 20);
  335 + }
  336 + else
  337 + center(lyr3[0], opts.centerX, opts.centerY);
  338 +
  339 + if (opts.timeout) {
  340 + // auto-unblock
  341 + var to = setTimeout(function() {
  342 + full ? $.unblockUI(opts) : $(el).unblock(opts);
  343 + }, opts.timeout);
  344 + $(el).data('blockUI.timeout', to);
  345 + }
  346 +};
  347 +
  348 +// remove the block
  349 +function remove(el, opts) {
  350 + var full = (el == window);
  351 + var $el = $(el);
  352 + var data = $el.data('blockUI.history');
  353 + var to = $el.data('blockUI.timeout');
  354 + if (to) {
  355 + clearTimeout(to);
  356 + $el.removeData('blockUI.timeout');
  357 + }
  358 + opts = $.extend({}, $.blockUI.defaults, opts || {});
  359 + bind(0, el, opts); // unbind events
  360 +
  361 + var els;
  362 + if (full) // crazy selector to handle odd field errors in ie6/7
  363 + els = $('body').children().filter('.blockUI').add('body > .blockUI');
  364 + else
  365 + els = $('.blockUI', el);
  366 +
  367 + if (full)
  368 + pageBlock = pageBlockEls = null;
  369 +
  370 + if (opts.fadeOut) {
  371 + els.fadeOut(opts.fadeOut);
  372 + setTimeout(function() { reset(els,data,opts,el); }, opts.fadeOut);
  373 + }
  374 + else
  375 + reset(els, data, opts, el);
  376 +};
  377 +
  378 +// move blocking element back into the DOM where it started
  379 +function reset(els,data,opts,el) {
  380 + els.each(function(i,o) {
  381 + // remove via DOM calls so we don't lose event handlers
  382 + if (this.parentNode)
  383 + this.parentNode.removeChild(this);
  384 + });
  385 +
  386 + if (data && data.el) {
  387 + data.el.style.display = data.display;
  388 + data.el.style.position = data.position;
  389 + if (data.parent)
  390 + data.parent.appendChild(data.el);
  391 + $(data.el).removeData('blockUI.history');
  392 + }
  393 +
  394 + if (typeof opts.onUnblock == 'function')
  395 + opts.onUnblock(el,opts);
  396 +};
  397 +
  398 +// bind/unbind the handler
  399 +function bind(b, el, opts) {
  400 + var full = el == window, $el = $(el);
  401 +
  402 + // don't bother unbinding if there is nothing to unbind
  403 + if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))
  404 + return;
  405 + if (!full)
  406 + $el.data('blockUI.isBlocked', b);
  407 +
  408 + // don't bind events when overlay is not in use or if bindEvents is false
  409 + if (!opts.bindEvents || (b && !opts.showOverlay))
  410 + return;
  411 +
  412 + // bind anchors and inputs for mouse and key events
  413 + var events = 'mousedown mouseup keydown keypress';
  414 + b ? $(document).bind(events, opts, handler) : $(document).unbind(events, handler);
  415 +
  416 +// former impl...
  417 +// var $e = $('a,:input');
  418 +// b ? $e.bind(events, opts, handler) : $e.unbind(events, handler);
  419 +};
  420 +
  421 +// event handler to suppress keyboard/mouse events when blocking
  422 +function handler(e) {
  423 + // allow tab navigation (conditionally)
  424 + if (e.keyCode && e.keyCode == 9) {
  425 + if (pageBlock && e.data.constrainTabKey) {
  426 + var els = pageBlockEls;
  427 + var fwd = !e.shiftKey && e.target == els[els.length-1];
  428 + var back = e.shiftKey && e.target == els[0];
  429 + if (fwd || back) {
  430 + setTimeout(function(){focus(back)},10);
  431 + return false;
  432 + }
  433 + }
  434 + }
  435 + // allow events within the message content
  436 + if ($(e.target).parents('div.blockMsg').length > 0)
  437 + return true;
  438 +
  439 + // allow events for content that is not being blocked
  440 + return $(e.target).parents().children().filter('div.blockUI').length == 0;
  441 +};
  442 +
  443 +function focus(back) {
  444 + if (!pageBlockEls)
  445 + return;
  446 + var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];
  447 + if (e)
  448 + e.focus();
  449 +};
  450 +
  451 +function center(el, x, y) {
  452 + var p = el.parentNode, s = el.style;
  453 + var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth');
  454 + var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');
  455 + if (x) s.left = l > 0 ? (l+'px') : '0';
  456 + if (y) s.top = t > 0 ? (t+'px') : '0';
  457 +};
  458 +
  459 +function sz(el, p) {
  460 + return parseInt($.css(el,p))||0;
  461 +};
  462 +
  463 +})(jQuery);
setup/wizard/resources/jquery.form.js 0 โ†’ 100644
  1 +// $Id: jquery.form.js,v 1.2 2007/11/19 10:05:48 goba Exp $
  2 +
  3 +/*
  4 + * jQuery Form Plugin
  5 + * version: 2.01 (10/31/2007)
  6 + * @requires jQuery v1.1 or later
  7 + *
  8 + * Examples at: http://malsup.com/jquery/form/
  9 + * Dual licensed under the MIT and GPL licenses:
  10 + * http://www.opensource.org/licenses/mit-license.php
  11 + * http://www.gnu.org/licenses/gpl.html
  12 + */
  13 +eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(5($){$.7.1j=5(o){2(P o==\'5\')o={L:o};o=$.2h({1h:4.X(\'2i\')||1E.2u.3D(),I:4.X(\'2g\')||\'29\'},o||{});3 p={};$.M.N(\'R.2P.2L\',[4,o,p]);2(p.1Q)6 4;3 a=4.1z(o.2r);2(o.V){H(3 n 3u o.V)a.C({z:n,A:o.V[n]})}2(o.28&&o.28(a,4,o)===E)6 4;$.M.N(\'R.K.36\',[a,4,o,p]);2(p.1Q)6 4;3 q=$.1x(a);2(o.I.31()==\'29\'){o.1h+=(o.1h.2Z(\'?\')>=0?\'&\':\'?\')+q;o.V=B}8 o.V=q;3 r=4,U=[];2(o.1r)U.C(5(){r.1r()});2(o.1o)U.C(5(){r.1o()});2(!o.18&&o.14){3 u=o.L||5(){};U.C(5(a){2(4.1N)$(o.14).X("1M",a).1N().D(u,1L);8 $(o.14).2t(a).D(u,1L)})}8 2(o.L)U.C(o.L);o.L=5(a,b){H(3 i=0,F=U.G;i<F;i++)U[i](a,b,r)};3 v=$(\'19:3v\',4).15();3 w=E;H(3 j=0;j<v.G;j++)2(v[j])w=T;2(o.2f||w){2($.1i.3o&&o.2a)$.3l(o.2a,1l);8 1l()}8 $.3h(o);$.M.N(\'R.K.3f\',[4,o]);6 4;5 1l(){3 d=r[0];3 f=$.2h({},$.39,o);3 h=\'35\'+$.7.1j.1a++;3 i=$(\'<2f 33="\'+h+\'" z="\'+h+\'" />\');3 j=i[0];3 k=$.1i.20&&1E.20.30()<9;2($.1i.1X||k)j.2Y=\'2W:E;1w.2U("");\';i.2S({2R:\'2Q\',23:\'-24\',1R:\'-24\'});3 l={Z:B,1b:B,2K:0,2J:\'n/a\',2H:5(){},2F:5(){},2E:5(){}};3 g=f.2B;2(g&&!$.1O++)$.M.N("2x");2(g)$.M.N("2w",[l,f]);3 m=0;3 n=0;1f(5(){i.2v(\'1n\');j.1K?j.1K(\'1J\',12):j.2s(\'1I\',12,E);3 a=d.1H?\'1H\':\'2q\';3 t=r.X(\'14\');r.X({14:h,2g:\'3C\',2i:f.1h});d[a]=\'3B/R-V\';2(f.1G)1f(5(){n=T;12()},f.1G);d.K();r.X(\'14\',t)},10);5 12(){2(m++)6;j.2o?j.2o(\'1J\',12):j.3A(\'1I\',12,E);3 a=T;3z{2(n)3x\'1G\';3 b,O;O=j.2n?j.2n.1w:j.2l?j.2l:j.1w;l.Z=O.1n?O.1n.1M:B;l.1b=O.2k?O.2k:O;2(f.18==\'2j\'||f.18==\'3s\'){3 c=O.1D(\'1C\')[0];b=c?c.A:l.Z;2(f.18==\'2j\')3r("V = "+b);8 $.3q(b)}8 2(f.18==\'2m\'){b=l.1b;2(!b&&l.Z!=B)b=2d(l.Z)}8{b=l.Z}}3p(e){a=E;$.3n(f,l,\'2b\',e)}2(a){f.L(b,\'L\');2(g)$.M.N("3m",[l,f])}2(g)$.M.N("3k",[l,f]);2(g&&!--$.1O)$.M.N("3j");2(f.27)f.27(l,a?\'L\':\'2b\');1f(5(){i.3i();l.1b=B},3g)};5 2d(s,a){2(1E.26){a=25 26(\'3d.3c\');a.3b=\'E\';a.3a(s)}8 a=(25 38()).37(s,\'1A/2m\');6(a&&a.22&&a.22.1e!=\'34\')?a:B}}};$.7.1j.1a=0;$.7.W=5(a){6 4.21().K(1m).D(5(){4.1u=$.7.W.1a++;$.7.W.1t[4.1u]=a;$(":K,19:Y",4).1Z(1s)})};$.7.W.1a=1;$.7.W.1t={};5 1s(e){3 a=4.R;a.Q=4;2(4.I==\'Y\'){2(e.1Y!=S){a.11=e.1Y;a.16=e.2X}8 2(P $.7.1U==\'5\'){3 b=$(4).1U();a.11=e.1V-b.1R;a.16=e.1W-b.23}8{a.11=e.1V-4.2V;a.16=e.1W-4.32}}1f(5(){a.Q=a.11=a.16=B},10)};5 1m(){3 a=4.1u;3 b=$.7.W.1t[a];$(4).1j(b);6 E};$.7.21=5(){4.1T(\'K\',1m);6 4.D(5(){$(":K,19:Y",4).1T(\'1Z\',1s)})};$.7.1z=5(b){3 a=[];2(4.G==0)6 a;3 c=4[0];3 d=b?c.1D(\'*\'):c.2T;2(!d)6 a;H(3 i=0,F=d.G;i<F;i++){3 e=d[i];3 n=e.z;2(!n)1v;2(b&&c.Q&&e.I=="Y"){2(!e.1d&&c.Q==e)a.C({z:n+\'.x\',A:c.11},{z:n+\'.y\',A:c.16});1v}3 v=$.15(e,T);2(v&&v.1c==1g){H(3 j=0,1S=v.G;j<1S;j++)a.C({z:n,A:v[j]})}8 2(v!==B&&P v!=\'S\')a.C({z:n,A:v})}2(!b&&c.Q){3 f=c.1D("19");H(3 i=0,F=f.G;i<F;i++){3 g=f[i];3 n=g.z;2(n&&!g.1d&&g.I=="Y"&&c.Q==g)a.C({z:n+\'.x\',A:c.11},{z:n+\'.y\',A:c.16})}}6 a};$.7.2O=5(a){6 $.1x(4.1z(a))};$.7.2N=5(b){3 a=[];4.D(5(){3 n=4.z;2(!n)6;3 v=$.15(4,b);2(v&&v.1c==1g){H(3 i=0,F=v.G;i<F;i++)a.C({z:n,A:v[i]})}8 2(v!==B&&P v!=\'S\')a.C({z:4.z,A:v})});6 $.1x(a)};$.7.15=5(a){H(3 b=[],i=0,F=4.G;i<F;i++){3 c=4[i];3 v=$.15(c,a);2(v===B||P v==\'S\'||(v.1c==1g&&!v.G))1v;v.1c==1g?$.3e(b,v):b.C(v)}6 b};$.15=5(b,c){3 n=b.z,t=b.I,13=b.1e.1F();2(P c==\'S\')c=T;2(c&&(!n||b.1d||t==\'17\'||t==\'2M\'||(t==\'1q\'||t==\'1B\')&&!b.1p||(t==\'K\'||t==\'Y\')&&b.R&&b.R.Q!=b||13==\'J\'&&b.1y==-1))6 B;2(13==\'J\'){3 d=b.1y;2(d<0)6 B;3 a=[],1k=b.2I;3 e=(t==\'J-2e\');3 f=(e?d+1:1k.G);H(3 i=(e?d:0);i<f;i++){3 g=1k[i];2(g.2c){3 v=$.1i.1X&&!(g.2G[\'A\'].3t)?g.1A:g.A;2(e)6 v;a.C(v)}}6 a}6 b.A};$.7.1o=5(){6 4.D(5(){$(\'19,J,1C\',4).2p()})};$.7.2p=$.7.2D=5(){6 4.D(5(){3 t=4.I,13=4.1e.1F();2(t==\'1A\'||t==\'3w\'||13==\'1C\')4.A=\'\';8 2(t==\'1q\'||t==\'1B\')4.1p=E;8 2(13==\'J\')4.1y=-1})};$.7.1r=5(){6 4.D(5(){2(P 4.17==\'5\'||(P 4.17==\'2C\'&&!4.17.3y))4.17()})};$.7.2A=5(b){2(b==S)b=T;6 4.D(5(){4.1d=!b})};$.7.J=5(b){2(b==S)b=T;6 4.D(5(){3 t=4.I;2(t==\'1q\'||t==\'1B\')4.1p=b;8 2(4.1e.1F()==\'1P\'){3 a=$(4).2z(\'J\');2(b&&a[0]&&a[0].I==\'J-2e\'){a.2y(\'1P\').J(E)}4.2c=b}})}})(3E);',62,227,'||if|var|this|function|return|fn|else|||||||||||||||||||||||||||name|value|null|push|each|false|max|length|for|type|select|submit|success|event|trigger|doc|typeof|clk|form|undefined|true|callbacks|data|ajaxForm|attr|image|responseText||clk_x|cb|tag|target|fieldValue|clk_y|reset|dataType|input|counter|responseXML|constructor|disabled|tagName|setTimeout|Array|url|browser|ajaxSubmit|ops|fileUpload|submitHandler|body|clearForm|checked|checkbox|resetForm|clickHandler|optionHash|formPluginId|continue|document|param|selectedIndex|formToArray|text|radio|textarea|getElementsByTagName|window|toLowerCase|timeout|encoding|load|onload|attachEvent|arguments|innerHTML|evalScripts|active|option|veto|left|jmax|unbind|offset|pageX|pageY|msie|offsetX|click|opera|ajaxFormUnbind|documentElement|top|1000px|new|ActiveXObject|complete|beforeSubmit|GET|closeKeepAlive|error|selected|toXml|one|iframe|method|extend|action|json|XMLDocument|contentDocument|xml|contentWindow|detachEvent|clearFields|enctype|semantic|addEventListener|html|location|appendTo|ajaxSend|ajaxStart|find|parent|enable|global|object|clearInputs|setRequestHeader|getResponseHeader|attributes|getAllResponseHeaders|options|statusText|status|serialize|button|fieldSerialize|formSerialize|pre|absolute|position|css|elements|write|offsetLeft|javascript|offsetY|src|indexOf|version|toUpperCase|offsetTop|id|parsererror|jqFormIO|validate|parseFromString|DOMParser|ajaxSettings|loadXML|async|XMLDOM|Microsoft|merge|notify|100|ajax|remove|ajaxStop|ajaxComplete|get|ajaxSuccess|handleError|safari|catch|globalEval|eval|script|specified|in|file|password|throw|nodeType|try|removeEventListener|multipart|POST|toString|jQuery'.split('|'),0,{}))
setup/wizard/resources/jquery.js 0 โ†’ 100644
  1 +/*!
  2 + * jQuery JavaScript Library v1.3.2
  3 + * http://jquery.com/
  4 + *
  5 + * Copyright (c) 2009 John Resig
  6 + * Dual licensed under the MIT and GPL licenses.
  7 + * http://docs.jquery.com/License
  8 + *
  9 + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
  10 + * Revision: 6246
  11 + */
  12 +(function(){
  13 +
  14 +var
  15 + // Will speed up references to window, and allows munging its name.
  16 + window = this,
  17 + // Will speed up references to undefined, and allows munging its name.
  18 + undefined,
  19 + // Map over jQuery in case of overwrite
  20 + _jQuery = window.jQuery,
  21 + // Map over the $ in case of overwrite
  22 + _$ = window.$,
  23 +
  24 + jQuery = window.jQuery = window.$ = function( selector, context ) {
  25 + // The jQuery object is actually just the init constructor 'enhanced'
  26 + return new jQuery.fn.init( selector, context );
  27 + },
  28 +
  29 + // A simple way to check for HTML strings or ID strings
  30 + // (both of which we optimize for)
  31 + quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
  32 + // Is it a simple selector
  33 + isSimple = /^.[^:#\[\.,]*$/;
  34 +
  35 +jQuery.fn = jQuery.prototype = {
  36 + init: function( selector, context ) {
  37 + // Make sure that a selection was provided
  38 + selector = selector || document;
  39 +
  40 + // Handle $(DOMElement)
  41 + if ( selector.nodeType ) {
  42 + this[0] = selector;
  43 + this.length = 1;
  44 + this.context = selector;
  45 + return this;
  46 + }
  47 + // Handle HTML strings
  48 + if ( typeof selector === "string" ) {
  49 + // Are we dealing with HTML string or an ID?
  50 + var match = quickExpr.exec( selector );
  51 +
  52 + // Verify a match, and that no context was specified for #id
  53 + if ( match && (match[1] || !context) ) {
  54 +
  55 + // HANDLE: $(html) -> $(array)
  56 + if ( match[1] )
  57 + selector = jQuery.clean( [ match[1] ], context );
  58 +
  59 + // HANDLE: $("#id")
  60 + else {
  61 + var elem = document.getElementById( match[3] );
  62 +
  63 + // Handle the case where IE and Opera return items
  64 + // by name instead of ID
  65 + if ( elem && elem.id != match[3] )
  66 + return jQuery().find( selector );
  67 +
  68 + // Otherwise, we inject the element directly into the jQuery object
  69 + var ret = jQuery( elem || [] );
  70 + ret.context = document;
  71 + ret.selector = selector;
  72 + return ret;
  73 + }
  74 +
  75 + // HANDLE: $(expr, [context])
  76 + // (which is just equivalent to: $(content).find(expr)
  77 + } else
  78 + return jQuery( context ).find( selector );
  79 +
  80 + // HANDLE: $(function)
  81 + // Shortcut for document ready
  82 + } else if ( jQuery.isFunction( selector ) )
  83 + return jQuery( document ).ready( selector );
  84 +
  85 + // Make sure that old selector state is passed along
  86 + if ( selector.selector && selector.context ) {
  87 + this.selector = selector.selector;
  88 + this.context = selector.context;
  89 + }
  90 +
  91 + return this.setArray(jQuery.isArray( selector ) ?
  92 + selector :
  93 + jQuery.makeArray(selector));
  94 + },
  95 +
  96 + // Start with an empty selector
  97 + selector: "",
  98 +
  99 + // The current version of jQuery being used
  100 + jquery: "1.3.2",
  101 +
  102 + // The number of elements contained in the matched element set
  103 + size: function() {
  104 + return this.length;
  105 + },
  106 +
  107 + // Get the Nth element in the matched element set OR
  108 + // Get the whole matched element set as a clean array
  109 + get: function( num ) {
  110 + return num === undefined ?
  111 +
  112 + // Return a 'clean' array
  113 + Array.prototype.slice.call( this ) :
  114 +
  115 + // Return just the object
  116 + this[ num ];
  117 + },
  118 +
  119 + // Take an array of elements and push it onto the stack
  120 + // (returning the new matched element set)
  121 + pushStack: function( elems, name, selector ) {
  122 + // Build a new jQuery matched element set
  123 + var ret = jQuery( elems );
  124 +
  125 + // Add the old object onto the stack (as a reference)
  126 + ret.prevObject = this;
  127 +
  128 + ret.context = this.context;
  129 +
  130 + if ( name === "find" )
  131 + ret.selector = this.selector + (this.selector ? " " : "") + selector;
  132 + else if ( name )
  133 + ret.selector = this.selector + "." + name + "(" + selector + ")";
  134 +
  135 + // Return the newly-formed element set
  136 + return ret;
  137 + },
  138 +
  139 + // Force the current matched set of elements to become
  140 + // the specified array of elements (destroying the stack in the process)
  141 + // You should use pushStack() in order to do this, but maintain the stack
  142 + setArray: function( elems ) {
  143 + // Resetting the length to 0, then using the native Array push
  144 + // is a super-fast way to populate an object with array-like properties
  145 + this.length = 0;
  146 + Array.prototype.push.apply( this, elems );
  147 +
  148 + return this;
  149 + },
  150 +
  151 + // Execute a callback for every element in the matched set.
  152 + // (You can seed the arguments with an array of args, but this is
  153 + // only used internally.)
  154 + each: function( callback, args ) {
  155 + return jQuery.each( this, callback, args );
  156 + },
  157 +
  158 + // Determine the position of an element within
  159 + // the matched set of elements
  160 + index: function( elem ) {
  161 + // Locate the position of the desired element
  162 + return jQuery.inArray(
  163 + // If it receives a jQuery object, the first element is used
  164 + elem && elem.jquery ? elem[0] : elem
  165 + , this );
  166 + },
  167 +
  168 + attr: function( name, value, type ) {
  169 + var options = name;
  170 +
  171 + // Look for the case where we're accessing a style value
  172 + if ( typeof name === "string" )
  173 + if ( value === undefined )
  174 + return this[0] && jQuery[ type || "attr" ]( this[0], name );
  175 +
  176 + else {
  177 + options = {};
  178 + options[ name ] = value;
  179 + }
  180 +
  181 + // Check to see if we're setting style values
  182 + return this.each(function(i){
  183 + // Set all the styles
  184 + for ( name in options )
  185 + jQuery.attr(
  186 + type ?
  187 + this.style :
  188 + this,
  189 + name, jQuery.prop( this, options[ name ], type, i, name )
  190 + );
  191 + });
  192 + },
  193 +
  194 + css: function( key, value ) {
  195 + // ignore negative width and height values
  196 + if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
  197 + value = undefined;
  198 + return this.attr( key, value, "curCSS" );
  199 + },
  200 +
  201 + text: function( text ) {
  202 + if ( typeof text !== "object" && text != null )
  203 + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
  204 +
  205 + var ret = "";
  206 +
  207 + jQuery.each( text || this, function(){
  208 + jQuery.each( this.childNodes, function(){
  209 + if ( this.nodeType != 8 )
  210 + ret += this.nodeType != 1 ?
  211 + this.nodeValue :
  212 + jQuery.fn.text( [ this ] );
  213 + });
  214 + });
  215 +
  216 + return ret;
  217 + },
  218 +
  219 + wrapAll: function( html ) {
  220 + if ( this[0] ) {
  221 + // The elements to wrap the target around
  222 + var wrap = jQuery( html, this[0].ownerDocument ).clone();
  223 +
  224 + if ( this[0].parentNode )
  225 + wrap.insertBefore( this[0] );
  226 +
  227 + wrap.map(function(){
  228 + var elem = this;
  229 +
  230 + while ( elem.firstChild )
  231 + elem = elem.firstChild;
  232 +
  233 + return elem;
  234 + }).append(this);
  235 + }
  236 +
  237 + return this;
  238 + },
  239 +
  240 + wrapInner: function( html ) {
  241 + return this.each(function(){
  242 + jQuery( this ).contents().wrapAll( html );
  243 + });
  244 + },
  245 +
  246 + wrap: function( html ) {
  247 + return this.each(function(){
  248 + jQuery( this ).wrapAll( html );
  249 + });
  250 + },
  251 +
  252 + append: function() {
  253 + return this.domManip(arguments, true, function(elem){
  254 + if (this.nodeType == 1)
  255 + this.appendChild( elem );
  256 + });
  257 + },
  258 +
  259 + prepend: function() {
  260 + return this.domManip(arguments, true, function(elem){
  261 + if (this.nodeType == 1)
  262 + this.insertBefore( elem, this.firstChild );
  263 + });
  264 + },
  265 +
  266 + before: function() {
  267 + return this.domManip(arguments, false, function(elem){
  268 + this.parentNode.insertBefore( elem, this );
  269 + });
  270 + },
  271 +
  272 + after: function() {
  273 + return this.domManip(arguments, false, function(elem){
  274 + this.parentNode.insertBefore( elem, this.nextSibling );
  275 + });
  276 + },
  277 +
  278 + end: function() {
  279 + return this.prevObject || jQuery( [] );
  280 + },
  281 +
  282 + // For internal use only.
  283 + // Behaves like an Array's method, not like a jQuery method.
  284 + push: [].push,
  285 + sort: [].sort,
  286 + splice: [].splice,
  287 +
  288 + find: function( selector ) {
  289 + if ( this.length === 1 ) {
  290 + var ret = this.pushStack( [], "find", selector );
  291 + ret.length = 0;
  292 + jQuery.find( selector, this[0], ret );
  293 + return ret;
  294 + } else {
  295 + return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){
  296 + return jQuery.find( selector, elem );
  297 + })), "find", selector );
  298 + }
  299 + },
  300 +
  301 + clone: function( events ) {
  302 + // Do the clone
  303 + var ret = this.map(function(){
  304 + if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
  305 + // IE copies events bound via attachEvent when
  306 + // using cloneNode. Calling detachEvent on the
  307 + // clone will also remove the events from the orignal
  308 + // In order to get around this, we use innerHTML.
  309 + // Unfortunately, this means some modifications to
  310 + // attributes in IE that are actually only stored
  311 + // as properties will not be copied (such as the
  312 + // the name attribute on an input).
  313 + var html = this.outerHTML;
  314 + if ( !html ) {
  315 + var div = this.ownerDocument.createElement("div");
  316 + div.appendChild( this.cloneNode(true) );
  317 + html = div.innerHTML;
  318 + }
  319 +
  320 + return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0];
  321 + } else
  322 + return this.cloneNode(true);
  323 + });
  324 +
  325 + // Copy the events from the original to the clone
  326 + if ( events === true ) {
  327 + var orig = this.find("*").andSelf(), i = 0;
  328 +
  329 + ret.find("*").andSelf().each(function(){
  330 + if ( this.nodeName !== orig[i].nodeName )
  331 + return;
  332 +
  333 + var events = jQuery.data( orig[i], "events" );
  334 +
  335 + for ( var type in events ) {
  336 + for ( var handler in events[ type ] ) {
  337 + jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
  338 + }
  339 + }
  340 +
  341 + i++;
  342 + });
  343 + }
  344 +
  345 + // Return the cloned set
  346 + return ret;
  347 + },
  348 +
  349 + filter: function( selector ) {
  350 + return this.pushStack(
  351 + jQuery.isFunction( selector ) &&
  352 + jQuery.grep(this, function(elem, i){
  353 + return selector.call( elem, i );
  354 + }) ||
  355 +
  356 + jQuery.multiFilter( selector, jQuery.grep(this, function(elem){
  357 + return elem.nodeType === 1;
  358 + }) ), "filter", selector );
  359 + },
  360 +
  361 + closest: function( selector ) {
  362 + var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
  363 + closer = 0;
  364 +
  365 + return this.map(function(){
  366 + var cur = this;
  367 + while ( cur && cur.ownerDocument ) {
  368 + if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
  369 + jQuery.data(cur, "closest", closer);
  370 + return cur;
  371 + }
  372 + cur = cur.parentNode;
  373 + closer++;
  374 + }
  375 + });
  376 + },
  377 +
  378 + not: function( selector ) {
  379 + if ( typeof selector === "string" )
  380 + // test special case where just one selector is passed in
  381 + if ( isSimple.test( selector ) )
  382 + return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector );
  383 + else
  384 + selector = jQuery.multiFilter( selector, this );
  385 +
  386 + var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
  387 + return this.filter(function() {
  388 + return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
  389 + });
  390 + },
  391 +
  392 + add: function( selector ) {
  393 + return this.pushStack( jQuery.unique( jQuery.merge(
  394 + this.get(),
  395 + typeof selector === "string" ?
  396 + jQuery( selector ) :
  397 + jQuery.makeArray( selector )
  398 + )));
  399 + },
  400 +
  401 + is: function( selector ) {
  402 + return !!selector && jQuery.multiFilter( selector, this ).length > 0;
  403 + },
  404 +
  405 + hasClass: function( selector ) {
  406 + return !!selector && this.is( "." + selector );
  407 + },
  408 +
  409 + val: function( value ) {
  410 + if ( value === undefined ) {
  411 + var elem = this[0];
  412 +
  413 + if ( elem ) {
  414 + if( jQuery.nodeName( elem, 'option' ) )
  415 + return (elem.attributes.value || {}).specified ? elem.value : elem.text;
  416 +
  417 + // We need to handle select boxes special
  418 + if ( jQuery.nodeName( elem, "select" ) ) {
  419 + var index = elem.selectedIndex,
  420 + values = [],
  421 + options = elem.options,
  422 + one = elem.type == "select-one";
  423 +
  424 + // Nothing was selected
  425 + if ( index < 0 )
  426 + return null;
  427 +
  428 + // Loop through all the selected options
  429 + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
  430 + var option = options[ i ];
  431 +
  432 + if ( option.selected ) {
  433 + // Get the specifc value for the option
  434 + value = jQuery(option).val();
  435 +
  436 + // We don't need an array for one selects
  437 + if ( one )
  438 + return value;
  439 +
  440 + // Multi-Selects return an array
  441 + values.push( value );
  442 + }
  443 + }
  444 +
  445 + return values;
  446 + }
  447 +
  448 + // Everything else, we just grab the value
  449 + return (elem.value || "").replace(/\r/g, "");
  450 +
  451 + }
  452 +
  453 + return undefined;
  454 + }
  455 +
  456 + if ( typeof value === "number" )
  457 + value += '';
  458 +
  459 + return this.each(function(){
  460 + if ( this.nodeType != 1 )
  461 + return;
  462 +
  463 + if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) )
  464 + this.checked = (jQuery.inArray(this.value, value) >= 0 ||
  465 + jQuery.inArray(this.name, value) >= 0);
  466 +
  467 + else if ( jQuery.nodeName( this, "select" ) ) {
  468 + var values = jQuery.makeArray(value);
  469 +
  470 + jQuery( "option", this ).each(function(){
  471 + this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
  472 + jQuery.inArray( this.text, values ) >= 0);
  473 + });
  474 +
  475 + if ( !values.length )
  476 + this.selectedIndex = -1;
  477 +
  478 + } else
  479 + this.value = value;
  480 + });
  481 + },
  482 +
  483 + html: function( value ) {
  484 + return value === undefined ?
  485 + (this[0] ?
  486 + this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
  487 + null) :
  488 + this.empty().append( value );
  489 + },
  490 +
  491 + replaceWith: function( value ) {
  492 + return this.after( value ).remove();
  493 + },
  494 +
  495 + eq: function( i ) {
  496 + return this.slice( i, +i + 1 );
  497 + },
  498 +
  499 + slice: function() {
  500 + return this.pushStack( Array.prototype.slice.apply( this, arguments ),
  501 + "slice", Array.prototype.slice.call(arguments).join(",") );
  502 + },
  503 +
  504 + map: function( callback ) {
  505 + return this.pushStack( jQuery.map(this, function(elem, i){
  506 + return callback.call( elem, i, elem );
  507 + }));
  508 + },
  509 +
  510 + andSelf: function() {
  511 + return this.add( this.prevObject );
  512 + },
  513 +
  514 + domManip: function( args, table, callback ) {
  515 + if ( this[0] ) {
  516 + var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
  517 + scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ),
  518 + first = fragment.firstChild;
  519 +
  520 + if ( first )
  521 + for ( var i = 0, l = this.length; i < l; i++ )
  522 + callback.call( root(this[i], first), this.length > 1 || i > 0 ?
  523 + fragment.cloneNode(true) : fragment );
  524 +
  525 + if ( scripts )
  526 + jQuery.each( scripts, evalScript );
  527 + }
  528 +
  529 + return this;
  530 +
  531 + function root( elem, cur ) {
  532 + return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ?
  533 + (elem.getElementsByTagName("tbody")[0] ||
  534 + elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
  535 + elem;
  536 + }
  537 + }
  538 +};
  539 +
  540 +// Give the init function the jQuery prototype for later instantiation
  541 +jQuery.fn.init.prototype = jQuery.fn;
  542 +
  543 +function evalScript( i, elem ) {
  544 + if ( elem.src )
  545 + jQuery.ajax({
  546 + url: elem.src,
  547 + async: false,
  548 + dataType: "script"
  549 + });
  550 +
  551 + else
  552 + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
  553 +
  554 + if ( elem.parentNode )
  555 + elem.parentNode.removeChild( elem );
  556 +}
  557 +
  558 +function now(){
  559 + return +new Date;
  560 +}
  561 +
  562 +jQuery.extend = jQuery.fn.extend = function() {
  563 + // copy reference to target object
  564 + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
  565 +
  566 + // Handle a deep copy situation
  567 + if ( typeof target === "boolean" ) {
  568 + deep = target;
  569 + target = arguments[1] || {};
  570 + // skip the boolean and the target
  571 + i = 2;
  572 + }
  573 +
  574 + // Handle case when target is a string or something (possible in deep copy)
  575 + if ( typeof target !== "object" && !jQuery.isFunction(target) )
  576 + target = {};
  577 +
  578 + // extend jQuery itself if only one argument is passed
  579 + if ( length == i ) {
  580 + target = this;
  581 + --i;
  582 + }
  583 +
  584 + for ( ; i < length; i++ )
  585 + // Only deal with non-null/undefined values
  586 + if ( (options = arguments[ i ]) != null )
  587 + // Extend the base object
  588 + for ( var name in options ) {
  589 + var src = target[ name ], copy = options[ name ];
  590 +
  591 + // Prevent never-ending loop
  592 + if ( target === copy )
  593 + continue;
  594 +
  595 + // Recurse if we're merging object values
  596 + if ( deep && copy && typeof copy === "object" && !copy.nodeType )
  597 + target[ name ] = jQuery.extend( deep,
  598 + // Never move original objects, clone them
  599 + src || ( copy.length != null ? [ ] : { } )
  600 + , copy );
  601 +
  602 + // Don't bring in undefined values
  603 + else if ( copy !== undefined )
  604 + target[ name ] = copy;
  605 +
  606 + }
  607 +
  608 + // Return the modified object
  609 + return target;
  610 +};
  611 +
  612 +// exclude the following css properties to add px
  613 +var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
  614 + // cache defaultView
  615 + defaultView = document.defaultView || {},
  616 + toString = Object.prototype.toString;
  617 +
  618 +jQuery.extend({
  619 + noConflict: function( deep ) {
  620 + window.$ = _$;
  621 +
  622 + if ( deep )
  623 + window.jQuery = _jQuery;
  624 +
  625 + return jQuery;
  626 + },
  627 +
  628 + // See test/unit/core.js for details concerning isFunction.
  629 + // Since version 1.3, DOM methods and functions like alert
  630 + // aren't supported. They return false on IE (#2968).
  631 + isFunction: function( obj ) {
  632 + return toString.call(obj) === "[object Function]";
  633 + },
  634 +
  635 + isArray: function( obj ) {
  636 + return toString.call(obj) === "[object Array]";
  637 + },
  638 +
  639 + // check if an element is in a (or is an) XML document
  640 + isXMLDoc: function( elem ) {
  641 + return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
  642 + !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument );
  643 + },
  644 +
  645 + // Evalulates a script in a global context
  646 + globalEval: function( data ) {
  647 + if ( data && /\S/.test(data) ) {
  648 + // Inspired by code by Andrea Giammarchi
  649 + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
  650 + var head = document.getElementsByTagName("head")[0] || document.documentElement,
  651 + script = document.createElement("script");
  652 +
  653 + script.type = "text/javascript";
  654 + if ( jQuery.support.scriptEval )
  655 + script.appendChild( document.createTextNode( data ) );
  656 + else
  657 + script.text = data;
  658 +
  659 + // Use insertBefore instead of appendChild to circumvent an IE6 bug.
  660 + // This arises when a base node is used (#2709).
  661 + head.insertBefore( script, head.firstChild );
  662 + head.removeChild( script );
  663 + }
  664 + },
  665 +
  666 + nodeName: function( elem, name ) {
  667 + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
  668 + },
  669 +
  670 + // args is for internal usage only
  671 + each: function( object, callback, args ) {
  672 + var name, i = 0, length = object.length;
  673 +
  674 + if ( args ) {
  675 + if ( length === undefined ) {
  676 + for ( name in object )
  677 + if ( callback.apply( object[ name ], args ) === false )
  678 + break;
  679 + } else
  680 + for ( ; i < length; )
  681 + if ( callback.apply( object[ i++ ], args ) === false )
  682 + break;
  683 +
  684 + // A special, fast, case for the most common use of each
  685 + } else {
  686 + if ( length === undefined ) {
  687 + for ( name in object )
  688 + if ( callback.call( object[ name ], name, object[ name ] ) === false )
  689 + break;
  690 + } else
  691 + for ( var value = object[0];
  692 + i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
  693 + }
  694 +
  695 + return object;
  696 + },
  697 +
  698 + prop: function( elem, value, type, i, name ) {
  699 + // Handle executable functions
  700 + if ( jQuery.isFunction( value ) )
  701 + value = value.call( elem, i );
  702 +
  703 + // Handle passing in a number to a CSS property
  704 + return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ?
  705 + value + "px" :
  706 + value;
  707 + },
  708 +
  709 + className: {
  710 + // internal only, use addClass("class")
  711 + add: function( elem, classNames ) {
  712 + jQuery.each((classNames || "").split(/\s+/), function(i, className){
  713 + if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
  714 + elem.className += (elem.className ? " " : "") + className;
  715 + });
  716 + },
  717 +
  718 + // internal only, use removeClass("class")
  719 + remove: function( elem, classNames ) {
  720 + if (elem.nodeType == 1)
  721 + elem.className = classNames !== undefined ?
  722 + jQuery.grep(elem.className.split(/\s+/), function(className){
  723 + return !jQuery.className.has( classNames, className );
  724 + }).join(" ") :
  725 + "";
  726 + },
  727 +
  728 + // internal only, use hasClass("class")
  729 + has: function( elem, className ) {
  730 + return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
  731 + }
  732 + },
  733 +
  734 + // A method for quickly swapping in/out CSS properties to get correct calculations
  735 + swap: function( elem, options, callback ) {
  736 + var old = {};
  737 + // Remember the old values, and insert the new ones
  738 + for ( var name in options ) {
  739 + old[ name ] = elem.style[ name ];
  740 + elem.style[ name ] = options[ name ];
  741 + }
  742 +
  743 + callback.call( elem );
  744 +
  745 + // Revert the old values
  746 + for ( var name in options )
  747 + elem.style[ name ] = old[ name ];
  748 + },
  749 +
  750 + css: function( elem, name, force, extra ) {
  751 + if ( name == "width" || name == "height" ) {
  752 + var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
  753 +
  754 + function getWH() {
  755 + val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
  756 +
  757 + if ( extra === "border" )
  758 + return;
  759 +
  760 + jQuery.each( which, function() {
  761 + if ( !extra )
  762 + val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
  763 + if ( extra === "margin" )
  764 + val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
  765 + else
  766 + val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
  767 + });
  768 + }
  769 +
  770 + if ( elem.offsetWidth !== 0 )
  771 + getWH();
  772 + else
  773 + jQuery.swap( elem, props, getWH );
  774 +
  775 + return Math.max(0, Math.round(val));
  776 + }
  777 +
  778 + return jQuery.curCSS( elem, name, force );
  779 + },
  780 +
  781 + curCSS: function( elem, name, force ) {
  782 + var ret, style = elem.style;
  783 +
  784 + // We need to handle opacity special in IE
  785 + if ( name == "opacity" && !jQuery.support.opacity ) {
  786 + ret = jQuery.attr( style, "opacity" );
  787 +
  788 + return ret == "" ?
  789 + "1" :
  790 + ret;
  791 + }
  792 +
  793 + // Make sure we're using the right name for getting the float value
  794 + if ( name.match( /float/i ) )
  795 + name = styleFloat;
  796 +
  797 + if ( !force && style && style[ name ] )
  798 + ret = style[ name ];
  799 +
  800 + else if ( defaultView.getComputedStyle ) {
  801 +
  802 + // Only "float" is needed here
  803 + if ( name.match( /float/i ) )
  804 + name = "float";
  805 +
  806 + name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
  807 +
  808 + var computedStyle = defaultView.getComputedStyle( elem, null );
  809 +
  810 + if ( computedStyle )
  811 + ret = computedStyle.getPropertyValue( name );
  812 +
  813 + // We should always get a number back from opacity
  814 + if ( name == "opacity" && ret == "" )
  815 + ret = "1";
  816 +
  817 + } else if ( elem.currentStyle ) {
  818 + var camelCase = name.replace(/\-(\w)/g, function(all, letter){
  819 + return letter.toUpperCase();
  820 + });
  821 +
  822 + ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
  823 +
  824 + // From the awesome hack by Dean Edwards
  825 + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
  826 +
  827 + // If we're not dealing with a regular pixel number
  828 + // but a number that has a weird ending, we need to convert it to pixels
  829 + if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
  830 + // Remember the original values
  831 + var left = style.left, rsLeft = elem.runtimeStyle.left;
  832 +
  833 + // Put in the new values to get a computed value out
  834 + elem.runtimeStyle.left = elem.currentStyle.left;
  835 + style.left = ret || 0;
  836 + ret = style.pixelLeft + "px";
  837 +
  838 + // Revert the changed values
  839 + style.left = left;
  840 + elem.runtimeStyle.left = rsLeft;
  841 + }
  842 + }
  843 +
  844 + return ret;
  845 + },
  846 +
  847 + clean: function( elems, context, fragment ) {
  848 + context = context || document;
  849 +
  850 + // !context.createElement fails in IE with an error but returns typeof 'object'
  851 + if ( typeof context.createElement === "undefined" )
  852 + context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
  853 +
  854 + // If a single string is passed in and it's a single tag
  855 + // just do a createElement and skip the rest
  856 + if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) {
  857 + var match = /^<(\w+)\s*\/?>$/.exec(elems[0]);
  858 + if ( match )
  859 + return [ context.createElement( match[1] ) ];
  860 + }
  861 +
  862 + var ret = [], scripts = [], div = context.createElement("div");
  863 +
  864 + jQuery.each(elems, function(i, elem){
  865 + if ( typeof elem === "number" )
  866 + elem += '';
  867 +
  868 + if ( !elem )
  869 + return;
  870 +
  871 + // Convert html string into DOM nodes
  872 + if ( typeof elem === "string" ) {
  873 + // Fix "XHTML"-style tags in all browsers
  874 + elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
  875 + return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
  876 + all :
  877 + front + "></" + tag + ">";
  878 + });
  879 +
  880 + // Trim whitespace, otherwise indexOf won't work as expected
  881 + var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase();
  882 +
  883 + var wrap =
  884 + // option or optgroup
  885 + !tags.indexOf("<opt") &&
  886 + [ 1, "<select multiple='multiple'>", "</select>" ] ||
  887 +
  888 + !tags.indexOf("<leg") &&
  889 + [ 1, "<fieldset>", "</fieldset>" ] ||
  890 +
  891 + tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
  892 + [ 1, "<table>", "</table>" ] ||
  893 +
  894 + !tags.indexOf("<tr") &&
  895 + [ 2, "<table><tbody>", "</tbody></table>" ] ||
  896 +
  897 + // <thead> matched above
  898 + (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
  899 + [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
  900 +
  901 + !tags.indexOf("<col") &&
  902 + [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
  903 +
  904 + // IE can't serialize <link> and <script> tags normally
  905 + !jQuery.support.htmlSerialize &&
  906 + [ 1, "div<div>", "</div>" ] ||
  907 +
  908 + [ 0, "", "" ];
  909 +
  910 + // Go to html and back, then peel off extra wrappers
  911 + div.innerHTML = wrap[1] + elem + wrap[2];
  912 +
  913 + // Move to the right depth
  914 + while ( wrap[0]-- )
  915 + div = div.lastChild;
  916 +
  917 + // Remove IE's autoinserted <tbody> from table fragments
  918 + if ( !jQuery.support.tbody ) {
  919 +
  920 + // String was a <table>, *may* have spurious <tbody>
  921 + var hasBody = /<tbody/i.test(elem),
  922 + tbody = !tags.indexOf("<table") && !hasBody ?
  923 + div.firstChild && div.firstChild.childNodes :
  924 +
  925 + // String was a bare <thead> or <tfoot>
  926 + wrap[1] == "<table>" && !hasBody ?
  927 + div.childNodes :
  928 + [];
  929 +
  930 + for ( var j = tbody.length - 1; j >= 0 ; --j )
  931 + if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
  932 + tbody[ j ].parentNode.removeChild( tbody[ j ] );
  933 +
  934 + }
  935 +
  936 + // IE completely kills leading whitespace when innerHTML is used
  937 + if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) )
  938 + div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
  939 +
  940 + elem = jQuery.makeArray( div.childNodes );
  941 + }
  942 +
  943 + if ( elem.nodeType )
  944 + ret.push( elem );
  945 + else
  946 + ret = jQuery.merge( ret, elem );
  947 +
  948 + });
  949 +
  950 + if ( fragment ) {
  951 + for ( var i = 0; ret[i]; i++ ) {
  952 + if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
  953 + scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
  954 + } else {
  955 + if ( ret[i].nodeType === 1 )
  956 + ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
  957 + fragment.appendChild( ret[i] );
  958 + }
  959 + }
  960 +
  961 + return scripts;
  962 + }
  963 +
  964 + return ret;
  965 + },
  966 +
  967 + attr: function( elem, name, value ) {
  968 + // don't set attributes on text and comment nodes
  969 + if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
  970 + return undefined;
  971 +
  972 + var notxml = !jQuery.isXMLDoc( elem ),
  973 + // Whether we are setting (or getting)
  974 + set = value !== undefined;
  975 +
  976 + // Try to normalize/fix the name
  977 + name = notxml && jQuery.props[ name ] || name;
  978 +
  979 + // Only do all the following if this is a node (faster for style)
  980 + // IE elem.getAttribute passes even for style
  981 + if ( elem.tagName ) {
  982 +
  983 + // These attributes require special treatment
  984 + var special = /href|src|style/.test( name );
  985 +
  986 + // Safari mis-reports the default selected property of a hidden option
  987 + // Accessing the parent's selectedIndex property fixes it
  988 + if ( name == "selected" && elem.parentNode )
  989 + elem.parentNode.selectedIndex;
  990 +
  991 + // If applicable, access the attribute via the DOM 0 way
  992 + if ( name in elem && notxml && !special ) {
  993 + if ( set ){
  994 + // We can't allow the type property to be changed (since it causes problems in IE)
  995 + if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
  996 + throw "type property can't be changed";
  997 +
  998 + elem[ name ] = value;
  999 + }
  1000 +
  1001 + // browsers index elements by id/name on forms, give priority to attributes.
  1002 + if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
  1003 + return elem.getAttributeNode( name ).nodeValue;
  1004 +
  1005 + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
  1006 + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
  1007 + if ( name == "tabIndex" ) {
  1008 + var attributeNode = elem.getAttributeNode( "tabIndex" );
  1009 + return attributeNode && attributeNode.specified
  1010 + ? attributeNode.value
  1011 + : elem.nodeName.match(/(button|input|object|select|textarea)/i)
  1012 + ? 0
  1013 + : elem.nodeName.match(/^(a|area)$/i) && elem.href
  1014 + ? 0
  1015 + : undefined;
  1016 + }
  1017 +
  1018 + return elem[ name ];
  1019 + }
  1020 +
  1021 + if ( !jQuery.support.style && notxml && name == "style" )
  1022 + return jQuery.attr( elem.style, "cssText", value );
  1023 +
  1024 + if ( set )
  1025 + // convert the value to a string (all browsers do this but IE) see #1070
  1026 + elem.setAttribute( name, "" + value );
  1027 +
  1028 + var attr = !jQuery.support.hrefNormalized && notxml && special
  1029 + // Some attributes require a special call on IE
  1030 + ? elem.getAttribute( name, 2 )
  1031 + : elem.getAttribute( name );
  1032 +
  1033 + // Non-existent attributes return null, we normalize to undefined
  1034 + return attr === null ? undefined : attr;
  1035 + }
  1036 +
  1037 + // elem is actually elem.style ... set the style
  1038 +
  1039 + // IE uses filters for opacity
  1040 + if ( !jQuery.support.opacity && name == "opacity" ) {
  1041 + if ( set ) {
  1042 + // IE has trouble with opacity if it does not have layout
  1043 + // Force it by setting the zoom level
  1044 + elem.zoom = 1;
  1045 +
  1046 + // Set the alpha filter to set the opacity
  1047 + elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
  1048 + (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
  1049 + }
  1050 +
  1051 + return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
  1052 + (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
  1053 + "";
  1054 + }
  1055 +
  1056 + name = name.replace(/-([a-z])/ig, function(all, letter){
  1057 + return letter.toUpperCase();
  1058 + });
  1059 +
  1060 + if ( set )
  1061 + elem[ name ] = value;
  1062 +
  1063 + return elem[ name ];
  1064 + },
  1065 +
  1066 + trim: function( text ) {
  1067 + return (text || "").replace( /^\s+|\s+$/g, "" );
  1068 + },
  1069 +
  1070 + makeArray: function( array ) {
  1071 + var ret = [];
  1072 +
  1073 + if( array != null ){
  1074 + var i = array.length;
  1075 + // The window, strings (and functions) also have 'length'
  1076 + if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
  1077 + ret[0] = array;
  1078 + else
  1079 + while( i )
  1080 + ret[--i] = array[i];
  1081 + }
  1082 +
  1083 + return ret;
  1084 + },
  1085 +
  1086 + inArray: function( elem, array ) {
  1087 + for ( var i = 0, length = array.length; i < length; i++ )
  1088 + // Use === because on IE, window == document
  1089 + if ( array[ i ] === elem )
  1090 + return i;
  1091 +
  1092 + return -1;
  1093 + },
  1094 +
  1095 + merge: function( first, second ) {
  1096 + // We have to loop this way because IE & Opera overwrite the length
  1097 + // expando of getElementsByTagName
  1098 + var i = 0, elem, pos = first.length;
  1099 + // Also, we need to make sure that the correct elements are being returned
  1100 + // (IE returns comment nodes in a '*' query)
  1101 + if ( !jQuery.support.getAll ) {
  1102 + while ( (elem = second[ i++ ]) != null )
  1103 + if ( elem.nodeType != 8 )
  1104 + first[ pos++ ] = elem;
  1105 +
  1106 + } else
  1107 + while ( (elem = second[ i++ ]) != null )
  1108 + first[ pos++ ] = elem;
  1109 +
  1110 + return first;
  1111 + },
  1112 +
  1113 + unique: function( array ) {
  1114 + var ret = [], done = {};
  1115 +
  1116 + try {
  1117 +
  1118 + for ( var i = 0, length = array.length; i < length; i++ ) {
  1119 + var id = jQuery.data( array[ i ] );
  1120 +
  1121 + if ( !done[ id ] ) {
  1122 + done[ id ] = true;
  1123 + ret.push( array[ i ] );
  1124 + }
  1125 + }
  1126 +
  1127 + } catch( e ) {
  1128 + ret = array;
  1129 + }
  1130 +
  1131 + return ret;
  1132 + },
  1133 +
  1134 + grep: function( elems, callback, inv ) {
  1135 + var ret = [];
  1136 +
  1137 + // Go through the array, only saving the items
  1138 + // that pass the validator function
  1139 + for ( var i = 0, length = elems.length; i < length; i++ )
  1140 + if ( !inv != !callback( elems[ i ], i ) )
  1141 + ret.push( elems[ i ] );
  1142 +
  1143 + return ret;
  1144 + },
  1145 +
  1146 + map: function( elems, callback ) {
  1147 + var ret = [];
  1148 +
  1149 + // Go through the array, translating each of the items to their
  1150 + // new value (or values).
  1151 + for ( var i = 0, length = elems.length; i < length; i++ ) {
  1152 + var value = callback( elems[ i ], i );
  1153 +
  1154 + if ( value != null )
  1155 + ret[ ret.length ] = value;
  1156 + }
  1157 +
  1158 + return ret.concat.apply( [], ret );
  1159 + }
  1160 +});
  1161 +
  1162 +// Use of jQuery.browser is deprecated.
  1163 +// It's included for backwards compatibility and plugins,
  1164 +// although they should work to migrate away.
  1165 +
  1166 +var userAgent = navigator.userAgent.toLowerCase();
  1167 +
  1168 +// Figure out what browser is being used
  1169 +jQuery.browser = {
  1170 + version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
  1171 + safari: /webkit/.test( userAgent ),
  1172 + opera: /opera/.test( userAgent ),
  1173 + msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
  1174 + mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
  1175 +};
  1176 +
  1177 +jQuery.each({
  1178 + parent: function(elem){return elem.parentNode;},
  1179 + parents: function(elem){return jQuery.dir(elem,"parentNode");},
  1180 + next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
  1181 + prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
  1182 + nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
  1183 + prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
  1184 + siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
  1185 + children: function(elem){return jQuery.sibling(elem.firstChild);},
  1186 + contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
  1187 +}, function(name, fn){
  1188 + jQuery.fn[ name ] = function( selector ) {
  1189 + var ret = jQuery.map( this, fn );
  1190 +
  1191 + if ( selector && typeof selector == "string" )
  1192 + ret = jQuery.multiFilter( selector, ret );
  1193 +
  1194 + return this.pushStack( jQuery.unique( ret ), name, selector );
  1195 + };
  1196 +});
  1197 +
  1198 +jQuery.each({
  1199 + appendTo: "append",
  1200 + prependTo: "prepend",
  1201 + insertBefore: "before",
  1202 + insertAfter: "after",
  1203 + replaceAll: "replaceWith"
  1204 +}, function(name, original){
  1205 + jQuery.fn[ name ] = function( selector ) {
  1206 + var ret = [], insert = jQuery( selector );
  1207 +
  1208 + for ( var i = 0, l = insert.length; i < l; i++ ) {
  1209 + var elems = (i > 0 ? this.clone(true) : this).get();
  1210 + jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
  1211 + ret = ret.concat( elems );
  1212 + }
  1213 +
  1214 + return this.pushStack( ret, name, selector );
  1215 + };
  1216 +});
  1217 +
  1218 +jQuery.each({
  1219 + removeAttr: function( name ) {
  1220 + jQuery.attr( this, name, "" );
  1221 + if (this.nodeType == 1)
  1222 + this.removeAttribute( name );
  1223 + },
  1224 +
  1225 + addClass: function( classNames ) {
  1226 + jQuery.className.add( this, classNames );
  1227 + },
  1228 +
  1229 + removeClass: function( classNames ) {
  1230 + jQuery.className.remove( this, classNames );
  1231 + },
  1232 +
  1233 + toggleClass: function( classNames, state ) {
  1234 + if( typeof state !== "boolean" )
  1235 + state = !jQuery.className.has( this, classNames );
  1236 + jQuery.className[ state ? "add" : "remove" ]( this, classNames );
  1237 + },
  1238 +
  1239 + remove: function( selector ) {
  1240 + if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
  1241 + // Prevent memory leaks
  1242 + jQuery( "*", this ).add([this]).each(function(){
  1243 + jQuery.event.remove(this);
  1244 + jQuery.removeData(this);
  1245 + });
  1246 + if (this.parentNode)
  1247 + this.parentNode.removeChild( this );
  1248 + }
  1249 + },
  1250 +
  1251 + empty: function() {
  1252 + // Remove element nodes and prevent memory leaks
  1253 + jQuery(this).children().remove();
  1254 +
  1255 + // Remove any remaining nodes
  1256 + while ( this.firstChild )
  1257 + this.removeChild( this.firstChild );
  1258 + }
  1259 +}, function(name, fn){
  1260 + jQuery.fn[ name ] = function(){
  1261 + return this.each( fn, arguments );
  1262 + };
  1263 +});
  1264 +
  1265 +// Helper function used by the dimensions and offset modules
  1266 +function num(elem, prop) {
  1267 + return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
  1268 +}
  1269 +var expando = "jQuery" + now(), uuid = 0, windowData = {};
  1270 +
  1271 +jQuery.extend({
  1272 + cache: {},
  1273 +
  1274 + data: function( elem, name, data ) {
  1275 + elem = elem == window ?
  1276 + windowData :
  1277 + elem;
  1278 +
  1279 + var id = elem[ expando ];
  1280 +
  1281 + // Compute a unique ID for the element
  1282 + if ( !id )
  1283 + id = elem[ expando ] = ++uuid;
  1284 +
  1285 + // Only generate the data cache if we're
  1286 + // trying to access or manipulate it
  1287 + if ( name && !jQuery.cache[ id ] )
  1288 + jQuery.cache[ id ] = {};
  1289 +
  1290 + // Prevent overriding the named cache with undefined values
  1291 + if ( data !== undefined )
  1292 + jQuery.cache[ id ][ name ] = data;
  1293 +
  1294 + // Return the named cache data, or the ID for the element
  1295 + return name ?
  1296 + jQuery.cache[ id ][ name ] :
  1297 + id;
  1298 + },
  1299 +
  1300 + removeData: function( elem, name ) {
  1301 + elem = elem == window ?
  1302 + windowData :
  1303 + elem;
  1304 +
  1305 + var id = elem[ expando ];
  1306 +
  1307 + // If we want to remove a specific section of the element's data
  1308 + if ( name ) {
  1309 + if ( jQuery.cache[ id ] ) {
  1310 + // Remove the section of cache data
  1311 + delete jQuery.cache[ id ][ name ];
  1312 +
  1313 + // If we've removed all the data, remove the element's cache
  1314 + name = "";
  1315 +
  1316 + for ( name in jQuery.cache[ id ] )
  1317 + break;
  1318 +
  1319 + if ( !name )
  1320 + jQuery.removeData( elem );
  1321 + }
  1322 +
  1323 + // Otherwise, we want to remove all of the element's data
  1324 + } else {
  1325 + // Clean up the element expando
  1326 + try {
  1327 + delete elem[ expando ];
  1328 + } catch(e){
  1329 + // IE has trouble directly removing the expando
  1330 + // but it's ok with using removeAttribute
  1331 + if ( elem.removeAttribute )
  1332 + elem.removeAttribute( expando );
  1333 + }
  1334 +
  1335 + // Completely remove the data cache
  1336 + delete jQuery.cache[ id ];
  1337 + }
  1338 + },
  1339 + queue: function( elem, type, data ) {
  1340 + if ( elem ){
  1341 +
  1342 + type = (type || "fx") + "queue";
  1343 +
  1344 + var q = jQuery.data( elem, type );
  1345 +
  1346 + if ( !q || jQuery.isArray(data) )
  1347 + q = jQuery.data( elem, type, jQuery.makeArray(data) );
  1348 + else if( data )
  1349 + q.push( data );
  1350 +
  1351 + }
  1352 + return q;
  1353 + },
  1354 +
  1355 + dequeue: function( elem, type ){
  1356 + var queue = jQuery.queue( elem, type ),
  1357 + fn = queue.shift();
  1358 +
  1359 + if( !type || type === "fx" )
  1360 + fn = queue[0];
  1361 +
  1362 + if( fn !== undefined )
  1363 + fn.call(elem);
  1364 + }
  1365 +});
  1366 +
  1367 +jQuery.fn.extend({
  1368 + data: function( key, value ){
  1369 + var parts = key.split(".");
  1370 + parts[1] = parts[1] ? "." + parts[1] : "";
  1371 +
  1372 + if ( value === undefined ) {
  1373 + var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
  1374 +
  1375 + if ( data === undefined && this.length )
  1376 + data = jQuery.data( this[0], key );
  1377 +
  1378 + return data === undefined && parts[1] ?
  1379 + this.data( parts[0] ) :
  1380 + data;
  1381 + } else
  1382 + return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
  1383 + jQuery.data( this, key, value );
  1384 + });
  1385 + },
  1386 +
  1387 + removeData: function( key ){
  1388 + return this.each(function(){
  1389 + jQuery.removeData( this, key );
  1390 + });
  1391 + },
  1392 + queue: function(type, data){
  1393 + if ( typeof type !== "string" ) {
  1394 + data = type;
  1395 + type = "fx";
  1396 + }
  1397 +
  1398 + if ( data === undefined )
  1399 + return jQuery.queue( this[0], type );
  1400 +
  1401 + return this.each(function(){
  1402 + var queue = jQuery.queue( this, type, data );
  1403 +
  1404 + if( type == "fx" && queue.length == 1 )
  1405 + queue[0].call(this);
  1406 + });
  1407 + },
  1408 + dequeue: function(type){
  1409 + return this.each(function(){
  1410 + jQuery.dequeue( this, type );
  1411 + });
  1412 + }
  1413 +});/*!
  1414 + * Sizzle CSS Selector Engine - v0.9.3
  1415 + * Copyright 2009, The Dojo Foundation
  1416 + * Released under the MIT, BSD, and GPL Licenses.
  1417 + * More information: http://sizzlejs.com/
  1418 + */
  1419 +(function(){
  1420 +
  1421 +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,
  1422 + done = 0,
  1423 + toString = Object.prototype.toString;
  1424 +
  1425 +var Sizzle = function(selector, context, results, seed) {
  1426 + results = results || [];
  1427 + context = context || document;
  1428 +
  1429 + if ( context.nodeType !== 1 && context.nodeType !== 9 )
  1430 + return [];
  1431 +
  1432 + if ( !selector || typeof selector !== "string" ) {
  1433 + return results;
  1434 + }
  1435 +
  1436 + var parts = [], m, set, checkSet, check, mode, extra, prune = true;
  1437 +
  1438 + // Reset the position of the chunker regexp (start from head)
  1439 + chunker.lastIndex = 0;
  1440 +
  1441 + while ( (m = chunker.exec(selector)) !== null ) {
  1442 + parts.push( m[1] );
  1443 +
  1444 + if ( m[2] ) {
  1445 + extra = RegExp.rightContext;
  1446 + break;
  1447 + }
  1448 + }
  1449 +
  1450 + if ( parts.length > 1 && origPOS.exec( selector ) ) {
  1451 + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
  1452 + set = posProcess( parts[0] + parts[1], context );
  1453 + } else {
  1454 + set = Expr.relative[ parts[0] ] ?
  1455 + [ context ] :
  1456 + Sizzle( parts.shift(), context );
  1457 +
  1458 + while ( parts.length ) {
  1459 + selector = parts.shift();
  1460 +
  1461 + if ( Expr.relative[ selector ] )
  1462 + selector += parts.shift();
  1463 +
  1464 + set = posProcess( selector, set );
  1465 + }
  1466 + }
  1467 + } else {
  1468 + var ret = seed ?
  1469 + { expr: parts.pop(), set: makeArray(seed) } :
  1470 + Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) );
  1471 + set = Sizzle.filter( ret.expr, ret.set );
  1472 +
  1473 + if ( parts.length > 0 ) {
  1474 + checkSet = makeArray(set);
  1475 + } else {
  1476 + prune = false;
  1477 + }
  1478 +
  1479 + while ( parts.length ) {
  1480 + var cur = parts.pop(), pop = cur;
  1481 +
  1482 + if ( !Expr.relative[ cur ] ) {
  1483 + cur = "";
  1484 + } else {
  1485 + pop = parts.pop();
  1486 + }
  1487 +
  1488 + if ( pop == null ) {
  1489 + pop = context;
  1490 + }
  1491 +
  1492 + Expr.relative[ cur ]( checkSet, pop, isXML(context) );
  1493 + }
  1494 + }
  1495 +
  1496 + if ( !checkSet ) {
  1497 + checkSet = set;
  1498 + }
  1499 +
  1500 + if ( !checkSet ) {
  1501 + throw "Syntax error, unrecognized expression: " + (cur || selector);
  1502 + }
  1503 +
  1504 + if ( toString.call(checkSet) === "[object Array]" ) {
  1505 + if ( !prune ) {
  1506 + results.push.apply( results, checkSet );
  1507 + } else if ( context.nodeType === 1 ) {
  1508 + for ( var i = 0; checkSet[i] != null; i++ ) {
  1509 + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
  1510 + results.push( set[i] );
  1511 + }
  1512 + }
  1513 + } else {
  1514 + for ( var i = 0; checkSet[i] != null; i++ ) {
  1515 + if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
  1516 + results.push( set[i] );
  1517 + }
  1518 + }
  1519 + }
  1520 + } else {
  1521 + makeArray( checkSet, results );
  1522 + }
  1523 +
  1524 + if ( extra ) {
  1525 + Sizzle( extra, context, results, seed );
  1526 +
  1527 + if ( sortOrder ) {
  1528 + hasDuplicate = false;
  1529 + results.sort(sortOrder);
  1530 +
  1531 + if ( hasDuplicate ) {
  1532 + for ( var i = 1; i < results.length; i++ ) {
  1533 + if ( results[i] === results[i-1] ) {
  1534 + results.splice(i--, 1);
  1535 + }
  1536 + }
  1537 + }
  1538 + }
  1539 + }
  1540 +
  1541 + return results;
  1542 +};
  1543 +
  1544 +Sizzle.matches = function(expr, set){
  1545 + return Sizzle(expr, null, null, set);
  1546 +};
  1547 +
  1548 +Sizzle.find = function(expr, context, isXML){
  1549 + var set, match;
  1550 +
  1551 + if ( !expr ) {
  1552 + return [];
  1553 + }
  1554 +
  1555 + for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
  1556 + var type = Expr.order[i], match;
  1557 +
  1558 + if ( (match = Expr.match[ type ].exec( expr )) ) {
  1559 + var left = RegExp.leftContext;
  1560 +
  1561 + if ( left.substr( left.length - 1 ) !== "\\" ) {
  1562 + match[1] = (match[1] || "").replace(/\\/g, "");
  1563 + set = Expr.find[ type ]( match, context, isXML );
  1564 + if ( set != null ) {
  1565 + expr = expr.replace( Expr.match[ type ], "" );
  1566 + break;
  1567 + }
  1568 + }
  1569 + }
  1570 + }
  1571 +
  1572 + if ( !set ) {
  1573 + set = context.getElementsByTagName("*");
  1574 + }
  1575 +
  1576 + return {set: set, expr: expr};
  1577 +};
  1578 +
  1579 +Sizzle.filter = function(expr, set, inplace, not){
  1580 + var old = expr, result = [], curLoop = set, match, anyFound,
  1581 + isXMLFilter = set && set[0] && isXML(set[0]);
  1582 +
  1583 + while ( expr && set.length ) {
  1584 + for ( var type in Expr.filter ) {
  1585 + if ( (match = Expr.match[ type ].exec( expr )) != null ) {
  1586 + var filter = Expr.filter[ type ], found, item;
  1587 + anyFound = false;
  1588 +
  1589 + if ( curLoop == result ) {
  1590 + result = [];
  1591 + }
  1592 +
  1593 + if ( Expr.preFilter[ type ] ) {
  1594 + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
  1595 +
  1596 + if ( !match ) {
  1597 + anyFound = found = true;
  1598 + } else if ( match === true ) {
  1599 + continue;
  1600 + }
  1601 + }
  1602 +
  1603 + if ( match ) {
  1604 + for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
  1605 + if ( item ) {
  1606 + found = filter( item, match, i, curLoop );
  1607 + var pass = not ^ !!found;
  1608 +
  1609 + if ( inplace && found != null ) {
  1610 + if ( pass ) {
  1611 + anyFound = true;
  1612 + } else {
  1613 + curLoop[i] = false;
  1614 + }
  1615 + } else if ( pass ) {
  1616 + result.push( item );
  1617 + anyFound = true;
  1618 + }
  1619 + }
  1620 + }
  1621 + }
  1622 +
  1623 + if ( found !== undefined ) {
  1624 + if ( !inplace ) {
  1625 + curLoop = result;
  1626 + }
  1627 +
  1628 + expr = expr.replace( Expr.match[ type ], "" );
  1629 +
  1630 + if ( !anyFound ) {
  1631 + return [];
  1632 + }
  1633 +
  1634 + break;
  1635 + }
  1636 + }
  1637 + }
  1638 +
  1639 + // Improper expression
  1640 + if ( expr == old ) {
  1641 + if ( anyFound == null ) {
  1642 + throw "Syntax error, unrecognized expression: " + expr;
  1643 + } else {
  1644 + break;
  1645 + }
  1646 + }
  1647 +
  1648 + old = expr;
  1649 + }
  1650 +
  1651 + return curLoop;
  1652 +};
  1653 +
  1654 +var Expr = Sizzle.selectors = {
  1655 + order: [ "ID", "NAME", "TAG" ],
  1656 + match: {
  1657 + ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
  1658 + CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
  1659 + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,
  1660 + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
  1661 + TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
  1662 + CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
  1663 + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
  1664 + PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
  1665 + },
  1666 + attrMap: {
  1667 + "class": "className",
  1668 + "for": "htmlFor"
  1669 + },
  1670 + attrHandle: {
  1671 + href: function(elem){
  1672 + return elem.getAttribute("href");
  1673 + }
  1674 + },
  1675 + relative: {
  1676 + "+": function(checkSet, part, isXML){
  1677 + var isPartStr = typeof part === "string",
  1678 + isTag = isPartStr && !/\W/.test(part),
  1679 + isPartStrNotTag = isPartStr && !isTag;
  1680 +
  1681 + if ( isTag && !isXML ) {
  1682 + part = part.toUpperCase();
  1683 + }
  1684 +
  1685 + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
  1686 + if ( (elem = checkSet[i]) ) {
  1687 + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
  1688 +
  1689 + checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
  1690 + elem || false :
  1691 + elem === part;
  1692 + }
  1693 + }
  1694 +
  1695 + if ( isPartStrNotTag ) {
  1696 + Sizzle.filter( part, checkSet, true );
  1697 + }
  1698 + },
  1699 + ">": function(checkSet, part, isXML){
  1700 + var isPartStr = typeof part === "string";
  1701 +
  1702 + if ( isPartStr && !/\W/.test(part) ) {
  1703 + part = isXML ? part : part.toUpperCase();
  1704 +
  1705 + for ( var i = 0, l = checkSet.length; i < l; i++ ) {
  1706 + var elem = checkSet[i];
  1707 + if ( elem ) {
  1708 + var parent = elem.parentNode;
  1709 + checkSet[i] = parent.nodeName === part ? parent : false;
  1710 + }
  1711 + }
  1712 + } else {
  1713 + for ( var i = 0, l = checkSet.length; i < l; i++ ) {
  1714 + var elem = checkSet[i];
  1715 + if ( elem ) {
  1716 + checkSet[i] = isPartStr ?
  1717 + elem.parentNode :
  1718 + elem.parentNode === part;
  1719 + }
  1720 + }
  1721 +
  1722 + if ( isPartStr ) {
  1723 + Sizzle.filter( part, checkSet, true );
  1724 + }
  1725 + }
  1726 + },
  1727 + "": function(checkSet, part, isXML){
  1728 + var doneName = done++, checkFn = dirCheck;
  1729 +
  1730 + if ( !part.match(/\W/) ) {
  1731 + var nodeCheck = part = isXML ? part : part.toUpperCase();
  1732 + checkFn = dirNodeCheck;
  1733 + }
  1734 +
  1735 + checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
  1736 + },
  1737 + "~": function(checkSet, part, isXML){
  1738 + var doneName = done++, checkFn = dirCheck;
  1739 +
  1740 + if ( typeof part === "string" && !part.match(/\W/) ) {
  1741 + var nodeCheck = part = isXML ? part : part.toUpperCase();
  1742 + checkFn = dirNodeCheck;
  1743 + }
  1744 +
  1745 + checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
  1746 + }
  1747 + },
  1748 + find: {
  1749 + ID: function(match, context, isXML){
  1750 + if ( typeof context.getElementById !== "undefined" && !isXML ) {
  1751 + var m = context.getElementById(match[1]);
  1752 + return m ? [m] : [];
  1753 + }
  1754 + },
  1755 + NAME: function(match, context, isXML){
  1756 + if ( typeof context.getElementsByName !== "undefined" ) {
  1757 + var ret = [], results = context.getElementsByName(match[1]);
  1758 +
  1759 + for ( var i = 0, l = results.length; i < l; i++ ) {
  1760 + if ( results[i].getAttribute("name") === match[1] ) {
  1761 + ret.push( results[i] );
  1762 + }
  1763 + }
  1764 +
  1765 + return ret.length === 0 ? null : ret;
  1766 + }
  1767 + },
  1768 + TAG: function(match, context){
  1769 + return context.getElementsByTagName(match[1]);
  1770 + }
  1771 + },
  1772 + preFilter: {
  1773 + CLASS: function(match, curLoop, inplace, result, not, isXML){
  1774 + match = " " + match[1].replace(/\\/g, "") + " ";
  1775 +
  1776 + if ( isXML ) {
  1777 + return match;
  1778 + }
  1779 +
  1780 + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
  1781 + if ( elem ) {
  1782 + if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
  1783 + if ( !inplace )
  1784 + result.push( elem );
  1785 + } else if ( inplace ) {
  1786 + curLoop[i] = false;
  1787 + }
  1788 + }
  1789 + }
  1790 +
  1791 + return false;
  1792 + },
  1793 + ID: function(match){
  1794 + return match[1].replace(/\\/g, "");
  1795 + },
  1796 + TAG: function(match, curLoop){
  1797 + for ( var i = 0; curLoop[i] === false; i++ ){}
  1798 + return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
  1799 + },
  1800 + CHILD: function(match){
  1801 + if ( match[1] == "nth" ) {
  1802 + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
  1803 + var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
  1804 + match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
  1805 + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
  1806 +
  1807 + // calculate the numbers (first)n+(last) including if they are negative
  1808 + match[2] = (test[1] + (test[2] || 1)) - 0;
  1809 + match[3] = test[3] - 0;
  1810 + }
  1811 +
  1812 + // TODO: Move to normal caching system
  1813 + match[0] = done++;
  1814 +
  1815 + return match;
  1816 + },
  1817 + ATTR: function(match, curLoop, inplace, result, not, isXML){
  1818 + var name = match[1].replace(/\\/g, "");
  1819 +
  1820 + if ( !isXML && Expr.attrMap[name] ) {
  1821 + match[1] = Expr.attrMap[name];
  1822 + }
  1823 +
  1824 + if ( match[2] === "~=" ) {
  1825 + match[4] = " " + match[4] + " ";
  1826 + }
  1827 +
  1828 + return match;
  1829 + },
  1830 + PSEUDO: function(match, curLoop, inplace, result, not){
  1831 + if ( match[1] === "not" ) {
  1832 + // If we're dealing with a complex expression, or a simple one
  1833 + if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) {
  1834 + match[3] = Sizzle(match[3], null, null, curLoop);
  1835 + } else {
  1836 + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
  1837 + if ( !inplace ) {
  1838 + result.push.apply( result, ret );
  1839 + }
  1840 + return false;
  1841 + }
  1842 + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
  1843 + return true;
  1844 + }
  1845 +
  1846 + return match;
  1847 + },
  1848 + POS: function(match){
  1849 + match.unshift( true );
  1850 + return match;
  1851 + }
  1852 + },
  1853 + filters: {
  1854 + enabled: function(elem){
  1855 + return elem.disabled === false && elem.type !== "hidden";
  1856 + },
  1857 + disabled: function(elem){
  1858 + return elem.disabled === true;
  1859 + },
  1860 + checked: function(elem){
  1861 + return elem.checked === true;
  1862 + },
  1863 + selected: function(elem){
  1864 + // Accessing this property makes selected-by-default
  1865 + // options in Safari work properly
  1866 + elem.parentNode.selectedIndex;
  1867 + return elem.selected === true;
  1868 + },
  1869 + parent: function(elem){
  1870 + return !!elem.firstChild;
  1871 + },
  1872 + empty: function(elem){
  1873 + return !elem.firstChild;
  1874 + },
  1875 + has: function(elem, i, match){
  1876 + return !!Sizzle( match[3], elem ).length;
  1877 + },
  1878 + header: function(elem){
  1879 + return /h\d/i.test( elem.nodeName );
  1880 + },
  1881 + text: function(elem){
  1882 + return "text" === elem.type;
  1883 + },
  1884 + radio: function(elem){
  1885 + return "radio" === elem.type;
  1886 + },
  1887 + checkbox: function(elem){
  1888 + return "checkbox" === elem.type;
  1889 + },
  1890 + file: function(elem){
  1891 + return "file" === elem.type;
  1892 + },
  1893 + password: function(elem){
  1894 + return "password" === elem.type;
  1895 + },
  1896 + submit: function(elem){
  1897 + return "submit" === elem.type;
  1898 + },
  1899 + image: function(elem){
  1900 + return "image" === elem.type;
  1901 + },
  1902 + reset: function(elem){
  1903 + return "reset" === elem.type;
  1904 + },
  1905 + button: function(elem){
  1906 + return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
  1907 + },
  1908 + input: function(elem){
  1909 + return /input|select|textarea|button/i.test(elem.nodeName);
  1910 + }
  1911 + },
  1912 + setFilters: {
  1913 + first: function(elem, i){
  1914 + return i === 0;
  1915 + },
  1916 + last: function(elem, i, match, array){
  1917 + return i === array.length - 1;
  1918 + },
  1919 + even: function(elem, i){
  1920 + return i % 2 === 0;
  1921 + },
  1922 + odd: function(elem, i){
  1923 + return i % 2 === 1;
  1924 + },
  1925 + lt: function(elem, i, match){
  1926 + return i < match[3] - 0;
  1927 + },
  1928 + gt: function(elem, i, match){
  1929 + return i > match[3] - 0;
  1930 + },
  1931 + nth: function(elem, i, match){
  1932 + return match[3] - 0 == i;
  1933 + },
  1934 + eq: function(elem, i, match){
  1935 + return match[3] - 0 == i;
  1936 + }
  1937 + },
  1938 + filter: {
  1939 + PSEUDO: function(elem, match, i, array){
  1940 + var name = match[1], filter = Expr.filters[ name ];
  1941 +
  1942 + if ( filter ) {
  1943 + return filter( elem, i, match, array );
  1944 + } else if ( name === "contains" ) {
  1945 + return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
  1946 + } else if ( name === "not" ) {
  1947 + var not = match[3];
  1948 +
  1949 + for ( var i = 0, l = not.length; i < l; i++ ) {
  1950 + if ( not[i] === elem ) {
  1951 + return false;
  1952 + }
  1953 + }
  1954 +
  1955 + return true;
  1956 + }
  1957 + },
  1958 + CHILD: function(elem, match){
  1959 + var type = match[1], node = elem;
  1960 + switch (type) {
  1961 + case 'only':
  1962 + case 'first':
  1963 + while (node = node.previousSibling) {
  1964 + if ( node.nodeType === 1 ) return false;
  1965 + }
  1966 + if ( type == 'first') return true;
  1967 + node = elem;
  1968 + case 'last':
  1969 + while (node = node.nextSibling) {
  1970 + if ( node.nodeType === 1 ) return false;
  1971 + }
  1972 + return true;
  1973 + case 'nth':
  1974 + var first = match[2], last = match[3];
  1975 +
  1976 + if ( first == 1 && last == 0 ) {
  1977 + return true;
  1978 + }
  1979 +
  1980 + var doneName = match[0],
  1981 + parent = elem.parentNode;
  1982 +
  1983 + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
  1984 + var count = 0;
  1985 + for ( node = parent.firstChild; node; node = node.nextSibling ) {
  1986 + if ( node.nodeType === 1 ) {
  1987 + node.nodeIndex = ++count;
  1988 + }
  1989 + }
  1990 + parent.sizcache = doneName;
  1991 + }
  1992 +
  1993 + var diff = elem.nodeIndex - last;
  1994 + if ( first == 0 ) {
  1995 + return diff == 0;
  1996 + } else {
  1997 + return ( diff % first == 0 && diff / first >= 0 );
  1998 + }
  1999 + }
  2000 + },
  2001 + ID: function(elem, match){
  2002 + return elem.nodeType === 1 && elem.getAttribute("id") === match;
  2003 + },
  2004 + TAG: function(elem, match){
  2005 + return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
  2006 + },
  2007 + CLASS: function(elem, match){
  2008 + return (" " + (elem.className || elem.getAttribute("class")) + " ")
  2009 + .indexOf( match ) > -1;
  2010 + },
  2011 + ATTR: function(elem, match){
  2012 + var name = match[1],
  2013 + result = Expr.attrHandle[ name ] ?
  2014 + Expr.attrHandle[ name ]( elem ) :
  2015 + elem[ name ] != null ?
  2016 + elem[ name ] :
  2017 + elem.getAttribute( name ),
  2018 + value = result + "",
  2019 + type = match[2],
  2020 + check = match[4];
  2021 +
  2022 + return result == null ?
  2023 + type === "!=" :
  2024 + type === "=" ?
  2025 + value === check :
  2026 + type === "*=" ?
  2027 + value.indexOf(check) >= 0 :
  2028 + type === "~=" ?
  2029 + (" " + value + " ").indexOf(check) >= 0 :
  2030 + !check ?
  2031 + value && result !== false :
  2032 + type === "!=" ?
  2033 + value != check :
  2034 + type === "^=" ?
  2035 + value.indexOf(check) === 0 :
  2036 + type === "$=" ?
  2037 + value.substr(value.length - check.length) === check :
  2038 + type === "|=" ?
  2039 + value === check || value.substr(0, check.length + 1) === check + "-" :
  2040 + false;
  2041 + },
  2042 + POS: function(elem, match, i, array){
  2043 + var name = match[2], filter = Expr.setFilters[ name ];
  2044 +
  2045 + if ( filter ) {
  2046 + return filter( elem, i, match, array );
  2047 + }
  2048 + }
  2049 + }
  2050 +};
  2051 +
  2052 +var origPOS = Expr.match.POS;
  2053 +
  2054 +for ( var type in Expr.match ) {
  2055 + Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
  2056 +}
  2057 +
  2058 +var makeArray = function(array, results) {
  2059 + array = Array.prototype.slice.call( array );
  2060 +
  2061 + if ( results ) {
  2062 + results.push.apply( results, array );
  2063 + return results;
  2064 + }
  2065 +
  2066 + return array;
  2067 +};
  2068 +
  2069 +// Perform a simple check to determine if the browser is capable of
  2070 +// converting a NodeList to an array using builtin methods.
  2071 +try {
  2072 + Array.prototype.slice.call( document.documentElement.childNodes );
  2073 +
  2074 +// Provide a fallback method if it does not work
  2075 +} catch(e){
  2076 + makeArray = function(array, results) {
  2077 + var ret = results || [];
  2078 +
  2079 + if ( toString.call(array) === "[object Array]" ) {
  2080 + Array.prototype.push.apply( ret, array );
  2081 + } else {
  2082 + if ( typeof array.length === "number" ) {
  2083 + for ( var i = 0, l = array.length; i < l; i++ ) {
  2084 + ret.push( array[i] );
  2085 + }
  2086 + } else {
  2087 + for ( var i = 0; array[i]; i++ ) {
  2088 + ret.push( array[i] );
  2089 + }
  2090 + }
  2091 + }
  2092 +
  2093 + return ret;
  2094 + };
  2095 +}
  2096 +
  2097 +var sortOrder;
  2098 +
  2099 +if ( document.documentElement.compareDocumentPosition ) {
  2100 + sortOrder = function( a, b ) {
  2101 + var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
  2102 + if ( ret === 0 ) {
  2103 + hasDuplicate = true;
  2104 + }
  2105 + return ret;
  2106 + };
  2107 +} else if ( "sourceIndex" in document.documentElement ) {
  2108 + sortOrder = function( a, b ) {
  2109 + var ret = a.sourceIndex - b.sourceIndex;
  2110 + if ( ret === 0 ) {
  2111 + hasDuplicate = true;
  2112 + }
  2113 + return ret;
  2114 + };
  2115 +} else if ( document.createRange ) {
  2116 + sortOrder = function( a, b ) {
  2117 + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
  2118 + aRange.selectNode(a);
  2119 + aRange.collapse(true);
  2120 + bRange.selectNode(b);
  2121 + bRange.collapse(true);
  2122 + var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
  2123 + if ( ret === 0 ) {
  2124 + hasDuplicate = true;
  2125 + }
  2126 + return ret;
  2127 + };
  2128 +}
  2129 +
  2130 +// Check to see if the browser returns elements by name when
  2131 +// querying by getElementById (and provide a workaround)
  2132 +(function(){
  2133 + // We're going to inject a fake input element with a specified name
  2134 + var form = document.createElement("form"),
  2135 + id = "script" + (new Date).getTime();
  2136 + form.innerHTML = "<input name='" + id + "'/>";
  2137 +
  2138 + // Inject it into the root element, check its status, and remove it quickly
  2139 + var root = document.documentElement;
  2140 + root.insertBefore( form, root.firstChild );
  2141 +
  2142 + // The workaround has to do additional checks after a getElementById
  2143 + // Which slows things down for other browsers (hence the branching)
  2144 + if ( !!document.getElementById( id ) ) {
  2145 + Expr.find.ID = function(match, context, isXML){
  2146 + if ( typeof context.getElementById !== "undefined" && !isXML ) {
  2147 + var m = context.getElementById(match[1]);
  2148 + return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
  2149 + }
  2150 + };
  2151 +
  2152 + Expr.filter.ID = function(elem, match){
  2153 + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
  2154 + return elem.nodeType === 1 && node && node.nodeValue === match;
  2155 + };
  2156 + }
  2157 +
  2158 + root.removeChild( form );
  2159 +})();
  2160 +
  2161 +(function(){
  2162 + // Check to see if the browser returns only elements
  2163 + // when doing getElementsByTagName("*")
  2164 +
  2165 + // Create a fake element
  2166 + var div = document.createElement("div");
  2167 + div.appendChild( document.createComment("") );
  2168 +
  2169 + // Make sure no comments are found
  2170 + if ( div.getElementsByTagName("*").length > 0 ) {
  2171 + Expr.find.TAG = function(match, context){
  2172 + var results = context.getElementsByTagName(match[1]);
  2173 +
  2174 + // Filter out possible comments
  2175 + if ( match[1] === "*" ) {
  2176 + var tmp = [];
  2177 +
  2178 + for ( var i = 0; results[i]; i++ ) {
  2179 + if ( results[i].nodeType === 1 ) {
  2180 + tmp.push( results[i] );
  2181 + }
  2182 + }
  2183 +
  2184 + results = tmp;
  2185 + }
  2186 +
  2187 + return results;
  2188 + };
  2189 + }
  2190 +
  2191 + // Check to see if an attribute returns normalized href attributes
  2192 + div.innerHTML = "<a href='#'></a>";
  2193 + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
  2194 + div.firstChild.getAttribute("href") !== "#" ) {
  2195 + Expr.attrHandle.href = function(elem){
  2196 + return elem.getAttribute("href", 2);
  2197 + };
  2198 + }
  2199 +})();
  2200 +
  2201 +if ( document.querySelectorAll ) (function(){
  2202 + var oldSizzle = Sizzle, div = document.createElement("div");
  2203 + div.innerHTML = "<p class='TEST'></p>";
  2204 +
  2205 + // Safari can't handle uppercase or unicode characters when
  2206 + // in quirks mode.
  2207 + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
  2208 + return;
  2209 + }
  2210 +
  2211 + Sizzle = function(query, context, extra, seed){
  2212 + context = context || document;
  2213 +
  2214 + // Only use querySelectorAll on non-XML documents
  2215 + // (ID selectors don't work in non-HTML documents)
  2216 + if ( !seed && context.nodeType === 9 && !isXML(context) ) {
  2217 + try {
  2218 + return makeArray( context.querySelectorAll(query), extra );
  2219 + } catch(e){}
  2220 + }
  2221 +
  2222 + return oldSizzle(query, context, extra, seed);
  2223 + };
  2224 +
  2225 + Sizzle.find = oldSizzle.find;
  2226 + Sizzle.filter = oldSizzle.filter;
  2227 + Sizzle.selectors = oldSizzle.selectors;
  2228 + Sizzle.matches = oldSizzle.matches;
  2229 +})();
  2230 +
  2231 +if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
  2232 + var div = document.createElement("div");
  2233 + div.innerHTML = "<div class='test e'></div><div class='test'></div>";
  2234 +
  2235 + // Opera can't find a second classname (in 9.6)
  2236 + if ( div.getElementsByClassName("e").length === 0 )
  2237 + return;
  2238 +
  2239 + // Safari caches class attributes, doesn't catch changes (in 3.2)
  2240 + div.lastChild.className = "e";
  2241 +
  2242 + if ( div.getElementsByClassName("e").length === 1 )
  2243 + return;
  2244 +
  2245 + Expr.order.splice(1, 0, "CLASS");
  2246 + Expr.find.CLASS = function(match, context, isXML) {
  2247 + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
  2248 + return context.getElementsByClassName(match[1]);
  2249 + }
  2250 + };
  2251 +})();
  2252 +
  2253 +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
  2254 + var sibDir = dir == "previousSibling" && !isXML;
  2255 + for ( var i = 0, l = checkSet.length; i < l; i++ ) {
  2256 + var elem = checkSet[i];
  2257 + if ( elem ) {
  2258 + if ( sibDir && elem.nodeType === 1 ){
  2259 + elem.sizcache = doneName;
  2260 + elem.sizset = i;
  2261 + }
  2262 + elem = elem[dir];
  2263 + var match = false;
  2264 +
  2265 + while ( elem ) {
  2266 + if ( elem.sizcache === doneName ) {
  2267 + match = checkSet[elem.sizset];
  2268 + break;
  2269 + }
  2270 +
  2271 + if ( elem.nodeType === 1 && !isXML ){
  2272 + elem.sizcache = doneName;
  2273 + elem.sizset = i;
  2274 + }
  2275 +
  2276 + if ( elem.nodeName === cur ) {
  2277 + match = elem;
  2278 + break;
  2279 + }
  2280 +
  2281 + elem = elem[dir];
  2282 + }
  2283 +
  2284 + checkSet[i] = match;
  2285 + }
  2286 + }
  2287 +}
  2288 +
  2289 +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
  2290 + var sibDir = dir == "previousSibling" && !isXML;
  2291 + for ( var i = 0, l = checkSet.length; i < l; i++ ) {
  2292 + var elem = checkSet[i];
  2293 + if ( elem ) {
  2294 + if ( sibDir && elem.nodeType === 1 ) {
  2295 + elem.sizcache = doneName;
  2296 + elem.sizset = i;
  2297 + }
  2298 + elem = elem[dir];
  2299 + var match = false;
  2300 +
  2301 + while ( elem ) {
  2302 + if ( elem.sizcache === doneName ) {
  2303 + match = checkSet[elem.sizset];
  2304 + break;
  2305 + }
  2306 +
  2307 + if ( elem.nodeType === 1 ) {
  2308 + if ( !isXML ) {
  2309 + elem.sizcache = doneName;
  2310 + elem.sizset = i;
  2311 + }
  2312 + if ( typeof cur !== "string" ) {
  2313 + if ( elem === cur ) {
  2314 + match = true;
  2315 + break;
  2316 + }
  2317 +
  2318 + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
  2319 + match = elem;
  2320 + break;
  2321 + }
  2322 + }
  2323 +
  2324 + elem = elem[dir];
  2325 + }
  2326 +
  2327 + checkSet[i] = match;
  2328 + }
  2329 + }
  2330 +}
  2331 +
  2332 +var contains = document.compareDocumentPosition ? function(a, b){
  2333 + return a.compareDocumentPosition(b) & 16;
  2334 +} : function(a, b){
  2335 + return a !== b && (a.contains ? a.contains(b) : true);
  2336 +};
  2337 +
  2338 +var isXML = function(elem){
  2339 + return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
  2340 + !!elem.ownerDocument && isXML( elem.ownerDocument );
  2341 +};
  2342 +
  2343 +var posProcess = function(selector, context){
  2344 + var tmpSet = [], later = "", match,
  2345 + root = context.nodeType ? [context] : context;
  2346 +
  2347 + // Position selectors must be done after the filter
  2348 + // And so must :not(positional) so we move all PSEUDOs to the end
  2349 + while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
  2350 + later += match[0];
  2351 + selector = selector.replace( Expr.match.PSEUDO, "" );
  2352 + }
  2353 +
  2354 + selector = Expr.relative[selector] ? selector + "*" : selector;
  2355 +
  2356 + for ( var i = 0, l = root.length; i < l; i++ ) {
  2357 + Sizzle( selector, root[i], tmpSet );
  2358 + }
  2359 +
  2360 + return Sizzle.filter( later, tmpSet );
  2361 +};
  2362 +
  2363 +// EXPOSE
  2364 +jQuery.find = Sizzle;
  2365 +jQuery.filter = Sizzle.filter;
  2366 +jQuery.expr = Sizzle.selectors;
  2367 +jQuery.expr[":"] = jQuery.expr.filters;
  2368 +
  2369 +Sizzle.selectors.filters.hidden = function(elem){
  2370 + return elem.offsetWidth === 0 || elem.offsetHeight === 0;
  2371 +};
  2372 +
  2373 +Sizzle.selectors.filters.visible = function(elem){
  2374 + return elem.offsetWidth > 0 || elem.offsetHeight > 0;
  2375 +};
  2376 +
  2377 +Sizzle.selectors.filters.animated = function(elem){
  2378 + return jQuery.grep(jQuery.timers, function(fn){
  2379 + return elem === fn.elem;
  2380 + }).length;
  2381 +};
  2382 +
  2383 +jQuery.multiFilter = function( expr, elems, not ) {
  2384 + if ( not ) {
  2385 + expr = ":not(" + expr + ")";
  2386 + }
  2387 +
  2388 + return Sizzle.matches(expr, elems);
  2389 +};
  2390 +
  2391 +jQuery.dir = function( elem, dir ){
  2392 + var matched = [], cur = elem[dir];
  2393 + while ( cur && cur != document ) {
  2394 + if ( cur.nodeType == 1 )
  2395 + matched.push( cur );
  2396 + cur = cur[dir];
  2397 + }
  2398 + return matched;
  2399 +};
  2400 +
  2401 +jQuery.nth = function(cur, result, dir, elem){
  2402 + result = result || 1;
  2403 + var num = 0;
  2404 +
  2405 + for ( ; cur; cur = cur[dir] )
  2406 + if ( cur.nodeType == 1 && ++num == result )
  2407 + break;
  2408 +
  2409 + return cur;
  2410 +};
  2411 +
  2412 +jQuery.sibling = function(n, elem){
  2413 + var r = [];
  2414 +
  2415 + for ( ; n; n = n.nextSibling ) {
  2416 + if ( n.nodeType == 1 && n != elem )
  2417 + r.push( n );
  2418 + }
  2419 +
  2420 + return r;
  2421 +};
  2422 +
  2423 +return;
  2424 +
  2425 +window.Sizzle = Sizzle;
  2426 +
  2427 +})();
  2428 +/*
  2429 + * A number of helper functions used for managing events.
  2430 + * Many of the ideas behind this code originated from
  2431 + * Dean Edwards' addEvent library.
  2432 + */
  2433 +jQuery.event = {
  2434 +
  2435 + // Bind an event to an element
  2436 + // Original by Dean Edwards
  2437 + add: function(elem, types, handler, data) {
  2438 + if ( elem.nodeType == 3 || elem.nodeType == 8 )
  2439 + return;
  2440 +
  2441 + // For whatever reason, IE has trouble passing the window object
  2442 + // around, causing it to be cloned in the process
  2443 + if ( elem.setInterval && elem != window )
  2444 + elem = window;
  2445 +
  2446 + // Make sure that the function being executed has a unique ID
  2447 + if ( !handler.guid )
  2448 + handler.guid = this.guid++;
  2449 +
  2450 + // if data is passed, bind to handler
  2451 + if ( data !== undefined ) {
  2452 + // Create temporary function pointer to original handler
  2453 + var fn = handler;
  2454 +
  2455 + // Create unique handler function, wrapped around original handler
  2456 + handler = this.proxy( fn );
  2457 +
  2458 + // Store data in unique handler
  2459 + handler.data = data;
  2460 + }
  2461 +
  2462 + // Init the element's event structure
  2463 + var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
  2464 + handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
  2465 + // Handle the second event of a trigger and when
  2466 + // an event is called after a page has unloaded
  2467 + return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
  2468 + jQuery.event.handle.apply(arguments.callee.elem, arguments) :
  2469 + undefined;
  2470 + });
  2471 + // Add elem as a property of the handle function
  2472 + // This is to prevent a memory leak with non-native
  2473 + // event in IE.
  2474 + handle.elem = elem;
  2475 +
  2476 + // Handle multiple events separated by a space
  2477 + // jQuery(...).bind("mouseover mouseout", fn);
  2478 + jQuery.each(types.split(/\s+/), function(index, type) {
  2479 + // Namespaced event handlers
  2480 + var namespaces = type.split(".");
  2481 + type = namespaces.shift();
  2482 + handler.type = namespaces.slice().sort().join(".");
  2483 +
  2484 + // Get the current list of functions bound to this event
  2485 + var handlers = events[type];
  2486 +
  2487 + if ( jQuery.event.specialAll[type] )
  2488 + jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
  2489 +
  2490 + // Init the event handler queue
  2491 + if (!handlers) {
  2492 + handlers = events[type] = {};
  2493 +
  2494 + // Check for a special event handler
  2495 + // Only use addEventListener/attachEvent if the special
  2496 + // events handler returns false
  2497 + if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
  2498 + // Bind the global event handler to the element
  2499 + if (elem.addEventListener)
  2500 + elem.addEventListener(type, handle, false);
  2501 + else if (elem.attachEvent)
  2502 + elem.attachEvent("on" + type, handle);
  2503 + }
  2504 + }
  2505 +
  2506 + // Add the function to the element's handler list
  2507 + handlers[handler.guid] = handler;
  2508 +
  2509 + // Keep track of which events have been used, for global triggering
  2510 + jQuery.event.global[type] = true;
  2511 + });
  2512 +
  2513 + // Nullify elem to prevent memory leaks in IE
  2514 + elem = null;
  2515 + },
  2516 +
  2517 + guid: 1,
  2518 + global: {},
  2519 +
  2520 + // Detach an event or set of events from an element
  2521 + remove: function(elem, types, handler) {
  2522 + // don't do events on text and comment nodes
  2523 + if ( elem.nodeType == 3 || elem.nodeType == 8 )
  2524 + return;
  2525 +
  2526 + var events = jQuery.data(elem, "events"), ret, index;
  2527 +
  2528 + if ( events ) {
  2529 + // Unbind all events for the element
  2530 + if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") )
  2531 + for ( var type in events )
  2532 + this.remove( elem, type + (types || "") );
  2533 + else {
  2534 + // types is actually an event object here
  2535 + if ( types.type ) {
  2536 + handler = types.handler;
  2537 + types = types.type;
  2538 + }
  2539 +
  2540 + // Handle multiple events seperated by a space
  2541 + // jQuery(...).unbind("mouseover mouseout", fn);
  2542 + jQuery.each(types.split(/\s+/), function(index, type){
  2543 + // Namespaced event handlers
  2544 + var namespaces = type.split(".");
  2545 + type = namespaces.shift();
  2546 + var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
  2547 +
  2548 + if ( events[type] ) {
  2549 + // remove the given handler for the given type
  2550 + if ( handler )
  2551 + delete events[type][handler.guid];
  2552 +
  2553 + // remove all handlers for the given type
  2554 + else
  2555 + for ( var handle in events[type] )
  2556 + // Handle the removal of namespaced events
  2557 + if ( namespace.test(events[type][handle].type) )
  2558 + delete events[type][handle];
  2559 +
  2560 + if ( jQuery.event.specialAll[type] )
  2561 + jQuery.event.specialAll[type].teardown.call(elem, namespaces);
  2562 +
  2563 + // remove generic event handler if no more handlers exist
  2564 + for ( ret in events[type] ) break;
  2565 + if ( !ret ) {
  2566 + if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
  2567 + if (elem.removeEventListener)
  2568 + elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
  2569 + else if (elem.detachEvent)
  2570 + elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
  2571 + }
  2572 + ret = null;
  2573 + delete events[type];
  2574 + }
  2575 + }
  2576 + });
  2577 + }
  2578 +
  2579 + // Remove the expando if it's no longer used
  2580 + for ( ret in events ) break;
  2581 + if ( !ret ) {
  2582 + var handle = jQuery.data( elem, "handle" );
  2583 + if ( handle ) handle.elem = null;
  2584 + jQuery.removeData( elem, "events" );
  2585 + jQuery.removeData( elem, "handle" );
  2586 + }
  2587 + }
  2588 + },
  2589 +
  2590 + // bubbling is internal
  2591 + trigger: function( event, data, elem, bubbling ) {
  2592 + // Event object or event type
  2593 + var type = event.type || event;
  2594 +
  2595 + if( !bubbling ){
  2596 + event = typeof event === "object" ?
  2597 + // jQuery.Event object
  2598 + event[expando] ? event :
  2599 + // Object literal
  2600 + jQuery.extend( jQuery.Event(type), event ) :
  2601 + // Just the event type (string)
  2602 + jQuery.Event(type);
  2603 +
  2604 + if ( type.indexOf("!") >= 0 ) {
  2605 + event.type = type = type.slice(0, -1);
  2606 + event.exclusive = true;
  2607 + }
  2608 +
  2609 + // Handle a global trigger
  2610 + if ( !elem ) {
  2611 + // Don't bubble custom events when global (to avoid too much overhead)
  2612 + event.stopPropagation();
  2613 + // Only trigger if we've ever bound an event for it
  2614 + if ( this.global[type] )
  2615 + jQuery.each( jQuery.cache, function(){
  2616 + if ( this.events && this.events[type] )
  2617 + jQuery.event.trigger( event, data, this.handle.elem );
  2618 + });
  2619 + }
  2620 +
  2621 + // Handle triggering a single element
  2622 +
  2623 + // don't do events on text and comment nodes
  2624 + if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
  2625 + return undefined;
  2626 +
  2627 + // Clean up in case it is reused
  2628 + event.result = undefined;
  2629 + event.target = elem;
  2630 +
  2631 + // Clone the incoming data, if any
  2632 + data = jQuery.makeArray(data);
  2633 + data.unshift( event );
  2634 + }
  2635 +
  2636 + event.currentTarget = elem;
  2637 +
  2638 + // Trigger the event, it is assumed that "handle" is a function
  2639 + var handle = jQuery.data(elem, "handle");
  2640 + if ( handle )
  2641 + handle.apply( elem, data );
  2642 +
  2643 + // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
  2644 + if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
  2645 + event.result = false;
  2646 +
  2647 + // Trigger the native events (except for clicks on links)
  2648 + if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
  2649 + this.triggered = true;
  2650 + try {
  2651 + elem[ type ]();
  2652 + // prevent IE from throwing an error for some hidden elements
  2653 + } catch (e) {}
  2654 + }
  2655 +
  2656 + this.triggered = false;
  2657 +
  2658 + if ( !event.isPropagationStopped() ) {
  2659 + var parent = elem.parentNode || elem.ownerDocument;
  2660 + if ( parent )
  2661 + jQuery.event.trigger(event, data, parent, true);
  2662 + }
  2663 + },
  2664 +
  2665 + handle: function(event) {
  2666 + // returned undefined or false
  2667 + var all, handlers;
  2668 +
  2669 + event = arguments[0] = jQuery.event.fix( event || window.event );
  2670 + event.currentTarget = this;
  2671 +
  2672 + // Namespaced event handlers
  2673 + var namespaces = event.type.split(".");
  2674 + event.type = namespaces.shift();
  2675 +
  2676 + // Cache this now, all = true means, any handler
  2677 + all = !namespaces.length && !event.exclusive;
  2678 +
  2679 + var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
  2680 +
  2681 + handlers = ( jQuery.data(this, "events") || {} )[event.type];
  2682 +
  2683 + for ( var j in handlers ) {
  2684 + var handler = handlers[j];
  2685 +
  2686 + // Filter the functions by class
  2687 + if ( all || namespace.test(handler.type) ) {
  2688 + // Pass in a reference to the handler function itself
  2689 + // So that we can later remove it
  2690 + event.handler = handler;
  2691 + event.data = handler.data;
  2692 +
  2693 + var ret = handler.apply(this, arguments);
  2694 +
  2695 + if( ret !== undefined ){
  2696 + event.result = ret;
  2697 + if ( ret === false ) {
  2698 + event.preventDefault();
  2699 + event.stopPropagation();
  2700 + }
  2701 + }
  2702 +
  2703 + if( event.isImmediatePropagationStopped() )
  2704 + break;
  2705 +
  2706 + }
  2707 + }
  2708 + },
  2709 +
  2710 + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
  2711 +
  2712 + fix: function(event) {
  2713 + if ( event[expando] )
  2714 + return event;
  2715 +
  2716 + // store a copy of the original event object
  2717 + // and "clone" to set read-only properties
  2718 + var originalEvent = event;
  2719 + event = jQuery.Event( originalEvent );
  2720 +
  2721 + for ( var i = this.props.length, prop; i; ){
  2722 + prop = this.props[ --i ];
  2723 + event[ prop ] = originalEvent[ prop ];
  2724 + }
  2725 +
  2726 + // Fix target property, if necessary
  2727 + if ( !event.target )
  2728 + event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
  2729 +
  2730 + // check if target is a textnode (safari)
  2731 + if ( event.target.nodeType == 3 )
  2732 + event.target = event.target.parentNode;
  2733 +
  2734 + // Add relatedTarget, if necessary
  2735 + if ( !event.relatedTarget && event.fromElement )
  2736 + event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
  2737 +
  2738 + // Calculate pageX/Y if missing and clientX/Y available
  2739 + if ( event.pageX == null && event.clientX != null ) {
  2740 + var doc = document.documentElement, body = document.body;
  2741 + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
  2742 + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
  2743 + }
  2744 +
  2745 + // Add which for key events
  2746 + if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
  2747 + event.which = event.charCode || event.keyCode;
  2748 +
  2749 + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
  2750 + if ( !event.metaKey && event.ctrlKey )
  2751 + event.metaKey = event.ctrlKey;
  2752 +
  2753 + // Add which for click: 1 == left; 2 == middle; 3 == right
  2754 + // Note: button is not normalized, so don't use it
  2755 + if ( !event.which && event.button )
  2756 + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
  2757 +
  2758 + return event;
  2759 + },
  2760 +
  2761 + proxy: function( fn, proxy ){
  2762 + proxy = proxy || function(){ return fn.apply(this, arguments); };
  2763 + // Set the guid of unique handler to the same of original handler, so it can be removed
  2764 + proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
  2765 + // So proxy can be declared as an argument
  2766 + return proxy;
  2767 + },
  2768 +
  2769 + special: {
  2770 + ready: {
  2771 + // Make sure the ready event is setup
  2772 + setup: bindReady,
  2773 + teardown: function() {}
  2774 + }
  2775 + },
  2776 +
  2777 + specialAll: {
  2778 + live: {
  2779 + setup: function( selector, namespaces ){
  2780 + jQuery.event.add( this, namespaces[0], liveHandler );
  2781 + },
  2782 + teardown: function( namespaces ){
  2783 + if ( namespaces.length ) {
  2784 + var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
  2785 +
  2786 + jQuery.each( (jQuery.data(this, "events").live || {}), function(){
  2787 + if ( name.test(this.type) )
  2788 + remove++;
  2789 + });
  2790 +
  2791 + if ( remove < 1 )
  2792 + jQuery.event.remove( this, namespaces[0], liveHandler );
  2793 + }
  2794 + }
  2795 + }
  2796 + }
  2797 +};
  2798 +
  2799 +jQuery.Event = function( src ){
  2800 + // Allow instantiation without the 'new' keyword
  2801 + if( !this.preventDefault )
  2802 + return new jQuery.Event(src);
  2803 +
  2804 + // Event object
  2805 + if( src && src.type ){
  2806 + this.originalEvent = src;
  2807 + this.type = src.type;
  2808 + // Event type
  2809 + }else
  2810 + this.type = src;
  2811 +
  2812 + // timeStamp is buggy for some events on Firefox(#3843)
  2813 + // So we won't rely on the native value
  2814 + this.timeStamp = now();
  2815 +
  2816 + // Mark it as fixed
  2817 + this[expando] = true;
  2818 +};
  2819 +
  2820 +function returnFalse(){
  2821 + return false;
  2822 +}
  2823 +function returnTrue(){
  2824 + return true;
  2825 +}
  2826 +
  2827 +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
  2828 +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
  2829 +jQuery.Event.prototype = {
  2830 + preventDefault: function() {
  2831 + this.isDefaultPrevented = returnTrue;
  2832 +
  2833 + var e = this.originalEvent;
  2834 + if( !e )
  2835 + return;
  2836 + // if preventDefault exists run it on the original event
  2837 + if (e.preventDefault)
  2838 + e.preventDefault();
  2839 + // otherwise set the returnValue property of the original event to false (IE)
  2840 + e.returnValue = false;
  2841 + },
  2842 + stopPropagation: function() {
  2843 + this.isPropagationStopped = returnTrue;
  2844 +
  2845 + var e = this.originalEvent;
  2846 + if( !e )
  2847 + return;
  2848 + // if stopPropagation exists run it on the original event
  2849 + if (e.stopPropagation)
  2850 + e.stopPropagation();
  2851 + // otherwise set the cancelBubble property of the original event to true (IE)
  2852 + e.cancelBubble = true;
  2853 + },
  2854 + stopImmediatePropagation:function(){
  2855 + this.isImmediatePropagationStopped = returnTrue;
  2856 + this.stopPropagation();
  2857 + },
  2858 + isDefaultPrevented: returnFalse,
  2859 + isPropagationStopped: returnFalse,
  2860 + isImmediatePropagationStopped: returnFalse
  2861 +};
  2862 +// Checks if an event happened on an element within another element
  2863 +// Used in jQuery.event.special.mouseenter and mouseleave handlers
  2864 +var withinElement = function(event) {
  2865 + // Check if mouse(over|out) are still within the same parent element
  2866 + var parent = event.relatedTarget;
  2867 + // Traverse up the tree
  2868 + while ( parent && parent != this )
  2869 + try { parent = parent.parentNode; }
  2870 + catch(e) { parent = this; }
  2871 +
  2872 + if( parent != this ){
  2873 + // set the correct event type
  2874 + event.type = event.data;
  2875 + // handle event if we actually just moused on to a non sub-element
  2876 + jQuery.event.handle.apply( this, arguments );
  2877 + }
  2878 +};
  2879 +
  2880 +jQuery.each({
  2881 + mouseover: 'mouseenter',
  2882 + mouseout: 'mouseleave'
  2883 +}, function( orig, fix ){
  2884 + jQuery.event.special[ fix ] = {
  2885 + setup: function(){
  2886 + jQuery.event.add( this, orig, withinElement, fix );
  2887 + },
  2888 + teardown: function(){
  2889 + jQuery.event.remove( this, orig, withinElement );
  2890 + }
  2891 + };
  2892 +});
  2893 +
  2894 +jQuery.fn.extend({
  2895 + bind: function( type, data, fn ) {
  2896 + return type == "unload" ? this.one(type, data, fn) : this.each(function(){
  2897 + jQuery.event.add( this, type, fn || data, fn && data );
  2898 + });
  2899 + },
  2900 +
  2901 + one: function( type, data, fn ) {
  2902 + var one = jQuery.event.proxy( fn || data, function(event) {
  2903 + jQuery(this).unbind(event, one);
  2904 + return (fn || data).apply( this, arguments );
  2905 + });
  2906 + return this.each(function(){
  2907 + jQuery.event.add( this, type, one, fn && data);
  2908 + });
  2909 + },
  2910 +
  2911 + unbind: function( type, fn ) {
  2912 + return this.each(function(){
  2913 + jQuery.event.remove( this, type, fn );
  2914 + });
  2915 + },
  2916 +
  2917 + trigger: function( type, data ) {
  2918 + return this.each(function(){
  2919 + jQuery.event.trigger( type, data, this );
  2920 + });
  2921 + },
  2922 +
  2923 + triggerHandler: function( type, data ) {
  2924 + if( this[0] ){
  2925 + var event = jQuery.Event(type);
  2926 + event.preventDefault();
  2927 + event.stopPropagation();
  2928 + jQuery.event.trigger( event, data, this[0] );
  2929 + return event.result;
  2930 + }
  2931 + },
  2932 +
  2933 + toggle: function( fn ) {
  2934 + // Save reference to arguments for access in closure
  2935 + var args = arguments, i = 1;
  2936 +
  2937 + // link all the functions, so any of them can unbind this click handler
  2938 + while( i < args.length )
  2939 + jQuery.event.proxy( fn, args[i++] );
  2940 +
  2941 + return this.click( jQuery.event.proxy( fn, function(event) {
  2942 + // Figure out which function to execute
  2943 + this.lastToggle = ( this.lastToggle || 0 ) % i;
  2944 +
  2945 + // Make sure that clicks stop
  2946 + event.preventDefault();
  2947 +
  2948 + // and execute the function
  2949 + return args[ this.lastToggle++ ].apply( this, arguments ) || false;
  2950 + }));
  2951 + },
  2952 +
  2953 + hover: function(fnOver, fnOut) {
  2954 + return this.mouseenter(fnOver).mouseleave(fnOut);
  2955 + },
  2956 +
  2957 + ready: function(fn) {
  2958 + // Attach the listeners
  2959 + bindReady();
  2960 +
  2961 + // If the DOM is already ready
  2962 + if ( jQuery.isReady )
  2963 + // Execute the function immediately
  2964 + fn.call( document, jQuery );
  2965 +
  2966 + // Otherwise, remember the function for later
  2967 + else
  2968 + // Add the function to the wait list
  2969 + jQuery.readyList.push( fn );
  2970 +
  2971 + return this;
  2972 + },
  2973 +
  2974 + live: function( type, fn ){
  2975 + var proxy = jQuery.event.proxy( fn );
  2976 + proxy.guid += this.selector + type;
  2977 +
  2978 + jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
  2979 +
  2980 + return this;
  2981 + },
  2982 +
  2983 + die: function( type, fn ){
  2984 + jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
  2985 + return this;
  2986 + }
  2987 +});
  2988 +
  2989 +function liveHandler( event ){
  2990 + var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
  2991 + stop = true,
  2992 + elems = [];
  2993 +
  2994 + jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
  2995 + if ( check.test(fn.type) ) {
  2996 + var elem = jQuery(event.target).closest(fn.data)[0];
  2997 + if ( elem )
  2998 + elems.push({ elem: elem, fn: fn });
  2999 + }
  3000 + });
  3001 +
  3002 + elems.sort(function(a,b) {
  3003 + return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest");
  3004 + });
  3005 +
  3006 + jQuery.each(elems, function(){
  3007 + if ( this.fn.call(this.elem, event, this.fn.data) === false )
  3008 + return (stop = false);
  3009 + });
  3010 +
  3011 + return stop;
  3012 +}
  3013 +
  3014 +function liveConvert(type, selector){
  3015 + return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
  3016 +}
  3017 +
  3018 +jQuery.extend({
  3019 + isReady: false,
  3020 + readyList: [],
  3021 + // Handle when the DOM is ready
  3022 + ready: function() {
  3023 + // Make sure that the DOM is not already loaded
  3024 + if ( !jQuery.isReady ) {
  3025 + // Remember that the DOM is ready
  3026 + jQuery.isReady = true;
  3027 +
  3028 + // If there are functions bound, to execute
  3029 + if ( jQuery.readyList ) {
  3030 + // Execute all of them
  3031 + jQuery.each( jQuery.readyList, function(){
  3032 + this.call( document, jQuery );
  3033 + });
  3034 +
  3035 + // Reset the list of functions
  3036 + jQuery.readyList = null;
  3037 + }
  3038 +
  3039 + // Trigger any bound ready events
  3040 + jQuery(document).triggerHandler("ready");
  3041 + }
  3042 + }
  3043 +});
  3044 +
  3045 +var readyBound = false;
  3046 +
  3047 +function bindReady(){
  3048 + if ( readyBound ) return;
  3049 + readyBound = true;
  3050 +
  3051 + // Mozilla, Opera and webkit nightlies currently support this event
  3052 + if ( document.addEventListener ) {
  3053 + // Use the handy event callback
  3054 + document.addEventListener( "DOMContentLoaded", function(){
  3055 + document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
  3056 + jQuery.ready();
  3057 + }, false );
  3058 +
  3059 + // If IE event model is used
  3060 + } else if ( document.attachEvent ) {
  3061 + // ensure firing before onload,
  3062 + // maybe late but safe also for iframes
  3063 + document.attachEvent("onreadystatechange", function(){
  3064 + if ( document.readyState === "complete" ) {
  3065 + document.detachEvent( "onreadystatechange", arguments.callee );
  3066 + jQuery.ready();
  3067 + }
  3068 + });
  3069 +
  3070 + // If IE and not an iframe
  3071 + // continually check to see if the document is ready
  3072 + if ( document.documentElement.doScroll && window == window.top ) (function(){
  3073 + if ( jQuery.isReady ) return;
  3074 +
  3075 + try {
  3076 + // If IE is used, use the trick by Diego Perini
  3077 + // http://javascript.nwbox.com/IEContentLoaded/
  3078 + document.documentElement.doScroll("left");
  3079 + } catch( error ) {
  3080 + setTimeout( arguments.callee, 0 );
  3081 + return;
  3082 + }
  3083 +
  3084 + // and execute any waiting functions
  3085 + jQuery.ready();
  3086 + })();
  3087 + }
  3088 +
  3089 + // A fallback to window.onload, that will always work
  3090 + jQuery.event.add( window, "load", jQuery.ready );
  3091 +}
  3092 +
  3093 +jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
  3094 + "mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
  3095 + "change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
  3096 +
  3097 + // Handle event binding
  3098 + jQuery.fn[name] = function(fn){
  3099 + return fn ? this.bind(name, fn) : this.trigger(name);
  3100 + };
  3101 +});
  3102 +
  3103 +// Prevent memory leaks in IE
  3104 +// And prevent errors on refresh with events like mouseover in other browsers
  3105 +// Window isn't included so as not to unbind existing unload events
  3106 +jQuery( window ).bind( 'unload', function(){
  3107 + for ( var id in jQuery.cache )
  3108 + // Skip the window
  3109 + if ( id != 1 && jQuery.cache[ id ].handle )
  3110 + jQuery.event.remove( jQuery.cache[ id ].handle.elem );
  3111 +});
  3112 +(function(){
  3113 +
  3114 + jQuery.support = {};
  3115 +
  3116 + var root = document.documentElement,
  3117 + script = document.createElement("script"),
  3118 + div = document.createElement("div"),
  3119 + id = "script" + (new Date).getTime();
  3120 +
  3121 + div.style.display = "none";
  3122 + div.innerHTML = ' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';
  3123 +
  3124 + var all = div.getElementsByTagName("*"),
  3125 + a = div.getElementsByTagName("a")[0];
  3126 +
  3127 + // Can't get basic test support
  3128 + if ( !all || !all.length || !a ) {
  3129 + return;
  3130 + }
  3131 +
  3132 + jQuery.support = {
  3133 + // IE strips leading whitespace when .innerHTML is used
  3134 + leadingWhitespace: div.firstChild.nodeType == 3,
  3135 +
  3136 + // Make sure that tbody elements aren't automatically inserted
  3137 + // IE will insert them into empty tables
  3138 + tbody: !div.getElementsByTagName("tbody").length,
  3139 +
  3140 + // Make sure that you can get all elements in an <object> element
  3141 + // IE 7 always returns no results
  3142 + objectAll: !!div.getElementsByTagName("object")[0]
  3143 + .getElementsByTagName("*").length,
  3144 +
  3145 + // Make sure that link elements get serialized correctly by innerHTML
  3146 + // This requires a wrapper element in IE
  3147 + htmlSerialize: !!div.getElementsByTagName("link").length,
  3148 +
  3149 + // Get the style information from getAttribute
  3150 + // (IE uses .cssText insted)
  3151 + style: /red/.test( a.getAttribute("style") ),
  3152 +
  3153 + // Make sure that URLs aren't manipulated
  3154 + // (IE normalizes it by default)
  3155 + hrefNormalized: a.getAttribute("href") === "/a",
  3156 +
  3157 + // Make sure that element opacity exists
  3158 + // (IE uses filter instead)
  3159 + opacity: a.style.opacity === "0.5",
  3160 +
  3161 + // Verify style float existence
  3162 + // (IE uses styleFloat instead of cssFloat)
  3163 + cssFloat: !!a.style.cssFloat,
  3164 +
  3165 + // Will be defined later
  3166 + scriptEval: false,
  3167 + noCloneEvent: true,
  3168 + boxModel: null
  3169 + };
  3170 +
  3171 + script.type = "text/javascript";
  3172 + try {
  3173 + script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
  3174 + } catch(e){}
  3175 +
  3176 + root.insertBefore( script, root.firstChild );
  3177 +
  3178 + // Make sure that the execution of code works by injecting a script
  3179 + // tag with appendChild/createTextNode
  3180 + // (IE doesn't support this, fails, and uses .text instead)
  3181 + if ( window[ id ] ) {
  3182 + jQuery.support.scriptEval = true;
  3183 + delete window[ id ];
  3184 + }
  3185 +
  3186 + root.removeChild( script );
  3187 +
  3188 + if ( div.attachEvent && div.fireEvent ) {
  3189 + div.attachEvent("onclick", function(){
  3190 + // Cloning a node shouldn't copy over any
  3191 + // bound event handlers (IE does this)
  3192 + jQuery.support.noCloneEvent = false;
  3193 + div.detachEvent("onclick", arguments.callee);
  3194 + });
  3195 + div.cloneNode(true).fireEvent("onclick");
  3196 + }
  3197 +
  3198 + // Figure out if the W3C box model works as expected
  3199 + // document.body must exist before we can do this
  3200 + jQuery(function(){
  3201 + var div = document.createElement("div");
  3202 + div.style.width = div.style.paddingLeft = "1px";
  3203 +
  3204 + document.body.appendChild( div );
  3205 + jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
  3206 + document.body.removeChild( div ).style.display = 'none';
  3207 + });
  3208 +})();
  3209 +
  3210 +var styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat";
  3211 +
  3212 +jQuery.props = {
  3213 + "for": "htmlFor",
  3214 + "class": "className",
  3215 + "float": styleFloat,
  3216 + cssFloat: styleFloat,
  3217 + styleFloat: styleFloat,
  3218 + readonly: "readOnly",
  3219 + maxlength: "maxLength",
  3220 + cellspacing: "cellSpacing",
  3221 + rowspan: "rowSpan",
  3222 + tabindex: "tabIndex"
  3223 +};
  3224 +jQuery.fn.extend({
  3225 + // Keep a copy of the old load
  3226 + _load: jQuery.fn.load,
  3227 +
  3228 + load: function( url, params, callback ) {
  3229 + if ( typeof url !== "string" )
  3230 + return this._load( url );
  3231 +
  3232 + var off = url.indexOf(" ");
  3233 + if ( off >= 0 ) {
  3234 + var selector = url.slice(off, url.length);
  3235 + url = url.slice(0, off);
  3236 + }
  3237 +
  3238 + // Default to a GET request
  3239 + var type = "GET";
  3240 +
  3241 + // If the second parameter was provided
  3242 + if ( params )
  3243 + // If it's a function
  3244 + if ( jQuery.isFunction( params ) ) {
  3245 + // We assume that it's the callback
  3246 + callback = params;
  3247 + params = null;
  3248 +
  3249 + // Otherwise, build a param string
  3250 + } else if( typeof params === "object" ) {
  3251 + params = jQuery.param( params );
  3252 + type = "POST";
  3253 + }
  3254 +
  3255 + var self = this;
  3256 +
  3257 + // Request the remote document
  3258 + jQuery.ajax({
  3259 + url: url,
  3260 + type: type,
  3261 + dataType: "html",
  3262 + data: params,
  3263 + complete: function(res, status){
  3264 + // If successful, inject the HTML into all the matched elements
  3265 + if ( status == "success" || status == "notmodified" )
  3266 + // See if a selector was specified
  3267 + self.html( selector ?
  3268 + // Create a dummy div to hold the results
  3269 + jQuery("<div/>")
  3270 + // inject the contents of the document in, removing the scripts
  3271 + // to avoid any 'Permission Denied' errors in IE
  3272 + .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
  3273 +
  3274 + // Locate the specified elements
  3275 + .find(selector) :
  3276 +
  3277 + // If not, just inject the full result
  3278 + res.responseText );
  3279 +
  3280 + if( callback )
  3281 + self.each( callback, [res.responseText, status, res] );
  3282 + }
  3283 + });
  3284 + return this;
  3285 + },
  3286 +
  3287 + serialize: function() {
  3288 + return jQuery.param(this.serializeArray());
  3289 + },
  3290 + serializeArray: function() {
  3291 + return this.map(function(){
  3292 + return this.elements ? jQuery.makeArray(this.elements) : this;
  3293 + })
  3294 + .filter(function(){
  3295 + return this.name && !this.disabled &&
  3296 + (this.checked || /select|textarea/i.test(this.nodeName) ||
  3297 + /text|hidden|password|search/i.test(this.type));
  3298 + })
  3299 + .map(function(i, elem){
  3300 + var val = jQuery(this).val();
  3301 + return val == null ? null :
  3302 + jQuery.isArray(val) ?
  3303 + jQuery.map( val, function(val, i){
  3304 + return {name: elem.name, value: val};
  3305 + }) :
  3306 + {name: elem.name, value: val};
  3307 + }).get();
  3308 + }
  3309 +});
  3310 +
  3311 +// Attach a bunch of functions for handling common AJAX events
  3312 +jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
  3313 + jQuery.fn[o] = function(f){
  3314 + return this.bind(o, f);
  3315 + };
  3316 +});
  3317 +
  3318 +var jsc = now();
  3319 +
  3320 +jQuery.extend({
  3321 +
  3322 + get: function( url, data, callback, type ) {
  3323 + // shift arguments if data argument was ommited
  3324 + if ( jQuery.isFunction( data ) ) {
  3325 + callback = data;
  3326 + data = null;
  3327 + }
  3328 +
  3329 + return jQuery.ajax({
  3330 + type: "GET",
  3331 + url: url,
  3332 + data: data,
  3333 + success: callback,
  3334 + dataType: type
  3335 + });
  3336 + },
  3337 +
  3338 + getScript: function( url, callback ) {
  3339 + return jQuery.get(url, null, callback, "script");
  3340 + },
  3341 +
  3342 + getJSON: function( url, data, callback ) {
  3343 + return jQuery.get(url, data, callback, "json");
  3344 + },
  3345 +
  3346 + post: function( url, data, callback, type ) {
  3347 + if ( jQuery.isFunction( data ) ) {
  3348 + callback = data;
  3349 + data = {};
  3350 + }
  3351 +
  3352 + return jQuery.ajax({
  3353 + type: "POST",
  3354 + url: url,
  3355 + data: data,
  3356 + success: callback,
  3357 + dataType: type
  3358 + });
  3359 + },
  3360 +
  3361 + ajaxSetup: function( settings ) {
  3362 + jQuery.extend( jQuery.ajaxSettings, settings );
  3363 + },
  3364 +
  3365 + ajaxSettings: {
  3366 + url: location.href,
  3367 + global: true,
  3368 + type: "GET",
  3369 + contentType: "application/x-www-form-urlencoded",
  3370 + processData: true,
  3371 + async: true,
  3372 + /*
  3373 + timeout: 0,
  3374 + data: null,
  3375 + username: null,
  3376 + password: null,
  3377 + */
  3378 + // Create the request object; Microsoft failed to properly
  3379 + // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
  3380 + // This function can be overriden by calling jQuery.ajaxSetup
  3381 + xhr:function(){
  3382 + return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
  3383 + },
  3384 + accepts: {
  3385 + xml: "application/xml, text/xml",
  3386 + html: "text/html",
  3387 + script: "text/javascript, application/javascript",
  3388 + json: "application/json, text/javascript",
  3389 + text: "text/plain",
  3390 + _default: "*/*"
  3391 + }
  3392 + },
  3393 +
  3394 + // Last-Modified header cache for next request
  3395 + lastModified: {},
  3396 +
  3397 + ajax: function( s ) {
  3398 + // Extend the settings, but re-extend 's' so that it can be
  3399 + // checked again later (in the test suite, specifically)
  3400 + s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
  3401 +
  3402 + var jsonp, jsre = /=\?(&|$)/g, status, data,
  3403 + type = s.type.toUpperCase();
  3404 +
  3405 + // convert data if not already a string
  3406 + if ( s.data && s.processData && typeof s.data !== "string" )
  3407 + s.data = jQuery.param(s.data);
  3408 +
  3409 + // Handle JSONP Parameter Callbacks
  3410 + if ( s.dataType == "jsonp" ) {
  3411 + if ( type == "GET" ) {
  3412 + if ( !s.url.match(jsre) )
  3413 + s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
  3414 + } else if ( !s.data || !s.data.match(jsre) )
  3415 + s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
  3416 + s.dataType = "json";
  3417 + }
  3418 +
  3419 + // Build temporary JSONP function
  3420 + if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
  3421 + jsonp = "jsonp" + jsc++;
  3422 +
  3423 + // Replace the =? sequence both in the query string and the data
  3424 + if ( s.data )
  3425 + s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
  3426 + s.url = s.url.replace(jsre, "=" + jsonp + "$1");
  3427 +
  3428 + // We need to make sure
  3429 + // that a JSONP style response is executed properly
  3430 + s.dataType = "script";
  3431 +
  3432 + // Handle JSONP-style loading
  3433 + window[ jsonp ] = function(tmp){
  3434 + data = tmp;
  3435 + success();
  3436 + complete();
  3437 + // Garbage collect
  3438 + window[ jsonp ] = undefined;
  3439 + try{ delete window[ jsonp ]; } catch(e){}
  3440 + if ( head )
  3441 + head.removeChild( script );
  3442 + };
  3443 + }
  3444 +
  3445 + if ( s.dataType == "script" && s.cache == null )
  3446 + s.cache = false;
  3447 +
  3448 + if ( s.cache === false && type == "GET" ) {
  3449 + var ts = now();
  3450 + // try replacing _= if it is there
  3451 + var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
  3452 + // if nothing was replaced, add timestamp to the end
  3453 + s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
  3454 + }
  3455 +
  3456 + // If data is available, append data to url for get requests
  3457 + if ( s.data && type == "GET" ) {
  3458 + s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
  3459 +
  3460 + // IE likes to send both get and post data, prevent this
  3461 + s.data = null;
  3462 + }
  3463 +
  3464 + // Watch for a new set of requests
  3465 + if ( s.global && ! jQuery.active++ )
  3466 + jQuery.event.trigger( "ajaxStart" );
  3467 +
  3468 + // Matches an absolute URL, and saves the domain
  3469 + var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url );
  3470 +
  3471 + // If we're requesting a remote document
  3472 + // and trying to load JSON or Script with a GET
  3473 + if ( s.dataType == "script" && type == "GET" && parts
  3474 + && ( parts[1] && parts[1] != location.protocol || parts[2] != location.host )){
  3475 +
  3476 + var head = document.getElementsByTagName("head")[0];
  3477 + var script = document.createElement("script");
  3478 + script.src = s.url;
  3479 + if (s.scriptCharset)
  3480 + script.charset = s.scriptCharset;
  3481 +
  3482 + // Handle Script loading
  3483 + if ( !jsonp ) {
  3484 + var done = false;
  3485 +
  3486 + // Attach handlers for all browsers
  3487 + script.onload = script.onreadystatechange = function(){
  3488 + if ( !done && (!this.readyState ||
  3489 + this.readyState == "loaded" || this.readyState == "complete") ) {
  3490 + done = true;
  3491 + success();
  3492 + complete();
  3493 +
  3494 + // Handle memory leak in IE
  3495 + script.onload = script.onreadystatechange = null;
  3496 + head.removeChild( script );
  3497 + }
  3498 + };
  3499 + }
  3500 +
  3501 + head.appendChild(script);
  3502 +
  3503 + // We handle everything using the script element injection
  3504 + return undefined;
  3505 + }
  3506 +
  3507 + var requestDone = false;
  3508 +
  3509 + // Create the request object
  3510 + var xhr = s.xhr();
  3511 +
  3512 + // Open the socket
  3513 + // Passing null username, generates a login popup on Opera (#2865)
  3514 + if( s.username )
  3515 + xhr.open(type, s.url, s.async, s.username, s.password);
  3516 + else
  3517 + xhr.open(type, s.url, s.async);
  3518 +
  3519 + // Need an extra try/catch for cross domain requests in Firefox 3
  3520 + try {
  3521 + // Set the correct header, if data is being sent
  3522 + if ( s.data )
  3523 + xhr.setRequestHeader("Content-Type", s.contentType);
  3524 +
  3525 + // Set the If-Modified-Since header, if ifModified mode.
  3526 + if ( s.ifModified )
  3527 + xhr.setRequestHeader("If-Modified-Since",
  3528 + jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
  3529 +
  3530 + // Set header so the called script knows that it's an XMLHttpRequest
  3531 + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
  3532 +
  3533 + // Set the Accepts header for the server, depending on the dataType
  3534 + xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
  3535 + s.accepts[ s.dataType ] + ", */*" :
  3536 + s.accepts._default );
  3537 + } catch(e){}
  3538 +
  3539 + // Allow custom headers/mimetypes and early abort
  3540 + if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
  3541 + // Handle the global AJAX counter
  3542 + if ( s.global && ! --jQuery.active )
  3543 + jQuery.event.trigger( "ajaxStop" );
  3544 + // close opended socket
  3545 + xhr.abort();
  3546 + return false;
  3547 + }
  3548 +
  3549 + if ( s.global )
  3550 + jQuery.event.trigger("ajaxSend", [xhr, s]);
  3551 +
  3552 + // Wait for a response to come back
  3553 + var onreadystatechange = function(isTimeout){
  3554 + // The request was aborted, clear the interval and decrement jQuery.active
  3555 + if (xhr.readyState == 0) {
  3556 + if (ival) {
  3557 + // clear poll interval
  3558 + clearInterval(ival);
  3559 + ival = null;
  3560 + // Handle the global AJAX counter
  3561 + if ( s.global && ! --jQuery.active )
  3562 + jQuery.event.trigger( "ajaxStop" );
  3563 + }
  3564 + // The transfer is complete and the data is available, or the request timed out
  3565 + } else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
  3566 + requestDone = true;
  3567 +
  3568 + // clear poll interval
  3569 + if (ival) {
  3570 + clearInterval(ival);
  3571 + ival = null;
  3572 + }
  3573 +
  3574 + status = isTimeout == "timeout" ? "timeout" :
  3575 + !jQuery.httpSuccess( xhr ) ? "error" :
  3576 + s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" :
  3577 + "success";
  3578 +
  3579 + if ( status == "success" ) {
  3580 + // Watch for, and catch, XML document parse errors
  3581 + try {
  3582 + // process the data (runs the xml through httpData regardless of callback)
  3583 + data = jQuery.httpData( xhr, s.dataType, s );
  3584 + } catch(e) {
  3585 + status = "parsererror";
  3586 + }
  3587 + }
  3588 +
  3589 + // Make sure that the request was successful or notmodified
  3590 + if ( status == "success" ) {
  3591 + // Cache Last-Modified header, if ifModified mode.
  3592 + var modRes;
  3593 + try {
  3594 + modRes = xhr.getResponseHeader("Last-Modified");
  3595 + } catch(e) {} // swallow exception thrown by FF if header is not available
  3596 +
  3597 + if ( s.ifModified && modRes )
  3598 + jQuery.lastModified[s.url] = modRes;
  3599 +
  3600 + // JSONP handles its own success callback
  3601 + if ( !jsonp )
  3602 + success();
  3603 + } else
  3604 + jQuery.handleError(s, xhr, status);
  3605 +
  3606 + // Fire the complete handlers
  3607 + complete();
  3608 +
  3609 + if ( isTimeout )
  3610 + xhr.abort();
  3611 +
  3612 + // Stop memory leaks
  3613 + if ( s.async )
  3614 + xhr = null;
  3615 + }
  3616 + };
  3617 +
  3618 + if ( s.async ) {
  3619 + // don't attach the handler to the request, just poll it instead
  3620 + var ival = setInterval(onreadystatechange, 13);
  3621 +
  3622 + // Timeout checker
  3623 + if ( s.timeout > 0 )
  3624 + setTimeout(function(){
  3625 + // Check to see if the request is still happening
  3626 + if ( xhr && !requestDone )
  3627 + onreadystatechange( "timeout" );
  3628 + }, s.timeout);
  3629 + }
  3630 +
  3631 + // Send the data
  3632 + try {
  3633 + xhr.send(s.data);
  3634 + } catch(e) {
  3635 + jQuery.handleError(s, xhr, null, e);
  3636 + }
  3637 +
  3638 + // firefox 1.5 doesn't fire statechange for sync requests
  3639 + if ( !s.async )
  3640 + onreadystatechange();
  3641 +
  3642 + function success(){
  3643 + // If a local callback was specified, fire it and pass it the data
  3644 + if ( s.success )
  3645 + s.success( data, status );
  3646 +
  3647 + // Fire the global callback
  3648 + if ( s.global )
  3649 + jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
  3650 + }
  3651 +
  3652 + function complete(){
  3653 + // Process result
  3654 + if ( s.complete )
  3655 + s.complete(xhr, status);
  3656 +
  3657 + // The request was completed
  3658 + if ( s.global )
  3659 + jQuery.event.trigger( "ajaxComplete", [xhr, s] );
  3660 +
  3661 + // Handle the global AJAX counter
  3662 + if ( s.global && ! --jQuery.active )
  3663 + jQuery.event.trigger( "ajaxStop" );
  3664 + }
  3665 +
  3666 + // return XMLHttpRequest to allow aborting the request etc.
  3667 + return xhr;
  3668 + },
  3669 +
  3670 + handleError: function( s, xhr, status, e ) {
  3671 + // If a local callback was specified, fire it
  3672 + if ( s.error ) s.error( xhr, status, e );
  3673 +
  3674 + // Fire the global callback
  3675 + if ( s.global )
  3676 + jQuery.event.trigger( "ajaxError", [xhr, s, e] );
  3677 + },
  3678 +
  3679 + // Counter for holding the number of active queries
  3680 + active: 0,
  3681 +
  3682 + // Determines if an XMLHttpRequest was successful or not
  3683 + httpSuccess: function( xhr ) {
  3684 + try {
  3685 + // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
  3686 + return !xhr.status && location.protocol == "file:" ||
  3687 + ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223;
  3688 + } catch(e){}
  3689 + return false;
  3690 + },
  3691 +
  3692 + // Determines if an XMLHttpRequest returns NotModified
  3693 + httpNotModified: function( xhr, url ) {
  3694 + try {
  3695 + var xhrRes = xhr.getResponseHeader("Last-Modified");
  3696 +
  3697 + // Firefox always returns 200. check Last-Modified date
  3698 + return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
  3699 + } catch(e){}
  3700 + return false;
  3701 + },
  3702 +
  3703 + httpData: function( xhr, type, s ) {
  3704 + var ct = xhr.getResponseHeader("content-type"),
  3705 + xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
  3706 + data = xml ? xhr.responseXML : xhr.responseText;
  3707 +
  3708 + if ( xml && data.documentElement.tagName == "parsererror" )
  3709 + throw "parsererror";
  3710 +
  3711 + // Allow a pre-filtering function to sanitize the response
  3712 + // s != null is checked to keep backwards compatibility
  3713 + if( s && s.dataFilter )
  3714 + data = s.dataFilter( data, type );
  3715 +
  3716 + // The filter can actually parse the response
  3717 + if( typeof data === "string" ){
  3718 +
  3719 + // If the type is "script", eval it in global context
  3720 + if ( type == "script" )
  3721 + jQuery.globalEval( data );
  3722 +
  3723 + // Get the JavaScript object, if JSON is used.
  3724 + if ( type == "json" )
  3725 + data = window["eval"]("(" + data + ")");
  3726 + }
  3727 +
  3728 + return data;
  3729 + },
  3730 +
  3731 + // Serialize an array of form elements or a set of
  3732 + // key/values into a query string
  3733 + param: function( a ) {
  3734 + var s = [ ];
  3735 +
  3736 + function add( key, value ){
  3737 + s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
  3738 + };
  3739 +
  3740 + // If an array was passed in, assume that it is an array
  3741 + // of form elements
  3742 + if ( jQuery.isArray(a) || a.jquery )
  3743 + // Serialize the form elements
  3744 + jQuery.each( a, function(){
  3745 + add( this.name, this.value );
  3746 + });
  3747 +
  3748 + // Otherwise, assume that it's an object of key/value pairs
  3749 + else
  3750 + // Serialize the key/values
  3751 + for ( var j in a )
  3752 + // If the value is an array then the key names need to be repeated
  3753 + if ( jQuery.isArray(a[j]) )
  3754 + jQuery.each( a[j], function(){
  3755 + add( j, this );
  3756 + });
  3757 + else
  3758 + add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
  3759 +
  3760 + // Return the resulting serialization
  3761 + return s.join("&").replace(/%20/g, "+");
  3762 + }
  3763 +
  3764 +});
  3765 +var elemdisplay = {},
  3766 + timerId,
  3767 + fxAttrs = [
  3768 + // height animations
  3769 + [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
  3770 + // width animations
  3771 + [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
  3772 + // opacity animations
  3773 + [ "opacity" ]
  3774 + ];
  3775 +
  3776 +function genFx( type, num ){
  3777 + var obj = {};
  3778 + jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){
  3779 + obj[ this ] = type;
  3780 + });
  3781 + return obj;
  3782 +}
  3783 +
  3784 +jQuery.fn.extend({
  3785 + show: function(speed,callback){
  3786 + if ( speed ) {
  3787 + return this.animate( genFx("show", 3), speed, callback);
  3788 + } else {
  3789 + for ( var i = 0, l = this.length; i < l; i++ ){
  3790 + var old = jQuery.data(this[i], "olddisplay");
  3791 +
  3792 + this[i].style.display = old || "";
  3793 +
  3794 + if ( jQuery.css(this[i], "display") === "none" ) {
  3795 + var tagName = this[i].tagName, display;
  3796 +
  3797 + if ( elemdisplay[ tagName ] ) {
  3798 + display = elemdisplay[ tagName ];
  3799 + } else {
  3800 + var elem = jQuery("<" + tagName + " />").appendTo("body");
  3801 +
  3802 + display = elem.css("display");
  3803 + if ( display === "none" )
  3804 + display = "block";
  3805 +
  3806 + elem.remove();
  3807 +
  3808 + elemdisplay[ tagName ] = display;
  3809 + }
  3810 +
  3811 + jQuery.data(this[i], "olddisplay", display);
  3812 + }
  3813 + }
  3814 +
  3815 + // Set the display of the elements in a second loop
  3816 + // to avoid the constant reflow
  3817 + for ( var i = 0, l = this.length; i < l; i++ ){
  3818 + this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
  3819 + }
  3820 +
  3821 + return this;
  3822 + }
  3823 + },
  3824 +
  3825 + hide: function(speed,callback){
  3826 + if ( speed ) {
  3827 + return this.animate( genFx("hide", 3), speed, callback);
  3828 + } else {
  3829 + for ( var i = 0, l = this.length; i < l; i++ ){
  3830 + var old = jQuery.data(this[i], "olddisplay");
  3831 + if ( !old && old !== "none" )
  3832 + jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
  3833 + }
  3834 +
  3835 + // Set the display of the elements in a second loop
  3836 + // to avoid the constant reflow
  3837 + for ( var i = 0, l = this.length; i < l; i++ ){
  3838 + this[i].style.display = "none";
  3839 + }
  3840 +
  3841 + return this;
  3842 + }
  3843 + },
  3844 +
  3845 + // Save the old toggle function
  3846 + _toggle: jQuery.fn.toggle,
  3847 +
  3848 + toggle: function( fn, fn2 ){
  3849 + var bool = typeof fn === "boolean";
  3850 +
  3851 + return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
  3852 + this._toggle.apply( this, arguments ) :
  3853 + fn == null || bool ?
  3854 + this.each(function(){
  3855 + var state = bool ? fn : jQuery(this).is(":hidden");
  3856 + jQuery(this)[ state ? "show" : "hide" ]();
  3857 + }) :
  3858 + this.animate(genFx("toggle", 3), fn, fn2);
  3859 + },
  3860 +
  3861 + fadeTo: function(speed,to,callback){
  3862 + return this.animate({opacity: to}, speed, callback);
  3863 + },
  3864 +
  3865 + animate: function( prop, speed, easing, callback ) {
  3866 + var optall = jQuery.speed(speed, easing, callback);
  3867 +
  3868 + return this[ optall.queue === false ? "each" : "queue" ](function(){
  3869 +
  3870 + var opt = jQuery.extend({}, optall), p,
  3871 + hidden = this.nodeType == 1 && jQuery(this).is(":hidden"),
  3872 + self = this;
  3873 +
  3874 + for ( p in prop ) {
  3875 + if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
  3876 + return opt.complete.call(this);
  3877 +
  3878 + if ( ( p == "height" || p == "width" ) && this.style ) {
  3879 + // Store display property
  3880 + opt.display = jQuery.css(this, "display");
  3881 +
  3882 + // Make sure that nothing sneaks out
  3883 + opt.overflow = this.style.overflow;
  3884 + }
  3885 + }
  3886 +
  3887 + if ( opt.overflow != null )
  3888 + this.style.overflow = "hidden";
  3889 +
  3890 + opt.curAnim = jQuery.extend({}, prop);
  3891 +
  3892 + jQuery.each( prop, function(name, val){
  3893 + var e = new jQuery.fx( self, opt, name );
  3894 +
  3895 + if ( /toggle|show|hide/.test(val) )
  3896 + e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
  3897 + else {
  3898 + var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
  3899 + start = e.cur(true) || 0;
  3900 +
  3901 + if ( parts ) {
  3902 + var end = parseFloat(parts[2]),
  3903 + unit = parts[3] || "px";
  3904 +
  3905 + // We need to compute starting value
  3906 + if ( unit != "px" ) {
  3907 + self.style[ name ] = (end || 1) + unit;
  3908 + start = ((end || 1) / e.cur(true)) * start;
  3909 + self.style[ name ] = start + unit;
  3910 + }
  3911 +
  3912 + // If a +=/-= token was provided, we're doing a relative animation
  3913 + if ( parts[1] )
  3914 + end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
  3915 +
  3916 + e.custom( start, end, unit );
  3917 + } else
  3918 + e.custom( start, val, "" );
  3919 + }
  3920 + });
  3921 +
  3922 + // For JS strict compliance
  3923 + return true;
  3924 + });
  3925 + },
  3926 +
  3927 + stop: function(clearQueue, gotoEnd){
  3928 + var timers = jQuery.timers;
  3929 +
  3930 + if (clearQueue)
  3931 + this.queue([]);
  3932 +
  3933 + this.each(function(){
  3934 + // go in reverse order so anything added to the queue during the loop is ignored
  3935 + for ( var i = timers.length - 1; i >= 0; i-- )
  3936 + if ( timers[i].elem == this ) {
  3937 + if (gotoEnd)
  3938 + // force the next step to be the last
  3939 + timers[i](true);
  3940 + timers.splice(i, 1);
  3941 + }
  3942 + });
  3943 +
  3944 + // start the next in the queue if the last step wasn't forced
  3945 + if (!gotoEnd)
  3946 + this.dequeue();
  3947 +
  3948 + return this;
  3949 + }
  3950 +
  3951 +});
  3952 +
  3953 +// Generate shortcuts for custom animations
  3954 +jQuery.each({
  3955 + slideDown: genFx("show", 1),
  3956 + slideUp: genFx("hide", 1),
  3957 + slideToggle: genFx("toggle", 1),
  3958 + fadeIn: { opacity: "show" },
  3959 + fadeOut: { opacity: "hide" }
  3960 +}, function( name, props ){
  3961 + jQuery.fn[ name ] = function( speed, callback ){
  3962 + return this.animate( props, speed, callback );
  3963 + };
  3964 +});
  3965 +
  3966 +jQuery.extend({
  3967 +
  3968 + speed: function(speed, easing, fn) {
  3969 + var opt = typeof speed === "object" ? speed : {
  3970 + complete: fn || !fn && easing ||
  3971 + jQuery.isFunction( speed ) && speed,
  3972 + duration: speed,
  3973 + easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
  3974 + };
  3975 +
  3976 + opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
  3977 + jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
  3978 +
  3979 + // Queueing
  3980 + opt.old = opt.complete;
  3981 + opt.complete = function(){
  3982 + if ( opt.queue !== false )
  3983 + jQuery(this).dequeue();
  3984 + if ( jQuery.isFunction( opt.old ) )
  3985 + opt.old.call( this );
  3986 + };
  3987 +
  3988 + return opt;
  3989 + },
  3990 +
  3991 + easing: {
  3992 + linear: function( p, n, firstNum, diff ) {
  3993 + return firstNum + diff * p;
  3994 + },
  3995 + swing: function( p, n, firstNum, diff ) {
  3996 + return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
  3997 + }
  3998 + },
  3999 +
  4000 + timers: [],
  4001 +
  4002 + fx: function( elem, options, prop ){
  4003 + this.options = options;
  4004 + this.elem = elem;
  4005 + this.prop = prop;
  4006 +
  4007 + if ( !options.orig )
  4008 + options.orig = {};
  4009 + }
  4010 +
  4011 +});
  4012 +
  4013 +jQuery.fx.prototype = {
  4014 +
  4015 + // Simple function for setting a style value
  4016 + update: function(){
  4017 + if ( this.options.step )
  4018 + this.options.step.call( this.elem, this.now, this );
  4019 +
  4020 + (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
  4021 +
  4022 + // Set display property to block for height/width animations
  4023 + if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style )
  4024 + this.elem.style.display = "block";
  4025 + },
  4026 +
  4027 + // Get the current size
  4028 + cur: function(force){
  4029 + if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) )
  4030 + return this.elem[ this.prop ];
  4031 +
  4032 + var r = parseFloat(jQuery.css(this.elem, this.prop, force));
  4033 + return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
  4034 + },
  4035 +
  4036 + // Start an animation from one number to another
  4037 + custom: function(from, to, unit){
  4038 + this.startTime = now();
  4039 + this.start = from;
  4040 + this.end = to;
  4041 + this.unit = unit || this.unit || "px";
  4042 + this.now = this.start;
  4043 + this.pos = this.state = 0;
  4044 +
  4045 + var self = this;
  4046 + function t(gotoEnd){
  4047 + return self.step(gotoEnd);
  4048 + }
  4049 +
  4050 + t.elem = this.elem;
  4051 +
  4052 + if ( t() && jQuery.timers.push(t) && !timerId ) {
  4053 + timerId = setInterval(function(){
  4054 + var timers = jQuery.timers;
  4055 +
  4056 + for ( var i = 0; i < timers.length; i++ )
  4057 + if ( !timers[i]() )
  4058 + timers.splice(i--, 1);
  4059 +
  4060 + if ( !timers.length ) {
  4061 + clearInterval( timerId );
  4062 + timerId = undefined;
  4063 + }
  4064 + }, 13);
  4065 + }
  4066 + },
  4067 +
  4068 + // Simple 'show' function
  4069 + show: function(){
  4070 + // Remember where we started, so that we can go back to it later
  4071 + this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
  4072 + this.options.show = true;
  4073 +
  4074 + // Begin the animation
  4075 + // Make sure that we start at a small width/height to avoid any
  4076 + // flash of content
  4077 + this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur());
  4078 +
  4079 + // Start by showing the element
  4080 + jQuery(this.elem).show();
  4081 + },
  4082 +
  4083 + // Simple 'hide' function
  4084 + hide: function(){
  4085 + // Remember where we started, so that we can go back to it later
  4086 + this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
  4087 + this.options.hide = true;
  4088 +
  4089 + // Begin the animation
  4090 + this.custom(this.cur(), 0);
  4091 + },
  4092 +
  4093 + // Each step of an animation
  4094 + step: function(gotoEnd){
  4095 + var t = now();
  4096 +
  4097 + if ( gotoEnd || t >= this.options.duration + this.startTime ) {
  4098 + this.now = this.end;
  4099 + this.pos = this.state = 1;
  4100 + this.update();
  4101 +
  4102 + this.options.curAnim[ this.prop ] = true;
  4103 +
  4104 + var done = true;
  4105 + for ( var i in this.options.curAnim )
  4106 + if ( this.options.curAnim[i] !== true )
  4107 + done = false;
  4108 +
  4109 + if ( done ) {
  4110 + if ( this.options.display != null ) {
  4111 + // Reset the overflow
  4112 + this.elem.style.overflow = this.options.overflow;
  4113 +
  4114 + // Reset the display
  4115 + this.elem.style.display = this.options.display;
  4116 + if ( jQuery.css(this.elem, "display") == "none" )
  4117 + this.elem.style.display = "block";
  4118 + }
  4119 +
  4120 + // Hide the element if the "hide" operation was done
  4121 + if ( this.options.hide )
  4122 + jQuery(this.elem).hide();
  4123 +
  4124 + // Reset the properties, if the item has been hidden or shown
  4125 + if ( this.options.hide || this.options.show )
  4126 + for ( var p in this.options.curAnim )
  4127 + jQuery.attr(this.elem.style, p, this.options.orig[p]);
  4128 +
  4129 + // Execute the complete function
  4130 + this.options.complete.call( this.elem );
  4131 + }
  4132 +
  4133 + return false;
  4134 + } else {
  4135 + var n = t - this.startTime;
  4136 + this.state = n / this.options.duration;
  4137 +
  4138 + // Perform the easing function, defaults to swing
  4139 + this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
  4140 + this.now = this.start + ((this.end - this.start) * this.pos);
  4141 +
  4142 + // Perform the next step of the animation
  4143 + this.update();
  4144 + }
  4145 +
  4146 + return true;
  4147 + }
  4148 +
  4149 +};
  4150 +
  4151 +jQuery.extend( jQuery.fx, {
  4152 + speeds:{
  4153 + slow: 600,
  4154 + fast: 200,
  4155 + // Default speed
  4156 + _default: 400
  4157 + },
  4158 + step: {
  4159 +
  4160 + opacity: function(fx){
  4161 + jQuery.attr(fx.elem.style, "opacity", fx.now);
  4162 + },
  4163 +
  4164 + _default: function(fx){
  4165 + if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )
  4166 + fx.elem.style[ fx.prop ] = fx.now + fx.unit;
  4167 + else
  4168 + fx.elem[ fx.prop ] = fx.now;
  4169 + }
  4170 + }
  4171 +});
  4172 +if ( document.documentElement["getBoundingClientRect"] )
  4173 + jQuery.fn.offset = function() {
  4174 + if ( !this[0] ) return { top: 0, left: 0 };
  4175 + if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
  4176 + var box = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement,
  4177 + clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
  4178 + top = box.top + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop || body.scrollTop ) - clientTop,
  4179 + left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
  4180 + return { top: top, left: left };
  4181 + };
  4182 +else
  4183 + jQuery.fn.offset = function() {
  4184 + if ( !this[0] ) return { top: 0, left: 0 };
  4185 + if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
  4186 + jQuery.offset.initialized || jQuery.offset.initialize();
  4187 +
  4188 + var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem,
  4189 + doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
  4190 + body = doc.body, defaultView = doc.defaultView,
  4191 + prevComputedStyle = defaultView.getComputedStyle(elem, null),
  4192 + top = elem.offsetTop, left = elem.offsetLeft;
  4193 +
  4194 + while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
  4195 + computedStyle = defaultView.getComputedStyle(elem, null);
  4196 + top -= elem.scrollTop, left -= elem.scrollLeft;
  4197 + if ( elem === offsetParent ) {
  4198 + top += elem.offsetTop, left += elem.offsetLeft;
  4199 + if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) )
  4200 + top += parseInt( computedStyle.borderTopWidth, 10) || 0,
  4201 + left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
  4202 + prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
  4203 + }
  4204 + if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" )
  4205 + top += parseInt( computedStyle.borderTopWidth, 10) || 0,
  4206 + left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
  4207 + prevComputedStyle = computedStyle;
  4208 + }
  4209 +
  4210 + if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" )
  4211 + top += body.offsetTop,
  4212 + left += body.offsetLeft;
  4213 +
  4214 + if ( prevComputedStyle.position === "fixed" )
  4215 + top += Math.max(docElem.scrollTop, body.scrollTop),
  4216 + left += Math.max(docElem.scrollLeft, body.scrollLeft);
  4217 +
  4218 + return { top: top, left: left };
  4219 + };
  4220 +
  4221 +jQuery.offset = {
  4222 + initialize: function() {
  4223 + if ( this.initialized ) return;
  4224 + var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop,
  4225 + html = '<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';
  4226 +
  4227 + rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' };
  4228 + for ( prop in rules ) container.style[prop] = rules[prop];
  4229 +
  4230 + container.innerHTML = html;
  4231 + body.insertBefore(container, body.firstChild);
  4232 + innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild;
  4233 +
  4234 + this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
  4235 + this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
  4236 +
  4237 + innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative';
  4238 + this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
  4239 +
  4240 + body.style.marginTop = '1px';
  4241 + this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0);
  4242 + body.style.marginTop = bodyMarginTop;
  4243 +
  4244 + body.removeChild(container);
  4245 + this.initialized = true;
  4246 + },
  4247 +
  4248 + bodyOffset: function(body) {
  4249 + jQuery.offset.initialized || jQuery.offset.initialize();
  4250 + var top = body.offsetTop, left = body.offsetLeft;
  4251 + if ( jQuery.offset.doesNotIncludeMarginInBodyOffset )
  4252 + top += parseInt( jQuery.curCSS(body, 'marginTop', true), 10 ) || 0,
  4253 + left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0;
  4254 + return { top: top, left: left };
  4255 + }
  4256 +};
  4257 +
  4258 +
  4259 +jQuery.fn.extend({
  4260 + position: function() {
  4261 + var left = 0, top = 0, results;
  4262 +
  4263 + if ( this[0] ) {
  4264 + // Get *real* offsetParent
  4265 + var offsetParent = this.offsetParent(),
  4266 +
  4267 + // Get correct offsets
  4268 + offset = this.offset(),
  4269 + parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
  4270 +
  4271 + // Subtract element margins
  4272 + // note: when an element has margin: auto the offsetLeft and marginLeft
  4273 + // are the same in Safari causing offset.left to incorrectly be 0
  4274 + offset.top -= num( this, 'marginTop' );
  4275 + offset.left -= num( this, 'marginLeft' );
  4276 +
  4277 + // Add offsetParent borders
  4278 + parentOffset.top += num( offsetParent, 'borderTopWidth' );
  4279 + parentOffset.left += num( offsetParent, 'borderLeftWidth' );
  4280 +
  4281 + // Subtract the two offsets
  4282 + results = {
  4283 + top: offset.top - parentOffset.top,
  4284 + left: offset.left - parentOffset.left
  4285 + };
  4286 + }
  4287 +
  4288 + return results;
  4289 + },
  4290 +
  4291 + offsetParent: function() {
  4292 + var offsetParent = this[0].offsetParent || document.body;
  4293 + while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
  4294 + offsetParent = offsetParent.offsetParent;
  4295 + return jQuery(offsetParent);
  4296 + }
  4297 +});
  4298 +
  4299 +
  4300 +// Create scrollLeft and scrollTop methods
  4301 +jQuery.each( ['Left', 'Top'], function(i, name) {
  4302 + var method = 'scroll' + name;
  4303 +
  4304 + jQuery.fn[ method ] = function(val) {
  4305 + if (!this[0]) return null;
  4306 +
  4307 + return val !== undefined ?
  4308 +
  4309 + // Set the scroll offset
  4310 + this.each(function() {
  4311 + this == window || this == document ?
  4312 + window.scrollTo(
  4313 + !i ? val : jQuery(window).scrollLeft(),
  4314 + i ? val : jQuery(window).scrollTop()
  4315 + ) :
  4316 + this[ method ] = val;
  4317 + }) :
  4318 +
  4319 + // Return the scroll offset
  4320 + this[0] == window || this[0] == document ?
  4321 + self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
  4322 + jQuery.boxModel && document.documentElement[ method ] ||
  4323 + document.body[ method ] :
  4324 + this[0][ method ];
  4325 + };
  4326 +});
  4327 +// Create innerHeight, innerWidth, outerHeight and outerWidth methods
  4328 +jQuery.each([ "Height", "Width" ], function(i, name){
  4329 +
  4330 + var tl = i ? "Left" : "Top", // top or left
  4331 + br = i ? "Right" : "Bottom", // bottom or right
  4332 + lower = name.toLowerCase();
  4333 +
  4334 + // innerHeight and innerWidth
  4335 + jQuery.fn["inner" + name] = function(){
  4336 + return this[0] ?
  4337 + jQuery.css( this[0], lower, false, "padding" ) :
  4338 + null;
  4339 + };
  4340 +
  4341 + // outerHeight and outerWidth
  4342 + jQuery.fn["outer" + name] = function(margin) {
  4343 + return this[0] ?
  4344 + jQuery.css( this[0], lower, false, margin ? "margin" : "border" ) :
  4345 + null;
  4346 + };
  4347 +
  4348 + var type = name.toLowerCase();
  4349 +
  4350 + jQuery.fn[ type ] = function( size ) {
  4351 + // Get window width or height
  4352 + return this[0] == window ?
  4353 + // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
  4354 + document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] ||
  4355 + document.body[ "client" + name ] :
  4356 +
  4357 + // Get document width or height
  4358 + this[0] == document ?
  4359 + // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
  4360 + Math.max(
  4361 + document.documentElement["client" + name],
  4362 + document.body["scroll" + name], document.documentElement["scroll" + name],
  4363 + document.body["offset" + name], document.documentElement["offset" + name]
  4364 + ) :
  4365 +
  4366 + // Get or set width or height on the element
  4367 + size === undefined ?
  4368 + // Get width or height on the element
  4369 + (this.length ? jQuery.css( this[0], type ) : null) :
  4370 +
  4371 + // Set the width or height on the element (default to pixels if value is unitless)
  4372 + this.css( type, typeof size === "string" ? size : size + "px" );
  4373 + };
  4374 +
  4375 +});
  4376 +})();
setup/wizard/resources/wizard.css
@@ -536,4 +536,12 @@ td.dir_description { @@ -536,4 +536,12 @@ td.dir_description {
536 padding: 2px 8px 2px 5px; 536 padding: 2px 8px 2px 5px;
537 text-decoration: none; 537 text-decoration: none;
538 color: #EC7725; 538 color: #EC7725;
  539 +}
  540 +
  541 +#loading {
  542 + bottom:250px;
  543 + left:500px;
  544 + position:relative;
  545 + height:0px;
  546 + width:0px;
539 } 547 }
540 \ No newline at end of file 548 \ No newline at end of file
setup/wizard/resources/wizard.js
@@ -2,171 +2,57 @@ @@ -2,171 +2,57 @@
2 function wizard() { 2 function wizard() {
3 } 3 }
4 4
5 -// Does a form check on every new page load  
6 -wizard.prototype.doFormCheck = function() {  
7 - w.addReadOnly();  
8 - w.preload();  
9 -}  
10 -  
11 // Toggle Advance Database options 5 // Toggle Advance Database options
12 -wizard.prototype.toggleClass = function(ele, option) {  
13 - var el = document.getElementsByClassName(ele); //adv_options|php_details|php_ext_details|php_con_details  
14 - if(el[0].style.display == 'none') {  
15 - el[0].style.display = 'block';  
16 - if(document.getElementById(option).innerHTML != '&nbsp;&nbsp;Advanced Options')  
17 - document.getElementById(option).innerHTML = "Hide Details";  
18 - } else {  
19 - el[0].style.display = 'none';  
20 - if(document.getElementById(option).innerHTML != '&nbsp;&nbsp;Advanced Options')  
21 - document.getElementById(option).innerHTML = "Show Details";  
22 - }  
23 -}  
24 -  
25 -// Toggle display of an element  
26 -wizard.prototype.toggleElement = function(el) {  
27 - if(el.style.display == 'none')  
28 - el.style.display = 'block';  
29 - else  
30 - el.style.display = 'none';  
31 -}  
32 -  
33 -// Handle steps within database page  
34 - wizard.prototype.showStep = function(p, d) {  
35 - if(d != 'p') { // Don't check if previous is clicked  
36 - var ueq = 0;  
37 - if(p == 2) { // Check User 1  
38 - ueq = w.validateUsers('dmsname', 'dmspassword', 'dmspassword2');  
39 - } else if(p == 3) { // Check User 2  
40 - ueq = w.validateUsers('dmsusername', 'dmsuserpassword', 'dmsuserpassword2');  
41 - }  
42 - if(ueq != 0) {  
43 - return w.display("error_"+ ueq + "_" + p) ;  
44 - }  
45 - }  
46 - w.hideErrors(); // If theres no errors, hide the ones displaying  
47 - var el = document.getElementsByClassName("step"+p);  
48 - el[0].style.display = 'none';  
49 - var j = 0;  
50 - if(d == "n") {  
51 - j = p+1;  
52 - } else if(d == "p") {  
53 - j = p-1;  
54 - }  
55 - el = document.getElementsByClassName("step"+j);  
56 - if(el != 'undefined') {  
57 - el[0].style.display = 'block';  
58 - }  
59 - return true;  
60 -}  
61 -  
62 -// Validate Users  
63 - wizard.prototype.validateUsers = function(id1, id2, id3) {  
64 - var el1 = document.getElementById(id1);  
65 - var el2 = document.getElementById(id2);  
66 - var el3 = document.getElementById(id3);  
67 - var elVal1 = el1.value;  
68 - var elVal2 = el2.value;  
69 - var elVal3 = el3.value;  
70 - if(elVal1 == '') { // User name empty  
71 - w.focusElement(el1);  
72 - return 1;  
73 - } else if(elVal2 == '') { // Empty Password  
74 - w.focusElement(el2);  
75 - return 2;  
76 - } else if(elVal3 == '') { // Empty Confirmation Password  
77 - w.focusElement(el3);  
78 - return 3;  
79 - } else if(elVal2 != elVal3) { // Passwords not equal  
80 - w.focusElement(el2);  
81 - return 4; 6 +wizard.prototype.toggleClass = function(ele, option) { //adv_options|php_details|php_ext_details|php_con_details
  7 + if($('.'+ele).attr('style') == 'display: none;') {
  8 + $('.'+ele).attr('style', 'display: block;');
  9 + if($('#'+option).attr('innerHTML') != '&nbsp;&nbsp;Advanced Options')
  10 + $('#'+option).attr('innerHTML', 'Hide Details');
82 } else { 11 } else {
83 - return 0; 12 + $('.'+ele).attr('style', 'display: none;');
  13 + if($('#'+option).attr('innerHTML') != '&nbsp;&nbsp;Advanced Options')
  14 + $('#'+option).attr('innerHTML', 'Show Details');
84 } 15 }
85 } 16 }
86 17
87 -// Display Errors  
88 -wizard.prototype.display = function(elname, er) {  
89 - var el = document.getElementById(elname);  
90 - w.showElement(el);  
91 - return 'display';  
92 -}  
93 -  
94 -// Hide Errors  
95 -wizard.prototype.hideErrors = function() {  
96 - var errors = document.getElementsByClassName('error');  
97 - var i;  
98 - for(i=0;i<errors.length;i++) {  
99 - w.hideElement(errors[i]);  
100 - }  
101 - return true;  
102 -}  
103 -  
104 -// Hide an element  
105 -wizard.prototype.hideElement = function(el) {  
106 - if(el.style.display == 'block')  
107 - el.style.display = 'none';  
108 -}  
109 -  
110 -// Show an element  
111 -wizard.prototype.showElement = function(el) {  
112 - if(el.style.display == 'none')  
113 - el.style.display = 'block';  
114 -}  
115 -  
116 // Focus on element 18 // Focus on element
117 wizard.prototype.focusElement = function(el) { 19 wizard.prototype.focusElement = function(el) {
118 el.focus(); 20 el.focus();
119 } 21 }
120 22
121 -// Catch form submit and validate  
122 -wizard.prototype.onSubmitValidate = function(silent) {  
123 - var response = w.showStep(3, 'n');  
124 - if(response == true || silent == true) {  
125 - document.getElementById('sendAll').name = 'Next'; // Force the next step  
126 - document.getElementById('sendAll').value = 'next';  
127 - document.getElementById('dbsettings').submit();  
128 - } else if(response == 'display') {  
129 - var el = document.getElementsByClassName("step1");  
130 - if(el[0].style.display == 'block') {  
131 - document.getElementById('sendAll').name = 'Previous'; // Force the previous step  
132 - document.getElementById('sendAll').value = 'previous';  
133 - document.getElementById('dbsettings').submit();  
134 - } else {  
135 - return false;  
136 - }  
137 - }  
138 - return true;  
139 -}  
140 - 23 +// Force previous click
141 wizard.prototype.pClick = function() { 24 wizard.prototype.pClick = function() {
142 - var state = document.getElementById('state');  
143 - if(state != "undefined") {  
144 - state.name = 'previous'; 25 + var state = $('#state');
  26 + if(state != undefined) {
  27 + state.attr('name', 'previous');
145 } 28 }
146 } 29 }
147 30
  31 +// Force next click
148 wizard.prototype.nClick = function() { 32 wizard.prototype.nClick = function() {
149 - var state = document.getElementById('state');  
150 - if(state != "undefined") {  
151 - state.name = 'next'; 33 + var state = $('#state');;
  34 + if(state != undefined) {
  35 + state.attr('name', 'next');
152 } 36 }
153 } 37 }
154 38
155 // Validate Registration Page 39 // Validate Registration Page
156 wizard.prototype.validateRegistration = function() { 40 wizard.prototype.validateRegistration = function() {
157 // See if next or previous is clicked. 41 // See if next or previous is clicked.
158 - var state = document.getElementById('state').name; 42 + var state = $('#state').attr('name');
159 if(state == 'next') { 43 if(state == 'next') {
160 if(w.valRegHelper()) { 44 if(w.valRegHelper()) {
161 - document.getElementById('sendAll').name = 'Next'; // Force the next step  
162 - document.getElementById('sendAll').value = 'next';  
163 - document.getElementById('registration').submit(); 45 + $('#sendAll').attr('name', 'Next'); // Force the next step
  46 + $('#sendAll').attr('value', 'next');
  47 + return true;
164 } 48 }
165 } else if(state == 'previous') { 49 } else if(state == 'previous') {
166 - document.getElementById('sendAll').name = 'Previous'; // Force the previous step  
167 - document.getElementById('sendAll').value = 'previous';  
168 - document.getElementById('registration').submit(); 50 + $('#sendAll').attr('name', 'Previous'); // Force the previous step
  51 + $('#sendAll').attr('value', 'previous');
  52 + return true;
169 } 53 }
  54 +
  55 + return false;
170 } 56 }
171 57
172 wizard.prototype.valRegHelper = function() { 58 wizard.prototype.valRegHelper = function() {
@@ -257,28 +143,23 @@ wizard.prototype.rtrim = function (str, chars) { @@ -257,28 +143,23 @@ wizard.prototype.rtrim = function (str, chars) {
257 return str.replace(new RegExp("[" + chars + "]+$", "g"), ""); 143 return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
258 } 144 }
259 145
260 -// Disable DnD on element  
261 -// Element has to have a readOnly status set to readonly  
262 -wizard.prototype.disableDnd = function(el_id) {  
263 -// el = document.getElementById(el_id);  
264 -// el.removeAttribute('readOnly');  
265 -}  
266 -  
267 -// Add readOnly access on all inputs of a form  
268 -wizard.prototype.addReadOnly = function() {  
269 - inputs = document.getElementsByTagName('input');  
270 - for(i=0;i<inputs.length;i++) {  
271 - var input_id = inputs[i].id;  
272 - if(input_id != '') {  
273 -// inputs[i].setAttribute('readOnly', 'readonly');  
274 -// inputs[i].setAttribute('onfocus', "javascript:{w.disableDnd('"+ input_id +"')}");  
275 -// inputs[i].focus();  
276 -// w.focusElement(inputs[i]);  
277 - } 146 +wizard.prototype.adjustMenu = function (form_id, previous) {
  147 + form_name = form_id.split('_');
  148 + if(form_name.length == 2) {
  149 + current_step = form_name[0];
  150 + next_step = form_name[1];
  151 + $('#'+current_step).attr('class', 'current');
  152 + $('#'+next_step).attr('class', 'inactive');
  153 + } else if(form_name.length == 3) {
  154 + previous_step = form_name[0];
  155 + current_step = form_name[1];
  156 + next_step = form_name[2];
  157 + $('#'+previous_step).attr('class', 'active');
  158 + $('#'+current_step).attr('class', 'current');
  159 + $('#'+next_step).attr('class', 'inactive');
278 } 160 }
279 } 161 }
280 162
281 -/* */  
282 -wizard.prototype.preload = function() {  
283 -// $('#tooltips').tooltip(); 163 +wizard.prototype.dummy = function () {
  164 +
284 } 165 }
285 \ No newline at end of file 166 \ No newline at end of file
setup/wizard/stepAction.php
@@ -324,11 +324,10 @@ class stepAction { @@ -324,11 +324,10 @@ class stepAction {
324 $item = "<a href=\"index.php?step_name={$step}\">{$item}</a>"; 324 $item = "<a href=\"index.php?step_name={$step}\">{$item}</a>";
325 } 325 }
326 } 326 }
327 -  
328 - $menu .= "<span class='{$class}'>$item</span><br />"; 327 + $menu .= "<span id = '{$step}' class='{$class}'>$item</span><br />";
329 } 328 }
330 } 329 }
331 -// $menu .= '</div>'; 330 +
332 return $menu; 331 return $menu;
333 } 332 }
334 333
@@ -377,7 +376,6 @@ class stepAction { @@ -377,7 +376,6 @@ class stepAction {
377 * @return string 376 * @return string
378 */ 377 */
379 public function paintAction() { 378 public function paintAction() {
380 -  
381 $step_errors = $this->action->getErrors(); // Get errors 379 $step_errors = $this->action->getErrors(); // Get errors
382 $step_warnings = $this->action->getWarnings(); // Get warnings 380 $step_warnings = $this->action->getWarnings(); // Get warnings
383 if($this->displayConfirm()) { // Check if theres a confirm step 381 if($this->displayConfirm()) { // Check if theres a confirm step
@@ -400,12 +398,17 @@ class stepAction { @@ -400,12 +398,17 @@ class stepAction {
400 $this->_loadValueToSession($this->stepName, $key, $value); 398 $this->_loadValueToSession($this->stepName, $key, $value);
401 } 399 }
402 } 400 }
403 - $content = $step_tpl->fetch();  
404 - $tpl = new Template("templates/wizard.tpl");  
405 - $vars = $this->getVars(); // Get template variables  
406 - $tpl->set("vars", $vars); // Set template errors  
407 - $tpl->set('content', $content);  
408 - echo $tpl->fetch(); 401 + // TODO: Force because it does not always recognize ajax request
  402 + if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
  403 + echo $step_tpl->fetch();
  404 + } else {
  405 + $content = $step_tpl->fetch();
  406 + $tpl = new Template("templates/wizard.tpl");
  407 + $vars = $this->getVars(); // Get template variables
  408 + $tpl->set("vars", $vars); // Set template errors
  409 + $tpl->set('content', $content);
  410 + echo $tpl->fetch();
  411 + }
409 } 412 }
410 413
411 public function getVars() { 414 public function getVars() {
setup/wizard/steps/services.php
@@ -40,6 +40,15 @@ @@ -40,6 +40,15 @@
40 * @version Version 0.1 40 * @version Version 0.1
41 */ 41 */
42 42
  43 +if(isset($_GET['action'])) {
  44 + $func = $_GET['action'];
  45 + if($func != '') {
  46 + require_once("../Step.php");
  47 + require_once("../InstallUtil.php");
  48 + require_once("../path.php");
  49 + }
  50 +}
  51 +
43 class services extends Step 52 class services extends Step
44 { 53 {
45 /** 54 /**
@@ -70,22 +79,49 @@ class services extends Step @@ -70,22 +79,49 @@ class services extends Step
70 private $services = array('Lucene', 'Scheduler', 'OpenOffice'); 79 private $services = array('Lucene', 'Scheduler', 'OpenOffice');
71 80
72 /** 81 /**
73 - * Path to java executable 82 + * Path to php executable
74 * 83 *
75 * @author KnowledgeTree Team 84 * @author KnowledgeTree Team
76 * @access protected 85 * @access protected
77 * @var string 86 * @var string
78 */ 87 */
79 - protected $java; 88 + protected $php;
80 89
81 /** 90 /**
82 - * Path to php executable 91 + * Flag if php already provided
83 * 92 *
84 * @author KnowledgeTree Team 93 * @author KnowledgeTree Team
85 - * @access protected 94 + * @access private
  95 + * @var mixed
  96 + */
  97 + public $providedPhp = false;
  98 +
  99 + /**
  100 + * PHP Installed
  101 + *
  102 + * @author KnowledgeTree Team
  103 + * @access private
  104 + * @var mixed
  105 + */
  106 + private $phpCheck = 'cross_orange';
  107 +
  108 + /**
  109 + * Flag, if php is specified and an error has been encountered
  110 + *
  111 + * @author KnowledgeTree Team
  112 + * @access public
  113 + * @var boolean
  114 + */
  115 + private $phpExeError = false;
  116 +
  117 + /**
  118 + * Holds path error, if php is specified
  119 + *
  120 + * @author KnowledgeTree Team
  121 + * @access public
86 * @var string 122 * @var string
87 */ 123 */
88 - protected $php; 124 + private $phpExeMessage = '';
89 125
90 /** 126 /**
91 * Path to open office executable 127 * Path to open office executable
@@ -97,15 +133,42 @@ class services extends Step @@ -97,15 +133,42 @@ class services extends Step
97 protected $soffice; 133 protected $soffice;
98 134
99 /** 135 /**
100 - * Reference to utility object 136 + * Flag if open office already provided
101 * 137 *
102 * @author KnowledgeTree Team 138 * @author KnowledgeTree Team
103 - * @access protected 139 + * @access private
  140 + * @var mixed
  141 + */
  142 + public $providedOpenOffice = false;
  143 +
  144 + /**
  145 + * Flag, if open office is specified and an error has been encountered
  146 + *
  147 + * @author KnowledgeTree Team
  148 + * @access public
  149 + * @var boolean
  150 + */
  151 + private $openOfficeExeError = false;
  152 +
  153 + /**
  154 + * Holds path error, if open office is specified
  155 + *
  156 + * @author KnowledgeTree Team
  157 + * @access public
104 * @var string 158 * @var string
105 */ 159 */
106 - protected $util; 160 + private $openOfficeExeMessage = '';
107 161
108 /** 162 /**
  163 + * Path to java executable
  164 + *
  165 + * @author KnowledgeTree Team
  166 + * @access protected
  167 + * @var string
  168 + */
  169 + protected $java;
  170 +
  171 + /**
109 * Minumum Java Version 172 * Minumum Java Version
110 * 173 *
111 * @author KnowledgeTree Team 174 * @author KnowledgeTree Team
@@ -113,7 +176,6 @@ class services extends Step @@ -113,7 +176,6 @@ class services extends Step
113 * @var string 176 * @var string
114 */ 177 */
115 private $javaVersion = '1.5'; 178 private $javaVersion = '1.5';
116 -// private $javaVersion = '1.7';  
117 179
118 /** 180 /**
119 * Java Installed 181 * Java Installed
@@ -124,26 +186,50 @@ class services extends Step @@ -124,26 +186,50 @@ class services extends Step
124 */ 186 */
125 private $javaCheck = 'cross'; 187 private $javaCheck = 'cross';
126 188
127 -  
128 - public $providedJava = false;  
129 -  
130 /** 189 /**
131 - * Flag if services are already Installed 190 + * Flag if java already provided
132 * 191 *
133 * @author KnowledgeTree Team 192 * @author KnowledgeTree Team
134 * @access private 193 * @access private
135 * @var mixed 194 * @var mixed
136 */ 195 */
137 - private $alreadyInstalled = false; 196 + public $providedJava = false;
138 197
139 /** 198 /**
140 - * Flag if services are already Installed 199 + * Java Bridge Installed
141 * 200 *
142 * @author KnowledgeTree Team 201 * @author KnowledgeTree Team
143 * @access private 202 * @access private
144 * @var mixed 203 * @var mixed
145 */ 204 */
146 - private $luceneInstalled = false; 205 + private $javaExtCheck = 'cross_orange';
  206 +
  207 + /**
  208 + * Flag if bridge extension needs to be disabled
  209 + *
  210 + * @author KnowledgeTree Team
  211 + * @access public
  212 + * @var boolean
  213 + */
  214 + private $disableExtension = false;
  215 +
  216 + /**
  217 + * Flag, if java is specified and an error has been encountered
  218 + *
  219 + * @author KnowledgeTree Team
  220 + * @access public
  221 + * @var booelean
  222 + */
  223 + private $javaExeError = false;
  224 +
  225 + /**
  226 + * Holds path error, if java is specified
  227 + *
  228 + * @author KnowledgeTree Team
  229 + * @access public
  230 + * @var string
  231 + */
  232 + private $javaExeMessage = '';
147 233
148 /** 234 /**
149 * Flag if services are already Installed 235 * Flag if services are already Installed
@@ -152,25 +238,25 @@ class services extends Step @@ -152,25 +238,25 @@ class services extends Step
152 * @access private 238 * @access private
153 * @var mixed 239 * @var mixed
154 */ 240 */
155 - private $schedulerInstalled = false; 241 + private $alreadyInstalled = false;
156 242
157 /** 243 /**
158 - * PHP Installed 244 + * Flag if services are already Installed
159 * 245 *
160 * @author KnowledgeTree Team 246 * @author KnowledgeTree Team
161 * @access private 247 * @access private
162 * @var mixed 248 * @var mixed
163 */ 249 */
164 - private $phpCheck = 'cross_orange'; 250 + private $luceneInstalled = false;
165 251
166 /** 252 /**
167 - * Java Bridge Installed 253 + * Flag if services are already Installed
168 * 254 *
169 * @author KnowledgeTree Team 255 * @author KnowledgeTree Team
170 * @access private 256 * @access private
171 * @var mixed 257 * @var mixed
172 */ 258 */
173 - private $javaExtCheck = 'cross_orange'; 259 + private $schedulerInstalled = false;
174 260
175 /** 261 /**
176 * Service Installed 262 * Service Installed
@@ -209,41 +295,15 @@ class services extends Step @@ -209,41 +295,15 @@ class services extends Step
209 protected $silent = true; 295 protected $silent = true;
210 296
211 /** 297 /**
212 - * Flag if bridge extension needs to be disabled  
213 - *  
214 - * @author KnowledgeTree Team  
215 - * @access public  
216 - * @var boolean  
217 - */  
218 - private $disableExtension = false;  
219 -  
220 - /**  
221 - * Flag, if java is specified and an error has been encountered  
222 - *  
223 - * @author KnowledgeTree Team  
224 - * @access public  
225 - * @var mixed  
226 - */  
227 - private $javaExeError = '';  
228 -  
229 - /**  
230 - * Holds path error, if java is specified 298 + * Reference to utility object
231 * 299 *
232 * @author KnowledgeTree Team 300 * @author KnowledgeTree Team
233 - * @access public  
234 - * @var mixed 301 + * @access protected
  302 + * @var string
235 */ 303 */
236 - private $javaExeMessage = ''; 304 + protected $util;
237 305
238 /** 306 /**
239 - * Holds path error, if php is specified  
240 - *  
241 - * @author KnowledgeTree Team  
242 - * @access public  
243 - * @var mixed  
244 - */  
245 - private $phpExeError = '';  
246 - /**  
247 * Constructs services object 307 * Constructs services object
248 * 308 *
249 * @author KnowledgeTree Team 309 * @author KnowledgeTree Team
@@ -273,8 +333,6 @@ class services extends Step @@ -273,8 +333,6 @@ class services extends Step
273 // Check dependencies 333 // Check dependencies
274 $passed = $this->doRun(); 334 $passed = $this->doRun();
275 $serv = $this->getDataFromSession("services"); 335 $serv = $this->getDataFromSession("services");
276 -// var_dump($conf);  
277 -// die;  
278 if($passed || $serv['providedJava']) 336 if($passed || $serv['providedJava'])
279 return 'next'; 337 return 'next';
280 else 338 else
@@ -282,7 +340,6 @@ class services extends Step @@ -282,7 +340,6 @@ class services extends Step
282 } else if($this->previous()) { 340 } else if($this->previous()) {
283 return 'previous'; 341 return 'previous';
284 } 342 }
285 -  
286 $passed = $this->doRun(); 343 $passed = $this->doRun();
287 return 'landing'; 344 return 'landing';
288 } 345 }
@@ -457,14 +514,42 @@ class services extends Step @@ -457,14 +514,42 @@ class services extends Step
457 return $this->detSettings(); 514 return $this->detSettings();
458 } 515 }
459 516
  517 + /**
  518 + * Set template view to specify java
  519 + *
  520 + * @author KnowledgeTree Team
  521 + * @param none
  522 + * @access private
  523 + * @return boolean
  524 + */
460 private function specifyJava() { 525 private function specifyJava() {
461 $this->javaExeError = true; 526 $this->javaExeError = true;
462 } 527 }
463 528
  529 + /**
  530 + * Set template view to specify php
  531 + *
  532 + * @author KnowledgeTree Team
  533 + * @param none
  534 + * @access private
  535 + * @return boolean
  536 + */
464 private function specifyPhp() { 537 private function specifyPhp() {
465 $this->phpExeError = true; 538 $this->phpExeError = true;
466 } 539 }
467 540
  541 + /**
  542 + * Set template view to specify open office
  543 + *
  544 + * @author KnowledgeTree Team
  545 + * @param none
  546 + * @access private
  547 + * @return boolean
  548 + */
  549 + private function specifyOpenOffice() {
  550 + $this->openOfficeExeError = true;
  551 + }
  552 +
468 private function phpChecks() { 553 private function phpChecks() {
469 // TODO: Better detection 554 // TODO: Better detection
470 return true; 555 return true;
@@ -931,5 +1016,41 @@ class services extends Step @@ -931,5 +1016,41 @@ class services extends Step
931 public function getPhpDir() { 1016 public function getPhpDir() {
932 return $this->php; 1017 return $this->php;
933 } 1018 }
  1019 +
  1020 + public function doDeleteAll() {
  1021 + $serverDetails = $this->getServices();
  1022 + foreach ($serverDetails as $serviceName) {
  1023 + $className = OS.$serviceName;
  1024 + require_once("../lib/services/service.php");
  1025 + require_once("../lib/services/".OS."service.php");
  1026 + require_once("../lib/services/$className.php");
  1027 + $service = new $className();
  1028 + echo "Delete Service {$service->getName()}<br/>";
  1029 + $service->uninstall();
  1030 + }
  1031 + }
  1032 +
  1033 + public function doInstallAll() {
  1034 + $serverDetails = $this->getServices();
  1035 + foreach ($serverDetails as $serviceName) {
  1036 + $className = OS.$serviceName;
  1037 + require_once("../lib/services/service.php");
  1038 + require_once("../lib/services/".OS."service.php");
  1039 + require_once("../lib/services/$className.php");
  1040 + $service = new $className();
  1041 + echo "Install Service {$service->getName()}<br/>";
  1042 + echo "Status of service ".$service->install()."<br/>";
  1043 + }
  1044 + }
  1045 +}
  1046 +
  1047 +if(isset($_GET['action'])) {
  1048 + $func = $_GET['action'];
  1049 + if($func != '') {
  1050 + $serv = new services();
  1051 + $func_call = strtoupper(substr($func,0,1)).substr($func,1);
  1052 + $method = "do$func";
  1053 + $serv->$method();
  1054 + }
934 } 1055 }
935 ?> 1056 ?>
936 \ No newline at end of file 1057 \ No newline at end of file
setup/wizard/steps/welcome.php
@@ -45,7 +45,7 @@ class welcome extends step { @@ -45,7 +45,7 @@ class welcome extends step {
45 protected $silent = true; 45 protected $silent = true;
46 46
47 function __construct() { 47 function __construct() {
48 - $this->temp_variables = array("step_name"=>"license"); 48 + $this->temp_variables = array("step_name"=>"welcome");
49 } 49 }
50 50
51 function doStep() { 51 function doStep() {
@@ -55,11 +55,6 @@ class welcome extends step { @@ -55,11 +55,6 @@ class welcome extends step {
55 55
56 return 'landing'; 56 return 'landing';
57 } 57 }
58 -  
59 -// function getErrors() {  
60 -// return array();  
61 -// return array('error'=>'error');  
62 -// }  
63 58
64 } 59 }
65 60
setup/wizard/templates/complete.tpl
1 -<form> 1 +<form id="install_complete_none">
2 <p class="title">Installation Completed</p> 2 <p class="title">Installation Completed</p>
3 3
4 <p class="description">This allows you to check that your KnowledgeTree configuration is set 4 <p class="description">This allows you to check that your KnowledgeTree configuration is set
@@ -108,4 +108,5 @@ @@ -108,4 +108,5 @@
108 <?php 108 <?php
109 } 109 }
110 ?> 110 ?>
111 -</form>  
112 \ No newline at end of file 111 \ No newline at end of file
  112 +</form>
  113 +<script type="text/javascript" src="resources/form.js"></script>
113 \ No newline at end of file 114 \ No newline at end of file
setup/wizard/templates/configuration.tpl
1 -<form action="index.php?step_name=configuration" method="post"> 1 +<form id="dependencies_configuration_services" action="index.php?step_name=configuration" method="post">
2 <p class="title">Checking System Configuration</p> 2 <p class="title">Checking System Configuration</p>
3 3
4 <p class="description"> 4 <p class="description">
@@ -85,7 +85,7 @@ @@ -85,7 +85,7 @@
85 <table> 85 <table>
86 <?php 86 <?php
87 if($errors || $warnings) { 87 if($errors || $warnings) {
88 - $width = "290px"; 88 + $width = "390px";
89 } else { 89 } else {
90 $width = "520px"; 90 $width = "520px";
91 } 91 }
@@ -98,7 +98,6 @@ @@ -98,7 +98,6 @@
98 <?php if(isset($path['msg'])) { 98 <?php if(isset($path['msg'])) {
99 ?> 99 ?>
100 <td class="error"> <?php echo $path['msg']; ?> </td> 100 <td class="error"> <?php echo $path['msg']; ?> </td>
101 -<!-- <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>-->  
102 <?php 101 <?php
103 } else { 102 } else {
104 ?> 103 ?>
@@ -118,4 +117,5 @@ @@ -118,4 +117,5 @@
118 </div> 117 </div>
119 <input type="submit" name="Previous" value="Previous" class="button_previous"/> 118 <input type="submit" name="Previous" value="Previous" class="button_previous"/>
120 <input type="submit" name="Next" value="Next" class="button_next"/> 119 <input type="submit" name="Next" value="Next" class="button_next"/>
121 -</form>  
122 \ No newline at end of file 120 \ No newline at end of file
  121 +</form>
  122 +<script type="text/javascript" src="resources/form.js"></script>
123 \ No newline at end of file 123 \ No newline at end of file
setup/wizard/templates/configuration_confirm.tpl
1 -<form action="index.php?step_name=configuration" method="post"> 1 +<form id="dependencies_configuration_services" action="index.php?step_name=configuration" method="post">
2 <p class="title">System Configuration</p> 2 <p class="title">System Configuration</p>
3 <!--Continue Message--> 3 <!--Continue Message-->
4 <?php 4 <?php
@@ -60,12 +60,17 @@ @@ -60,12 +60,17 @@
60 60
61 <table class="conf_paths"> 61 <table class="conf_paths">
62 <?php 62 <?php
  63 + if($errors || $warnings) {
  64 + $width = "50%";
  65 + } else {
  66 + $width = "60%";
  67 + }
63 foreach ($paths as $key => $path){ 68 foreach ($paths as $key => $path){
64 ?> 69 ?>
65 <tr> 70 <tr>
66 <td width="10"><div class='<?php echo $path['class']; ?>'></div></td> 71 <td width="10"><div class='<?php echo $path['class']; ?>'></div></td>
67 <td width="22%"><?php echo $path['name']; ?>:</td> 72 <td width="22%"><?php echo $path['name']; ?>:</td>
68 - <td width="50%"><?php echo $path['path']; ?></td> 73 + <td width="<?php echo $width; ?>"><?php echo $path['path']; ?></td>
69 <?php if(isset($path['msg'])) { ?> 74 <?php if(isset($path['msg'])) { ?>
70 <td class="error" width="27%"> <?php echo $path['msg']; ?> </td> 75 <td class="error" width="27%"> <?php echo $path['msg']; ?> </td>
71 <td width="10"><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td> 76 <td width="10"><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>
@@ -82,4 +87,5 @@ @@ -82,4 +87,5 @@
82 </div> 87 </div>
83 <input type="submit" name="Edit" value="Edit" class="button_previous"/> 88 <input type="submit" name="Edit" value="Edit" class="button_previous"/>
84 <input type="submit" name="Confirm" value="Confirm" class="button_next"/> 89 <input type="submit" name="Confirm" value="Confirm" class="button_next"/>
85 -</form>  
86 \ No newline at end of file 90 \ No newline at end of file
  91 +</form>
  92 +<script type="text/javascript" src="resources/form.js"></script>
87 \ No newline at end of file 93 \ No newline at end of file
setup/wizard/templates/database.tpl
1 -<form id="dbsettings" action="index.php?step_name=<?php echo $step_name; ?>" method="post" onsubmit="w.onSubmitValidate(<?php if ($silent) echo 'true'; else echo 'false'; ?>);return false;"> 1 +<form id="services_database_registration" action="index.php?step_name=<?php echo $step_name; ?>" method="post">
2 <p class="title">Confirming Database Configurations</p> 2 <p class="title">Confirming Database Configurations</p>
3 <!-- Check For immediate Errors --> 3 <!-- Check For immediate Errors -->
4 <span class="error"> <?php if($errors['con']) { echo $errors['con']; } ?> </span> 4 <span class="error"> <?php if($errors['con']) { echo $errors['con']; } ?> </span>
@@ -137,4 +137,5 @@ An second user is required for normal database interaction, the reading and writ @@ -137,4 +137,5 @@ An second user is required for normal database interaction, the reading and writ
137 <input type="button" name="Previous" value="previous" onclick="javascript:{w.showStep(3, 'p');}" class="button_previous"/> 137 <input type="button" name="Previous" value="previous" onclick="javascript:{w.showStep(3, 'p');}" class="button_previous"/>
138 <input type="submit" name="Next" value="next" class="button_next"/> 138 <input type="submit" name="Next" value="next" class="button_next"/>
139 </div> 139 </div>
140 -</form>  
141 \ No newline at end of file 140 \ No newline at end of file
  141 +</form>
  142 +<script type="text/javascript" src="resources/form.js"></script>
142 \ No newline at end of file 143 \ No newline at end of file
setup/wizard/templates/database_confirm.tpl
1 -<form action="index.php?step_name=<?php echo $step_name; ?>" method="post"> 1 +<form id="services_database_registration" action="index.php?step_name=<?php echo $step_name; ?>" method="post">
2 <p class="title">Confirming Database Configurations</p> 2 <p class="title">Confirming Database Configurations</p>
3 3
4 <div class="description"> 4 <div class="description">
@@ -100,4 +100,5 @@ @@ -100,4 +100,5 @@
100 </div> 100 </div>
101 <input type="submit" name="Edit" value="Edit" class="button_previous"/> 101 <input type="submit" name="Edit" value="Edit" class="button_previous"/>
102 <input type="submit" name="Confirm" value="Confirm" class="button_next"/> 102 <input type="submit" name="Confirm" value="Confirm" class="button_next"/>
103 -</form>  
104 \ No newline at end of file 103 \ No newline at end of file
  104 +</form>
  105 +<script type="text/javascript" src="resources/form.js"></script>
105 \ No newline at end of file 106 \ No newline at end of file
setup/wizard/templates/dependencies.tpl
1 -<form action="index.php?step_name=dependencies" method="post"> 1 +<form id="license_dependencies_configuration" action="index.php?step_name=dependencies" method="post">
2 <p class="title">Checking PHP Dependencies</p> 2 <p class="title">Checking PHP Dependencies</p>
3 <p class="description"> 3 <p class="description">
4 The wizard will review your system to determine whether you have the right PHP components in place to run KnowledgeTree. <br/> 4 The wizard will review your system to determine whether you have the right PHP components in place to run KnowledgeTree. <br/>
@@ -132,6 +132,7 @@ @@ -132,6 +132,7 @@
132 </div> 132 </div>
133 <?php } ?> 133 <?php } ?>
134 </div> 134 </div>
135 - <input type="submit" name="Previous" value="Back" class="button_previous"/> 135 + <input type="submit" name="Previous" value="Previous" class="button_previous"/>
136 <input type="submit" name="Next" value="Next" class="button_next"/> 136 <input type="submit" name="Next" value="Next" class="button_next"/>
137 -</form>  
138 \ No newline at end of file 137 \ No newline at end of file
  138 +</form>
  139 +<script type="text/javascript" src="resources/form.js"></script>
139 \ No newline at end of file 140 \ No newline at end of file
setup/wizard/templates/error.tpl
@@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
8 8
9 </head> 9 </head>
10 10
11 - <body onload="w.doFormCheck();"> 11 + <body onload="">
12 <div id="outer-wrapper"> 12 <div id="outer-wrapper">
13 <div id="header"> 13 <div id="header">
14 <div id="logo"><img src="resources/graphics/dame/installer-header_logo.png"/></div> 14 <div id="logo"><img src="resources/graphics/dame/installer-header_logo.png"/></div>
@@ -30,7 +30,6 @@ @@ -30,7 +30,6 @@
30 <?php if(isset($error)) { 30 <?php if(isset($error)) {
31 echo "<span class='error'>".$error."</span>"; 31 echo "<span class='error'>".$error."</span>";
32 ?> 32 ?>
33 - <a style="width:100px;" href="javascript:this.location.reload();" class="refresh">Refresh</a>  
34 <?php 33 <?php
35 } 34 }
36 ?> 35 ?>
setup/wizard/templates/install.tpl
1 -<form action="index.php?step_name=install" method="post"> 1 +<form id="registration_install_complete" action="index.php?step_name=install" method="post">
2 <p class="title">Finalizing System Installation</p> 2 <p class="title">Finalizing System Installation</p>
3 3
4 <div id="step_content" class="step"> 4 <div id="step_content" class="step">
@@ -11,4 +11,5 @@ @@ -11,4 +11,5 @@
11 </div> 11 </div>
12 <input type="submit" name="Previous" value="Previous" class="button_previous"/> 12 <input type="submit" name="Previous" value="Previous" class="button_previous"/>
13 <input type="submit" name="Install" value="Install" class="button_next"/> 13 <input type="submit" name="Install" value="Install" class="button_next"/>
14 -</form>  
15 \ No newline at end of file 14 \ No newline at end of file
  15 +</form>
  16 +<script type="text/javascript" src="resources/form.js"></script>
16 \ No newline at end of file 17 \ No newline at end of file
setup/wizard/templates/license.tpl
1 -<form action="index.php?step_name=license" method="POST"> 1 +<form id="welcome_license_dependencies" action="index.php?step_name=license" method="POST">
2 <p class="title">License Agreement</p> 2 <p class="title">License Agreement</p>
3 3
4 <div class="error_message"> 4 <div class="error_message">
@@ -333,7 +333,8 @@ govern. @@ -333,7 +333,8 @@ govern.
333 </p> 333 </p>
334 </div> 334 </div>
335 <input id="accept" type="hidden" name="license" value=""/> 335 <input id="accept" type="hidden" name="license" value=""/>
336 - <input type="submit" name="Previous" value="Back" class="button_previous"/> 336 + <input type="submit" name="Previous" value="Previous" class="button_previous"/>
337 <input type="submit" name="Next" value="I Disagree" onclick="javascript:{document.getElementById('accept').value = 0;}" class="button_next"/> 337 <input type="submit" name="Next" value="I Disagree" onclick="javascript:{document.getElementById('accept').value = 0;}" class="button_next"/>
338 <input type="submit" name="Next" value="I Agree" onclick="javascript:{document.getElementById('accept').value = 1;}" class="button_next"/> 338 <input type="submit" name="Next" value="I Agree" onclick="javascript:{document.getElementById('accept').value = 1;}" class="button_next"/>
339 -</form>  
340 \ No newline at end of file 339 \ No newline at end of file
  340 +</form>
  341 +<script type="text/javascript" src="resources/form.js"></script>
341 \ No newline at end of file 342 \ No newline at end of file
setup/wizard/templates/registration.tpl
1 -<form id="registration" action="index.php?step_name=<?php echo $step_name; ?>" method="post" onsubmit="w.validateRegistration();return false;"> 1 +<form id="database_registration_install" action="index.php?step_name=<?php echo $step_name; ?>" method="post" onsubmit="w.dummy();">
2 <p class="title">Registering KnowledgeTree</p> 2 <p class="title">Registering KnowledgeTree</p>
3 <?php 3 <?php
4 //echo $sel_country; 4 //echo $sel_country;
@@ -17,7 +17,7 @@ @@ -17,7 +17,7 @@
17 <br/> 17 <br/>
18 <div id="step_content_registration" class="step"> 18 <div id="step_content_registration" class="step">
19 <span class="error" id="reg_error"></span> 19 <span class="error" id="reg_error"></span>
20 - <?php $input_width = 32; ?> 20 + <?php $input_width = 40; ?>
21 <table> 21 <table>
22 <tr> 22 <tr>
23 <td><label for='first'>First Name</label></td> 23 <td><label for='first'>First Name</label></td>
@@ -101,4 +101,5 @@ @@ -101,4 +101,5 @@
101 101
102 <input type="submit" name="Previous" value="Previous" onclick="w.pClick()" class="button_previous"/> 102 <input type="submit" name="Previous" value="Previous" onclick="w.pClick()" class="button_previous"/>
103 <input type="submit" name="Next" value="Register" onclick="w.nClick()" class="button_next"/> 103 <input type="submit" name="Next" value="Register" onclick="w.nClick()" class="button_next"/>
104 -</form>  
105 \ No newline at end of file 104 \ No newline at end of file
  105 +</form>
  106 +<script type="text/javascript" src="resources/form.js"></script>
106 \ No newline at end of file 107 \ No newline at end of file
setup/wizard/templates/registration_confirm.tpl
1 -<form action="index.php?step_name=install" method="post"> 1 +<form id="database_registration_install" action="index.php?step_name=install" method="post">
2 <p class="title">Thank you for registering</p> 2 <p class="title">Thank you for registering</p>
3 <div id="step_content_registration_confirm" class="step"> 3 <div id="step_content_registration_confirm" class="step">
4 <br/> 4 <br/>
@@ -10,4 +10,5 @@ @@ -10,4 +10,5 @@
10 </div> 10 </div>
11 <input type="submit" name="Previous" value="Previous" class="button_previous"/> 11 <input type="submit" name="Previous" value="Previous" class="button_previous"/>
12 <input type="submit" name="Confirm" value="Next" class="button_next"/> 12 <input type="submit" name="Confirm" value="Next" class="button_next"/>
13 -</form>  
14 \ No newline at end of file 13 \ No newline at end of file
  14 +</form>
  15 +<script type="text/javascript" src="resources/form.js"></script>
15 \ No newline at end of file 16 \ No newline at end of file
setup/wizard/templates/services.tpl
1 -<form action="index.php?step_name=services" method="post" id="services"> 1 +<form id="configuration_services_database" action="index.php?step_name=services" method="post" id="services">
2 <?php //if($javaExeError != '' || $phpExeError != '') { 2 <?php //if($javaExeError != '' || $phpExeError != '') {
3 //var_dump($javaExeError); 3 //var_dump($javaExeError);
4 //if($errors) $top = "185px"; elseif ($warnings) $top = "185px"; else $top = "168px"; 4 //if($errors) $top = "185px"; elseif ($warnings) $top = "185px"; else $top = "168px";
@@ -161,6 +161,7 @@ @@ -161,6 +161,7 @@
161 </div> 161 </div>
162 <?php } ?> 162 <?php } ?>
163 </div> 163 </div>
164 - <input type="submit" name="Previous" value="Back" class="button_previous"/> 164 + <input type="submit" name="Previous" value="Previous" class="button_previous"/>
165 <input type="submit" name="Next" value="Next" class="button_next"/> 165 <input type="submit" name="Next" value="Next" class="button_next"/>
166 -</form>  
167 \ No newline at end of file 166 \ No newline at end of file
  167 +</form>
  168 +<script type="text/javascript" src="resources/form.js"></script>
168 \ No newline at end of file 169 \ No newline at end of file
setup/wizard/templates/welcome.tpl
1 -<form action="index.php?step_name=welcome" method="post"> 1 +<form id="welcome_license" action="index.php?step_name=welcome" method="post">
2 <p class="title">Welcome to KnowledgeTree</p> 2 <p class="title">Welcome to KnowledgeTree</p>
3 <div id="step_content" class="step"> 3 <div id="step_content" class="step">
4 <br/> 4 <br/>
@@ -7,4 +7,5 @@ @@ -7,4 +7,5 @@
7 <div class="demo"><img src="resources/graphics/kt_browse.png" /></div> 7 <div class="demo"><img src="resources/graphics/kt_browse.png" /></div>
8 </div> 8 </div>
9 <input type="submit" name="Next" value="Next" class="button_next"/> 9 <input type="submit" name="Next" value="Next" class="button_next"/>
10 -</form>  
11 \ No newline at end of file 10 \ No newline at end of file
  11 +</form>
  12 +<script type="text/javascript" src="resources/form.js"></script>
12 \ No newline at end of file 13 \ No newline at end of file
setup/wizard/templates/wizard.tpl
@@ -2,18 +2,19 @@ @@ -2,18 +2,19 @@
2 <html> 2 <html>
3 <head> 3 <head>
4 <title>KnowledgeTree Installer</title> 4 <title>KnowledgeTree Installer</title>
5 - <script type="text/javascript" src="resources/jquery-tooltip/lib/jquery.js"></script> 5 + <script type="text/javascript" src="resources/jquery.js"></script>
  6 + <script type="text/javascript" src="resources/jquery.form.js"></script>
  7 + <script type="text/javascript" src="resources/jquery.blockUI.js"></script>
6 <script type="text/javascript" src="resources/wizard.js" ></script> 8 <script type="text/javascript" src="resources/wizard.js" ></script>
7 <link rel="stylesheet" type="text/css" href="resources/wizard.css" /> 9 <link rel="stylesheet" type="text/css" href="resources/wizard.css" />
8 -  
9 </head> 10 </head>
10 - <body onload="w.doFormCheck();"> 11 + <body onload="">
11 <div id="outer-wrapper"> 12 <div id="outer-wrapper">
12 <div id="header"> 13 <div id="header">
13 - <div id="logo"><img src="resources/graphics/dame/installer-header_logo.png"/></div>  
14 - <div id="install_details">  
15 - <span style="font-size:120%;"> <?php echo $vars['install_version']; ?> </span>  
16 - <span style="font-size:120%;"><?php echo $vars['install_type']; ?></span> 14 + <div id="logo"><img src="resources/graphics/dame/installer-header_logo.png"/></div>
  15 + <div id="install_details">
  16 + <span style="font-size:120%;"> <?php echo $vars['install_version']; ?> </span>
  17 + <span style="font-size:120%;"><?php echo $vars['install_type']; ?></span>
17 </div> 18 </div>
18 </div> 19 </div>
19 <div id="wrapper"> 20 <div id="wrapper">
@@ -26,6 +27,7 @@ @@ -26,6 +27,7 @@
26 <?php echo $content; ?> 27 <?php echo $content; ?>
27 </div> 28 </div>
28 </div> 29 </div>
  30 + <div id="loading" style="display:none;"> <img src="resources/graphics/loading.gif" height="32px" width="32px"> </div>
29 </div> 31 </div>
30 <div class="clearing">&nbsp;</div> 32 <div class="clearing">&nbsp;</div>
31 </div> 33 </div>