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 150 function start() {
151 151 // TODO : Write sh on the fly? Not sure the reasoning here
152 152 $source = $this->getSchedulerSourceLoc();
153   - return ;
154 153 if($source) { // Source
155 154 $cmd = "nohup ".$source." > ".SYS_LOG_DIR."scheduler.log 2>&1 & echo $!";
156 155 $response = $this->util->pexec($cmd);
... ...
setup/wizard/lib/services/windowsAgent.php
... ... @@ -42,10 +42,16 @@
42 42  
43 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 58 \ No newline at end of file
... ...
setup/wizard/lib/services/windowsLucene.php
... ... @@ -122,6 +122,16 @@ class windowsLucene extends windowsService {
122 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 135 * Load defaults needed by service
126 136 *
127 137 * @author KnowledgeTree Team
... ... @@ -130,7 +140,7 @@ class windowsLucene extends windowsService {
130 140 * @return void
131 141 */
132 142 public function load() {
133   - $this->name = "KTLuceneTest";
  143 +// $this->name = "KTLuceneTest";
134 144 $this->javaSystem = new Java('java.lang.System');
135 145 $this->setJavaBin($this->javaSystem->getProperty('java.home').DS."bin");
136 146 $this->setLuceneDIR(SYSTEM_DIR."bin".DS."luceneserver");
... ... @@ -352,11 +362,12 @@ class windowsLucene extends windowsService {
352 362 * @author KnowledgeTree Team
353 363 * @access public
354 364 * @param none
355   - * @return array
  365 + * @return string
356 366 */
357   - function install() {
  367 + public function install() {
358 368 $state = $this->status();
359 369 if($state == '') {
  370 + $this->writeLuceneProperties();
360 371 $luceneExe = $this->getLuceneExe();
361 372 $luceneSource = $this->getLuceneSource();
362 373 $luceneDir = $this->getluceneDir();
... ... @@ -371,5 +382,29 @@ class windowsLucene extends windowsService {
371 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 411 \ No newline at end of file
... ...
setup/wizard/lib/services/windowsOpenOffice.php
... ... @@ -42,42 +42,118 @@
42 42  
43 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 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 61 private $path;
49   - // host
  62 +
  63 + /**
  64 + * Web server
  65 + *
  66 + * @author KnowledgeTree Team
  67 + * @access protected
  68 + * @var string
  69 + */
50 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 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 88 private $port;
55   - // bin folder
  89 +
  90 + /**
  91 + * Web server
  92 + *
  93 + * @author KnowledgeTree Team
  94 + * @access protected
  95 + * @var string
  96 + */
56 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 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 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 145 public function load() {
70 146 // hack for testing
71 147 $this->setPort("8100");
72 148 $this->setHost("127.0.0.1");
73 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 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 157 private function setPort($port = "8100") {
82 158 $this->port = $port;
83 159 }
... ... @@ -139,24 +215,5 @@ class windowsOpenOffice extends windowsService {
139 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 220 \ No newline at end of file
... ...
setup/wizard/lib/services/windowsScheduler.php
... ... @@ -66,6 +66,16 @@ class windowsScheduler extends windowsService {
66 66 * @var string
67 67 */
68 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 81 * Load defaults needed by service
... ... @@ -76,62 +86,61 @@ class windowsScheduler extends windowsService {
76 86 * @return void
77 87 */
78 88 function load() {
79   - $this->name = "KTSchedulerTest";
80 89 $this->setSchedulerDIR(SYSTEM_DIR."bin".DS."win32");
81   -// $this->setSchedulerScriptPath("taskrunner_test.bat");
82 90 $this->setSchedulerScriptPath("taskrunner.bat");
83 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 98 * @author KnowledgeTree Team
90 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 110 * @author KnowledgeTree Team
102 111 * @access public
103 112 * @param none
104 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 118 return false;
110 119 }
111 120  
112 121 /**
113   - * Set Scheduler Directory path
  122 + * Set Batch Script path
114 123 *
115 124 * @author KnowledgeTree Team
116 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 136 * @author KnowledgeTree Team
128 137 * @access public
129 138 * @param none
130 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 144 return false;
136 145 }
137 146  
... ... @@ -172,28 +181,33 @@ class windowsScheduler extends windowsService {
172 181 public function install() {
173 182 $state = $this->status();
174 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 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 187 $response = win32_create_service(array(
189 188 'service' => $this->name,
190 189 'display' => $this->name,
191 190 'path' => $this->getSchedulerScriptPath()
192 191 ));
193 192 return $response;
  193 + } else { // Attempt to use the winserv
  194 +
194 195 }
195 196 }
196 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 214 \ No newline at end of file
... ...
setup/wizard/lib/services/windowsService.php
... ... @@ -41,7 +41,25 @@
41 41 */
42 42  
43 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 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 63 public $util;
46 64  
47 65 public function __construct() {
... ...
setup/wizard/path.php
... ... @@ -40,6 +40,7 @@
40 40 * @version Version 0.1
41 41 */
42 42 // Define installer environment
  43 + define('DEBUG', 1);
43 44 if (substr(php_uname(), 0, 7) == "Windows"){
44 45 define('WINDOWS_OS', true);
45 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 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 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 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 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 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 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 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 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 536 padding: 2px 8px 2px 5px;
537 537 text-decoration: none;
538 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 548 \ No newline at end of file
... ...
setup/wizard/resources/wizard.js
... ... @@ -2,171 +2,57 @@
2 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 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 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 18 // Focus on element
117 19 wizard.prototype.focusElement = function(el) {
118 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 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 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 39 // Validate Registration Page
156 40 wizard.prototype.validateRegistration = function() {
157 41 // See if next or previous is clicked.
158   - var state = document.getElementById('state').name;
  42 + var state = $('#state').attr('name');
159 43 if(state == 'next') {
160 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 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 58 wizard.prototype.valRegHelper = function() {
... ... @@ -257,28 +143,23 @@ wizard.prototype.rtrim = function (str, chars) {
257 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 166 \ No newline at end of file
... ...
setup/wizard/stepAction.php
... ... @@ -324,11 +324,10 @@ class stepAction {
324 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 331 return $menu;
333 332 }
334 333  
... ... @@ -377,7 +376,6 @@ class stepAction {
377 376 * @return string
378 377 */
379 378 public function paintAction() {
380   -
381 379 $step_errors = $this->action->getErrors(); // Get errors
382 380 $step_warnings = $this->action->getWarnings(); // Get warnings
383 381 if($this->displayConfirm()) { // Check if theres a confirm step
... ... @@ -400,12 +398,17 @@ class stepAction {
400 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 414 public function getVars() {
... ...
setup/wizard/steps/services.php
... ... @@ -40,6 +40,15 @@
40 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 52 class services extends Step
44 53 {
45 54 /**
... ... @@ -70,22 +79,49 @@ class services extends Step
70 79 private $services = array('Lucene', 'Scheduler', 'OpenOffice');
71 80  
72 81 /**
73   - * Path to java executable
  82 + * Path to php executable
74 83 *
75 84 * @author KnowledgeTree Team
76 85 * @access protected
77 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 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 122 * @var string
87 123 */
88   - protected $php;
  124 + private $phpExeMessage = '';
89 125  
90 126 /**
91 127 * Path to open office executable
... ... @@ -97,15 +133,42 @@ class services extends Step
97 133 protected $soffice;
98 134  
99 135 /**
100   - * Reference to utility object
  136 + * Flag if open office already provided
101 137 *
102 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 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 172 * Minumum Java Version
110 173 *
111 174 * @author KnowledgeTree Team
... ... @@ -113,7 +176,6 @@ class services extends Step
113 176 * @var string
114 177 */
115 178 private $javaVersion = '1.5';
116   -// private $javaVersion = '1.7';
117 179  
118 180 /**
119 181 * Java Installed
... ... @@ -124,26 +186,50 @@ class services extends Step
124 186 */
125 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 192 * @author KnowledgeTree Team
134 193 * @access private
135 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 201 * @author KnowledgeTree Team
143 202 * @access private
144 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 235 * Flag if services are already Installed
... ... @@ -152,25 +238,25 @@ class services extends Step
152 238 * @access private
153 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 246 * @author KnowledgeTree Team
161 247 * @access private
162 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 255 * @author KnowledgeTree Team
170 256 * @access private
171 257 * @var mixed
172 258 */
173   - private $javaExtCheck = 'cross_orange';
  259 + private $schedulerInstalled = false;
174 260  
175 261 /**
176 262 * Service Installed
... ... @@ -209,41 +295,15 @@ class services extends Step
209 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 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 307 * Constructs services object
248 308 *
249 309 * @author KnowledgeTree Team
... ... @@ -273,8 +333,6 @@ class services extends Step
273 333 // Check dependencies
274 334 $passed = $this->doRun();
275 335 $serv = $this->getDataFromSession("services");
276   -// var_dump($conf);
277   -// die;
278 336 if($passed || $serv['providedJava'])
279 337 return 'next';
280 338 else
... ... @@ -282,7 +340,6 @@ class services extends Step
282 340 } else if($this->previous()) {
283 341 return 'previous';
284 342 }
285   -
286 343 $passed = $this->doRun();
287 344 return 'landing';
288 345 }
... ... @@ -457,14 +514,42 @@ class services extends Step
457 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 525 private function specifyJava() {
461 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 537 private function specifyPhp() {
465 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 553 private function phpChecks() {
469 554 // TODO: Better detection
470 555 return true;
... ... @@ -931,5 +1016,41 @@ class services extends Step
931 1016 public function getPhpDir() {
932 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 1057 \ No newline at end of file
... ...
setup/wizard/steps/welcome.php
... ... @@ -45,7 +45,7 @@ class welcome extends step {
45 45 protected $silent = true;
46 46  
47 47 function __construct() {
48   - $this->temp_variables = array("step_name"=>"license");
  48 + $this->temp_variables = array("step_name"=>"welcome");
49 49 }
50 50  
51 51 function doStep() {
... ... @@ -55,11 +55,6 @@ class welcome extends step {
55 55  
56 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 2 <p class="title">Installation Completed</p>
3 3  
4 4 <p class="description">This allows you to check that your KnowledgeTree configuration is set
... ... @@ -108,4 +108,5 @@
108 108 <?php
109 109 }
110 110 ?>
111   -</form>
112 111 \ No newline at end of file
  112 +</form>
  113 +<script type="text/javascript" src="resources/form.js"></script>
113 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 2 <p class="title">Checking System Configuration</p>
3 3  
4 4 <p class="description">
... ... @@ -85,7 +85,7 @@
85 85 <table>
86 86 <?php
87 87 if($errors || $warnings) {
88   - $width = "290px";
  88 + $width = "390px";
89 89 } else {
90 90 $width = "520px";
91 91 }
... ... @@ -98,7 +98,6 @@
98 98 <?php if(isset($path['msg'])) {
99 99 ?>
100 100 <td class="error"> <?php echo $path['msg']; ?> </td>
101   -<!-- <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>-->
102 101 <?php
103 102 } else {
104 103 ?>
... ... @@ -118,4 +117,5 @@
118 117 </div>
119 118 <input type="submit" name="Previous" value="Previous" class="button_previous"/>
120 119 <input type="submit" name="Next" value="Next" class="button_next"/>
121   -</form>
122 120 \ No newline at end of file
  121 +</form>
  122 +<script type="text/javascript" src="resources/form.js"></script>
123 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 2 <p class="title">System Configuration</p>
3 3 <!--Continue Message-->
4 4 <?php
... ... @@ -60,12 +60,17 @@
60 60  
61 61 <table class="conf_paths">
62 62 <?php
  63 + if($errors || $warnings) {
  64 + $width = "50%";
  65 + } else {
  66 + $width = "60%";
  67 + }
63 68 foreach ($paths as $key => $path){
64 69 ?>
65 70 <tr>
66 71 <td width="10"><div class='<?php echo $path['class']; ?>'></div></td>
67 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 74 <?php if(isset($path['msg'])) { ?>
70 75 <td class="error" width="27%"> <?php echo $path['msg']; ?> </td>
71 76 <td width="10"><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>
... ... @@ -82,4 +87,5 @@
82 87 </div>
83 88 <input type="submit" name="Edit" value="Edit" class="button_previous"/>
84 89 <input type="submit" name="Confirm" value="Confirm" class="button_next"/>
85   -</form>
86 90 \ No newline at end of file
  91 +</form>
  92 +<script type="text/javascript" src="resources/form.js"></script>
87 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 2 <p class="title">Confirming Database Configurations</p>
3 3 <!-- Check For immediate Errors -->
4 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 137 <input type="button" name="Previous" value="previous" onclick="javascript:{w.showStep(3, 'p');}" class="button_previous"/>
138 138 <input type="submit" name="Next" value="next" class="button_next"/>
139 139 </div>
140   -</form>
141 140 \ No newline at end of file
  141 +</form>
  142 +<script type="text/javascript" src="resources/form.js"></script>
142 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 2 <p class="title">Confirming Database Configurations</p>
3 3  
4 4 <div class="description">
... ... @@ -100,4 +100,5 @@
100 100 </div>
101 101 <input type="submit" name="Edit" value="Edit" class="button_previous"/>
102 102 <input type="submit" name="Confirm" value="Confirm" class="button_next"/>
103   -</form>
104 103 \ No newline at end of file
  104 +</form>
  105 +<script type="text/javascript" src="resources/form.js"></script>
105 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 2 <p class="title">Checking PHP Dependencies</p>
3 3 <p class="description">
4 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 132 </div>
133 133 <?php } ?>
134 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 136 <input type="submit" name="Next" value="Next" class="button_next"/>
137   -</form>
138 137 \ No newline at end of file
  138 +</form>
  139 +<script type="text/javascript" src="resources/form.js"></script>
139 140 \ No newline at end of file
... ...
setup/wizard/templates/error.tpl
... ... @@ -8,7 +8,7 @@
8 8  
9 9 </head>
10 10  
11   - <body onload="w.doFormCheck();">
  11 + <body onload="">
12 12 <div id="outer-wrapper">
13 13 <div id="header">
14 14 <div id="logo"><img src="resources/graphics/dame/installer-header_logo.png"/></div>
... ... @@ -30,7 +30,6 @@
30 30 <?php if(isset($error)) {
31 31 echo "<span class='error'>".$error."</span>";
32 32 ?>
33   - <a style="width:100px;" href="javascript:this.location.reload();" class="refresh">Refresh</a>
34 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 2 <p class="title">Finalizing System Installation</p>
3 3  
4 4 <div id="step_content" class="step">
... ... @@ -11,4 +11,5 @@
11 11 </div>
12 12 <input type="submit" name="Previous" value="Previous" class="button_previous"/>
13 13 <input type="submit" name="Install" value="Install" class="button_next"/>
14   -</form>
15 14 \ No newline at end of file
  15 +</form>
  16 +<script type="text/javascript" src="resources/form.js"></script>
16 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 2 <p class="title">License Agreement</p>
3 3  
4 4 <div class="error_message">
... ... @@ -333,7 +333,8 @@ govern.
333 333 </p>
334 334 </div>
335 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 337 <input type="submit" name="Next" value="I Disagree" onclick="javascript:{document.getElementById('accept').value = 0;}" class="button_next"/>
338 338 <input type="submit" name="Next" value="I Agree" onclick="javascript:{document.getElementById('accept').value = 1;}" class="button_next"/>
339   -</form>
340 339 \ No newline at end of file
  340 +</form>
  341 +<script type="text/javascript" src="resources/form.js"></script>
341 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 2 <p class="title">Registering KnowledgeTree</p>
3 3 <?php
4 4 //echo $sel_country;
... ... @@ -17,7 +17,7 @@
17 17 <br/>
18 18 <div id="step_content_registration" class="step">
19 19 <span class="error" id="reg_error"></span>
20   - <?php $input_width = 32; ?>
  20 + <?php $input_width = 40; ?>
21 21 <table>
22 22 <tr>
23 23 <td><label for='first'>First Name</label></td>
... ... @@ -101,4 +101,5 @@
101 101  
102 102 <input type="submit" name="Previous" value="Previous" onclick="w.pClick()" class="button_previous"/>
103 103 <input type="submit" name="Next" value="Register" onclick="w.nClick()" class="button_next"/>
104   -</form>
105 104 \ No newline at end of file
  105 +</form>
  106 +<script type="text/javascript" src="resources/form.js"></script>
106 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 2 <p class="title">Thank you for registering</p>
3 3 <div id="step_content_registration_confirm" class="step">
4 4 <br/>
... ... @@ -10,4 +10,5 @@
10 10 </div>
11 11 <input type="submit" name="Previous" value="Previous" class="button_previous"/>
12 12 <input type="submit" name="Confirm" value="Next" class="button_next"/>
13   -</form>
14 13 \ No newline at end of file
  14 +</form>
  15 +<script type="text/javascript" src="resources/form.js"></script>
15 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 2 <?php //if($javaExeError != '' || $phpExeError != '') {
3 3 //var_dump($javaExeError);
4 4 //if($errors) $top = "185px"; elseif ($warnings) $top = "185px"; else $top = "168px";
... ... @@ -161,6 +161,7 @@
161 161 </div>
162 162 <?php } ?>
163 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 165 <input type="submit" name="Next" value="Next" class="button_next"/>
166   -</form>
167 166 \ No newline at end of file
  167 +</form>
  168 +<script type="text/javascript" src="resources/form.js"></script>
168 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 2 <p class="title">Welcome to KnowledgeTree</p>
3 3 <div id="step_content" class="step">
4 4 <br/>
... ... @@ -7,4 +7,5 @@
7 7 <div class="demo"><img src="resources/graphics/kt_browse.png" /></div>
8 8 </div>
9 9 <input type="submit" name="Next" value="Next" class="button_next"/>
10   -</form>
11 10 \ No newline at end of file
  11 +</form>
  12 +<script type="text/javascript" src="resources/form.js"></script>
12 13 \ No newline at end of file
... ...
setup/wizard/templates/wizard.tpl
... ... @@ -2,18 +2,19 @@
2 2 <html>
3 3 <head>
4 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 8 <script type="text/javascript" src="resources/wizard.js" ></script>
7 9 <link rel="stylesheet" type="text/css" href="resources/wizard.css" />
8   -
9 10 </head>
10   - <body onload="w.doFormCheck();">
  11 + <body onload="">
11 12 <div id="outer-wrapper">
12 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 18 </div>
18 19 </div>
19 20 <div id="wrapper">
... ... @@ -26,6 +27,7 @@
26 27 <?php echo $content; ?>
27 28 </div>
28 29 </div>
  30 + <div id="loading" style="display:none;"> <img src="resources/graphics/loading.gif" height="32px" width="32px"> </div>
29 31 </div>
30 32 <div class="clearing">&nbsp;</div>
31 33 </div>
... ...