diff options
363 files changed, 13044 insertions, 1452 deletions
diff --git a/.build_number b/.build_number new file mode 100644 index 00000000..ba31e80f --- /dev/null +++ b/.build_number @@ -0,0 +1,6 @@ +; This file keeps track of the build number for the "master" +; branch of gallery3. It's kept up to date by an automated +; process. You don't need to edit it. In fact.. +; +; DO NOT EDIT THIS FILE BY HAND! +build_number=64 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..fdf9d072 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +.build_number merge=merge-keep-ours + @@ -1,3 +1,8 @@ +# Set some reasonable defaults for PHP. Most of these cannot be set +# inside the script itself. For hosts that don't have .htaccess +# support but do support per-dir php.ini files, these settings are +# mirrored in php.ini +# <IfModule mod_php5.c> php_flag short_open_tag On php_flag magic_quotes_gpc Off @@ -24,7 +29,7 @@ # in your Apache2 config file before you uncomment this block or # you'll get an "Internal Server Error". # -# <FilesMatch "(\.(class|fla|gitignore|inc|ini|sql|txt)|(README|LICENSE))$"> +# <FilesMatch "(\.(class|fla|gitignore|inc|ini|sql|txt)|(README|LICENSE|.build_number))$"> # Order deny,allow # Deny from all # </FilesMatch> @@ -1,4 +1,4 @@ -Gallery 3.0 (code name "Santa Fe") +Gallery 3.0+ (development version) ABOUT: Gallery 3 is a web based software product that lets you manage your @@ -33,6 +33,9 @@ SUPPORTED CONFIGURATION: filter, and json must be installed). - Database: MySQL 5 and newer. +For complete system requirements, please refer to: + http://codex.gallery2.org/Gallery3:Requirements + INSTALLING AND UPGRADING INSTRUCTIONS: For comprehensive instructions, The online User Guide is your best resource: @@ -61,8 +64,7 @@ INSTALLATION FROM THE COMMAND LINE: BUGS? Go to http://apps.sourceforge.net/trac/gallery/ click the "login" link and log in with your SourceForge username and password, then click the -"new ticket" button. Mark any issues you find with the "3.1" -milestone and we'll try to get 'em done for the next release. +"new ticket" button. QUESTIONS, PROBLEMS: diff --git a/application/Bootstrap.php b/application/Bootstrap.php index fbd83ce1..ff021fd5 100644 --- a/application/Bootstrap.php +++ b/application/Bootstrap.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/application/config/config.php b/application/config/config.php index 3b92ac73..e595231f 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -1,7 +1,7 @@ <?php /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -35,6 +35,11 @@ error_reporting(0); // and logging. You can turn off Kohana errors in application/config/config.php ini_set("display_errors", false); +// Turn off session.use_trans_sid -- that feature attempts to inject session ids +// into generated URLs and forms, but it doesn't interoperate will with Gallery's +// Ajax code. +ini_set("session.use_trans_sid", false); + define("EXT", ".php"); define("DOCROOT", getcwd() . "/"); define("KOHANA", "index.php"); diff --git a/installer/cli.php b/installer/cli.php index fe82395a..e02c8658 100644 --- a/installer/cli.php +++ b/installer/cli.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/installer/index.php b/installer/index.php index 75d6fe5b..5ac23cfb 100644 --- a/installer/index.php +++ b/installer/index.php @@ -1,7 +1,7 @@ <?php /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,6 +26,11 @@ if (version_compare(PHP_VERSION, "5.2.3", "<")) { exit; } +// Turn off session.use_trans_sid -- that feature attempts to inject session ids +// into generated URLs and forms, but it doesn't interoperate will with Gallery's +// Ajax code. +ini_set("session.use_trans_sid", false); + require(DOCROOT . "installer/installer.php"); if (PHP_SAPI == "cli") { include("cli.php"); diff --git a/installer/install.sql b/installer/install.sql index 427a3283..865cb2a4 100644 --- a/installer/install.sql +++ b/installer/install.sql @@ -43,7 +43,7 @@ CREATE TABLE {caches} ( `expiration` int(9) NOT NULL, `cache` longblob, PRIMARY KEY (`id`), - KEY `key` (`key`), + UNIQUE KEY `key` (`key`), KEY `tags` (`tags`) ) DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -152,7 +152,7 @@ CREATE TABLE {items} ( `album_cover_item_id` int(9) DEFAULT NULL, `captured` int(9) DEFAULT NULL, `created` int(9) DEFAULT NULL, - `description` varchar(2048) DEFAULT NULL, + `description` text, `height` int(9) DEFAULT NULL, `left_ptr` int(9) NOT NULL, `level` int(9) NOT NULL, @@ -160,7 +160,7 @@ CREATE TABLE {items} ( `name` varchar(255) DEFAULT NULL, `owner_id` int(9) DEFAULT NULL, `parent_id` int(9) NOT NULL, - `rand_key` float DEFAULT NULL, + `rand_key` decimal(11,10) DEFAULT NULL, `relative_path_cache` varchar(255) DEFAULT NULL, `relative_url_cache` varchar(255) DEFAULT NULL, `resize_dirty` tinyint(1) DEFAULT '1', @@ -225,7 +225,7 @@ CREATE TABLE {messages} ( `id` int(9) NOT NULL AUTO_INCREMENT, `key` varchar(255) DEFAULT NULL, `severity` varchar(32) DEFAULT NULL, - `value` varchar(255) DEFAULT NULL, + `value` text, PRIMARY KEY (`id`), UNIQUE KEY `key` (`key`) ) DEFAULT CHARSET=utf8; @@ -242,18 +242,17 @@ CREATE TABLE {modules} ( PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`), KEY `weight` (`weight`) -) AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; +) AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -INSERT INTO {modules} VALUES (1,1,'gallery',41,1); +INSERT INTO {modules} VALUES (1,1,'gallery',46,1); INSERT INTO {modules} VALUES (2,1,'user',3,2); INSERT INTO {modules} VALUES (3,1,'comment',3,3); -INSERT INTO {modules} VALUES (4,1,'organize',2,4); -INSERT INTO {modules} VALUES (5,1,'info',1,5); -INSERT INTO {modules} VALUES (6,1,'rest',3,6); -INSERT INTO {modules} VALUES (7,1,'rss',1,7); -INSERT INTO {modules} VALUES (8,1,'search',1,8); -INSERT INTO {modules} VALUES (9,1,'slideshow',2,9); -INSERT INTO {modules} VALUES (10,1,'tag',2,10); +INSERT INTO {modules} VALUES (4,1,'organize',4,4); +INSERT INTO {modules} VALUES (5,1,'info',2,5); +INSERT INTO {modules} VALUES (6,1,'rss',1,6); +INSERT INTO {modules} VALUES (7,1,'search',1,7); +INSERT INTO {modules} VALUES (8,1,'slideshow',2,8); +INSERT INTO {modules} VALUES (9,1,'tag',2,9); DROP TABLE IF EXISTS {outgoing_translations}; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -350,18 +349,6 @@ CREATE TABLE {themes} ( /*!40101 SET character_set_client = @saved_cs_client */; INSERT INTO {themes} VALUES (1,'wind',1); INSERT INTO {themes} VALUES (2,'admin_wind',1); -DROP TABLE IF EXISTS {user_access_keys}; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE {user_access_keys} ( - `id` int(9) NOT NULL AUTO_INCREMENT, - `user_id` int(9) NOT NULL, - `access_key` char(32) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `access_key` (`access_key`), - UNIQUE KEY `user_id` (`user_id`) -) DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS {users}; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -395,7 +382,7 @@ CREATE TABLE {vars} ( `value` text, PRIMARY KEY (`id`), UNIQUE KEY `module_name` (`module_name`,`name`) -) AUTO_INCREMENT=35 DEFAULT CHARSET=utf8; +) AUTO_INCREMENT=40 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; INSERT INTO {vars} VALUES (NULL,'gallery','active_site_theme','wind'); INSERT INTO {vars} VALUES (NULL,'gallery','active_admin_theme','admin_wind'); @@ -405,8 +392,9 @@ INSERT INTO {vars} VALUES (NULL,'gallery','resize_size','640'); INSERT INTO {vars} VALUES (NULL,'gallery','default_locale','en_US'); INSERT INTO {vars} VALUES (NULL,'gallery','image_quality','75'); INSERT INTO {vars} VALUES (NULL,'gallery','image_sharpen','15'); +INSERT INTO {vars} VALUES (NULL,'gallery','upgrade_checker_auto_enabled','1'); INSERT INTO {vars} VALUES (NULL,'gallery','blocks_dashboard_sidebar','a:4:{i:2;a:2:{i:0;s:7:\"gallery\";i:1;s:11:\"block_adder\";}i:3;a:2:{i:0;s:7:\"gallery\";i:1;s:5:\"stats\";}i:4;a:2:{i:0;s:7:\"gallery\";i:1;s:13:\"platform_info\";}i:5;a:2:{i:0;s:7:\"gallery\";i:1;s:12:\"project_news\";}}'); -INSERT INTO {vars} VALUES (NULL,'gallery','blocks_dashboard_center','a:3:{i:6;a:2:{i:0;s:7:\"gallery\";i:1;s:7:\"welcome\";}i:7;a:2:{i:0;s:7:\"gallery\";i:1;s:12:\"photo_stream\";}i:8;a:2:{i:0;s:7:\"gallery\";i:1;s:11:\"log_entries\";}}'); +INSERT INTO {vars} VALUES (NULL,'gallery','blocks_dashboard_center','a:4:{i:6;a:2:{i:0;s:7:\"gallery\";i:1;s:7:\"welcome\";}i:7;a:2:{i:0;s:7:\"gallery\";i:1;s:15:\"upgrade_checker\";}i:8;a:2:{i:0;s:7:\"gallery\";i:1;s:12:\"photo_stream\";}i:9;a:2:{i:0;s:7:\"gallery\";i:1;s:11:\"log_entries\";}}'); INSERT INTO {vars} VALUES (NULL,'gallery','choose_default_tookit','1'); INSERT INTO {vars} VALUES (NULL,'gallery','date_format','Y-M-d'); INSERT INTO {vars} VALUES (NULL,'gallery','date_time_format','Y-M-d H:i:s'); @@ -424,10 +412,14 @@ INSERT INTO {vars} VALUES (NULL,'gallery','email_line_length','70'); INSERT INTO {vars} VALUES (NULL,'gallery','email_header_separator','s:1:\"\n\";'); INSERT INTO {vars} VALUES (NULL,'gallery','show_user_profiles_to','registered_users'); INSERT INTO {vars} VALUES (NULL,'gallery','extra_binary_paths','/usr/local/bin:/opt/local/bin:/opt/bin'); -INSERT INTO {vars} VALUES (NULL,'gallery','blocks_site_sidebar','a:4:{i:9;a:2:{i:0;s:7:\"gallery\";i:1;s:8:\"language\";}i:10;a:2:{i:0;s:4:\"info\";i:1;s:8:\"metadata\";}i:11;a:2:{i:0;s:3:\"rss\";i:1;s:9:\"rss_feeds\";}i:12;a:2:{i:0;s:3:\"tag\";i:1;s:3:\"tag\";}}'); +INSERT INTO {vars} VALUES (NULL,'gallery','blocks_site_sidebar','a:4:{i:10;a:2:{i:0;s:7:\"gallery\";i:1;s:8:\"language\";}i:11;a:2:{i:0;s:4:\"info\";i:1;s:8:\"metadata\";}i:12;a:2:{i:0;s:3:\"rss\";i:1;s:9:\"rss_feeds\";}i:13;a:2:{i:0;s:3:\"tag\";i:1;s:3:\"tag\";}}'); INSERT INTO {vars} VALUES (NULL,'gallery','identity_provider','user'); INSERT INTO {vars} VALUES (NULL,'user','mininum_password_length','5'); INSERT INTO {vars} VALUES (NULL,'comment','spam_caught','0'); INSERT INTO {vars} VALUES (NULL,'comment','access_permissions','everybody'); -INSERT INTO {vars} VALUES (NULL,'rest','allow_guest_access','0'); +INSERT INTO {vars} VALUES (NULL,'info','show_title','1'); +INSERT INTO {vars} VALUES (NULL,'info','show_description','1'); +INSERT INTO {vars} VALUES (NULL,'info','show_owner','1'); +INSERT INTO {vars} VALUES (NULL,'info','show_name','1'); +INSERT INTO {vars} VALUES (NULL,'info','show_captured','1'); INSERT INTO {vars} VALUES (NULL,'slideshow','max_scale','0'); diff --git a/installer/installer.php b/installer/installer.php index 9a957b43..c23d918f 100644 --- a/installer/installer.php +++ b/installer/installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -138,7 +138,7 @@ class installer { $char += ($char > 90) ? 13 : ($char > 57) ? 7 : 0; $salt .= chr($char); } - $password = substr(md5(time() * rand()), 0, 6); + $password = substr(md5(time() . mt_rand()), 0, 6); // Escape backslash in preparation for our UPDATE statement. $hashed_password = str_replace("\\", "\\\\", $salt . md5($salt . $password)); $sql = self::prepend_prefix($config["prefix"], @@ -152,7 +152,7 @@ class installer { } static function create_admin_session($config) { - $session_id = md5(time() * rand()); + $session_id = md5(time() . mt_rand()); $user_agent = $_SERVER["HTTP_USER_AGENT"]; $user_agent_len = strlen($user_agent); $now = time(); @@ -233,7 +233,30 @@ class installer { $errors[] = "Gallery requires the <a href=\"http://php.net/manual/en/book.ctype.php\">PHP Ctype</a> extension. Please install it."; } + if (self::ini_get_bool("safe_mode")) { + $errors[] = "Gallery cannot function when PHP is in <a href=\"http://php.net/manual/en/features.safe-mode.php\">Safe Mode</a>. Please disable safe mode."; + } + return @$errors; } + /** + * Convert any possible boolean ini value to true/false. + * On = on = 1 = true + * Off = off = 0 = false + */ + static function ini_get_bool($varname) { + $value = ini_get($varname); + + if (!strcasecmp("on", $value) || $value == 1 || $value === true) { + return true; + } + + if (!strcasecmp("off", $value) || $value == 0 || $value === false) { + return false; + } + + return false; + } + } diff --git a/installer/web.php b/installer/web.php index 51f0f8aa..0df9b69c 100644 --- a/installer/web.php +++ b/installer/web.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/lib/gallery.common.js b/lib/gallery.common.js index 2dbd7c7c..697a33cb 100644 --- a/lib/gallery.common.js +++ b/lib/gallery.common.js @@ -171,10 +171,10 @@ // handle the case where the calculation is almost zero (2.14e-14) return { - top: Number((height - imageHeight) / 2), - left: Number((width - imageWidth) / 2), - width: Number(imageWidth), - height: Number(imageHeight) + top: Math.round((height - imageHeight) / 2), + left: Math.round((width - imageWidth) / 2), + width: Math.round(imageWidth), + height: Math.round(imageHeight) }; }; diff --git a/lib/gallery.show_full_size.js b/lib/gallery.show_full_size.js index f617836b..531d2a3a 100644 --- a/lib/gallery.show_full_size.js +++ b/lib/gallery.show_full_size.js @@ -8,32 +8,34 @@ var size = $.gallery_get_viewport_size(); $("body").append('<div id="g-fullsize-overlay" class="ui-dialog-overlay" ' + - 'style="border: none; margin: 0; padding: 0; background-color: #000; ' + - 'position: absolute; top: 0px; left: 0px; ' + - 'width: ' + width + 'px; height: ' + height + 'px;' + - ' opacity: 0.7; filter: alpha(opacity=70);' + - '-moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; ' + - '-moz-background-inline-policy: -moz-initial; z-index: 1001;"> </div>'); + 'style="border: none; margin: 0; padding: 0; background-color: #000; ' + + 'position: fixed; top: 0px; left: 0px; ' + + 'width: 100%; height: 100%; ' + + 'opacity: 0.7; filter: alpha(opacity=70); ' + + '-moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; ' + + '-moz-background-inline-policy: -moz-initial; z-index: 1001;"> </div>'); var image_size; if (image_width >= size.width() - 6 || image_height >= size.height() - 6) { image_size = $.gallery_auto_fit_window(image_width, image_height); } else { image_size = { - top: Number((height - image_height) / 2), left: Number((width - image_width) / 2), - width: Number(image_width), height: Number(image_height) + top: Math.round((height - image_height) / 2), + left: Math.round((width - image_width) / 2), + width: Math.round(image_width), + height: Math.round(image_height) }; } $("body").append('<div id="g-fullsize" class="ui-dialog ui-widget" ' + - 'style="overflow: hidden; display: block; ' + - 'position: absolute; z-index: 1002; outline-color: -moz-use-text-color; ' + - 'outline-style: none; outline-width: 0px; ' + - 'height: ' + image_size.height + 'px; ' + - 'width: ' + image_size.width + 'px; ' + - 'top: ' + image_size.top + 'px; left: ' + image_size.left + 'px;">' + - '<img id="g-fullsize-image" src="' + image_url + '"' + - 'height="' + image_size.height + '" width="' + image_size.width + '"/></div>'); + 'style="overflow: hidden; display: block; ' + + 'position: absolute; z-index: 1002; outline-color: -moz-use-text-color; ' + + 'outline-style: none; outline-width: 0px; ' + + 'height: ' + image_size.height + 'px; ' + + 'width: ' + image_size.width + 'px; ' + + 'top: ' + image_size.top + 'px; left: ' + image_size.left + 'px;">' + + '<img id="g-fullsize-image" src="' + image_url + '"' + + 'height="' + image_size.height + '" width="' + image_size.width + '"/></div>'); $().click(function() { $("#g-fullsize-overlay*").remove(); diff --git a/lib/json2-min.js b/lib/json2-min.js new file mode 100644 index 00000000..988ab6f2 --- /dev/null +++ b/lib/json2-min.js @@ -0,0 +1,39 @@ +/* + http://www.JSON.org/json2.js + 2010-11-17 + + Public Domain. + + NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + + See http://www.JSON.org/js.html +*/ + +if(!this.JSON){this.JSON={};} +(function(){"use strict";function f(n){return n<10?'0'+n:n;} +if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+'-'+ +f(this.getUTCMonth()+1)+'-'+ +f(this.getUTCDate())+'T'+ +f(this.getUTCHours())+':'+ +f(this.getUTCMinutes())+':'+ +f(this.getUTCSeconds())+'Z':null;};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf();};} +var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==='string'?c:'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);})+'"':'"'+string+'"';} +function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key);} +if(typeof rep==='function'){value=rep.call(holder,key,value);} +switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';} +gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==='[object Array]'){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||'null';} +v=partial.length===0?'[]':gap?'[\n'+gap+ +partial.join(',\n'+gap)+'\n'+ +mind+']':'['+partial.join(',')+']';gap=mind;return v;} +if(rep&&typeof rep==='object'){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==='string'){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}} +v=partial.length===0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+ +mind+'}':'{'+partial.join(',')+'}';gap=mind;return v;}} +if(typeof JSON.stringify!=='function'){JSON.stringify=function(value,replacer,space){var i;gap='';indent='';if(typeof space==='number'){for(i=0;i<space;i+=1){indent+=' ';}}else if(typeof space==='string'){indent=space;} +rep=replacer;if(replacer&&typeof replacer!=='function'&&(typeof replacer!=='object'||typeof replacer.length!=='number')){throw new Error('JSON.stringify');} +return str('',{'':value});};} +if(typeof JSON.parse!=='function'){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==='object'){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v;}else{delete value[k];}}}} +return reviver.call(holder,key,value);} +text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return'\\u'+ +('0000'+a.charCodeAt(0).toString(16)).slice(-4);});} +if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j;} +throw new SyntaxError('JSON.parse');};}}());
\ No newline at end of file diff --git a/modules/akismet/controllers/admin_akismet.php b/modules/akismet/controllers/admin_akismet.php index af98536a..e2e1d91b 100644 --- a/modules/akismet/controllers/admin_akismet.php +++ b/modules/akismet/controllers/admin_akismet.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/akismet/helpers/akismet.php b/modules/akismet/helpers/akismet.php index 3a7fc105..f3a015dc 100644 --- a/modules/akismet/helpers/akismet.php +++ b/modules/akismet/helpers/akismet.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/akismet/helpers/akismet_event.php b/modules/akismet/helpers/akismet_event.php index 4bfb0b8b..ae76aeb5 100644 --- a/modules/akismet/helpers/akismet_event.php +++ b/modules/akismet/helpers/akismet_event.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/akismet/helpers/akismet_installer.php b/modules/akismet/helpers/akismet_installer.php index 63205d5a..74022995 100644 --- a/modules/akismet/helpers/akismet_installer.php +++ b/modules/akismet/helpers/akismet_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/akismet/tests/Akismet_Helper_Test.php b/modules/akismet/tests/Akismet_Helper_Test.php index 5181fec4..9f68e3a4 100644 --- a/modules/akismet/tests/Akismet_Helper_Test.php +++ b/modules/akismet/tests/Akismet_Helper_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/comment/controllers/admin_comments.php b/modules/comment/controllers/admin_comments.php index fda3873c..1e24ac9b 100644 --- a/modules/comment/controllers/admin_comments.php +++ b/modules/comment/controllers/admin_comments.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/comment/controllers/admin_manage_comments.php b/modules/comment/controllers/admin_manage_comments.php index 49bd85d5..9bd1d7f6 100644 --- a/modules/comment/controllers/admin_manage_comments.php +++ b/modules/comment/controllers/admin_manage_comments.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,7 +25,7 @@ class Admin_Manage_Comments_Controller extends Admin_Controller { db::build() ->delete("comments") ->where("state", "IN", array("deleted", "spam")) - ->where("updated", "<", new Database_Expression("UNIX_TIMESTAMP() - 86400 * 7")) + ->where("updated", "<", db::expr("UNIX_TIMESTAMP() - 86400 * 7")) ->execute(); // Redirect to the appropriate queue diff --git a/modules/comment/controllers/comments.php b/modules/comment/controllers/comments.php index ded9743e..04660ec0 100644 --- a/modules/comment/controllers/comments.php +++ b/modules/comment/controllers/comments.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/comment/helpers/comment.php b/modules/comment/helpers/comment.php index 958f2f3d..428b11d6 100644 --- a/modules/comment/helpers/comment.php +++ b/modules/comment/helpers/comment.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/comment/helpers/comment_block.php b/modules/comment/helpers/comment_block.php index 641395e1..dee57b2b 100644 --- a/modules/comment/helpers/comment_block.php +++ b/modules/comment/helpers/comment_block.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/comment/helpers/comment_event.php b/modules/comment/helpers/comment_event.php index 33d4cd05..22550c75 100644 --- a/modules/comment/helpers/comment_event.php +++ b/modules/comment/helpers/comment_event.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/comment/helpers/comment_installer.php b/modules/comment/helpers/comment_installer.php index 18d51758..48b6ee21 100644 --- a/modules/comment/helpers/comment_installer.php +++ b/modules/comment/helpers/comment_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/comment/helpers/comment_rest.php b/modules/comment/helpers/comment_rest.php index bd3011cc..c2c582c7 100644 --- a/modules/comment/helpers/comment_rest.php +++ b/modules/comment/helpers/comment_rest.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/comment/helpers/comment_rss.php b/modules/comment/helpers/comment_rss.php index cc4180bf..d04e74cf 100644 --- a/modules/comment/helpers/comment_rss.php +++ b/modules/comment/helpers/comment_rss.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/comment/helpers/comment_theme.php b/modules/comment/helpers/comment_theme.php index b993cdae..398f84b4 100644 --- a/modules/comment/helpers/comment_theme.php +++ b/modules/comment/helpers/comment_theme.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,14 +19,12 @@ */ class comment_theme_Core { static function head($theme) { - $theme->css("comment.css"); - $theme->script("comment.js"); - return ""; + return $theme->css("comment.css") + . $theme->script("comment.js"); } static function admin_head($theme) { - $theme->css("comment.css"); - return ""; + return $theme->css("comment.css"); } static function photo_bottom($theme) { diff --git a/modules/comment/helpers/comments_rest.php b/modules/comment/helpers/comments_rest.php index 1cedb80b..28a675ee 100644 --- a/modules/comment/helpers/comments_rest.php +++ b/modules/comment/helpers/comments_rest.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/comment/helpers/item_comments_rest.php b/modules/comment/helpers/item_comments_rest.php index 1fe5c35f..3c6dacab 100644 --- a/modules/comment/helpers/item_comments_rest.php +++ b/modules/comment/helpers/item_comments_rest.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/comment/models/comment.php b/modules/comment/models/comment.php index 8f860a7b..d5e952eb 100644 --- a/modules/comment/models/comment.php +++ b/modules/comment/models/comment.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/comment/tests/Comment_Event_Test.php b/modules/comment/tests/Comment_Event_Test.php index 7cae9297..3745ba3b 100644 --- a/modules/comment/tests/Comment_Event_Test.php +++ b/modules/comment/tests/Comment_Event_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/comment/tests/Comment_Helper_Test.php b/modules/comment/tests/Comment_Helper_Test.php index 313764a8..2a5c29c4 100644 --- a/modules/comment/tests/Comment_Helper_Test.php +++ b/modules/comment/tests/Comment_Helper_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/comment/tests/Comment_Model_Test.php b/modules/comment/tests/Comment_Model_Test.php index ee4d3d3c..15451e0e 100644 --- a/modules/comment/tests/Comment_Model_Test.php +++ b/modules/comment/tests/Comment_Model_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/digibug/config/digibug.php b/modules/digibug/config/digibug.php index 01aa1e00..4033b1f2 100644 --- a/modules/digibug/config/digibug.php +++ b/modules/digibug/config/digibug.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/digibug/controllers/admin_digibug.php b/modules/digibug/controllers/admin_digibug.php index f3a0f8f0..6caeec38 100644 --- a/modules/digibug/controllers/admin_digibug.php +++ b/modules/digibug/controllers/admin_digibug.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/digibug/controllers/digibug.php b/modules/digibug/controllers/digibug.php index 88d1ace0..4acb6513 100644 --- a/modules/digibug/controllers/digibug.php +++ b/modules/digibug/controllers/digibug.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ class Digibug_Controller extends Controller { + const ALLOW_PRIVATE_GALLERY = true; + public function print_photo($id) { access::verify_csrf(); $item = ORM::factory("item", $id); @@ -28,7 +30,7 @@ class Digibug_Controller extends Controller { $thumb_url = $item->thumb_url(true); } else { $proxy = ORM::factory("digibug_proxy"); - $proxy->uuid = md5(rand()); + $proxy->uuid = random::hash(); $proxy->item_id = $item->id; $proxy->save(); $full_url = url::abs_site("digibug/print_proxy/full/$proxy->uuid"); @@ -112,7 +114,7 @@ class Digibug_Controller extends Controller { private function _clean_expired() { db::build() ->delete("digibug_proxies") - ->where("request_date", "<=", new Database_Expression("(CURDATE() - INTERVAL 10 DAY)")) + ->where("request_date", "<=", db::expr("(CURDATE() - INTERVAL 10 DAY)")) ->limit(20) ->execute(); } diff --git a/modules/digibug/helpers/digibug_event.php b/modules/digibug/helpers/digibug_event.php index 413bf586..20ba6951 100644 --- a/modules/digibug/helpers/digibug_event.php +++ b/modules/digibug/helpers/digibug_event.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/digibug/helpers/digibug_installer.php b/modules/digibug/helpers/digibug_installer.php index a72e9ff3..85c03855 100644 --- a/modules/digibug/helpers/digibug_installer.php +++ b/modules/digibug/helpers/digibug_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/digibug/helpers/digibug_theme.php b/modules/digibug/helpers/digibug_theme.php index d146e17d..f2944500 100644 --- a/modules/digibug/helpers/digibug_theme.php +++ b/modules/digibug/helpers/digibug_theme.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,6 +19,6 @@ */ class digibug_theme_Core { static function head($theme) { - $theme->script("digibug.js"); + return $theme->script("digibug.js"); } } diff --git a/modules/digibug/models/digibug_proxy.php b/modules/digibug/models/digibug_proxy.php index 2bff6ddb..73c633b3 100644 --- a/modules/digibug/models/digibug_proxy.php +++ b/modules/digibug/models/digibug_proxy.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/digibug/tests/Digibug_Controller_Test.php b/modules/digibug/tests/Digibug_Controller_Test.php index 19a3f9da..6021564a 100644 --- a/modules/digibug/tests/Digibug_Controller_Test.php +++ b/modules/digibug/tests/Digibug_Controller_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -36,7 +36,7 @@ class Digibug_Controller_Test extends Gallery_Unit_Test_Case { access::deny(identity::registered_users(), "view_full", $album); $proxy = ORM::factory("digibug_proxy"); - $proxy->uuid = md5(rand()); + $proxy->uuid = random::hash(); $proxy->item_id = $photo->id; return $proxy->save(); } diff --git a/modules/exif/controllers/exif.php b/modules/exif/controllers/exif.php index 2fe875e3..2336a36d 100644 --- a/modules/exif/controllers/exif.php +++ b/modules/exif/controllers/exif.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/exif/helpers/exif.php b/modules/exif/helpers/exif.php index aa77b42e..1cdf7d34 100644 --- a/modules/exif/helpers/exif.php +++ b/modules/exif/helpers/exif.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/exif/helpers/exif_event.php b/modules/exif/helpers/exif_event.php index e85aa5bd..e594c765 100644 --- a/modules/exif/helpers/exif_event.php +++ b/modules/exif/helpers/exif_event.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/exif/helpers/exif_installer.php b/modules/exif/helpers/exif_installer.php index 6567600e..76aa473f 100644 --- a/modules/exif/helpers/exif_installer.php +++ b/modules/exif/helpers/exif_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/exif/helpers/exif_task.php b/modules/exif/helpers/exif_task.php index 5963d03f..528e1aa2 100644 --- a/modules/exif/helpers/exif_task.php +++ b/modules/exif/helpers/exif_task.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/exif/helpers/exif_theme.php b/modules/exif/helpers/exif_theme.php index dc891fd3..acbbe496 100644 --- a/modules/exif/helpers/exif_theme.php +++ b/modules/exif/helpers/exif_theme.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/exif/models/exif_key.php b/modules/exif/models/exif_key.php index 8ca63ada..5a0d688f 100644 --- a/modules/exif/models/exif_key.php +++ b/modules/exif/models/exif_key.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/exif/models/exif_record.php b/modules/exif/models/exif_record.php index 03b8c982..53441920 100644 --- a/modules/exif/models/exif_record.php +++ b/modules/exif/models/exif_record.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/exif/tests/Exif_Test.php b/modules/exif/tests/Exif_Test.php index 404b6cde..1a1cd847 100644 --- a/modules/exif/tests/Exif_Test.php +++ b/modules/exif/tests/Exif_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/g2_import/controllers/admin_g2_import.php b/modules/g2_import/controllers/admin_g2_import.php index b9427f79..33186fb5 100644 --- a/modules/g2_import/controllers/admin_g2_import.php +++ b/modules/g2_import/controllers/admin_g2_import.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/g2_import/controllers/g2.php b/modules/g2_import/controllers/g2.php index 0f51173a..6e60bed0 100644 --- a/modules/g2_import/controllers/g2.php +++ b/modules/g2_import/controllers/g2.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/g2_import/helpers/g2_import.php b/modules/g2_import/helpers/g2_import.php index 8de5ce44..5fd92972 100644 --- a/modules/g2_import/helpers/g2_import.php +++ b/modules/g2_import/helpers/g2_import.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -499,6 +499,9 @@ class g2_import_Core { static function set_album_highlight(&$queue) { // Dequeue the current album and enqueue its children list($g2_album_id, $children) = each($queue); + if (empty($children)) { + return; + } unset($queue[$g2_album_id]); foreach ($children as $key => $value) { $queue[$key] = $value; @@ -1152,7 +1155,8 @@ class g2_import_Core { "SELECT [GalleryComment::id] " . "FROM [GalleryComment] " . "WHERE [GalleryComment::publishStatus] = 0 " . // 0 == COMMENT_PUBLISH_STATUS_PUBLISHED - "AND [GalleryComment::id] > ?", + "AND [GalleryComment::id] > ? " . + "ORDER BY [GalleryComment::id] ASC", array($min_id), array("limit" => array("count" => 100)))); while ($result = $results->nextResult()) { @@ -1171,7 +1175,50 @@ class g2_import_Core { $ids = array(); $results = g2($gallery->search( "SELECT DISTINCT([TagItemMap::itemId]) FROM [TagItemMap] " . - "WHERE [TagItemMap::itemId] > ?", + "WHERE [TagItemMap::itemId] > ? " . + "ORDER BY [TagItemMap::itemId] ASC", + array($min_id), + array("limit" => array("count" => 100)))); + while ($result = $results->nextResult()) { + $ids[] = $result[0]; + } + return $ids; + } + + /** + * Get a set of user ids from Gallery 2 greater than $min_id. We use this to get the + * next chunk of users to import. + */ + static function get_user_ids($min_id) { + global $gallery; + + $ids = array(); + $results = g2($gallery->search( + "SELECT [GalleryUser::id] " . + "FROM [GalleryUser] " . + "WHERE [GalleryUser::id] > ? " . + "ORDER BY [GalleryUser::id] ASC", + array($min_id), + array("limit" => array("count" => 100)))); + while ($result = $results->nextResult()) { + $ids[] = $result[0]; + } + return $ids; + } + + /** + * Get a set of group ids from Gallery 2 greater than $min_id. We use this to get the + * next chunk of groups to import. + */ + static function get_group_ids($min_id) { + global $gallery; + + $ids = array(); + $results = g2($gallery->search( + "SELECT [GalleryGroup::id] " . + "FROM [GalleryGroup] " . + "WHERE [GalleryGroup::id] > ? " . + "ORDER BY [GalleryGroup::id] ASC", array($min_id), array("limit" => array("count" => 100)))); while ($result = $results->nextResult()) { diff --git a/modules/g2_import/helpers/g2_import_event.php b/modules/g2_import/helpers/g2_import_event.php index d3eb001a..0e078d08 100644 --- a/modules/g2_import/helpers/g2_import_event.php +++ b/modules/g2_import/helpers/g2_import_event.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/g2_import/helpers/g2_import_installer.php b/modules/g2_import/helpers/g2_import_installer.php index 8ada4fcb..a422ed30 100644 --- a/modules/g2_import/helpers/g2_import_installer.php +++ b/modules/g2_import/helpers/g2_import_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/g2_import/helpers/g2_import_task.php b/modules/g2_import/helpers/g2_import_task.php index f2a13291..6bda8f17 100644 --- a/modules/g2_import/helpers/g2_import_task.php +++ b/modules/g2_import/helpers/g2_import_task.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -96,7 +96,8 @@ class g2_import_task_Core { switch($modes[$mode]) { case "groups": if (empty($queue)) { - $task->set("queue", $queue = array_keys(g2(GalleryCoreApi::fetchGroupNames()))); + $task->set("queue", $queue = g2_import::get_group_ids($task->get("last_id", 0))); + $task->set("last_id", end($queue)); } $log_message = g2_import::import_group($queue); if ($log_message) { @@ -109,8 +110,8 @@ class g2_import_task_Core { case "users": if (empty($queue)) { - $task->set( - "queue", $queue = array_keys(g2(GalleryCoreApi::fetchUsersForGroup(GROUP_EVERYBODY)))); + $task->set("queue", $queue = g2_import::get_user_ids($task->get("last_id", 0))); + $task->set("last_id", end($queue)); } $log_message = g2_import::import_user($queue); if ($log_message) { @@ -141,7 +142,6 @@ class g2_import_task_Core { $task->set("queue", $queue = g2_import::get_item_ids($task->get("last_id", 0))); $task->set("last_id", end($queue)); } - $log_message = g2_import::import_item($queue); if ($log_message) { $task->log($log_message); diff --git a/modules/g2_import/libraries/G2_Import_Exception.php b/modules/g2_import/libraries/G2_Import_Exception.php index 591f51cd..f5814ccb 100644 --- a/modules/g2_import/libraries/G2_Import_Exception.php +++ b/modules/g2_import/libraries/G2_Import_Exception.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/g2_import/models/g2_map.php b/modules/g2_import/models/g2_map.php index 8b96050d..7795ba6a 100644 --- a/modules/g2_import/models/g2_map.php +++ b/modules/g2_import/models/g2_map.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/config/cache.php b/modules/gallery/config/cache.php index a817a5da..7460d95b 100644 --- a/modules/gallery/config/cache.php +++ b/modules/gallery/config/cache.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/config/cookie.php b/modules/gallery/config/cookie.php index 7f6ea265..a865231c 100644 --- a/modules/gallery/config/cookie.php +++ b/modules/gallery/config/cookie.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/config/database.php b/modules/gallery/config/database.php index 0defd853..b9911b47 100644 --- a/modules/gallery/config/database.php +++ b/modules/gallery/config/database.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/config/locale.php b/modules/gallery/config/locale.php index 2047159d..0509e45f 100644 --- a/modules/gallery/config/locale.php +++ b/modules/gallery/config/locale.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/config/log_file.php b/modules/gallery/config/log_file.php index d154d6d4..82377f99 100644 --- a/modules/gallery/config/log_file.php +++ b/modules/gallery/config/log_file.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/config/routes.php b/modules/gallery/config/routes.php index 55d3cf6c..ed827f60 100644 --- a/modules/gallery/config/routes.php +++ b/modules/gallery/config/routes.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/config/session.php b/modules/gallery/config/session.php index a94166d3..b114a2fe 100644 --- a/modules/gallery/config/session.php +++ b/modules/gallery/config/session.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/config/upload.php b/modules/gallery/config/upload.php index e065ab68..70781dc0 100644 --- a/modules/gallery/config/upload.php +++ b/modules/gallery/config/upload.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/config/user_agents.php b/modules/gallery/config/user_agents.php index 24720046..23877c66 100644 --- a/modules/gallery/config/user_agents.php +++ b/modules/gallery/config/user_agents.php @@ -1,122 +1,22 @@ -<?php defined('SYSPATH') OR die('No direct access allowed.'); +<?php defined("SYSPATH") or die("No direct script access."); /** - * This file contains four arrays of user agent data. It is used by the - * User Agent library to help identify browser, platform, robot, and - * mobile device data. The array keys are used to identify the device - * and the array values are used to set the actual name of the item. + * Gallery - a web based photo album viewer and editor + * Copyright (C) 2000-2011 Bharat Mediratta * - * @package Kohana - * @author Kohana Team - * @copyright (c) 2007-2009 Kohana Team - * @license http://kohanaphp.com/license - */ - -$config['platform'] = array -( - 'windows nt 6.0' => 'Windows Vista', - 'windows nt 5.2' => 'Windows 2003', - 'windows nt 5.0' => 'Windows 2000', - 'windows nt 5.1' => 'Windows XP', - 'windows nt 4.0' => 'Windows NT', - 'winnt4.0' => 'Windows NT', - 'winnt 4.0' => 'Windows NT', - 'winnt' => 'Windows NT', - 'windows 98' => 'Windows 98', - 'win98' => 'Windows 98', - 'windows 95' => 'Windows 95', - 'win95' => 'Windows 95', - 'windows' => 'Unknown Windows OS', - 'os x' => 'Mac OS X', - 'intel mac' => 'Intel Mac', - 'ppc mac' => 'PowerPC Mac', - 'powerpc' => 'PowerPC', - 'ppc' => 'PowerPC', - 'cygwin' => 'Cygwin', - 'linux' => 'Linux', - 'debian' => 'Debian', - 'openvms' => 'OpenVMS', - 'sunos' => 'Sun Solaris', - 'amiga' => 'Amiga', - 'beos' => 'BeOS', - 'apachebench' => 'ApacheBench', - 'freebsd' => 'FreeBSD', - 'netbsd' => 'NetBSD', - 'bsdi' => 'BSDi', - 'openbsd' => 'OpenBSD', - 'os/2' => 'OS/2', - 'warp' => 'OS/2', - 'aix' => 'AIX', - 'irix' => 'Irix', - 'osf' => 'DEC OSF', - 'hp-ux' => 'HP-UX', - 'hurd' => 'GNU/Hurd', - 'unix' => 'Unknown Unix OS', -); - -/** - * The order of this array should NOT be changed. Many browsers return - * multiple browser types so we want to identify the sub-type first. - */ -$config['browser'] = array -( - 'Opera' => 'Opera', - 'MSIE' => 'Internet Explorer', - 'Internet Explorer' => 'Internet Explorer', - 'Shiira' => 'Shiira', - 'Firefox' => 'Firefox', - 'Chimera' => 'Chimera', - 'Phoenix' => 'Phoenix', - 'Firebird' => 'Firebird', - 'Camino' => 'Camino', - 'Netscape' => 'Netscape', - 'OmniWeb' => 'OmniWeb', - 'Chrome' => 'Chrome', - 'Safari' => 'Safari', - 'Konqueror' => 'Konqueror', - 'Epiphany' => 'Epiphany', - 'Galeon' => 'Galeon', - 'Mozilla' => 'Mozilla', - 'icab' => 'iCab', - 'lynx' => 'Lynx', - 'links' => 'Links', - 'hotjava' => 'HotJava', - 'amaya' => 'Amaya', - 'IBrowse' => 'IBrowse', -); - -$config['mobile'] = array -( - 'mobileexplorer' => 'Mobile Explorer', - 'openwave' => 'Open Wave', - 'opera mini' => 'Opera Mini', - 'operamini' => 'Opera Mini', - 'elaine' => 'Palm', - 'palmsource' => 'Palm', - 'digital paths' => 'Palm', - 'avantgo' => 'Avantgo', - 'xiino' => 'Xiino', - 'palmscape' => 'Palmscape', - 'nokia' => 'Nokia', - 'ericsson' => 'Ericsson', - 'blackBerry' => 'BlackBerry', - 'motorola' => 'Motorola', - 'iphone' => 'iPhone', - 'android' => 'Android', -); - -/** - * There are hundreds of bots but these are the most common. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ -$config['robot'] = array -( - 'googlebot' => 'Googlebot', - 'msnbot' => 'MSNBot', - 'slurp' => 'Inktomi Slurp', - 'yahoo' => 'Yahoo', - 'askjeeves' => 'AskJeeves', - 'fastcrawler' => 'FastCrawler', - 'infoseek' => 'InfoSeek Robot 1.0', - 'lycos' => 'Lycos', - 'mj12bot' => 'MJ12bot', - 'speedy spider' => 'Speedy Spider', -);
\ No newline at end of file +include(SYSPATH . "config/user_agents.php"); +$config["robot"]["mj12bot"] = "MJ12bot"; +$config["robot"]["speedy spider"] = "Speedy Spider"; diff --git a/modules/gallery/controllers/admin.php b/modules/gallery/controllers/admin.php index 8fc5432d..b70f9634 100644 --- a/modules/gallery/controllers/admin.php +++ b/modules/gallery/controllers/admin.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/controllers/admin_advanced_settings.php b/modules/gallery/controllers/admin_advanced_settings.php index cf197743..fd652988 100644 --- a/modules/gallery/controllers/admin_advanced_settings.php +++ b/modules/gallery/controllers/admin_advanced_settings.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/controllers/admin_dashboard.php b/modules/gallery/controllers/admin_dashboard.php index 76c42612..8dfb6615 100644 --- a/modules/gallery/controllers/admin_dashboard.php +++ b/modules/gallery/controllers/admin_dashboard.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/controllers/admin_graphics.php b/modules/gallery/controllers/admin_graphics.php index de98035d..a2d19d4a 100644 --- a/modules/gallery/controllers/admin_graphics.php +++ b/modules/gallery/controllers/admin_graphics.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/controllers/admin_languages.php b/modules/gallery/controllers/admin_languages.php index 573ededf..2e2651fc 100644 --- a/modules/gallery/controllers/admin_languages.php +++ b/modules/gallery/controllers/admin_languages.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -74,9 +74,11 @@ class Admin_Languages_Controller extends Admin_Controller { private function _save_api_key($form) { $new_key = $form->sharing->api_key->value; - if ($new_key && !l10n_client::validate_api_key($new_key)) { - $form->sharing->api_key->add_error("invalid", 1); - $valid = false; + if ($new_key) { + list($connected, $valid) = l10n_client::validate_api_key($new_key); + if (!$valid) { + $form->sharing->api_key->add_error($connected ? "invalid" : "no_connection", 1); + } } else { $valid = true; } @@ -119,7 +121,9 @@ class Admin_Languages_Controller extends Admin_Controller { array("server-link" => html::mark_clean(html::anchor($server_link)))) : t("API key")) ->value($api_key) - ->error_messages("invalid", t("The API key you provided is invalid.")); + ->error_messages("invalid", t("The API key you provided is invalid.")) + ->error_messages( + "no_connection", t("Could not connect to remote server to validate the API key.")); $group->submit("save")->value(t("Save settings")); if ($api_key && $this->_outgoing_translations_count()) { // TODO: UI improvement: hide API key / save button when API key is set. diff --git a/modules/gallery/controllers/admin_maintenance.php b/modules/gallery/controllers/admin_maintenance.php index 7729d797..ce828a75 100644 --- a/modules/gallery/controllers/admin_maintenance.php +++ b/modules/gallery/controllers/admin_maintenance.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,7 +27,7 @@ class Admin_Maintenance_Controller extends Admin_Controller { ->set("state", "stalled") ->where("done", "=", 0) ->where("state", "<>", "stalled") - ->where(new Database_Expression("UNIX_TIMESTAMP(NOW()) - `updated` > 15")) + ->where(db::expr("UNIX_TIMESTAMP(NOW()) - `updated` > 15")) ->execute(); $stalled_count = $query->count(); if ($stalled_count) { diff --git a/modules/gallery/controllers/admin_modules.php b/modules/gallery/controllers/admin_modules.php index 650b7e9e..787785ea 100644 --- a/modules/gallery/controllers/admin_modules.php +++ b/modules/gallery/controllers/admin_modules.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/controllers/admin_sidebar.php b/modules/gallery/controllers/admin_sidebar.php index 2e49097a..42c4bb18 100644 --- a/modules/gallery/controllers/admin_sidebar.php +++ b/modules/gallery/controllers/admin_sidebar.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/controllers/admin_theme_options.php b/modules/gallery/controllers/admin_theme_options.php index 57f32f96..055e063c 100644 --- a/modules/gallery/controllers/admin_theme_options.php +++ b/modules/gallery/controllers/admin_theme_options.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/controllers/admin_themes.php b/modules/gallery/controllers/admin_themes.php index a88e1e89..cd8a5530 100644 --- a/modules/gallery/controllers/admin_themes.php +++ b/modules/gallery/controllers/admin_themes.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/controllers/admin_upgrade_checker.php b/modules/gallery/controllers/admin_upgrade_checker.php new file mode 100644 index 00000000..a5cfcfc8 --- /dev/null +++ b/modules/gallery/controllers/admin_upgrade_checker.php @@ -0,0 +1,57 @@ +<?php defined("SYSPATH") or die("No direct script access."); +/** + * Gallery - a web based photo album viewer and editor + * Copyright (C) 2000-2011 Bharat Mediratta + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ +class Admin_Upgrade_Checker_Controller extends Admin_Controller { + function check_now() { + access::verify_csrf(); + upgrade_checker::fetch_version_info(); + $message = upgrade_checker::get_upgrade_message(); + if ($message) { + $message .= t( + " <a href=\"%hide-url\"><i>(remind me later)</i></a>", + array("url" => url::site("admin/upgrade_checker/remind_me_later?csrf=__CSRF__"))); + site_status::info($message, "upgrade_checker"); + } else { + site_status::clear("upgrade_checker"); + } + url::redirect("admin/dashboard"); + } + + function remind_me_later() { + access::verify_csrf(); + site_status::clear("upgrade_checker"); + if ($referer = Input::instance()->server("HTTP_REFERER")) { + url::redirect($referer); + } else { + url::redirect(item::root()->abs_url()); + } + } + + function set_auto($val) { + access::verify_csrf(); + module::set_var("gallery", "upgrade_checker_auto_enabled", (bool)$val); + + if ((bool)$val) { + message::success(t("Automatic upgrade checking is enabled.")); + } else { + message::success(t("Automatic upgrade checking is disabled.")); + } + url::redirect("admin/dashboard"); + } +} diff --git a/modules/gallery/controllers/albums.php b/modules/gallery/controllers/albums.php index b0887195..ccf6c1cb 100644 --- a/modules/gallery/controllers/albums.php +++ b/modules/gallery/controllers/albums.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -37,7 +37,7 @@ class Albums_Controller extends Items_Controller { if ($show) { $child = ORM::factory("item", $show); - $index = $album->get_position($child); + $index = item::get_position($child); if ($index) { $page = ceil($index / $page_size); if ($page == 1) { @@ -61,20 +61,18 @@ class Albums_Controller extends Items_Controller { } $template = new Theme_View("page.html", "collection", "album"); - $template->set_global("page", $page); - $template->set_global("page_title", null); - $template->set_global("max_pages", $max_pages); - $template->set_global("page_size", $page_size); - $template->set_global("item", $album); - $template->set_global("children", $album->viewable()->children($page_size, $offset)); - $template->set_global("children_count", $children_count); - $template->set_global("parents", $album->parents()->as_array()); // view calls empty() on this + $template->set_global( + array("page" => $page, + "page_title" => null, + "max_pages" => $max_pages, + "page_size" => $page_size, + "item" => $album, + "children" => $album->viewable()->children($page_size, $offset), + "parents" => $album->parents()->as_array(), // view calls empty() on this + "children_count" => $children_count)); $template->content = new View("album.html"); - // We can't use math in ORM or the query builder, so do this by hand. It's important - // that we do this with math, otherwise concurrent accesses will damage accuracy. - db::query("UPDATE {items} SET `view_count` = `view_count` + 1 WHERE `id` = $album->id") - ->execute(); + $album->increment_view_count(); print $template; } diff --git a/modules/gallery/controllers/combined.php b/modules/gallery/controllers/combined.php index 4b1a342a..ef640bd9 100644 --- a/modules/gallery/controllers/combined.php +++ b/modules/gallery/controllers/combined.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,6 +18,9 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ class Combined_Controller extends Controller { + const ALLOW_MAINTENANCE_MODE = true; + const ALLOW_PRIVATE_GALLERY = true; + /** * Return the combined Javascript bundle associated with the given key. */ diff --git a/modules/gallery/controllers/file_proxy.php b/modules/gallery/controllers/file_proxy.php index b17310c4..d1e42106 100644 --- a/modules/gallery/controllers/file_proxy.php +++ b/modules/gallery/controllers/file_proxy.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,10 +27,13 @@ * input is sanitized against the database before we perform any file I/O. */ class File_Proxy_Controller extends Controller { + const ALLOW_PRIVATE_GALLERY = true; public function __call($function, $args) { - // request_uri: gallery3/var/trunk/albums/foo/bar.jpg + // request_uri: gallery3/var/albums/foo/bar.jpg?m=1234 $request_uri = rawurldecode(Input::instance()->server("REQUEST_URI")); + // get rid of query parameters + // request_uri: gallery3/var/albums/foo/bar.jpg $request_uri = preg_replace("/\?.*/", "", $request_uri); // var_uri: gallery3/var/ @@ -42,13 +45,11 @@ class File_Proxy_Controller extends Controller { throw new Kohana_404_Exception(); } + // file_uri: albums/foo/bar.jpg $file_uri = substr($request_uri, strlen($var_uri)); - // Make sure that we don't leave the var dir - if (strpos($file_uri, "..") !== false) { - throw new Kohana_404_Exception(); - } - + // type: albums + // path: foo/bar.jpg list ($type, $path) = explode("/", $file_uri, 2); if ($type != "resizes" && $type != "albums" && $type != "thumbs") { throw new Kohana_404_Exception(); @@ -56,28 +57,16 @@ class File_Proxy_Controller extends Controller { // If the last element is .album.jpg, pop that off since it's not a real item $path = preg_replace("|/.album.jpg$|", "", $path); - $encoded_path = array(); - foreach (explode("/", $path) as $path_part) { - $encoded_path[] = rawurlencode($path_part); - } - $encoded_path = implode("/", $encoded_path); - // We now have the relative path to the item. Search for it in the path cache - // The patch cache is urlencoded so re-encode the path. (it was decoded earlier to - // insure that the paths are normalized. - $item = ORM::factory("item") - ->where("relative_path_cache", "=", $encoded_path)->find(); - if (!$item->loaded()) { - // We didn't turn it up. It's possible that the relative_path_cache is out of date here. - // There was fallback code, but bharat deleted it in 8f1bca74. If it turns out to be - // necessary, it's easily resurrected. - // If we're looking for a .jpg then it's it's possible that we're requesting the thumbnail - // for a movie. In that case, the .flv, .mp4 or .m4v file would have been converted to a - // .jpg. So try some alternate types: + $item = item::find_by_path($path); + if (!$item->loaded()) { + // We didn't turn it up. If we're looking for a .jpg then it's it's possible that we're + // requesting the thumbnail for a movie. In that case, the .flv, .mp4 or .m4v file would + // have been converted to a .jpg. So try some alternate types: if (preg_match('/.jpg$/', $path)) { foreach (array("flv", "mp4", "m4v") as $ext) { - $movie_path = preg_replace('/.jpg$/', ".$ext", $encoded_path); - $item = ORM::factory("item")->where("relative_path_cache", "=", $movie_path)->find(); + $movie_path = preg_replace('/.jpg$/', ".$ext", $path); + $item = item::find_by_path($movie_path); if ($item->loaded()) { break; } diff --git a/modules/gallery/controllers/items.php b/modules/gallery/controllers/items.php index 39b0f638..9dd49547 100644 --- a/modules/gallery/controllers/items.php +++ b/modules/gallery/controllers/items.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/controllers/l10n_client.php b/modules/gallery/controllers/l10n_client.php index 6833a9ae..05b88829 100644 --- a/modules/gallery/controllers/l10n_client.php +++ b/modules/gallery/controllers/l10n_client.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/controllers/login.php b/modules/gallery/controllers/login.php index 62d33345..b203b7d3 100644 --- a/modules/gallery/controllers/login.php +++ b/modules/gallery/controllers/login.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ class Login_Controller extends Controller { + const ALLOW_MAINTENANCE_MODE = true; + const ALLOW_PRIVATE_GALLERY = true; public function ajax() { $view = new View("login_ajax.html"); diff --git a/modules/gallery/controllers/logout.php b/modules/gallery/controllers/logout.php index 20fa8074..dd0f7ddc 100644 --- a/modules/gallery/controllers/logout.php +++ b/modules/gallery/controllers/logout.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/controllers/movies.php b/modules/gallery/controllers/movies.php index 717eb8aa..8e81c594 100644 --- a/modules/gallery/controllers/movies.php +++ b/modules/gallery/controllers/movies.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,29 +28,29 @@ class Movies_Controller extends Items_Controller { access::required("view", $movie); $where = array(array("type", "!=", "album")); - $position = $movie->parent()->get_position($movie, $where); + $position = item::get_position($movie, $where); if ($position > 1) { list ($previous_item, $ignore, $next_item) = - $movie->parent()->children(3, $position - 2, $where); + $movie->parent()->viewable()->children(3, $position - 2, $where); } else { $previous_item = null; list ($next_item) = $movie->parent()->viewable()->children(1, $position, $where); } $template = new Theme_View("page.html", "item", "movie"); - $template->set_global("item", $movie); - $template->set_global("children", array()); - $template->set_global("children_count", 0); - $template->set_global("parents", $movie->parents()->as_array()); - $template->set_global("next_item", $next_item); - $template->set_global("previous_item", $previous_item); - $template->set_global("sibling_count", $movie->parent()->viewable()->children_count($where)); - $template->set_global("position", $position); + $template->set_global( + array("item" => $movie, + "children" => array(), + "children_count" => 0, + "parents" => $movie->parents()->as_array(), + "next_item" => $next_item, + "previous_item" => $previous_item, + "sibling_count" => $movie->parent()->viewable()->children_count($where), + "position" => $position)); $template->content = new View("movie.html"); - $movie->view_count++; - $movie->save(); + $movie->increment_view_count(); print $template; } diff --git a/modules/gallery/controllers/packager.php b/modules/gallery/controllers/packager.php index bd51b93c..c5335c72 100644 --- a/modules/gallery/controllers/packager.php +++ b/modules/gallery/controllers/packager.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -59,7 +59,7 @@ class Packager_Controller extends Controller { // numbers, keeping our install.sql file more stable. srand(0); - foreach (array("gallery", "user", "comment", "organize", "info", "rest", + foreach (array("gallery", "user", "comment", "organize", "info", "rss", "search", "slideshow", "tag") as $module_name) { module::install($module_name); module::activate($module_name); diff --git a/modules/gallery/controllers/permissions.php b/modules/gallery/controllers/permissions.php index fc06cb44..023610c1 100644 --- a/modules/gallery/controllers/permissions.php +++ b/modules/gallery/controllers/permissions.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/controllers/photos.php b/modules/gallery/controllers/photos.php index b22ac8e5..054300a1 100644 --- a/modules/gallery/controllers/photos.php +++ b/modules/gallery/controllers/photos.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,29 +28,29 @@ class Photos_Controller extends Items_Controller { access::required("view", $photo); $where = array(array("type", "!=", "album")); - $position = $photo->parent()->get_position($photo, $where); + $position = item::get_position($photo, $where); if ($position > 1) { list ($previous_item, $ignore, $next_item) = - $photo->parent()->children(3, $position - 2, $where); + $photo->parent()->viewable()->children(3, $position - 2, $where); } else { $previous_item = null; list ($next_item) = $photo->parent()->viewable()->children(1, $position, $where); } $template = new Theme_View("page.html", "item", "photo"); - $template->set_global("item", $photo); - $template->set_global("children", array()); - $template->set_global("children_count", 0); - $template->set_global("parents", $photo->parents()->as_array()); - $template->set_global("next_item", $next_item); - $template->set_global("previous_item", $previous_item); - $template->set_global("sibling_count", $photo->parent()->viewable()->children_count($where)); - $template->set_global("position", $position); + $template->set_global( + array("item" => $photo, + "children" => array(), + "children_count" => 0, + "parents" => $photo->parents()->as_array(), + "next_item" => $next_item, + "previous_item" => $previous_item, + "sibling_count" => $photo->parent()->viewable()->children_count($where), + "position" => $position)); $template->content = new View("photo.html"); - $photo->view_count++; - $photo->save(); + $photo->increment_view_count(); print $template; } diff --git a/modules/gallery/controllers/quick.php b/modules/gallery/controllers/quick.php index 3db4f5df..17abc39f 100644 --- a/modules/gallery/controllers/quick.php +++ b/modules/gallery/controllers/quick.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/controllers/reauthenticate.php b/modules/gallery/controllers/reauthenticate.php index 53a96374..ef0e4632 100644 --- a/modules/gallery/controllers/reauthenticate.php +++ b/modules/gallery/controllers/reauthenticate.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/controllers/upgrader.php b/modules/gallery/controllers/upgrader.php index b2646874..365ba28e 100644 --- a/modules/gallery/controllers/upgrader.php +++ b/modules/gallery/controllers/upgrader.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,7 +23,7 @@ class Upgrader_Controller extends Controller { // Make sure we have an upgrade token if (!($upgrade_token = $session->get("upgrade_token", null))) { - $session->set("upgrade_token", $upgrade_token = md5(rand())); + $session->set("upgrade_token", $upgrade_token = random::hash()); } // If the upgrade token exists, then bless this session @@ -94,6 +94,9 @@ class Upgrader_Controller extends Controller { // If the upgrade failed, this will get recreated site_status::clear("upgrade_now"); + // Clear any upgrade check strings, we are probably up to date. + site_status::clear("upgrade_checker"); + if (php_sapi_name() == "cli") { if ($failed) { print "Upgrade completed ** WITH FAILURES **\n"; diff --git a/modules/gallery/controllers/uploader.php b/modules/gallery/controllers/uploader.php index 168e8b2d..6b1455e4 100644 --- a/modules/gallery/controllers/uploader.php +++ b/modules/gallery/controllers/uploader.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/controllers/user_profile.php b/modules/gallery/controllers/user_profile.php index 4922416c..f30fe78a 100644 --- a/modules/gallery/controllers/user_profile.php +++ b/modules/gallery/controllers/user_profile.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/controllers/welcome_message.php b/modules/gallery/controllers/welcome_message.php index b20f0a94..f2a5aeb1 100644 --- a/modules/gallery/controllers/welcome_message.php +++ b/modules/gallery/controllers/welcome_message.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/MY_html.php b/modules/gallery/helpers/MY_html.php index d15bd816..f5d36ad4 100644 --- a/modules/gallery/helpers/MY_html.php +++ b/modules/gallery/helpers/MY_html.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/MY_num.php b/modules/gallery/helpers/MY_num.php index e784b1ac..9787044c 100644 --- a/modules/gallery/helpers/MY_num.php +++ b/modules/gallery/helpers/MY_num.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/MY_remote.php b/modules/gallery/helpers/MY_remote.php index a1d2a3d1..67de36ff 100644 --- a/modules/gallery/helpers/MY_remote.php +++ b/modules/gallery/helpers/MY_remote.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/MY_url.php b/modules/gallery/helpers/MY_url.php index 877c5ada..47898687 100644 --- a/modules/gallery/helpers/MY_url.php +++ b/modules/gallery/helpers/MY_url.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,7 +31,7 @@ class url extends url_Core { return; } - $item = self::get_item_from_uri(Router::$current_uri); + $item = item::find_by_relative_url(html_entity_decode(Router::$current_uri, ENT_QUOTES)); if ($item && $item->loaded()) { Router::$controller = "{$item->type}s"; Router::$controller_path = MODPATH . "gallery/controllers/{$item->type}s.php"; @@ -41,32 +41,6 @@ class url extends url_Core { } /** - * Locate an item using the URI. We assume that the uri is in the form /a/b/c where each - * component matches up with an item slug. - * @param string $uri the uri fragment - * @return Item_Model - */ - static function get_item_from_uri($uri) { - $current_uri = html_entity_decode($uri, ENT_QUOTES); - // In most cases, we'll have an exact match in the relative_url_cache item field. - // but failing that, walk down the tree until we find it. The fallback code will fix caches - // as it goes, so it'll never be run frequently. - $item = ORM::factory("item")->where("relative_url_cache", "=", $current_uri)->find(); - if (!$item->loaded()) { - $count = count(Router::$segments); - foreach (ORM::factory("item") - ->where("slug", "=", html_entity_decode(Router::$segments[$count - 1], ENT_QUOTES)) - ->where("level", "=", $count + 1) - ->find_all() as $match) { - if ($match->relative_url() == $current_uri) { - $item = $match; - } - } - } - return $item; - } - - /** * Just like url::file() except that it returns an absolute URI */ static function abs_file($path) { @@ -101,4 +75,18 @@ class url extends url_Core { static function current($qs=false, $suffix=false) { return htmlspecialchars(parent::current($qs, $suffix)); } + + /** + * Merge extra an query string onto a given url safely. + * @param string the original url + * @param array the query string data in key=value form + */ + static function merge_querystring($url, $query_params) { + $qs = implode("&", $query_params); + if (strpos($url, "?") === false) { + return $url . "?$qs"; + } else { + return $url . "&$qs"; + } + } } diff --git a/modules/gallery/helpers/access.php b/modules/gallery/helpers/access.php index 0b0dcbc1..545e544f 100644 --- a/modules/gallery/helpers/access.php +++ b/modules/gallery/helpers/access.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -99,8 +99,12 @@ class access_Core { return true; } + // Use the nearest parent album (including the current item) so that we take advantage + // of the cache when checking many items in a single album. + $id = ($item->type == "album") ? $item->id : $item->parent_id; $resource = $perm_name == "view" ? - $item : model_cache::get("access_cache", $item->id, "item_id"); + $item : model_cache::get("access_cache", $id, "item_id"); + foreach ($user->groups() as $group) { if ($resource->__get("{$perm_name}_{$group->id}") === access::ALLOW) { return true; @@ -136,8 +140,12 @@ class access_Core { * @return boolean */ static function group_can($group, $perm_name, $item) { + // Use the nearest parent album (including the current item) so that we take advantage + // of the cache when checking many items in a single album. + $id = ($item->type == "album") ? $item->id : $item->parent_id; $resource = $perm_name == "view" ? - $item : model_cache::get("access_cache", $item->id, "item_id"); + $item : model_cache::get("access_cache", $id, "item_id"); + return $resource->__get("{$perm_name}_{$group->id}") === access::ALLOW; } @@ -426,7 +434,7 @@ class access_Core { $session = Session::instance(); $csrf = $session->get("csrf"); if (empty($csrf)) { - $csrf = md5(rand()); + $csrf = random::hash(); $session->set("csrf", $csrf); } return $csrf; diff --git a/modules/gallery/helpers/album.php b/modules/gallery/helpers/album.php index 89185e50..d8e918e0 100644 --- a/modules/gallery/helpers/album.php +++ b/modules/gallery/helpers/album.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/auth.php b/modules/gallery/helpers/auth.php index fa6242b9..3b2318c3 100644 --- a/modules/gallery/helpers/auth.php +++ b/modules/gallery/helpers/auth.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/batch.php b/modules/gallery/helpers/batch.php index 72d24400..461d5b2c 100644 --- a/modules/gallery/helpers/batch.php +++ b/modules/gallery/helpers/batch.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/block_manager.php b/modules/gallery/helpers/block_manager.php index 2237b702..c385a987 100644 --- a/modules/gallery/helpers/block_manager.php +++ b/modules/gallery/helpers/block_manager.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ class block_manager_Core { static function add($location, $module_name, $block_id) { $blocks = block_manager::get_active($location); - $blocks[rand()] = array($module_name, $block_id); + $blocks[random::int()] = array($module_name, $block_id); block_manager::set_active($location, $blocks); } diff --git a/modules/gallery/helpers/data_rest.php b/modules/gallery/helpers/data_rest.php index 791de9c0..552df34e 100644 --- a/modules/gallery/helpers/data_rest.php +++ b/modules/gallery/helpers/data_rest.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/dir.php b/modules/gallery/helpers/dir.php index f66f443e..e1d11a14 100644 --- a/modules/gallery/helpers/dir.php +++ b/modules/gallery/helpers/dir.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/gallery.php b/modules/gallery/helpers/gallery.php index 2bb55ccb..1fafdef7 100644 --- a/modules/gallery/helpers/gallery.php +++ b/modules/gallery/helpers/gallery.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,25 +18,37 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ class gallery_Core { - const VERSION = "3.0+ (git)"; + const VERSION = "3.0+"; + const CODE_NAME = ""; + const RELEASE_CHANNEL = "git"; + const RELEASE_BRANCH = "master"; /** * If Gallery is in maintenance mode, then force all non-admins to get routed to a "This site is * down for maintenance" page. */ static function maintenance_mode() { - // @todo: we need a mechanism here to identify controllers that are still legally accessible - // when the entire Gallery is in maintenance mode. Perhaps a controller class function or - // method? - // https://sourceforge.net/apps/trac/gallery/ticket/1411 - if (Router::$controller != "login" && - Router::$controller != "combined" && - module::get_var("gallery", "maintenance_mode", 0) && + if (module::get_var("gallery", "maintenance_mode", 0) && !identity::active_user()->admin) { - Session::instance()->set("continue_url", url::abs_site("admin/maintenance")); - Router::$controller = "login"; - Router::$controller_path = MODPATH . "gallery/controllers/login.php"; - Router::$method = "html"; + try { + $class = new ReflectionClass(ucfirst(Router::$controller).'_Controller'); + $allowed = $class->getConstant("ALLOW_MAINTENANCE_MODE") === true; + } catch (ReflectionClass $e) { + $allowed = false; + } + if (!$allowed) { + if (Router::$controller == "admin") { + // At this point we're in the admin theme and it doesn't have a themed login page, so + // we can't just swap in the login controller and have it work. So redirect back to the + // root item where we'll run this code again with the site theme. + url::redirect(item::root()->abs_url()); + } else { + Session::instance()->set("continue_url", url::abs_site("admin/maintenance")); + Router::$controller = "login"; + Router::$controller_path = MODPATH . "gallery/controllers/login.php"; + Router::$method = "html"; + } + } } } @@ -45,26 +57,27 @@ class gallery_Core { * the login page. */ static function private_gallery() { - // @todo: we need a mechanism here to identify controllers that are still legally accessible - // when the entire Gallery is private. Perhaps a controller class function or method? - // https://sourceforge.net/apps/trac/gallery/ticket/1411 - if (Router::$controller != "login" && - Router::$controller != "combined" && - Router::$controller != "digibug" && - Router::$controller != "rest" && - identity::active_user()->guest && + if (identity::active_user()->guest && !access::user_can(identity::guest(), "view", item::root()) && php_sapi_name() != "cli") { - if (Router::$controller == "admin") { - // At this point we're in the admin theme and it doesn't have a themed login page, so - // we can't just swap in the login controller and have it work. So redirect back to the - // root item where we'll run this code again with the site theme. - url::redirect(item::root()->abs_url()); - } else { - Session::instance()->set("continue_url", url::abs_current()); - Router::$controller = "login"; - Router::$controller_path = MODPATH . "gallery/controllers/login.php"; - Router::$method = "html"; + try { + $class = new ReflectionClass(ucfirst(Router::$controller).'_Controller'); + $allowed = $class->getConstant("ALLOW_PRIVATE_GALLERY") === true; + } catch (ReflectionClass $e) { + $allowed = false; + } + if (!$allowed) { + if (Router::$controller == "admin") { + // At this point we're in the admin theme and it doesn't have a themed login page, so + // we can't just swap in the login controller and have it work. So redirect back to the + // root item where we'll run this code again with the site theme. + url::redirect(item::root()->abs_url()); + } else { + Session::instance()->set("continue_url", url::abs_current()); + Router::$controller = "login"; + Router::$controller_path = MODPATH . "gallery/controllers/login.php"; + Router::$method = "html"; + } } } } @@ -143,8 +156,15 @@ class gallery_Core { if (is_string($file_name)) { // make relative to DOCROOT $parts = explode("/", $file_name); + $count = count($parts); foreach ($parts as $idx => $part) { - if (in_array($part, array("application", "modules", "themes", "lib"))) { + // If this part is "modules" or "themes" make sure that the part 2 after this + // is the target directory, and if it is then we're done. This check makes + // sure that if Gallery is installed in a directory called "modules" or "themes" + // We don't parse the directory structure incorrectly. + if (in_array($part, array("modules", "themes")) && + $idx + 2 < $count && + $parts[$idx + 2] == $directory) { break; } unset($parts[$idx]); @@ -167,4 +187,25 @@ class gallery_Core { } putenv("PATH=" . implode(":", $path_env)); } + + /** + * Return a string describing this version of Gallery and the type of release. + */ + static function version_string() { + if (gallery::RELEASE_CHANNEL == "git") { + return sprintf( + "%s (branch %s build %s)", gallery::VERSION, gallery::RELEASE_BRANCH, + gallery::build_number()); + } else { + return sprintf("%s (%s)", gallery::VERSION, gallery::CODE_NAME); + } + } + + /** + * Return the contents of the .build_number file, which should be a single integer. + */ + static function build_number() { + $result = parse_ini_file(DOCROOT . ".build_number"); + return $result["build_number"]; + } }
\ No newline at end of file diff --git a/modules/gallery/helpers/gallery_block.php b/modules/gallery/helpers/gallery_block.php index 1d92d66d..b9ccf25b 100644 --- a/modules/gallery/helpers/gallery_block.php +++ b/modules/gallery/helpers/gallery_block.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,7 +25,9 @@ class gallery_block_Core { "log_entries" => t("Log entries"), "stats" => t("Gallery stats"), "platform_info" => t("Platform information"), - "project_news" => t("Gallery project news")); + "project_news" => t("Gallery project news"), + "upgrade_checker" => t("Check for Gallery upgrades") + ); } static function get_site_list() { @@ -101,6 +103,15 @@ class gallery_block_Core { $block = ""; } break; + + case "upgrade_checker": + $block = new Block(); + $block->css_id = "g-upgrade-available-block"; + $block->title = t("Check for Gallery upgrades"); + $block->content = new View("upgrade_checker_block.html"); + $block->content->version_info = upgrade_checker::version_info(); + $block->content->auto_check_enabled = upgrade_checker::auto_check_enabled(); + $block->content->new_version = upgrade_checker::get_upgrade_message(); } return $block; } diff --git a/modules/gallery/helpers/gallery_error.php b/modules/gallery/helpers/gallery_error.php index f9bbedfc..16699f84 100644 --- a/modules/gallery/helpers/gallery_error.php +++ b/modules/gallery/helpers/gallery_error.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/gallery_event.php b/modules/gallery/helpers/gallery_event.php index b59bb9b9..07817187 100644 --- a/modules/gallery/helpers/gallery_event.php +++ b/modules/gallery/helpers/gallery_event.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -371,6 +371,9 @@ class gallery_event_Core { ->id("admin_menu") ->label(t("Admin"))); module::event("admin_menu", $admin_menu, $theme); + + $settings_menu = $admin_menu->get("settings_menu"); + uasort($settings_menu->elements, array("Menu", "title_comparator")); } } } diff --git a/modules/gallery/helpers/gallery_graphics.php b/modules/gallery/helpers/gallery_graphics.php index 6038a95b..e63b9336 100644 --- a/modules/gallery/helpers/gallery_graphics.php +++ b/modules/gallery/helpers/gallery_graphics.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -56,7 +56,7 @@ class gallery_graphics_Core { } $dims = getimagesize($input_file); - if (max($dims[0], $dims[1]) < min($options["width"], $options["height"])) { + if (max($dims[0], $dims[1]) <= min($options["width"], $options["height"])) { // Image would get upscaled; do nothing copy($input_file, $output_file); } else { @@ -75,7 +75,7 @@ class gallery_graphics_Core { /** * Overlay an image on top of the input file. * - * Valid options are: file, mime_type, position, transparency_percent, padding + * Valid options are: file, position, transparency, padding * * Valid positions: northwest, north, northeast, * west, center, east, diff --git a/modules/gallery/helpers/gallery_installer.php b/modules/gallery/helpers/gallery_installer.php index 3d82bc69..01c59eaa 100644 --- a/modules/gallery/helpers/gallery_installer.php +++ b/modules/gallery/helpers/gallery_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -44,7 +44,7 @@ class gallery_installer { `expiration` int(9) NOT NULL, `cache` longblob, PRIMARY KEY (`id`), - KEY (`key`), + UNIQUE KEY (`key`), KEY (`tags`)) DEFAULT CHARSET=utf8;"); @@ -84,7 +84,7 @@ class gallery_installer { `album_cover_item_id` int(9) default NULL, `captured` int(9) default NULL, `created` int(9) default NULL, - `description` varchar(2048) default NULL, + `description` text default NULL, `height` int(9) default NULL, `left_ptr` int(9) NOT NULL, `level` int(9) NOT NULL, @@ -92,7 +92,7 @@ class gallery_installer { `name` varchar(255) default NULL, `owner_id` int(9) default NULL, `parent_id` int(9) NOT NULL, - `rand_key` float default NULL, + `rand_key` decimal(11,10) default NULL, `relative_path_cache` varchar(255) default NULL, `relative_url_cache` varchar(255) default NULL, `resize_dirty` boolean default 1, @@ -136,7 +136,7 @@ class gallery_installer { `id` int(9) NOT NULL auto_increment, `key` varchar(255) default NULL, `severity` varchar(32) default NULL, - `value` varchar(255) default NULL, + `value` text default NULL, PRIMARY KEY (`id`), UNIQUE KEY(`key`)) DEFAULT CHARSET=utf8;"); @@ -259,6 +259,7 @@ class gallery_installer { module::set_var("gallery", "default_locale", "en_US"); module::set_var("gallery", "image_quality", 75); module::set_var("gallery", "image_sharpen", 15); + module::set_var("gallery", "upgrade_checker_auto_enabled", true); // Add rules for generating our thumbnails and resizes graphics::add_rule( @@ -285,6 +286,7 @@ class gallery_installer { block_manager::add("dashboard_sidebar", "gallery", "platform_info"); block_manager::add("dashboard_sidebar", "gallery", "project_news"); block_manager::add("dashboard_center", "gallery", "welcome"); + block_manager::add("dashboard_center", "gallery", "upgrade_checker"); block_manager::add("dashboard_center", "gallery", "photo_stream"); block_manager::add("dashboard_center", "gallery", "log_entries"); @@ -309,7 +311,7 @@ class gallery_installer { module::set_var("gallery", "show_user_profiles_to", "registered_users"); module::set_var("gallery", "extra_binary_paths", "/usr/local/bin:/opt/local/bin:/opt/bin"); - module::set_version("gallery", 41); + module::set_version("gallery", 46); } static function upgrade($version) { @@ -459,7 +461,7 @@ class gallery_installer { $blocks = block_manager::get_active($location); $new_blocks = array(); foreach ($blocks as $block) { - $new_blocks[rand()] = $block; + $new_blocks[random::int()] = $block; } block_manager::set_active($location, $new_blocks); } @@ -503,11 +505,11 @@ class gallery_installer { foreach (db::build() ->from("items") ->select("id", "slug") - ->where(new Database_Expression("`slug` REGEXP '[^_A-Za-z0-9-]'"), "=", 1) + ->where(db::expr("`slug` REGEXP '[^_A-Za-z0-9-]'"), "=", 1) ->execute() as $row) { $new_slug = item::convert_filename_to_slug($row->slug); if (empty($new_slug)) { - $new_slug = rand(); + $new_slug = random::int(); } db::build() ->update("items") @@ -540,7 +542,7 @@ class gallery_installer { if ($version == 25) { db::build() ->update("items") - ->set("title", new Database_Expression("`name`")) + ->set("title", db::expr("`name`")) ->and_open() ->where("title", "IS", null) ->or_where("title", "=", "") @@ -581,7 +583,7 @@ class gallery_installer { $db->query("ALTER TABLE {modules} ADD COLUMN `weight` int(9) DEFAULT NULL"); $db->query("ALTER TABLE {modules} ADD KEY (`weight`)"); db::update("modules") - ->set("weight", new Database_Expression("`id`")) + ->set("weight", db::expr("`id`")) ->execute(); module::set_version("gallery", $version = 32); } @@ -642,6 +644,39 @@ class gallery_installer { module::clear_var("gallery", "_cache"); module::set_version("gallery", $version = 41); } + + if ($version == 41) { + $db->query("TRUNCATE TABLE {caches}"); + $db->query("ALTER TABLE {caches} DROP INDEX `key`, ADD UNIQUE `key` (`key`)"); + module::set_version("gallery", $version = 42); + } + + if ($version == 42) { + $db->query("ALTER TABLE {items} CHANGE `description` `description` text DEFAULT NULL"); + module::set_version("gallery", $version = 43); + } + + if ($version == 43) { + $db->query("ALTER TABLE {items} CHANGE `rand_key` `rand_key` DECIMAL(11, 10)"); + module::set_version("gallery", $version = 44); + } + + if ($version == 44) { + $db->query("ALTER TABLE {messages} CHANGE `value` `value` text default NULL"); + module::set_version("gallery", $version = 45); + } + + if ($version == 45) { + // Splice the upgrade_checker block into the admin dashboard at the top + // of the page, but under the welcome block if it's in the first position. + $blocks = block_manager::get_active("dashboard_center"); + $index = count($blocks) && current($blocks) == array("gallery", "welcome") ? 1 : 0; + array_splice($blocks, $index, 0, array(random::int() => array("gallery", "upgrade_checker"))); + block_manager::set_active("dashboard_center", $blocks); + + module::set_var("gallery", "upgrade_checker_auto_enabled", true); + module::set_version("gallery", $version = 46); + } } static function uninstall() { diff --git a/modules/gallery/helpers/gallery_rss.php b/modules/gallery/helpers/gallery_rss.php index fb617934..612872e6 100644 --- a/modules/gallery/helpers/gallery_rss.php +++ b/modules/gallery/helpers/gallery_rss.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/gallery_task.php b/modules/gallery/helpers/gallery_task.php index e69ff91a..4a97d865 100644 --- a/modules/gallery/helpers/gallery_task.php +++ b/modules/gallery/helpers/gallery_task.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -74,7 +74,7 @@ class gallery_task_Core { // Choose the dirty images in a random order so that if we run this task multiple times // concurrently each task is rebuilding different images simultaneously. $result = graphics::find_dirty_images_query()->select("id") - ->select(new Database_Expression("RAND() as r")) + ->select(db::expr("RAND() as r")) ->order_by("r", "ASC") ->execute(); $total_count = $task->get("total_count", $result->count()); @@ -608,7 +608,7 @@ class gallery_task_Core { static function find_dupe_slugs() { return db::build() ->select_distinct( - array("parent_slug" => new Database_Expression("CONCAT(`parent_id`, ':', LOWER(`slug`))"))) + array("parent_slug" => db::expr("CONCAT(`parent_id`, ':', LOWER(`slug`))"))) ->select("id") ->select(array("C" => "COUNT(\"*\")")) ->from("items") @@ -620,7 +620,7 @@ class gallery_task_Core { static function find_dupe_names() { return db::build() ->select_distinct( - array("parent_name" => new Database_Expression("CONCAT(`parent_id`, ':', LOWER(`name`))"))) + array("parent_name" => db::expr("CONCAT(`parent_id`, ':', LOWER(`name`))"))) ->select("id") ->select(array("C" => "COUNT(\"*\")")) ->from("items") diff --git a/modules/gallery/helpers/gallery_theme.php b/modules/gallery/helpers/gallery_theme.php index 978c69a6..c4a82390 100644 --- a/modules/gallery/helpers/gallery_theme.php +++ b/modules/gallery/helpers/gallery_theme.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,9 +21,9 @@ class gallery_theme_Core { static function head($theme) { $session = Session::instance(); $buf = ""; - $theme->css("gallery.css"); + $buf .= $theme->css("gallery.css"); if ($session->get("debug")) { - $theme->css("debug.css"); + $buf .= $theme->css("debug.css"); } if (module::is_active("rss")) { @@ -40,32 +40,33 @@ class gallery_theme_Core { if (count(locales::installed())) { // Needed by the languages block - $theme->script("jquery.cookie.js"); + $buf .= $theme->script("jquery.cookie.js"); } if ($session->get("l10n_mode", false)) { - $theme->css("l10n_client.css"); - $theme->script("jquery.cookie.js"); - $theme->script("l10n_client.js"); + $buf .= $theme->css("l10n_client.css") + . $theme->script("jquery.cookie.js") + . $theme->script("l10n_client.js"); } - $theme->css("uploadify/uploadify.css"); + $buf .= $theme->css("uploadify/uploadify.css"); return $buf; } static function admin_head($theme) { - $theme->css("gallery.css"); - $theme->script("gallery.panel.js"); + $buf = $theme->css("gallery.css"); + $buf .= $theme->script("gallery.panel.js"); $session = Session::instance(); if ($session->get("debug")) { - $theme->css("debug.css"); + $buf .= $theme->css("debug.css"); } if ($session->get("l10n_mode", false)) { - $theme->css("l10n_client.css"); - $theme->script("jquery.cookie.js"); - $theme->script("l10n_client.js"); + $buf .= $theme->css("l10n_client.css"); + $buf .= $theme->script("jquery.cookie.js"); + $buf .=$theme->script("l10n_client.js"); } + return $buf; } static function page_bottom($theme) { @@ -75,13 +76,22 @@ class gallery_theme_Core { $profiler = new Profiler(); $profiler->render(); } + $content = ""; if ($session->get("l10n_mode", false)) { - return L10n_Client_Controller::l10n_form(); + $content .= L10n_Client_Controller::l10n_form(); } if ($session->get_once("after_install")) { - return new View("welcome_message_loader.html"); + $content .= new View("welcome_message_loader.html"); + } + + if (identity::active_user()->admin && upgrade_checker::should_auto_check()) { + $content .= '<script type="text/javascript"> + $.ajax({url: "' . url::site("admin/upgrade_checker/check_now?csrf=" . + access::csrf_token()) . '"}); + </script>'; } + return $content; } static function admin_page_bottom($theme) { @@ -106,6 +116,13 @@ class gallery_theme_Core { setInterval("adminReauthCheck();", 60 * 1000); </script>'; + if (upgrade_checker::should_auto_check()) { + $content .= '<script type="text/javascript"> + $.ajax({url: "' . url::site("admin/upgrade_checker/check_now?csrf=" . + access::csrf_token()) . '"}); + </script>'; + } + if ($session->get("l10n_mode", false)) { $content .= "\n" . L10n_Client_Controller::l10n_form(); } @@ -114,7 +131,7 @@ class gallery_theme_Core { static function credits() { $version_string = SafeString::of_safe_html( - '<bdo dir="ltr">Gallery ' . gallery::VERSION . '</bdo>'); + '<bdo dir="ltr">Gallery ' . gallery::version_string() . '</bdo>'); return "<li class=\"g-first\">" . t(module::get_var("gallery", "credits"), array("url" => "http://gallery.menalto.com", diff --git a/modules/gallery/helpers/graphics.php b/modules/gallery/helpers/graphics.php index edba6b76..72c563b7 100644 --- a/modules/gallery/helpers/graphics.php +++ b/modules/gallery/helpers/graphics.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -313,60 +313,42 @@ class graphics_Core { $toolkits->graphicsmagick->installed = false; $toolkits->graphicsmagick->error = t("GraphicsMagick requires the <b>exec</b> function"); } else { - gallery::set_path_env( - array(module::get_var("gallery", "graphics_toolkit_path"), - getenv("PATH"), - module::get_var("gallery", "extra_binary_paths"))); - - // @todo: consider refactoring the two segments below into a loop since they are so - // similar. - - // ImageMagick - $path = exec("which convert"); - $toolkits->imagemagick->name = "ImageMagick"; - if ($path) { - if (@is_file($path)) { - preg_match('/Version: \S+ (\S+)/', `convert -v`, $matches); - $version = $matches[1]; - - $toolkits->imagemagick->installed = true; - $toolkits->imagemagick->version = $version; - $toolkits->imagemagick->binary = $path; - $toolkits->imagemagick->dir = dirname($path); - $toolkits->imagemagick->rotate = true; - $toolkits->imagemagick->sharpen = true; - } else { - $toolkits->imagemagick->installed = false; - $toolkits->imagemagick->error = - t("ImageMagick is installed, but PHP's open_basedir restriction prevents Gallery from using it."); - } - } else { - $toolkits->imagemagick->installed = false; - $toolkits->imagemagick->error = t("We could not locate ImageMagick on your system."); - } - - // GraphicsMagick - $path = exec("which gm"); - $toolkits->graphicsmagick->name = "GraphicsMagick"; - if ($path) { - if (@is_file($path)) { - preg_match('/\S+ (\S+)/', `gm version`, $matches); - $version = $matches[1]; - - $toolkits->graphicsmagick->installed = true; - $toolkits->graphicsmagick->version = $version; - $toolkits->graphicsmagick->binary = $path; - $toolkits->graphicsmagick->dir = dirname($path); - $toolkits->graphicsmagick->rotate = true; - $toolkits->graphicsmagick->sharpen = true; + // ImageMagick & GraphicsMagick + $magick_kits = array( + "imagemagick" => array( + "name" => "ImageMagick", "binary" => "convert", "version" => "convert -v", + "version_regex" => "/Version: \S+ (\S+)/"), + "graphicsmagick" => array( + "name" => "GraphicsMagick", "binary" => "gm", "version" => "gm version", + "version_regex" => "/\S+ (\S+)/")); + // Loop through the kits + foreach ($magick_kits as $index => $settings) { + $path = system::find_binary( + $settings["binary"], module::get_var("gallery", "graphics_toolkit_path")); + $toolkits->$index->name = $settings["name"]; + if ($path) { + if (@is_file($path) && + preg_match($settings["version_regex"], shell_exec($settings["version"]), $matches)) { + $version = $matches[1]; + + $toolkits->$index->installed = true; + $toolkits->$index->version = $version; + $toolkits->$index->binary = $path; + $toolkits->$index->dir = dirname($path); + $toolkits->$index->rotate = true; + $toolkits->$index->sharpen = true; + } else { + $toolkits->$index->installed = false; + $toolkits->$index->error = + t("%toolkit_name is installed, but PHP's open_basedir restriction prevents Gallery from using it.", + array("toolkit_name" => $settings["name"])); + } } else { - $toolkits->graphicsmagick->installed = false; - $toolkits->graphicsmagick->error = - t("GraphicsMagick is installed, but PHP's open_basedir restriction prevents Gallery from using it."); + $toolkits->$index->installed = false; + $toolkits->$index->error = + t("We could not locate %toolkit_name on your system.", + array("toolkit_name" => $settings["name"])); } - } else { - $toolkits->graphicsmagick->installed = false; - $toolkits->graphicsmagick->error = t("We could not locate GraphicsMagick on your system."); } } diff --git a/modules/gallery/helpers/identity.php b/modules/gallery/helpers/identity.php index f45f72c3..ae888d6a 100644 --- a/modules/gallery/helpers/identity.php +++ b/modules/gallery/helpers/identity.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/item.php b/modules/gallery/helpers/item.php index 052b1c8e..1a5c631e 100644 --- a/modules/gallery/helpers/item.php +++ b/modules/gallery/helpers/item.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -210,6 +210,75 @@ class item_Core { } /** + * Find an item by its path. If there's no match, return an empty Item_Model. + * NOTE: the caller is responsible for performing security checks on the resulting item. + * @param string $path + * @return object Item_Model + */ + static function find_by_path($path) { + $path = trim($path, "/"); + + // The root path name is NULL not "", hence this workaround. + if ($path == "") { + return item::root(); + } + + // Check to see if there's an item in the database with a matching relative_path_cache value. + // Since that field is urlencoded, we must urlencoded the components of the path. + foreach (explode("/", $path) as $part) { + $encoded_array[] = rawurlencode($part); + } + $encoded_path = join("/", $encoded_array); + $item = ORM::factory("item") + ->where("relative_path_cache", "=", $encoded_path) + ->find(); + if ($item->loaded()) { + return $item; + } + + // Since the relative_path_cache field is a cache, it can be unavailable. If we don't find + // anything, fall back to checking the path the hard way. + $paths = explode("/", $path); + foreach (ORM::factory("item") + ->where("name", "=", end($paths)) + ->where("level", "=", count($paths) + 1) + ->find_all() as $item) { + if (urldecode($item->relative_path()) == $path) { + return $item; + } + } + + return new Item_Model(); + } + + + /** + * Locate an item using the URL. We assume that the url is in the form /a/b/c where each + * component matches up with an item slug. If there's no match, return an empty Item_Model + * NOTE: the caller is responsible for performing security checks on the resulting item. + * @param string $url the relative url fragment + * @return Item_Model + */ + static function find_by_relative_url($relative_url) { + // In most cases, we'll have an exact match in the relative_url_cache item field. + // but failing that, walk down the tree until we find it. The fallback code will fix caches + // as it goes, so it'll never be run frequently. + $item = ORM::factory("item")->where("relative_url_cache", "=", $relative_url)->find(); + if (!$item->loaded()) { + $segments = explode("/", $relative_url); + foreach (ORM::factory("item") + ->where("slug", "=", end($segments)) + ->where("level", "=", count($segments) + 1) + ->find_all() as $match) { + if ($match->relative_url() == $relative_url) { + $item = $match; + } + } + } + return $item; + } + + /** * Return the root Item_Model * @return Item_Model */ @@ -232,7 +301,95 @@ class item_Core { // distributed so this is going to be more efficient with larger data sets. return ORM::factory("item") ->viewable() - ->where("rand_key", "<", ((float)mt_rand()) / (float)mt_getrandmax()) + ->where("rand_key", "<", random::percent()) ->order_by("rand_key", "DESC"); } + + /** + * Find the position of the given item in its parent album. The resulting + * value is 1-indexed, so the first child in the album is at position 1. + * + * @param Item_Model $item + * @param array $where an array of arrays, each compatible with ORM::where() + */ + static function get_position($item, $where=array()) { + $album = $item->parent(); + + if (!strcasecmp($album->sort_order, "DESC")) { + $comp = ">"; + } else { + $comp = "<"; + } + $query_model = ORM::factory("item"); + + // If the comparison column has NULLs in it, we can't use comparators on it + // and will have to deal with it the hard way. + $count = $query_model->viewable() + ->where("parent_id", "=", $album->id) + ->where($album->sort_column, "IS", null) + ->merge_where($where) + ->count_all(); + + if (empty($count)) { + // There are no NULLs in the sort column, so we can just use it directly. + $sort_column = $album->sort_column; + + $position = $query_model->viewable() + ->where("parent_id", "=", $album->id) + ->where($sort_column, $comp, $item->$sort_column) + ->merge_where($where) + ->count_all(); + + // We stopped short of our target value in the sort (notice that we're + // using a inequality comparator above) because it's possible that we have + // duplicate values in the sort column. An equality check would just + // arbitrarily pick one of those multiple possible equivalent columns, + // which would mean that if you choose a sort order that has duplicates, + // it'd pick any one of them as the child's "position". + // + // Fix this by doing a 2nd query where we iterate over the equivalent + // columns and add them to our position count. + foreach ($query_model->viewable() + ->select("id") + ->where("parent_id", "=", $album->id) + ->where($sort_column, "=", $item->$sort_column) + ->merge_where($where) + ->order_by(array("id" => "ASC")) + ->find_all() as $row) { + $position++; + if ($row->id == $item->id) { + break; + } + } + } else { + // There are NULLs in the sort column, so we can't use MySQL comparators. + // Fall back to iterating over every child row to get to the current one. + // This can be wildly inefficient for really large albums, but it should + // be a rare case that the user is sorting an album with null values in + // the sort column. + // + // Reproduce the children() functionality here using Database directly to + // avoid loading the whole ORM for each row. + $order_by = array($album->sort_column => $album->sort_order); + // Use id as a tie breaker + if ($album->sort_column != "id") { + $order_by["id"] = "ASC"; + } + + $position = 0; + foreach ($query_model->viewable() + ->select("id") + ->where("parent_id", "=", $album->id) + ->merge_where($where) + ->order_by($order_by) + ->find_all() as $row) { + $position++; + if ($row->id == $item->id) { + break; + } + } + } + + return $position; + } }
\ No newline at end of file diff --git a/modules/gallery/helpers/item_rest.php b/modules/gallery/helpers/item_rest.php index a8bc36ad..2cc1b75d 100644 --- a/modules/gallery/helpers/item_rest.php +++ b/modules/gallery/helpers/item_rest.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/items_rest.php b/modules/gallery/helpers/items_rest.php index 08aa3279..80db25b8 100644 --- a/modules/gallery/helpers/items_rest.php +++ b/modules/gallery/helpers/items_rest.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -84,9 +84,9 @@ class items_rest_Core { if ($item->type == "album") { $members = array(); foreach ($item->viewable()->children() as $child) { - if (empty($types) || in_array($child->type, $types)) { - $members[] = rest::url("item", $child); - } + if (empty($types) || in_array($child->type, $types)) { + $members[] = rest::url("item", $child); + } } $item_rest["members"] = $members; } diff --git a/modules/gallery/helpers/json.php b/modules/gallery/helpers/json.php index a88608aa..c89b9f30 100644 --- a/modules/gallery/helpers/json.php +++ b/modules/gallery/helpers/json.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/l10n_client.php b/modules/gallery/helpers/l10n_client.php index 8c2685a8..6d580249 100644 --- a/modules/gallery/helpers/l10n_client.php +++ b/modules/gallery/helpers/l10n_client.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -55,15 +55,24 @@ class l10n_client_Core { $url = self::_server_url("status"); $signature = self::_sign($version, $api_key); - list ($response_data, $response_status) = remote::post( - $url, array("version" => $version, - "client_token" => l10n_client::client_token(), - "signature" => $signature, - "uid" => l10n_client::server_uid($api_key))); + try { + list ($response_data, $response_status) = remote::post( + $url, array("version" => $version, + "client_token" => l10n_client::client_token(), + "signature" => $signature, + "uid" => l10n_client::server_uid($api_key))); + } catch (ErrorException $e) { + // Log the error, but then return a "can't make connection" error + Kohana_Log::add("error", $e->getMessage() . "\n" . $e->getTraceAsString()); + } + if (!isset($response_data) && !isset($response_status)) { + return array(false, false); + } + if (!remote::success($response_status)) { - return false; + return array(true, false); } - return true; + return array(true, true); } /** diff --git a/modules/gallery/helpers/l10n_scanner.php b/modules/gallery/helpers/l10n_scanner.php index 843c74f7..572099ea 100644 --- a/modules/gallery/helpers/l10n_scanner.php +++ b/modules/gallery/helpers/l10n_scanner.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/locales.php b/modules/gallery/helpers/locales.php index 565e9da8..47c2f76a 100644 --- a/modules/gallery/helpers/locales.php +++ b/modules/gallery/helpers/locales.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -64,6 +64,7 @@ class locales_Core { // @todo Might want to add a localizable language name as well. // ref: http://cldr.unicode.org/ // ref: http://cldr.unicode.org/index/cldr-spec/picking-the-right-language-code + // ref: http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/likely_subtags.html private static function _init_language_data() { $l["af_ZA"] = "Afrikaans"; // Afrikaans $l["ar_SA"] = "العربية"; // Arabic @@ -88,6 +89,7 @@ class locales_Core { $l["fr_FR"] = "Français"; // French $l["ga_IE"] = "Gaeilge"; // Irish $l["he_IL"] = "עברית"; // Hebrew + $l["hr_HR"] = "hr̀vātskī"; // Croatian $l["hu_HU"] = "Magyar"; // Hungarian $l["is_IS"] = "Icelandic"; // Icelandic $l["it_IT"] = "Italiano"; // Italian diff --git a/modules/gallery/helpers/log.php b/modules/gallery/helpers/log.php index 37154522..fe491ab1 100644 --- a/modules/gallery/helpers/log.php +++ b/modules/gallery/helpers/log.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/message.php b/modules/gallery/helpers/message.php index 64dd703c..f5a5eede 100644 --- a/modules/gallery/helpers/message.php +++ b/modules/gallery/helpers/message.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/model_cache.php b/modules/gallery/helpers/model_cache.php index b39d599e..10d85f3b 100644 --- a/modules/gallery/helpers/model_cache.php +++ b/modules/gallery/helpers/model_cache.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/module.php b/modules/gallery/helpers/module.php index 2b446daa..37f7f68a 100644 --- a/modules/gallery/helpers/module.php +++ b/modules/gallery/helpers/module.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -168,7 +168,7 @@ class module_Core { if (method_exists($installer_class, "install")) { call_user_func_array(array($installer_class, "install"), array()); } else { - module::set_version($module_name, 1); + module::set_version($module_name, module::available()->$module_name->code_version); } // Set the weight of the new module, which controls the order in which the modules are @@ -488,7 +488,7 @@ class module_Core { static function incr_var($module_name, $name, $increment=1) { db::build() ->update("vars") - ->set("value", new Database_Expression("`value` + $increment")) + ->set("value", db::expr("`value` + $increment")) ->where("module_name", "=", $module_name) ->where("name", "=", $name) ->execute(); diff --git a/modules/gallery/helpers/movie.php b/modules/gallery/helpers/movie.php index 0895c5f4..ddced0d2 100644 --- a/modules/gallery/helpers/movie.php +++ b/modules/gallery/helpers/movie.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -83,22 +83,18 @@ class movie_Core { } } + /** + * Return the path to the ffmpeg binary if one exists and is executable, or null. + */ static function find_ffmpeg() { if (!($ffmpeg_path = module::get_var("gallery", "ffmpeg_path")) || !file_exists($ffmpeg_path)) { - gallery::set_path_env( - array(module::get_var("gallery", "graphics_toolkit_path"), - getenv("PATH"), - module::get_var("gallery", "extra_binary_paths"))); - if (function_exists("exec")) { - $ffmpeg_path = exec("which ffmpeg"); - } - + $ffmpeg_path = system::find_binary( + "ffmpeg", module::get_var("gallery", "graphics_toolkit_path")); module::set_var("gallery", "ffmpeg_path", $ffmpeg_path); } return $ffmpeg_path; } - /** * Return the width, height, mime_type and extension of the given movie file. */ diff --git a/modules/gallery/helpers/photo.php b/modules/gallery/helpers/photo.php index a38b4fb2..8913f567 100644 --- a/modules/gallery/helpers/photo.php +++ b/modules/gallery/helpers/photo.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/random.php b/modules/gallery/helpers/random.php new file mode 100644 index 00000000..6016df7b --- /dev/null +++ b/modules/gallery/helpers/random.php @@ -0,0 +1,54 @@ +<?php defined("SYSPATH") or die("No direct script access."); +/** + * Gallery - a web based photo album viewer and editor + * Copyright (C) 2000-2011 Bharat Mediratta + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ +class random_Core { + /** + * Return a random 32 bit hash value. + * @param string extra entropy data + */ + static function hash($entropy="") { + return md5($entropy . uniqid(mt_rand(), true)); + } + + /** + * Return a random hexadecimal string of the given length. + * @param int the desired length of the string + */ + static function string($length) { + return substr(random::hash(), 0, $length); + } + + /** + * Return a random floating point number between 0 and 1 + */ + static function percent() { + return ((float)mt_rand()) / (float)mt_getrandmax(); + } + + /** + * Return a random number between $min and $max. If $min and $max are not specified, + * return a random number between 0 and mt_getrandmax() + */ + static function int($min=null, $max=null) { + if ($min || $max) { + return mt_rand($min, $max); + } + return mt_rand(); + } +}
\ No newline at end of file diff --git a/modules/gallery/helpers/site_status.php b/modules/gallery/helpers/site_status.php index 85f30dba..2ba7fca5 100644 --- a/modules/gallery/helpers/site_status.php +++ b/modules/gallery/helpers/site_status.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/system.php b/modules/gallery/helpers/system.php new file mode 100644 index 00000000..c39c7227 --- /dev/null +++ b/modules/gallery/helpers/system.php @@ -0,0 +1,43 @@ +<?php defined("SYSPATH") or die("No direct script access."); +/** + * Gallery - a web based photo album viewer and editor + * Copyright (C) 2000-2011 Bharat Mediratta + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ +class system_Core { + /** + * Return the path to an executable version of the named binary, or null. + * Traverse the PATH environment variable looking for the given file. If + * the $priority_path variable is set, check that path first. + */ + static function find_binary($binary, $priority_path=null) { + $paths = array_merge( + explode(":", getenv("PATH")), + explode(":", module::get_var("gallery", "extra_binary_paths"))); + if ($priority_path) { + array_unshift($paths, $priority_path); + } + + foreach ($paths as $path) { + $candidate = "$path/$binary"; + // @suppress errors below to avoid open_basedir issues + if (@file_exists($candidate) && @is_executable($candidate)) { + return $candidate; + } + } + return null; + } +}
\ No newline at end of file diff --git a/modules/gallery/helpers/task.php b/modules/gallery/helpers/task.php index 4dda568f..0421035f 100644 --- a/modules/gallery/helpers/task.php +++ b/modules/gallery/helpers/task.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/theme.php b/modules/gallery/helpers/theme.php index 1dc1f3b6..f285834c 100644 --- a/modules/gallery/helpers/theme.php +++ b/modules/gallery/helpers/theme.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/tree_rest.php b/modules/gallery/helpers/tree_rest.php new file mode 100644 index 00000000..d9468ed8 --- /dev/null +++ b/modules/gallery/helpers/tree_rest.php @@ -0,0 +1,92 @@ +<?php defined("SYSPATH") or die("No direct script access."); +/** + * Gallery - a web based photo album viewer and editor + * Copyright (C) 2000-2011 Bharat Mediratta + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ +class tree_rest_Core { + /** + * The tree is rooted in a single item and can have modifiers which adjust what data is shown + * for items inside the given tree, up to the depth that you want. The entity for this resource + * is a series of items. + * + * depth=<number> + * Only traverse this far down into the tree. If there are more albums + * below this depth, provide RESTful urls to other tree resources in + * the members section. Default is infinite. + * + * type=<album|photo|movie> + * Restrict the items displayed to the given type. Default is all types. + * + * fields=<comma separated list of field names> + * In the entity section only return these fields for each item. + * Default is all fields. + */ + static function get($request) { + $item = rest::resolve($request->url); + access::required("view", $item); + + $query_params = array(); + $p = $request->params; + $where = array(); + if (isset($p->type)) { + $where[] = array("type", "=", $p->type); + $query_params[] = "type={$p->type}"; + } + + if (isset($p->depth)) { + $lowest_depth = $item->level + $p->depth; + $where[] = array("level", "<=", $lowest_depth); + $query_params[] = "depth={$p->depth}"; + } + + $fields = array(); + if (isset($p->fields)) { + $fields = explode(",", $p->fields); + $query_params[] = "fields={$p->fields}"; + } + + $entity = array(array("url" => rest::url("item", $item), + "entity" => $item->as_restful_array($fields))); + $members = array(); + foreach ($item->viewable()->descendants(null, null, $where) as $child) { + $entity[] = array("url" => rest::url("item", $child), + "entity" => $child->as_restful_array($fields)); + if (isset($lowest_depth) && $child->level == $lowest_depth) { + $members[] = url::merge_querystring(rest::url("tree", $child), $query_params); + } + } + + $result = array( + "url" => $request->url, + "entity" => $entity, + "members" => $members, + "relationships" => rest::relationships("tree", $item)); + return $result; + } + + static function resolve($id) { + $item = ORM::factory("item", $id); + if (!access::can("view", $item)) { + throw new Kohana_404_Exception(); + } + return $item; + } + + static function url($item) { + return url::abs_site("rest/tree/{$item->id}"); + } +} diff --git a/modules/gallery/helpers/upgrade_checker.php b/modules/gallery/helpers/upgrade_checker.php new file mode 100644 index 00000000..ff65608b --- /dev/null +++ b/modules/gallery/helpers/upgrade_checker.php @@ -0,0 +1,103 @@ +<?php defined("SYSPATH") or die("No direct script access."); +/** + * Gallery - a web based photo album viewer and editor + * Copyright (C) 2000-2011 Bharat Mediratta + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ +class upgrade_checker_Core { + const CHECK_URL = "http://gallery.menalto.com/versioncheck/gallery3"; + const AUTO_CHECK_INTERVAL = 604800; // 7 days in seconds + + /** + * Return the last version info blob retrieved from the Gallery website or + * null if no checks have been performed. + */ + static function version_info() { + return unserialize(Cache::instance()->get("upgrade_checker_version_info")); + } + + /** + * Return true if auto checking is enabled. + */ + static function auto_check_enabled() { + return (bool)module::get_var("gallery", "upgrade_checker_auto_enabled"); + } + + /** + * Return true if it's time to auto check. + */ + static function should_auto_check() { + if (upgrade_checker::auto_check_enabled() && random::int(1, 100) == 1) { + $version_info = upgrade_checker::version_info(); + return (!$version_info || (time() - $version_info->timestamp) > AUTO_CHECK_INTERVAL); + } + return false; + } + + /** + * Fech version info from the Gallery website. + */ + static function fetch_version_info() { + $result = new stdClass(); + try { + list ($status, $headers, $body) = remote::do_request(upgrade_checker::CHECK_URL); + if ($status == "HTTP/1.1 200 OK") { + $result->status = "success"; + foreach (explode("\n", $body) as $line) { + if ($line) { + list($key, $val) = explode("=", $line, 2); + $result->data[$key] = $val; + } + } + } else { + $result->status = "error"; + } + } catch (Exception $e) { + Kohana_Log::add("error", + sprintf("%s in %s at line %s:\n%s", $e->getMessage(), $e->getFile(), + $e->getLine(), $e->getTraceAsString())); + } + $result->timestamp = time(); + Cache::instance()->set("upgrade_checker_version_info", serialize($result), null, 86400 * 365); + } + + /** + * Check the latest version info blob to see if it's time for an upgrade. + */ + static function get_upgrade_message() { + $version_info = upgrade_checker::version_info(); + if ($version_info) { + if (gallery::RELEASE_CHANNEL == "release") { + if (version_compare($version_info->data["release_version"], gallery::VERSION, ">")) { + return t("A newer version of Gallery is available! <a href=\"%upgrade-url\">Upgrade now</a> to version %version", + array("version" => $version_info->data["release_version"], + "upgrade-url" => $version_info->data["release_upgrade_url"])); + } + } else { + $branch = gallery::RELEASE_BRANCH; + if (isset($version_info->data["branch_{$branch}_build_number"]) && + version_compare($version_info->data["branch_{$branch}_build_number"], + gallery::build_number(), ">")) { + return t("A newer version of Gallery is available! <a href=\"%upgrade-url\">Upgrade now</a> to version %version (build %build on branch %branch)", + array("version" => $version_info->data["branch_{$branch}_version"], + "upgrade-url" => $version_info->data["branch_{$branch}_upgrade_url"], + "build" => $version_info->data["branch_{$branch}_build_number"], + "branch" => $branch)); + } + } + } + } +} diff --git a/modules/gallery/helpers/user_profile.php b/modules/gallery/helpers/user_profile.php index d9cc8ace..d2a7441d 100644 --- a/modules/gallery/helpers/user_profile.php +++ b/modules/gallery/helpers/user_profile.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/helpers/xml.php b/modules/gallery/helpers/xml.php index 2d3a2545..569ba5b2 100644 --- a/modules/gallery/helpers/xml.php +++ b/modules/gallery/helpers/xml.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/hooks/init_gallery.php b/modules/gallery/hooks/init_gallery.php index 10a74733..fed0ad3d 100644 --- a/modules/gallery/hooks/init_gallery.php +++ b/modules/gallery/hooks/init_gallery.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/Admin_View.php b/modules/gallery/libraries/Admin_View.php index 88d86a7d..af6c2a69 100644 --- a/modules/gallery/libraries/Admin_View.php +++ b/modules/gallery/libraries/Admin_View.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -34,16 +34,20 @@ class Admin_View_Core extends Gallery_View { $this->theme_name = Input::instance()->get("theme", $this->theme_name); } $this->sidebar = ""; - $this->set_global("theme", $this); - $this->set_global("user", identity::active_user()); - $this->set_global("page_type", "admin"); - $this->set_global("page_subtype", $name); - $this->set_global("page_title", null); + $this->set_global(array("theme" => $this, + "user" => identity::active_user(), + "page_type" => "admin", + "page_subtype" => $name, + "page_title" => null)); } public function admin_menu() { $menu = Menu::factory("root"); module::event("admin_menu", $menu, $this); + + $settings_menu = $menu->get("settings_menu"); + uasort($settings_menu->elements, array("Menu", "title_comparator")); + return $menu->render(); } @@ -82,6 +86,7 @@ class Admin_View_Core extends Gallery_View { case "admin_page_top": case "admin_head": case "body_attributes": + case "html_attributes": $blocks = array(); foreach (module::active() as $module) { $helper_class = "{$module->name}_theme"; @@ -92,11 +97,6 @@ class Admin_View_Core extends Gallery_View { } } - if ($function == "admin_head") { - array_unshift($blocks, $this->combine_files($this->css, "css")); - array_unshift($blocks, $this->combine_files($this->scripts, "javascript")); - } - if (Session::instance()->get("debug")) { if ($function != "admin_head") { array_unshift( diff --git a/modules/gallery/libraries/Block.php b/modules/gallery/libraries/Block.php index f0a1b9c6..dd650b53 100644 --- a/modules/gallery/libraries/Block.php +++ b/modules/gallery/libraries/Block.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/Form_Script.php b/modules/gallery/libraries/Form_Script.php index a2465169..c91256fe 100644 --- a/modules/gallery/libraries/Form_Script.php +++ b/modules/gallery/libraries/Form_Script.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/Form_Uploadify.php b/modules/gallery/libraries/Form_Uploadify.php index 79477763..27ab9684 100644 --- a/modules/gallery/libraries/Form_Uploadify.php +++ b/modules/gallery/libraries/Form_Uploadify.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/Form_Uploadify_buttons.php b/modules/gallery/libraries/Form_Uploadify_buttons.php index eab0a700..663e989b 100644 --- a/modules/gallery/libraries/Form_Uploadify_buttons.php +++ b/modules/gallery/libraries/Form_Uploadify_buttons.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/Gallery_I18n.php b/modules/gallery/libraries/Gallery_I18n.php index 6cb36f07..1defd123 100644 --- a/modules/gallery/libraries/Gallery_I18n.php +++ b/modules/gallery/libraries/Gallery_I18n.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/Gallery_View.php b/modules/gallery/libraries/Gallery_View.php index b45bb94a..562f7929 100644 --- a/modules/gallery/libraries/Gallery_View.php +++ b/modules/gallery/libraries/Gallery_View.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,41 +19,66 @@ */ class Gallery_View_Core extends View { protected $theme_name = null; - protected $scripts = array(); - protected $css = array(); + protected $combine_queue = array(); /** - * Add a script to the combined scripts list. + * Provide a url to a resource within the current theme. This allows us to refer to theme + * resources without naming the theme itself which makes themes easier to copy. + */ + public function url($path, $absolute_url=false) { + $arg = "themes/{$this->theme_name}/$path"; + return $absolute_url ? url::abs_file($arg) : url::file($arg); + } + + /** + * Begin gather up scripts or css files so that they can be combined into a single request. + * + * @param $types a comma separated list of types to combine, eg "script,css" + */ + public function start_combining($types) { + foreach (explode(",", $types) as $type) { + $this->combine_queue[$type] = array(); + } + } + + /** + * If script combining is enabled, add this script to the list of scripts that will be + * combined into a single script element. When combined, the order of scripts is preserved. + * * @param $file the file name or path of the script to include. If a path is specified then * it needs to be relative to DOCROOT. Just specifying a file name will result * in searching Kohana's cascading file system. + * @param $group the group of scripts to combine this with. defaults to "core" */ - public function script($file) { + public function script($file, $group="core") { if (($path = gallery::find_file("js", $file, false))) { - $this->scripts[$path] = 1; + if (isset($this->combine_queue["script"])) { + $this->combine_queue["script"][$group][$path] = 1; + } else { + return html::script($path); + } } else { Kohana_Log::add("error", "Can't find script file: $file"); } } /** - * Provide a url to a resource within the current theme. This allows us to refer to theme - * resources without naming the theme itself which makes themes easier to copy. - */ - public function url($path, $absolute_url=false) { - $arg = "themes/{$this->theme_name}/$path"; - return $absolute_url ? url::abs_file($arg) : url::file($arg); - } - - /** - * Add a css file to the combined css list. - * @param $file the file name or path of the script to include. If a path is specified then + * If css combining is enabled, add this css to the list of css that will be + * combined into a single style element. When combined, the order of style elements + * is preserved. + * + * @param $file the file name or path of the css to include. If a path is specified then * it needs to be relative to DOCROOT. Just specifying a file name will result * in searching Kohana's cascading file system. + * @param $group the group of css to combine this with. defaults to "core" */ - public function css($file) { + public function css($file, $group="core") { if (($path = gallery::find_file("css", $file, false))) { - $this->css[$path] = 1; + if (isset($this->combine_queue["css"])) { + $this->combine_queue["css"][$group][$path] = 1; + } else { + return html::stylesheet($path); + } } else { Kohana_Log::add("error", "Can't find css file: $file"); } @@ -61,11 +86,13 @@ class Gallery_View_Core extends View { /** * Combine a series of files into a single one and cache it in the database. + * @param $type the data type (script or css) + * @param $group the group of scripts or css we want */ - protected function combine_files($paths, $type) { + public function get_combined($type, $group="core") { $links = array(); - if (empty($paths)) { + if (empty($this->combine_queue[$type][$group])) { return; } @@ -73,7 +100,7 @@ class Gallery_View_Core extends View { // entries. $key = array(url::abs_file("")); - foreach (array_keys($paths) as $path) { + foreach (array_keys($this->combine_queue[$type][$group]) as $path) { $stats = stat($path); // 7 == size, 9 == mtime, see http://php.net/stat $key[] = "$path $stats[7] $stats[9]"; @@ -85,7 +112,7 @@ class Gallery_View_Core extends View { if (empty($contents)) { $contents = ""; - foreach (array_keys($paths) as $path) { + foreach (array_keys($this->combine_queue[$type][$group]) as $path) { if ($type == "css") { $contents .= "/* $path */\n" . $this->process_css($path) . "\n"; } else { @@ -103,12 +130,12 @@ class Gallery_View_Core extends View { } } + unset($this->combine_queue[$type][$group]); + if ($type == "css") { - return "<!-- LOOKING FOR YOUR CSS? It's all been combined into the link below -->\n" . - html::stylesheet("combined/css/$key", "screen,print,projection", true); + return html::stylesheet("combined/css/$key", "screen,print,projection", true); } else { - return "<!-- LOOKING FOR YOUR JAVASCRIPT? It's all been combined into the link below -->\n" . - html::script("combined/javascript/$key", true); + return html::script("combined/javascript/$key", true); } } diff --git a/modules/gallery/libraries/IdentityProvider.php b/modules/gallery/libraries/IdentityProvider.php index 4ef07e1a..153446e6 100644 --- a/modules/gallery/libraries/IdentityProvider.php +++ b/modules/gallery/libraries/IdentityProvider.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/InPlaceEdit.php b/modules/gallery/libraries/InPlaceEdit.php index 42eb2ffe..88c30494 100644 --- a/modules/gallery/libraries/InPlaceEdit.php +++ b/modules/gallery/libraries/InPlaceEdit.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/MY_Database.php b/modules/gallery/libraries/MY_Database.php index 10dd8f3c..6afe48eb 100644 --- a/modules/gallery/libraries/MY_Database.php +++ b/modules/gallery/libraries/MY_Database.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/MY_Forge.php b/modules/gallery/libraries/MY_Forge.php index 0e264335..57ee2f42 100644 --- a/modules/gallery/libraries/MY_Forge.php +++ b/modules/gallery/libraries/MY_Forge.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/MY_Input.php b/modules/gallery/libraries/MY_Input.php index 1d5949e8..6ab597cf 100644 --- a/modules/gallery/libraries/MY_Input.php +++ b/modules/gallery/libraries/MY_Input.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/MY_Kohana_Exception.php b/modules/gallery/libraries/MY_Kohana_Exception.php index 82899d7e..c63e8621 100644 --- a/modules/gallery/libraries/MY_Kohana_Exception.php +++ b/modules/gallery/libraries/MY_Kohana_Exception.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/MY_ORM.php b/modules/gallery/libraries/MY_ORM.php index 4a66cf63..d39aa4aa 100644 --- a/modules/gallery/libraries/MY_ORM.php +++ b/modules/gallery/libraries/MY_ORM.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/MY_Pagination.php b/modules/gallery/libraries/MY_Pagination.php index 4c0df1fb..e697c0bd 100644 --- a/modules/gallery/libraries/MY_Pagination.php +++ b/modules/gallery/libraries/MY_Pagination.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/MY_View.php b/modules/gallery/libraries/MY_View.php index ded77792..9eeeca0c 100644 --- a/modules/gallery/libraries/MY_View.php +++ b/modules/gallery/libraries/MY_View.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,8 +23,14 @@ class View extends View_Core { /** * Reimplement Kohana 2.3's View::set_global() functionality. */ - public function set_global($key, $value) { - View::$global_data[$key] = $value; + public function set_global($key, $value = NULL) { + if (is_array($key)) { + foreach ($key as $key2 => $value) { + View::$global_data[$key2] = $value; + } + } else { + View::$global_data[$key] = $value; + } } public function is_set($key=null) { diff --git a/modules/gallery/libraries/Menu.php b/modules/gallery/libraries/Menu.php index 3ad6ebef..a29a9905 100644 --- a/modules/gallery/libraries/Menu.php +++ b/modules/gallery/libraries/Menu.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -223,12 +223,13 @@ class Menu_Core extends Menu_Element { /** * Retrieve a Menu_Element by id */ - public function get($id) { + public function &get($id) { if (array_key_exists($id, $this->elements)) { return $this->elements[$id]; } - return null; + $null = null; + return $null; } public function is_empty() { @@ -249,4 +250,8 @@ class Menu_Core extends Menu_Element { $view->menu = $this; return $view; } + + static function title_comparator($a, $b) { + return strnatcasecmp((string)$a->label, (string)$b->label); + } } diff --git a/modules/gallery/libraries/ORM_MPTT.php b/modules/gallery/libraries/ORM_MPTT.php index f20fafa0..2a43471f 100644 --- a/modules/gallery/libraries/ORM_MPTT.php +++ b/modules/gallery/libraries/ORM_MPTT.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -54,12 +54,12 @@ class ORM_MPTT_Core extends ORM { // Make a hole in the parent for this new item db::build() ->update($this->table_name) - ->set("left_ptr", new Database_Expression("`left_ptr` + 2")) + ->set("left_ptr", db::expr("`left_ptr` + 2")) ->where("left_ptr", ">=", $parent->right_ptr) ->execute(); db::build() ->update($this->table_name) - ->set("right_ptr", new Database_Expression("`right_ptr` + 2")) + ->set("right_ptr", db::expr("`right_ptr` + 2")) ->where("right_ptr", ">=", $parent->right_ptr) ->execute(); $parent->right_ptr += 2; @@ -109,12 +109,12 @@ class ORM_MPTT_Core extends ORM { try { db::build() ->update($this->table_name) - ->set("left_ptr", new Database_Expression("`left_ptr` - 2")) + ->set("left_ptr", db::expr("`left_ptr` - 2")) ->where("left_ptr", ">", $this->right_ptr) ->execute(); db::build() ->update($this->table_name) - ->set("right_ptr", new Database_Expression("`right_ptr` - 2")) + ->set("right_ptr", db::expr("`right_ptr` - 2")) ->where("right_ptr", ">", $this->right_ptr) ->execute(); } catch (Exception $e) { @@ -253,7 +253,7 @@ class ORM_MPTT_Core extends ORM { // Update the levels for the to-be-moved items db::build() ->update($this->table_name) - ->set("level", new Database_Expression("`level` + $level_delta")) + ->set("level", db::expr("`level` + $level_delta")) ->where("left_ptr", ">=", $original_left_ptr) ->where("right_ptr", "<=", $original_right_ptr) ->execute(); @@ -262,12 +262,12 @@ class ORM_MPTT_Core extends ORM { // Make a hole in the target for the move db::build() ->update($this->table_name) - ->set("left_ptr", new Database_Expression("`left_ptr` + $size_of_hole")) + ->set("left_ptr", db::expr("`left_ptr` + $size_of_hole")) ->where("left_ptr", ">=", $target_right_ptr) ->execute(); db::build() ->update($this->table_name) - ->set("right_ptr", new Database_Expression("`right_ptr` + $size_of_hole")) + ->set("right_ptr", db::expr("`right_ptr` + $size_of_hole")) ->where("right_ptr", ">=", $target_right_ptr) ->execute(); @@ -290,8 +290,8 @@ class ORM_MPTT_Core extends ORM { $new_offset = $target->right_ptr - $left_ptr; db::build() ->update($this->table_name) - ->set("left_ptr", new Database_Expression("`left_ptr` + $new_offset")) - ->set("right_ptr", new Database_Expression("`right_ptr` + $new_offset")) + ->set("left_ptr", db::expr("`left_ptr` + $new_offset")) + ->set("right_ptr", db::expr("`right_ptr` + $new_offset")) ->where("left_ptr", ">=", $left_ptr) ->where("right_ptr", "<=", $right_ptr) ->execute(); @@ -299,12 +299,12 @@ class ORM_MPTT_Core extends ORM { // Close the hole in the source's parent after the move db::build() ->update($this->table_name) - ->set("left_ptr", new Database_Expression("`left_ptr` - $size_of_hole")) + ->set("left_ptr", db::expr("`left_ptr` - $size_of_hole")) ->where("left_ptr", ">", $right_ptr) ->execute(); db::build() ->update($this->table_name) - ->set("right_ptr", new Database_Expression("`right_ptr` - $size_of_hole")) + ->set("right_ptr", db::expr("`right_ptr` - $size_of_hole")) ->where("right_ptr", ">", $right_ptr) ->execute(); } catch (Exception $e) { diff --git a/modules/gallery/libraries/SafeString.php b/modules/gallery/libraries/SafeString.php index 81a51f08..cea9f8ce 100644 --- a/modules/gallery/libraries/SafeString.php +++ b/modules/gallery/libraries/SafeString.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/Sendmail.php b/modules/gallery/libraries/Sendmail.php index a93be736..6d4329a1 100644 --- a/modules/gallery/libraries/Sendmail.php +++ b/modules/gallery/libraries/Sendmail.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/Task_Definition.php b/modules/gallery/libraries/Task_Definition.php index 2a78308e..5185d102 100644 --- a/modules/gallery/libraries/Task_Definition.php +++ b/modules/gallery/libraries/Task_Definition.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/libraries/Theme_View.php b/modules/gallery/libraries/Theme_View.php index 7a6bc1da..a507e9c8 100644 --- a/modules/gallery/libraries/Theme_View.php +++ b/modules/gallery/libraries/Theme_View.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -37,11 +37,11 @@ class Theme_View_Core extends Gallery_View { } $this->item = null; $this->tag = null; - $this->set_global("theme", $this); - $this->set_global("user", identity::active_user()); - $this->set_global("page_type", $page_type); - $this->set_global("page_subtype", $page_subtype); - $this->set_global("page_title", null); + $this->set_global(array("theme" => $this, + "user" => identity::active_user(), + "page_type" => $page_type, + "page_subtype" => $page_subtype, + "page_title" => null)); if ($page_type == "collection") { $this->set_global("thumb_proportion", $this->thumb_proportion()); } @@ -224,6 +224,7 @@ class Theme_View_Core extends Gallery_View { case "head": case "header_bottom": case "header_top": + case "html_attributes": case "page_bottom": case "page_top": case "photo_blocks": @@ -236,13 +237,6 @@ class Theme_View_Core extends Gallery_View { case "thumb_bottom": case "thumb_info": case "thumb_top": - if ($function == "head") { - // Stash any CSS we have already; that came from the theme and we want theme CSS to - // override module CSs - $save_css = $this->css; - $this->css = array(); - } - $blocks = array(); if (method_exists("gallery_theme", $function)) { switch (count($args)) { @@ -281,13 +275,6 @@ class Theme_View_Core extends Gallery_View { array_merge(array($this), $args)); } - if ($function == "head") { - // Merge the theme CSS/JS at the end - $this->css = array_merge($this->css, $save_css); - array_unshift($blocks, $this->combine_files($this->css, "css")); - array_unshift($blocks, $this->combine_files($this->scripts, "javascript")); - } - if (Session::instance()->get("debug")) { if ($function != "head" && $function != "body_attributes") { array_unshift( diff --git a/modules/gallery/libraries/drivers/Cache/Database.php b/modules/gallery/libraries/drivers/Cache/Database.php index b7822811..b61dbc17 100644 --- a/modules/gallery/libraries/drivers/Cache/Database.php +++ b/modules/gallery/libraries/drivers/Cache/Database.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,20 +25,6 @@ class Cache_Database_Driver extends Cache_Driver { protected $db; /** - * Checks if a cache id is already set. - * - * @param string cache id - * @return boolean - */ - public function exists($id) { - $count = db::build() - ->where("key", "=", $id) - ->where("expiration", ">=", time()) - ->count_records("caches"); - return $count > 0; - } - - /** * Sets a cache item to the given data, tags, and lifetime. * * @param array assoc array of key => value pairs @@ -59,22 +45,15 @@ class Cache_Database_Driver extends Cache_Driver { $lifetime += time(); } + $db = Database::instance(); + $tags = $db->escape($tags); foreach ($items as $id => $data) { - if ($this->exists($id)) { - $status = db::build() - ->update("caches") - ->set("tags", $tags) - ->set("expiration", $lifetime) - ->set("cache", serialize($data)) - ->where("key", "=", $id) - ->execute(); - } else { - $status = db::build() - ->insert("caches") - ->columns("key", "tags", "expiration", "cache") - ->values($id, $tags, $lifetime, serialize($data)) - ->execute(); - } + $id = $db->escape($id); + $data = $db->escape(serialize($data)); + $db->query("INSERT INTO {caches} (`key`, `tags`, `expiration`, `cache`) + VALUES ('$id', '$tags', $lifetime, '$data') + ON DUPLICATE KEY UPDATE `tags` = VALUES(tags), `expiration` = VALUES(expiration), + `cache` = VALUES(cache)"); } return true; diff --git a/modules/gallery/libraries/drivers/IdentityProvider.php b/modules/gallery/libraries/drivers/IdentityProvider.php index ac2473f5..98bc025c 100644 --- a/modules/gallery/libraries/drivers/IdentityProvider.php +++ b/modules/gallery/libraries/drivers/IdentityProvider.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/models/access_cache.php b/modules/gallery/models/access_cache.php index e730f25c..217dd147 100644 --- a/modules/gallery/models/access_cache.php +++ b/modules/gallery/models/access_cache.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/models/access_intent.php b/modules/gallery/models/access_intent.php index 31711014..43c46d0c 100644 --- a/modules/gallery/models/access_intent.php +++ b/modules/gallery/models/access_intent.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/models/cache.php b/modules/gallery/models/cache.php index 1c464d51..9d02a44c 100644 --- a/modules/gallery/models/cache.php +++ b/modules/gallery/models/cache.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/models/failed_auth.php b/modules/gallery/models/failed_auth.php index 649e4bc9..a418681d 100644 --- a/modules/gallery/models/failed_auth.php +++ b/modules/gallery/models/failed_auth.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/models/graphics_rule.php b/modules/gallery/models/graphics_rule.php index 09410af0..feaae3c6 100644 --- a/modules/gallery/models/graphics_rule.php +++ b/modules/gallery/models/graphics_rule.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/models/incoming_translation.php b/modules/gallery/models/incoming_translation.php index ff6a7160..07df9d2f 100644 --- a/modules/gallery/models/incoming_translation.php +++ b/modules/gallery/models/incoming_translation.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/models/item.php b/modules/gallery/models/item.php index 9016a04a..8f4bc5e4 100644 --- a/modules/gallery/models/item.php +++ b/modules/gallery/models/item.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ class Item_Model_Core extends ORM_MPTT { if (!$this->loaded()) { // Set reasonable defaults $this->created = time(); - $this->rand_key = ((float)mt_rand()) / (float)mt_getrandmax(); + $this->rand_key = random::percent(); $this->thumb_dirty = 1; $this->resize_dirty = 1; $this->sort_column = "created"; @@ -390,7 +390,7 @@ class Item_Model_Core extends ORM_MPTT { if (file_exists($this->resize_path()) || file_exists($this->thumb_path())) { $pi = pathinfo($this->name); - $this->name = $pi["filename"] . "-" . rand() . "." . $pi["extension"]; + $this->name = $pi["filename"] . "-" . random::int() . "." . $pi["extension"]; parent::save(); } @@ -512,7 +512,7 @@ class Item_Model_Core extends ORM_MPTT { ->or_where("slug", "=", $this->slug) ->close() ->find()->id) { - $rand = rand(); + $rand = random::int(); if ($base_ext) { $this->name = "$base_name-$rand.$base_ext"; } else { @@ -546,83 +546,12 @@ class Item_Model_Core extends ORM_MPTT { /** * Find the position of the given child id in this album. The resulting value is 1-indexed, so * the first child in the album is at position 1. + * + * This method stands as a backward compatibility for gallery 3.0, and will + * be deprecated in version 3.1. */ public function get_position($child, $where=array()) { - if (!strcasecmp($this->sort_order, "DESC")) { - $comp = ">"; - } else { - $comp = "<"; - } - $db = db::build(); - - // If the comparison column has NULLs in it, we can't use comparators on it and will have to - // deal with it the hard way. - $count = $db->from("items") - ->where("parent_id", "=", $this->id) - ->where($this->sort_column, "IS", null) - ->merge_where($where) - ->count_records(); - - if (empty($count)) { - // There are no NULLs in the sort column, so we can just use it directly. - $sort_column = $this->sort_column; - - $position = $db->from("items") - ->where("parent_id", "=", $this->id) - ->where($sort_column, $comp, $child->$sort_column) - ->merge_where($where) - ->count_records(); - - // We stopped short of our target value in the sort (notice that we're using a < comparator - // above) because it's possible that we have duplicate values in the sort column. An - // equality check would just arbitrarily pick one of those multiple possible equivalent - // columns, which would mean that if you choose a sort order that has duplicates, it'd pick - // any one of them as the child's "position". - // - // Fix this by doing a 2nd query where we iterate over the equivalent columns and add them to - // our base value. - foreach ($db - ->select("id") - ->from("items") - ->where("parent_id", "=", $this->id) - ->where($sort_column, "=", $child->$sort_column) - ->merge_where($where) - ->order_by(array("id" => "ASC")) - ->execute() as $row) { - $position++; - if ($row->id == $child->id) { - break; - } - } - } else { - // There are NULLs in the sort column, so we can't use MySQL comparators. Fall back to - // iterating over every child row to get to the current one. This can be wildly inefficient - // for really large albums, but it should be a rare case that the user is sorting an album - // with null values in the sort column. - // - // Reproduce the children() functionality here using Database directly to avoid loading the - // whole ORM for each row. - $order_by = array($this->sort_column => $this->sort_order); - // Use id as a tie breaker - if ($this->sort_column != "id") { - $order_by["id"] = "ASC"; - } - - $position = 0; - foreach ($db->select("id") - ->from("items") - ->where("parent_id", "=", $this->id) - ->merge_where($where) - ->order_by($order_by) - ->execute() as $row) { - $position++; - if ($row->id == $child->id) { - break; - } - } - } - - return $position; + return item::get_position($child, $where); } /** @@ -653,7 +582,7 @@ class Item_Model_Core extends ORM_MPTT { /** * Calculate the largest width/height that fits inside the given maximum, while preserving the - * aspect ratio. + * aspect ratio. Don't upscale. * @param int $max Maximum size of the largest dimension * @return array */ @@ -661,6 +590,10 @@ class Item_Model_Core extends ORM_MPTT { $width = $this->thumb_width; $height = $this->thumb_height; + if ($width <= $max && $height <= $max) { + return array($height, $width); + } + if ($height) { if (isset($max)) { if ($width > $height) { @@ -848,10 +781,17 @@ class Item_Model_Core extends ORM_MPTT { } } else { // New items must have an extension - if (!pathinfo($this->name, PATHINFO_EXTENSION)) { + $ext = pathinfo($this->name, PATHINFO_EXTENSION); + if (!$ext) { $v->add_error("name", "illegal_data_file_extension"); return; } + + if ($this->is_movie() && !preg_match("/^(flv|mp4|m4v)$/i", $ext)) { + $v->add_error("name", "illegal_data_file_extension"); + } else if ($this->is_photo() && !preg_match("/^(gif|jpg|jpeg|png)$/i", $ext)) { + $v->add_error("name", "illegal_data_file_extension"); + } } } @@ -980,48 +920,88 @@ class Item_Model_Core extends ORM_MPTT { /** * Same as ORM::as_array() but convert id fields into their RESTful form. + * + * @param array if specified, only return the named fields */ - public function as_restful_array() { + public function as_restful_array($fields=array()) { + if ($fields) { + $data = array(); + foreach ($fields as $field) { + if (isset($this->object[$field])) { + $data[$field] = $this->__get($field); + } + } + $fields = array_flip($fields); + } else { + $data = $this->as_array(); + } + // Convert item ids to rest URLs for consistency - $data = $this->as_array(); - if ($tmp = $this->parent()) { - $data["parent"] = rest::url("item", $tmp); + if (empty($fields) || isset($fields["parent"])) { + if ($tmp = $this->parent()) { + $data["parent"] = rest::url("item", $tmp); + } + unset($data["parent_id"]); } - unset($data["parent_id"]); - if ($tmp = $this->album_cover()) { - $data["album_cover"] = rest::url("item", $tmp); + + if (empty($fields) || isset($fields["album_cover"])) { + if ($tmp = $this->album_cover()) { + $data["album_cover"] = rest::url("item", $tmp); + } + unset($data["album_cover_item_id"]); } - unset($data["album_cover_item_id"]); - $data["web_url"] = $this->abs_url(); + if (empty($fields) || isset($fields["web_url"])) { + $data["web_url"] = $this->abs_url(); + } if (!$this->is_album()) { if (access::can("view_full", $this)) { - $data["file_url"] = rest::url("data", $this, "full"); - $data["file_size"] = filesize($this->file_path()); - } - if (access::user_can(identity::guest(), "view_full", $this)) { - $data["file_url_public"] = $this->file_url(true); + if (empty($fields) || isset($fields["file_url"])) { + $data["file_url"] = rest::url("data", $this, "full"); + } + if (empty($fields) || isset($fields["file_size"])) { + $data["file_size"] = filesize($this->file_path()); + } + if (access::user_can(identity::guest(), "view_full", $this)) { + if (empty($fields) || isset($fields["file_url_public"])) { + $data["file_url_public"] = $this->file_url(true); + } + } } } if ($this->is_photo()) { - $data["resize_url"] = rest::url("data", $this, "resize"); - $data["resize_size"] = filesize($this->resize_path()); + if (empty($fields) || isset($fields["resize_url"])) { + $data["resize_url"] = rest::url("data", $this, "resize"); + } + if (empty($fields) || isset($fields["resize_size"])) { + $data["resize_size"] = filesize($this->resize_path()); + } if (access::user_can(identity::guest(), "view", $this)) { - $data["resize_url_public"] = $this->resize_url(true); + if (empty($fields) || isset($fields["resize_url_public"])) { + $data["resize_url_public"] = $this->resize_url(true); + } } } if ($this->has_thumb()) { - $data["thumb_url"] = rest::url("data", $this, "thumb"); - $data["thumb_size"] = filesize($this->thumb_path()); + if (empty($fields) || isset($fields["thumb_url"])) { + $data["thumb_url"] = rest::url("data", $this, "thumb"); + } + if (empty($fields) || isset($fields["thumb_size"])) { + $data["thumb_size"] = filesize($this->thumb_path()); + } if (access::user_can(identity::guest(), "view", $this)) { - $data["thumb_url_public"] = $this->thumb_url(true); + if (empty($fields) || isset($fields["thumb_url_public"])) { + $data["thumb_url_public"] = $this->thumb_url(true); + } } } - $data["can_edit"] = access::can("edit", $this); + if (empty($fields) || isset($fields["can_edit"])) { + $data["can_edit"] = access::can("edit", $this); + } // Elide some internal-only data that is going to cause confusion in the client. foreach (array("relative_path_cache", "relative_url_cache", "left_ptr", "right_ptr", @@ -1031,6 +1011,16 @@ class Item_Model_Core extends ORM_MPTT { return $data; } + /** + * Increments the view counter of this item + * We can't use math in ORM or the query builder, so do this by hand. It's important + * that we do this with math, otherwise concurrent accesses will damage accuracy. + */ + public function increment_view_count() { + db::query("UPDATE {items} SET `view_count` = `view_count` + 1 WHERE `id` = $this->id") + ->execute(); + } + private function _cache_buster($path) { return "?m=" . (string)(file_exists($path) ? filemtime($path) : 0); } diff --git a/modules/gallery/models/log.php b/modules/gallery/models/log.php index 5d065313..a57649ff 100644 --- a/modules/gallery/models/log.php +++ b/modules/gallery/models/log.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/models/message.php b/modules/gallery/models/message.php index 3f84efd0..9a0b99f7 100644 --- a/modules/gallery/models/message.php +++ b/modules/gallery/models/message.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/models/module.php b/modules/gallery/models/module.php index e54613d1..ca251ff5 100644 --- a/modules/gallery/models/module.php +++ b/modules/gallery/models/module.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/models/outgoing_translation.php b/modules/gallery/models/outgoing_translation.php index cd580bed..7f90a2b0 100644 --- a/modules/gallery/models/outgoing_translation.php +++ b/modules/gallery/models/outgoing_translation.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/models/permission.php b/modules/gallery/models/permission.php index 51bd95e7..52e3131e 100644 --- a/modules/gallery/models/permission.php +++ b/modules/gallery/models/permission.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/models/task.php b/modules/gallery/models/task.php index 4d435101..2ee9075a 100644 --- a/modules/gallery/models/task.php +++ b/modules/gallery/models/task.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/models/theme.php b/modules/gallery/models/theme.php index 50fd04fd..ab2ba57f 100644 --- a/modules/gallery/models/theme.php +++ b/modules/gallery/models/theme.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/models/var.php b/modules/gallery/models/var.php index f21486ee..6e406ac7 100644 --- a/modules/gallery/models/var.php +++ b/modules/gallery/models/var.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/module.info b/modules/gallery/module.info index 2b684e5e..4c0c8866 100644 --- a/modules/gallery/module.info +++ b/modules/gallery/module.info @@ -1,3 +1,3 @@ name = "Gallery 3" description = "Gallery core application" -version = 41 +version = 46 diff --git a/modules/gallery/tests/Access_Helper_Test.php b/modules/gallery/tests/Access_Helper_Test.php index 32b3020f..35e3f76a 100644 --- a/modules/gallery/tests/Access_Helper_Test.php +++ b/modules/gallery/tests/Access_Helper_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/Albums_Controller_Test.php b/modules/gallery/tests/Albums_Controller_Test.php index 6c64394d..d9983cc2 100644 --- a/modules/gallery/tests/Albums_Controller_Test.php +++ b/modules/gallery/tests/Albums_Controller_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,7 +31,7 @@ class Albums_Controller_Test extends Gallery_Unit_Test_Case { $album = test::random_album(); // Randomize to avoid conflicts. - $new_name = "new_name_" . rand(); + $new_name = "new_name_" . random::string(6); $_POST["name"] = $new_name; $_POST["title"] = "new title"; diff --git a/modules/gallery/tests/Cache_Test.php b/modules/gallery/tests/Cache_Test.php index e8d8b6f4..7dce6297 100644 --- a/modules/gallery/tests/Cache_Test.php +++ b/modules/gallery/tests/Cache_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,21 +24,29 @@ class Cache_Test extends Gallery_Unit_Test_Case { $this->_driver = new Cache_Database_Driver(); } - public function cache_exists_test() { - $this->assert_false($this->_driver->exists("test_key"), "test_key should not be defined"); + private function _exists($id) { + return db::build() + ->where("key", "=", $id) + ->where("expiration", ">=", time()) + ->limit("1") + ->count_records("caches") > 0; + } + + public function cache_exists_test_helper_function_test() { + $this->assert_false($this->_exists("test_key"), "test_key should not be defined"); - $id = md5(rand()); + $id = random::hash(); db::build() ->insert("caches") ->columns("key", "tags", "expiration", "cache") ->values($id, "<tag1>, <tag2>", 84600 + time(), serialize("some test data")) ->execute(); - $this->assert_true($this->_driver->exists($id), "test_key should be defined"); + $this->assert_true($this->_exists($id), "test_key should be defined"); } public function cache_get_test() { - $id = md5(rand()); + $id = random::hash(); db::build() ->insert("caches") @@ -54,7 +62,7 @@ class Cache_Test extends Gallery_Unit_Test_Case { } public function cache_set_test() { - $id = md5(rand()); + $id = random::hash(); $original_data = array("field1" => "value1", "field2" => "value2"); $this->_driver->set(array($id => $original_data), array("tag1", "tag2"), 84600); @@ -63,15 +71,15 @@ class Cache_Test extends Gallery_Unit_Test_Case { } public function cache_get_tag_test() { - $id1 = md5(rand()); + $id1 = random::hash(); $value1 = array("field1" => "value1", "field2" => "value2"); $this->_driver->set(array($id1 => $value1), array("tag1", "tag2"), 84600); - $id2 = md5(rand()); + $id2 = random::hash(); $value2 = array("field3" => "value3", "field4" => "value4"); $this->_driver->set(array($id2 => $value2), array("tag2", "tag3"), 84600); - $id3 = md5(rand()); + $id3 = random::hash(); $value3 = array("field5" => "value5", "field6" => "value6"); $this->_driver->set(array($id3 => $value3), array("tag3", "tag4"), 84600); @@ -86,62 +94,62 @@ class Cache_Test extends Gallery_Unit_Test_Case { } public function cache_delete_id_test() { - $id1 = md5(rand()); + $id1 = random::hash(); $value1 = array("field1" => "value1", "field2" => "value2"); $this->_driver->set(array($id1 => $value1), array("tag1", "tag2"), 84600); - $id2 = md5(rand()); + $id2 = random::hash(); $value2 = array("field3" => "value3", "field4" => "value4"); $this->_driver->set(array($id2 => $value2), array("tag2", "tag3"), 846000); - $id3 = md5(rand()); + $id3 = random::hash(); $value3 = array("field5" => "value5", "field6" => "value6"); $this->_driver->set(array($id3 => $value3), array("tag3", "tag4"), 84600); $this->_driver->delete(array($id1)); - $this->assert_false($this->_driver->exists($id1), "$id1 should have been deleted"); - $this->assert_true($this->_driver->exists($id2), "$id2 should not have been deleted"); - $this->assert_true($this->_driver->exists($id3), "$id3 should not have been deleted"); + $this->assert_false($this->_exists($id1), "$id1 should have been deleted"); + $this->assert_true($this->_exists($id2), "$id2 should not have been deleted"); + $this->assert_true($this->_exists($id3), "$id3 should not have been deleted"); } public function cache_delete_tag_test() { - $id1 = md5(rand()); + $id1 = random::hash(); $value1 = array("field1" => "value1", "field2" => "value2"); $this->_driver->set(array($id1 => $value1), array("tag1", "tag2"), 84600); - $id2 = md5(rand()); + $id2 = random::hash(); $value2 = array("field3" => "value3", "field4" => "value4"); $this->_driver->set(array($id2 => $value2), array("tag2", "tag3"), 846000); - $id3 = md5(rand()); + $id3 = random::hash(); $value3 = array("field5" => "value5", "field6" => "value6"); $this->_driver->set(array($id3 => $value3), array("tag3", "tag4"), 84600); $data = $this->_driver->delete_tag(array("tag3")); - $this->assert_true($this->_driver->exists($id1), "$id1 should not have been deleted"); - $this->assert_false($this->_driver->exists($id2), "$id2 should have been deleted"); - $this->assert_false($this->_driver->exists($id3), "$id3 should have been deleted"); + $this->assert_true($this->_exists($id1), "$id1 should not have been deleted"); + $this->assert_false($this->_exists($id2), "$id2 should have been deleted"); + $this->assert_false($this->_exists($id3), "$id3 should have been deleted"); } public function cache_delete_all_test() { - $id1 = md5(rand()); + $id1 = random::hash(); $value1 = array("field1" => "value1", "field2" => "value2"); $this->_driver->set(array($id1 => $value1), array("tag1", "tag2"), 84600); - $id2 = md5(rand()); + $id2 = random::hash(); $value2 = array("field3" => "value3", "field4" => "value4"); $this->_driver->set(array($id2 => $value2), array("tag2", "tag3"), 846000); - $id3 = md5(rand()); + $id3 = random::hash(); $value3 = array("field5" => "value5", "field6" => "value6"); $this->_driver->set(array($id3 => $value3), array("tag3", "tag4"), 84600); $data = $this->_driver->delete(true); - $this->assert_false($this->_driver->exists($id1), "$id1 should have been deleted"); - $this->assert_false($this->_driver->exists($id2), "$id2 should have been deleted"); - $this->assert_false($this->_driver->exists($id3), "$id3 should have been deleted"); + $this->assert_false($this->_exists($id1), "$id1 should have been deleted"); + $this->assert_false($this->_exists($id2), "$id2 should have been deleted"); + $this->assert_false($this->_exists($id3), "$id3 should have been deleted"); } }
\ No newline at end of file diff --git a/modules/gallery/tests/Controller_Auth_Test.php b/modules/gallery/tests/Controller_Auth_Test.php index e83f9a29..d3da60e5 100644 --- a/modules/gallery/tests/Controller_Auth_Test.php +++ b/modules/gallery/tests/Controller_Auth_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/Database_Test.php b/modules/gallery/tests/Database_Test.php index f1a83d9c..64794b36 100644 --- a/modules/gallery/tests/Database_Test.php +++ b/modules/gallery/tests/Database_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/Dir_Helper_Test.php b/modules/gallery/tests/Dir_Helper_Test.php index 597963d7..2a0efdb0 100644 --- a/modules/gallery/tests/Dir_Helper_Test.php +++ b/modules/gallery/tests/Dir_Helper_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/DrawForm_Test.php b/modules/gallery/tests/DrawForm_Test.php index 4cbc7cb7..146fe1a4 100644 --- a/modules/gallery/tests/DrawForm_Test.php +++ b/modules/gallery/tests/DrawForm_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/File_Structure_Test.php b/modules/gallery/tests/File_Structure_Test.php index 96e0b758..69c4bbf9 100644 --- a/modules/gallery/tests/File_Structure_Test.php +++ b/modules/gallery/tests/File_Structure_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -130,7 +130,7 @@ class File_Structure_Test extends Gallery_Unit_Test_Case { "<?php defined(\"SYSPATH\") or die(\"No direct script access.\");", "/**", " * Gallery - a web based photo album viewer and editor", - " * Copyright (C) 2000-2010 Bharat Mediratta", + " * Copyright (C) 2000-2011 Bharat Mediratta", " *", " * This program is free software; you can redistribute it and/or modify", " * it under the terms of the GNU General Public License as published by", diff --git a/modules/gallery/tests/Gallery_Filters.php b/modules/gallery/tests/Gallery_Filters.php index 1c07f93e..e0208ed3 100644 --- a/modules/gallery/tests/Gallery_Filters.php +++ b/modules/gallery/tests/Gallery_Filters.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/Gallery_I18n_Test.php b/modules/gallery/tests/Gallery_I18n_Test.php index 3643e2ed..171f4c3a 100644 --- a/modules/gallery/tests/Gallery_I18n_Test.php +++ b/modules/gallery/tests/Gallery_I18n_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/Gallery_Installer_Test.php b/modules/gallery/tests/Gallery_Installer_Test.php index 67e712de..10a67465 100644 --- a/modules/gallery/tests/Gallery_Installer_Test.php +++ b/modules/gallery/tests/Gallery_Installer_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -35,7 +35,7 @@ class Gallery_Installer_Test extends Gallery_Unit_Test_Case { public function install_creates_root_item_test() { $max_right_ptr = ORM::factory("item") - ->select(new Database_Expression("MAX(`right_ptr`) AS `right_ptr`")) + ->select(db::expr("MAX(`right_ptr`) AS `right_ptr`")) ->find()->right_ptr; $root = ORM::factory('item')->find(1); $this->assert_equal("Gallery", $root->title); diff --git a/modules/gallery/tests/Html_Helper_Test.php b/modules/gallery/tests/Html_Helper_Test.php index 520f9b01..fcd7c685 100644 --- a/modules/gallery/tests/Html_Helper_Test.php +++ b/modules/gallery/tests/Html_Helper_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/Input_Library_Test.php b/modules/gallery/tests/Input_Library_Test.php index 06641323..a27f85b0 100644 --- a/modules/gallery/tests/Input_Library_Test.php +++ b/modules/gallery/tests/Input_Library_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/Item_Helper_Test.php b/modules/gallery/tests/Item_Helper_Test.php index eb2458cb..4d5aed41 100644 --- a/modules/gallery/tests/Item_Helper_Test.php +++ b/modules/gallery/tests/Item_Helper_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -92,7 +92,7 @@ class Item_Helper_Test extends Gallery_Unit_Test_Case { } public function move_conflicts_result_in_a_rename_test() { - $rand = rand(); + $rand = random::int(); $photo1 = test::random_photo_unsaved(item::root()); $photo1->name = "{$rand}.jpg"; $photo1->slug = (string)$rand; @@ -125,4 +125,110 @@ class Item_Helper_Test extends Gallery_Unit_Test_Case { $this->assert_same($photo2->id, $album->album_cover_item_id); $this->assert_same($photo2->id, $parent->album_cover_item_id); } + + public function find_by_path_test() { + $level1 = test::random_album(); + $level2 = test::random_album_unsaved($level1); + $level2->name = "plus + space"; + $level2->save()->reload(); + + $level3 = test::random_photo_unsaved($level2); + $level3->name = "same.jpg"; + $level3->save()->reload(); + + $level2b = test::random_album($level1); + $level3b = test::random_photo_unsaved($level2b); + $level3b->name = "same.jpg"; + $level3b->save()->reload(); + + // Item in album + $this->assert_same( + $level3->id, + item::find_by_path("/{$level1->name}/{$level2->name}/{$level3->name}")->id); + + // Album, ends with a slash + $this->assert_same( + $level2->id, + item::find_by_path("{$level1->name}/{$level2->name}/")->id); + + // Album, ends without a slash + $this->assert_same( + $level2->id, + item::find_by_path("/{$level1->name}/{$level2->name}")->id); + + // Return root if "" is passed + $this->assert_same(item::root()->id, item::find_by_path("")->id); + + // Verify that we don't get confused by the part names, using the fallback code. + db::build() + ->update("items") + ->set(array("relative_path_cache" => null)) + ->where("id", "IN", array($level3->id, $level3b->id)) + ->execute(); + $this->assert_same( + $level3->id, + item::find_by_path("{$level1->name}/{$level2->name}/{$level3->name}")->id); + + $this->assert_same( + $level3b->id, + item::find_by_path("{$level1->name}/{$level2b->name}/{$level3b->name}")->id); + + // Verify that we don't get false positives + $this->assert_false( + item::find_by_path("foo/bar/baz")->loaded()); + + // Verify that the fallback code works + $this->assert_same( + $level3b->id, + item::find_by_path("{$level1->name}/{$level2b->name}/{$level3b->name}")->id); + } + + public function find_by_relative_url_test() { + $level1 = test::random_album(); + $level2 = test::random_album($level1); + $level3 = test::random_photo_unsaved($level2); + $level3->slug = "same"; + $level3->save()->reload(); + + $level2b = test::random_album($level1); + $level3b = test::random_photo_unsaved($level2b); + $level3b->slug = "same"; + $level3b->save()->reload(); + + // Item in album + $this->assert_same( + $level3->id, + item::find_by_relative_url("{$level1->slug}/{$level2->slug}/{$level3->slug}")->id); + + // Album, ends without a slash + $this->assert_same( + $level2->id, + item::find_by_relative_url("{$level1->slug}/{$level2->slug}")->id); + + // Return root if "" is passed + $this->assert_same(item::root()->id, item::find_by_relative_url("")->id); + + // Verify that we don't get confused by the part slugs, using the fallback code. + db::build() + ->update("items") + ->set(array("relative_url_cache" => null)) + ->where("id", "IN", array($level3->id, $level3b->id)) + ->execute(); + $this->assert_same( + $level3->id, + item::find_by_relative_url("{$level1->slug}/{$level2->slug}/{$level3->slug}")->id); + + $this->assert_same( + $level3b->id, + item::find_by_relative_url("{$level1->slug}/{$level2b->slug}/{$level3b->slug}")->id); + + // Verify that we don't get false positives + $this->assert_false( + item::find_by_relative_url("foo/bar/baz")->loaded()); + + // Verify that the fallback code works + $this->assert_same( + $level3b->id, + item::find_by_relative_url("{$level1->slug}/{$level2b->slug}/{$level3b->slug}")->id); + } } diff --git a/modules/gallery/tests/Item_Model_Test.php b/modules/gallery/tests/Item_Model_Test.php index 264a2128..968d7510 100644 --- a/modules/gallery/tests/Item_Model_Test.php +++ b/modules/gallery/tests/Item_Model_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -278,10 +278,10 @@ class Item_Model_Test extends Gallery_Unit_Test_Case { public function basic_validation_test() { $item = ORM::factory("item"); - $item->album_cover_item_id = rand(); // invalid + $item->album_cover_item_id = random::int(); // invalid $item->description = str_repeat("x", 70000); // invalid $item->name = null; - $item->parent_id = rand(); + $item->parent_id = random::int(); $item->slug = null; $item->sort_column = "bogus"; $item->sort_order = "bogus"; @@ -362,11 +362,11 @@ class Item_Model_Test extends Gallery_Unit_Test_Case { } public function as_restful_array_with_edit_bit_test() { - $response = item::root()->as_restful_array(true); + $response = item::root()->as_restful_array(); $this->assert_true($response["can_edit"]); identity::set_active_user(identity::guest()); - $response = item::root()->as_restful_array(true); + $response = item::root()->as_restful_array(); $this->assert_false($response["can_edit"]); } @@ -411,24 +411,47 @@ class Item_Model_Test extends Gallery_Unit_Test_Case { public function urls_test() { $photo = test::random_photo(); $this->assert_true( - preg_match("|http://./var/resizes/name_\d+\.jpg\?m=\d+|", $photo->resize_url()), + preg_match("|http://./var/resizes/name_\w+\.jpg\?m=\d+|", $photo->resize_url()), $photo->resize_url() . " is malformed"); $this->assert_true( - preg_match("|http://./var/thumbs/name_\d+\.jpg\?m=\d+|", $photo->thumb_url()), + preg_match("|http://./var/thumbs/name_\w+\.jpg\?m=\d+|", $photo->thumb_url()), $photo->thumb_url() . " is malformed"); $this->assert_true( - preg_match("|http://./var/albums/name_\d+\.jpg\?m=\d+|", $photo->file_url()), + preg_match("|http://./var/albums/name_\w+\.jpg\?m=\d+|", $photo->file_url()), $photo->file_url() . " is malformed"); // Albums have special thumbnails. Empty album has cachebuster of 0 since it has no thumbnail $album = test::random_album(); $this->assert_true( - preg_match("|http://./var/thumbs/name_\d+/\.album\.jpg\?m=0|", $album->thumb_url()), + preg_match("|http://./var/thumbs/name_\w+/\.album\.jpg\?m=0|", $album->thumb_url()), $album->thumb_url() . " is malformed"); $photo = test::random_photo($album); $this->assert_true( - preg_match("|http://./var/thumbs/name_\d+/\.album\.jpg\?m=\d+|", $album->thumb_url()), + preg_match("|http://./var/thumbs/name_\w+/\.album\.jpg\?m=\d+|", $album->thumb_url()), $album->thumb_url() . " is malformed"); } + + public function legal_extension_test() { + foreach (array("test.gif", "test.GIF", "test.Gif", "test.jpeg", "test.JPG") as $name) { + $photo = test::random_photo_unsaved(item::root()); + $photo->name = $name; + $photo->save(); + } + } + + public function illegal_extension_test() { + foreach (array("test.php", "test.PHP", "test.php5", "test.php4", "test.pl") as $name) { + try { + $photo = test::random_photo_unsaved(item::root()); + $photo->name = $name; + $photo->save(); + } catch (ORM_Validation_Exception $e) { + $this->assert_equal(array("name" => "illegal_data_file_extension"), + $e->validation->errors()); + continue; + } + $this->assert_true(false, "Shouldn't get here"); + } + } } diff --git a/modules/gallery/tests/Item_Rest_Helper_Test.php b/modules/gallery/tests/Item_Rest_Helper_Test.php index a2ab534b..51943f73 100644 --- a/modules/gallery/tests/Item_Rest_Helper_Test.php +++ b/modules/gallery/tests/Item_Rest_Helper_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/Items_Rest_Helper_Test.php b/modules/gallery/tests/Items_Rest_Helper_Test.php index 8e53110a..ebbeda20 100644 --- a/modules/gallery/tests/Items_Rest_Helper_Test.php +++ b/modules/gallery/tests/Items_Rest_Helper_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -65,21 +65,21 @@ class Items_Rest_Helper_Test extends Gallery_Unit_Test_Case { $request = new stdClass(); $request->params = new stdClass(); $request->params->urls = json_encode(array( - rest::url("item", $photo1), - rest::url("item", $album2))); + rest::url("item", $photo2), + rest::url("item", $album1))); $request->params->type = "album"; $this->assert_equal_array( array( - array("url" => rest::url("item", $album2), - "entity" => $album2->as_restful_array(), + array("url" => rest::url("item", $album1), + "entity" => $album1->as_restful_array(), "relationships" => array( "comments" => array( - "url" => rest::url("item_comments", $album2)), + "url" => rest::url("item_comments", $album1)), "tags" => array( - "url" => rest::url("item_tags", $album2), + "url" => rest::url("item_tags", $album1), "members" => array())), "members" => array( - rest::url("item", $photo2)))), + rest::url("item", $album2)))), items_rest::get($request)); } diff --git a/modules/gallery/tests/Kohana_Exception_Test.php b/modules/gallery/tests/Kohana_Exception_Test.php index df7cf9ff..be91017d 100644 --- a/modules/gallery/tests/Kohana_Exception_Test.php +++ b/modules/gallery/tests/Kohana_Exception_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/Locales_Helper_Test.php b/modules/gallery/tests/Locales_Helper_Test.php index a0ffd91c..7fc926cc 100644 --- a/modules/gallery/tests/Locales_Helper_Test.php +++ b/modules/gallery/tests/Locales_Helper_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/Menu_Test.php b/modules/gallery/tests/Menu_Test.php index 58e37d5b..a6e6bd72 100644 --- a/modules/gallery/tests/Menu_Test.php +++ b/modules/gallery/tests/Menu_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/ORM_MPTT_Test.php b/modules/gallery/tests/ORM_MPTT_Test.php index 71f553d5..6e19ec90 100644 --- a/modules/gallery/tests/ORM_MPTT_Test.php +++ b/modules/gallery/tests/ORM_MPTT_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/Photos_Controller_Test.php b/modules/gallery/tests/Photos_Controller_Test.php index dc50db94..401b1808 100644 --- a/modules/gallery/tests/Photos_Controller_Test.php +++ b/modules/gallery/tests/Photos_Controller_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/SafeString_Test.php b/modules/gallery/tests/SafeString_Test.php index 64772c12..5dfdb064 100644 --- a/modules/gallery/tests/SafeString_Test.php +++ b/modules/gallery/tests/SafeString_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/Sendmail_Test.php b/modules/gallery/tests/Sendmail_Test.php index aee6abf5..979ebaab 100644 --- a/modules/gallery/tests/Sendmail_Test.php +++ b/modules/gallery/tests/Sendmail_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/Url_Security_Test.php b/modules/gallery/tests/Url_Security_Test.php index dd395f78..900c7f32 100644 --- a/modules/gallery/tests/Url_Security_Test.php +++ b/modules/gallery/tests/Url_Security_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/Var_Test.php b/modules/gallery/tests/Var_Test.php index 292fe2f1..c99c97bd 100644 --- a/modules/gallery/tests/Var_Test.php +++ b/modules/gallery/tests/Var_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/Xss_Security_Test.php b/modules/gallery/tests/Xss_Security_Test.php index f7806c07..2fbd72f1 100644 --- a/modules/gallery/tests/Xss_Security_Test.php +++ b/modules/gallery/tests/Xss_Security_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery/tests/controller_auth_data.txt b/modules/gallery/tests/controller_auth_data.txt index 24170092..f1192071 100644 --- a/modules/gallery/tests/controller_auth_data.txt +++ b/modules/gallery/tests/controller_auth_data.txt @@ -22,8 +22,8 @@ modules/gallery/controllers/user_profile.php show modules/gallery/controllers/user_profile.php contact DIRTY_AUTH modules/gallery/controllers/user_profile.php send DIRTY_AUTH modules/gallery/controllers/welcome_message.php index DIRTY_AUTH -modules/organize/controllers/organize.php dialog DIRTY_CSRF -modules/organize/controllers/organize.php add_album_fields DIRTY_AUTH +modules/organize/controllers/organize.php tree DIRTY_CSRF +modules/organize/controllers/organize.php delete DIRTY_AUTH modules/rest/controllers/rest.php index DIRTY_CSRF|DIRTY_AUTH modules/rest/controllers/rest.php reset_api_key_confirm DIRTY_AUTH modules/rest/controllers/rest.php reset_api_key DIRTY_AUTH @@ -35,5 +35,6 @@ modules/server_add/controllers/server_add.php children modules/tag/controllers/admin_tags.php index DIRTY_CSRF modules/tag/controllers/tag.php __call DIRTY_CSRF|DIRTY_AUTH modules/tag/controllers/tags.php autocomplete DIRTY_CSRF|DIRTY_AUTH +modules/user/controllers/admin_users.php index DIRTY_CSRF modules/user/controllers/password.php reset DIRTY_AUTH modules/user/controllers/password.php do_reset DIRTY_CSRF|DIRTY_AUTH diff --git a/modules/gallery/tests/xss_data.txt b/modules/gallery/tests/xss_data.txt index 0345df96..0c812fb4 100644 --- a/modules/gallery/tests/xss_data.txt +++ b/modules/gallery/tests/xss_data.txt @@ -43,8 +43,8 @@ modules/digibug/views/digibug_form.html.php 6 DIRTY form:: modules/exif/views/exif_dialog.html.php 14 DIRTY $details[$i]["caption"] modules/exif/views/exif_dialog.html.php 21 DIRTY $details[$i]["caption"] modules/g2_import/views/admin_g2_import.html.php 9 DIRTY $form -modules/gallery/views/admin_advanced_settings.html.php 20 DIRTY_ATTR text::alternate("g-odd","g-even") -modules/gallery/views/admin_advanced_settings.html.php 21 DIRTY $var->module_name +modules/gallery/views/admin_advanced_settings.html.php 21 DIRTY_ATTR text::alternate("g-odd","g-even") +modules/gallery/views/admin_advanced_settings.html.php 22 DIRTY $var->module_name modules/gallery/views/admin_block_log_entries.html.php 4 DIRTY_ATTR log::severity_class($entry->severity) modules/gallery/views/admin_block_log_entries.html.php 8 DIRTY_JS user_profile::url($entry->user->id) modules/gallery/views/admin_block_log_entries.html.php 10 DIRTY gallery::date_time($entry->timestamp) @@ -213,7 +213,7 @@ modules/gallery/views/menu_link.html.php 5 DIRTY_JS $menu- modules/gallery/views/movieplayer.html.php 2 DIRTY html::anchor($item->file_url(true),"",$attrs) modules/gallery/views/movieplayer.html.php 5 DIRTY_JS $attrs["id"] modules/gallery/views/movieplayer.html.php 7 DIRTY_JS url::abs_file("lib/flowplayer.swf") -modules/gallery/views/movieplayer.html.php 14 DIRTY_JS url::abs_file("lib/flowplayer.pseudostreaming.swf") +modules/gallery/views/movieplayer.html.php 17 DIRTY_JS url::abs_file("lib/flowplayer.pseudostreaming.swf") modules/gallery/views/permissions_browse.html.php 3 DIRTY_JS url::site("permissions/form/__ITEM__") modules/gallery/views/permissions_browse.html.php 16 DIRTY_JS url::site("permissions/change/__CMD__/__GROUP__/__PERM__/__ITEM__?csrf=$csrf") modules/gallery/views/permissions_browse.html.php 43 DIRTY_ATTR $parent->id @@ -248,6 +248,7 @@ modules/gallery/views/permissions_form.html.php 80 DIRTY_JS $permi modules/gallery/views/permissions_form.html.php 80 DIRTY_JS $item->id modules/gallery/views/quick_delete_confirm.html.php 11 DIRTY $form modules/gallery/views/reauthenticate.html.php 9 DIRTY $form +modules/gallery/views/upgrade_checker_block.html.php 17 DIRTY $new_version modules/gallery/views/upgrader.html.php 76 DIRTY_ATTR $done?"muted":"" modules/gallery/views/upgrader.html.php 94 DIRTY_ATTR $done?"muted":"" modules/gallery/views/upgrader.html.php 102 DIRTY_ATTR $module->version==$module->code_version?"current":"upgradeable" @@ -260,10 +261,10 @@ modules/gallery/views/upgrader.html.php 123 DIRTY_ATTR $don modules/gallery/views/user_languages_block.html.php 2 DIRTY form::dropdown("g-select-session-locale",$installed_locales,$selected) modules/gallery/views/user_profile.html.php 34 DIRTY_ATTR $user->avatar_url(40,$theme->url(,true)) modules/gallery/views/user_profile.html.php 43 DIRTY $info->view -modules/image_block/views/image_block_block.html.php 3 DIRTY_JS $item->url() -modules/image_block/views/image_block_block.html.php 4 DIRTY $item->thumb_img(array("class"=>"g-thumbnail")) -modules/info/views/info_block.html.php 22 DIRTY gallery::date_time($item->captured) -modules/info/views/info_block.html.php 29 DIRTY_JS $item->owner->url +modules/image_block/views/image_block_block.html.php 4 DIRTY_JS $item->url() +modules/image_block/views/image_block_block.html.php 5 DIRTY $item->thumb_img(array("class"=>"g-thumbnail")) +modules/info/views/info_block.html.php 5 DIRTY $info["label"] +modules/info/views/info_block.html.php 5 DIRTY $info["value"] modules/notification/views/comment_published.html.php 28 DIRTY_JS $comment->item()->abs_url() modules/notification/views/comment_published.html.php 29 DIRTY $comment->item()->abs_url() modules/notification/views/item_added.html.php 16 DIRTY_JS $item->abs_url() @@ -274,22 +275,29 @@ modules/notification/views/item_updated.html.php 20 DIRTY_JS $item- modules/notification/views/item_updated.html.php 20 DIRTY $item->abs_url() modules/notification/views/user_profile_notification.html.php 5 DIRTY_ATTR $subscription->id modules/notification/views/user_profile_notification.html.php 6 DIRTY_JS $subscription->url -modules/organize/views/organize_dialog.html.php 94 DIRTY_JS $domain -modules/organize/views/organize_dialog.html.php 95 DIRTY_JS $access_key -modules/organize/views/organize_dialog.html.php 96 DIRTY_JS request::protocol() -modules/organize/views/organize_dialog.html.php 97 DIRTY_JS $file_filter -modules/organize/views/organize_dialog.html.php 98 DIRTY_JS $sort_order -modules/organize/views/organize_dialog.html.php 99 DIRTY_JS $sort_fields -modules/organize/views/organize_dialog.html.php 100 DIRTY_JS $album->id -modules/organize/views/organize_dialog.html.php 101 DIRTY_JS $selected_id -modules/organize/views/organize_dialog.html.php 102 DIRTY_JS $rest_uri -modules/organize/views/organize_dialog.html.php 103 DIRTY_JS $controller_uri -modules/organize/views/organize_dialog.html.php 109 DIRTY_JS $flash_minimum_version="10.0.0" -modules/organize/views/organize_dialog.html.php 127 DIRTY_JS $swf_uri -modules/organize/views/organize_dialog.html.php 140 DIRTY_ATTR request::protocol() +modules/organize/views/organize_dialog.html.php 8 DIRTY_JS url::site("items/__ID__") +modules/organize/views/organize_dialog.html.php 14 DIRTY_JS $album->title +modules/organize/views/organize_frame.html.php 12 DIRTY_JS url::file("modules/organize/vendor/ext/images/default/s.gif") +modules/organize/views/organize_frame.html.php 56 DIRTY_JS url::site("organize/album_info/__ID__") +modules/organize/views/organize_frame.html.php 94 DIRTY_JS access::csrf_token() +modules/organize/views/organize_frame.html.php 96 DIRTY_JS url::site("organize/set_sort/__ID__") +modules/organize/views/organize_frame.html.php 116 DIRTY_JS url::site("organize/delete") +modules/organize/views/organize_frame.html.php 125 DIRTY_JS access::csrf_token() +modules/organize/views/organize_frame.html.php 226 DIRTY_JS url::site("organize/rearrange") +modules/organize/views/organize_frame.html.php 237 DIRTY_JS access::csrf_token() +modules/organize/views/organize_frame.html.php 275 DIRTY_JS $key +modules/organize/views/organize_frame.html.php 398 DIRTY_JS url::site("organize/tree/{$album->id}") +modules/organize/views/organize_frame.html.php 456 DIRTY_JS url::site("organize/reparent") +modules/organize/views/organize_frame.html.php 479 DIRTY_JS access::csrf_token() +modules/organize/views/organize_frame.html.php 495 DIRTY_JS access::can("edit",item::root()) +modules/organize/views/organize_frame.html.php 497 DIRTY_JS item::root()->title +modules/organize/views/organize_frame.html.php 499 DIRTY_JS item::root()->id +modules/organize/views/organize_frame.html.php 507 DIRTY_JS $album->id +modules/organize/views/organize_frame.html.php 508 DIRTY_JS $album->id modules/recaptcha/views/admin_recaptcha.html.php 11 DIRTY $form modules/recaptcha/views/admin_recaptcha.html.php 23 DIRTY_JS $public_key -modules/recaptcha/views/form_recaptcha.html.php 7 DIRTY_JS $public_key +modules/recaptcha/views/form_recaptcha.html.php 3 DIRTY_ATTR request::protocol() +modules/recaptcha/views/form_recaptcha.html.php 8 DIRTY_JS $public_key modules/rest/views/reset_api_key_confirm.html.php 6 DIRTY $form modules/rss/views/feed.mrss.php 10 DIRTY $feed->uri modules/rss/views/feed.mrss.php 13 DIRTY_JS $feed->uri @@ -331,8 +339,8 @@ modules/server_add/views/server_add_tree_dialog.html.php 4 DIRTY_JS url::s modules/server_add/views/server_add_tree_dialog.html.php 21 DIRTY $tree modules/tag/views/admin_tags.html.php 45 DIRTY_ATTR $tag->id modules/tag/views/admin_tags.html.php 46 DIRTY $tag->count -modules/tag/views/tag_block.html.php 26 DIRTY $cloud -modules/tag/views/tag_block.html.php 28 DIRTY $form +modules/tag/views/tag_block.html.php 28 DIRTY $cloud +modules/tag/views/tag_block.html.php 30 DIRTY $form modules/tag/views/tag_cloud.html.php 4 DIRTY_ATTR (int)(($tag->count/$max_count)*7) modules/tag/views/tag_cloud.html.php 5 DIRTY $tag->count modules/tag/views/tag_cloud.html.php 6 DIRTY_JS $tag->url() @@ -346,28 +354,32 @@ modules/user/views/admin_users.html.php 73 DIRTY_ATTR $use modules/user/views/admin_users.html.php 74 DIRTY_ATTR $user->avatar_url(20,$theme->url(,true)) modules/user/views/admin_users.html.php 88 DIRTY ($user->last_login==0)?"":gallery::date($user->last_login) modules/user/views/admin_users.html.php 91 DIRTY db::build()->from("items")->where("owner_id","=",$user->id)->count_records() -modules/user/views/admin_users.html.php 127 DIRTY_ATTR $group->id -modules/user/views/admin_users.html.php 127 DIRTY_ATTR ($group->special?"g-default-group":"") -modules/user/views/admin_users.html.php 129 DIRTY $v +modules/user/views/admin_users.html.php 113 DIRTY $pager +modules/user/views/admin_users.html.php 132 DIRTY_ATTR $group->id +modules/user/views/admin_users.html.php 132 DIRTY_ATTR ($group->special?"g-default-group":"") +modules/user/views/admin_users.html.php 134 DIRTY $v modules/user/views/admin_users_delete_user.html.php 6 DIRTY $form modules/user/views/admin_users_group.html.php 24 DIRTY_JS $user->id modules/user/views/admin_users_group.html.php 24 DIRTY_JS $group->id modules/watermark/views/admin_watermarks.html.php 20 DIRTY_ATTR $width modules/watermark/views/admin_watermarks.html.php 20 DIRTY_ATTR $height modules/watermark/views/admin_watermarks.html.php 20 DIRTY_ATTR $url -themes/admin_wind/views/admin.html.php 21 DIRTY_JS $theme->url() -themes/admin_wind/views/admin.html.php 38 DIRTY $theme->admin_head() -themes/admin_wind/views/admin.html.php 42 DIRTY $theme->admin_page_top() -themes/admin_wind/views/admin.html.php 50 DIRTY $theme->admin_header_top() -themes/admin_wind/views/admin.html.php 51 DIRTY_JS item::root()->url() -themes/admin_wind/views/admin.html.php 54 DIRTY $theme->user_menu() -themes/admin_wind/views/admin.html.php 57 DIRTY $theme->admin_menu() -themes/admin_wind/views/admin.html.php 60 DIRTY $theme->admin_header_bottom() -themes/admin_wind/views/admin.html.php 67 DIRTY $content -themes/admin_wind/views/admin.html.php 73 DIRTY $sidebar -themes/admin_wind/views/admin.html.php 78 DIRTY $theme->admin_footer() -themes/admin_wind/views/admin.html.php 81 DIRTY $theme->admin_credits() -themes/admin_wind/views/admin.html.php 86 DIRTY $theme->admin_page_bottom() +themes/admin_wind/views/admin.html.php 4 DIRTY $theme->html_attributes() +themes/admin_wind/views/admin.html.php 31 DIRTY $theme->admin_head() +themes/admin_wind/views/admin.html.php 40 DIRTY_JS $theme->url() +themes/admin_wind/views/admin.html.php 45 DIRTY $theme->get_combined("script") +themes/admin_wind/views/admin.html.php 48 DIRTY $theme->get_combined("css") +themes/admin_wind/views/admin.html.php 52 DIRTY $theme->admin_page_top() +themes/admin_wind/views/admin.html.php 60 DIRTY $theme->admin_header_top() +themes/admin_wind/views/admin.html.php 61 DIRTY_JS item::root()->url() +themes/admin_wind/views/admin.html.php 64 DIRTY $theme->user_menu() +themes/admin_wind/views/admin.html.php 67 DIRTY $theme->admin_menu() +themes/admin_wind/views/admin.html.php 70 DIRTY $theme->admin_header_bottom() +themes/admin_wind/views/admin.html.php 77 DIRTY $content +themes/admin_wind/views/admin.html.php 83 DIRTY $sidebar +themes/admin_wind/views/admin.html.php 88 DIRTY $theme->admin_footer() +themes/admin_wind/views/admin.html.php 91 DIRTY $theme->admin_credits() +themes/admin_wind/views/admin.html.php 96 DIRTY $theme->admin_page_bottom() themes/admin_wind/views/block.html.php 3 DIRTY_ATTR $anchor themes/admin_wind/views/block.html.php 5 DIRTY $id themes/admin_wind/views/block.html.php 5 DIRTY_ATTR $css_id @@ -398,18 +410,23 @@ themes/wind/views/dynamic.html.php 17 DIRTY_ATTR $chi themes/wind/views/dynamic.html.php 29 DIRTY $theme->paginator() themes/wind/views/movie.html.php 5 DIRTY $theme->paginator() themes/wind/views/movie.html.php 9 DIRTY $item->movie_img(array("class"=>"g-movie","id"=>"g-item-id-{$item->id}")) -themes/wind/views/page.html.php 9 DIRTY $page_title -themes/wind/views/page.html.php 32 DIRTY_JS $theme->url() -themes/wind/views/page.html.php 41 DIRTY $new_width -themes/wind/views/page.html.php 42 DIRTY $new_height -themes/wind/views/page.html.php 43 DIRTY $thumb_proportion -themes/wind/views/page.html.php 80 DIRTY $header_text -themes/wind/views/page.html.php 82 DIRTY_JS item::root()->url() -themes/wind/views/page.html.php 86 DIRTY $theme->user_menu() -themes/wind/views/page.html.php 107 DIRTY_JS $parent->url($parent->id==$theme->item()->parent_id?"show={$theme->item()->id}":null) -themes/wind/views/page.html.php 128 DIRTY $content -themes/wind/views/page.html.php 134 DIRTY newView("sidebar.html") -themes/wind/views/page.html.php 141 DIRTY $footer_text +themes/wind/views/page.html.php 4 DIRTY $theme->html_attributes() +themes/wind/views/page.html.php 10 DIRTY $page_title +themes/wind/views/page.html.php 13 DIRTY $theme->item()->title +themes/wind/views/page.html.php 17 DIRTY item::root()->title +themes/wind/views/page.html.php 31 DIRTY $new_width +themes/wind/views/page.html.php 32 DIRTY $new_height +themes/wind/views/page.html.php 33 DIRTY $thumb_proportion +themes/wind/views/page.html.php 70 DIRTY_JS $theme->url() +themes/wind/views/page.html.php 75 DIRTY $theme->get_combined("script") +themes/wind/views/page.html.php 78 DIRTY $theme->get_combined("css") +themes/wind/views/page.html.php 88 DIRTY $header_text +themes/wind/views/page.html.php 90 DIRTY_JS item::root()->url() +themes/wind/views/page.html.php 94 DIRTY $theme->user_menu() +themes/wind/views/page.html.php 115 DIRTY_JS $parent->url($parent->id==$theme->item()->parent_id?"show={$theme->item()->id}":null) +themes/wind/views/page.html.php 136 DIRTY $content +themes/wind/views/page.html.php 142 DIRTY newView("sidebar.html") +themes/wind/views/page.html.php 149 DIRTY $footer_text themes/wind/views/paginator.html.php 33 DIRTY_JS $first_page_url themes/wind/views/paginator.html.php 42 DIRTY_JS $previous_page_url themes/wind/views/paginator.html.php 70 DIRTY_JS $next_page_url diff --git a/modules/gallery/views/admin_block_stats.html.php b/modules/gallery/views/admin_block_stats.html.php index 1dec8ccd..c8c54765 100644 --- a/modules/gallery/views/admin_block_stats.html.php +++ b/modules/gallery/views/admin_block_stats.html.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access.") ?> <ul> <li> - <?= t("Version: %version", array("version" => gallery::VERSION)) ?> + <?= t("Version: %version", array("version" => gallery::version_string())) ?> </li> <li> <?= t("Albums: %count", array("count" => $album_count)) ?> diff --git a/modules/gallery/views/form_uploadify.html.php b/modules/gallery/views/form_uploadify.html.php index 893bb3b9..77b6d493 100644 --- a/modules/gallery/views/form_uploadify.html.php +++ b/modules/gallery/views/form_uploadify.html.php @@ -112,7 +112,7 @@ </script> <div class="requires-flash"> - <? if ($suhosin_session_encrypt || !$movies_allowed): ?> + <? if ($suhosin_session_encrypt || (identity::active_user()->admin && !$movies_allowed)): ?> <div class="g-message-block g-info"> <? if ($suhosin_session_encrypt): ?> <p class="g-error"> @@ -122,7 +122,7 @@ </p> <? endif ?> - <? if (!$movies_allowed): ?> + <? if (identity::active_user()->admin && !$movies_allowed): ?> <p class="g-warning"> <?= t("Can't find <i>ffmpeg</i> on your system. Movie uploading disabled. <a href=\"%help_url\">Help!</a>", array("help_url" => "http://codex.gallery2.org/Gallery3:FAQ#Why_does_it_say_I.27m_missing_ffmpeg.3F")) ?> </p> diff --git a/modules/gallery/views/movieplayer.html.php b/modules/gallery/views/movieplayer.html.php index 2e79b620..5c280a36 100644 --- a/modules/gallery/views/movieplayer.html.php +++ b/modules/gallery/views/movieplayer.html.php @@ -9,6 +9,9 @@ provider: "pseudostreaming" }, { + clip: { + scaling: 'fit' + }, plugins: { pseudostreaming: { url: "<?= url::abs_file("lib/flowplayer.pseudostreaming.swf") ?>" diff --git a/modules/gallery/views/upgrade_checker_block.html.php b/modules/gallery/views/upgrade_checker_block.html.php new file mode 100644 index 00000000..b04887b2 --- /dev/null +++ b/modules/gallery/views/upgrade_checker_block.html.php @@ -0,0 +1,53 @@ +<?php defined("SYSPATH") or die("No direct script access.") ?> +<p> + <?= t("Gallery can check to see if there is a new version available for you to use. It is a good idea to upgrade your Gallery to get the latest features and security fixes. Your privacy is important so no information about your Gallery is shared during this process. You can disable this feature below.") ?> +</p> + +<p> + <? if (gallery::RELEASE_CHANNEL == "release"): ?> + <?= t("You are using the official Gallery %version release, code named <i>%code_name</i>.", array("version" => gallery::VERSION, "code_name" => gallery::CODE_NAME)) ?> + <? else: ?> + <?= t("You are using an experimental snapshot of Gallery %version (build %build_number on branch %branch).", array("version" => gallery::VERSION, "branch" => gallery::RELEASE_BRANCH, "build_number" => gallery::build_number())) ?> + <? endif ?> +</p> + +<? if ($new_version): ?> +<ul class="g-message-block"> + <li class="g-message g-info"> + <?= $new_version ?> + </li> +</ul> +<? endif ?> + +<p> + <a class="g-button ui-state-default ui-corner-all" + href="<?= url::site("admin/upgrade_checker/check_now?csrf=$csrf") ?>"> + <?= t("Check now") ?> + </a> + <? if ($auto_check_enabled): ?> + <a class="g-button ui-state-default ui-corner-all" + href="<?= url::site("admin/upgrade_checker/set_auto/0?csrf=$csrf") ?>"> + <?= t("Disable automatic checking") ?> + </a> + <? else: ?> + <a class="g-button ui-state-default ui-corner-all" + href="<?= url::site("admin/upgrade_checker/set_auto/1?csrf=$csrf") ?>"> + <?= t("Enable automatic checking") ?> + </a> + <? endif ?> +</p> + +<p class="g-text-small"> + <? if ($auto_check_enabled): ?> + <?= t("Automatic upgrade checking is enabled.") ?> + <? else: ?> + <?= t("Automatic upgrade checking is disabled.") ?> + <? endif ?> + <? if (!$version_info): ?> + <?= t("No upgrade checks have been made yet.") ?> + <? else: ?> + <?= t("The last upgrade check was made on %date.", + array("date" => gallery::date_time($version_info->timestamp))) ?> + <? endif ?> +</p> + diff --git a/modules/gallery_unit_test/controllers/gallery_unit_test.php b/modules/gallery_unit_test/controllers/gallery_unit_test.php index c4a891ba..8d7d97df 100644 --- a/modules/gallery_unit_test/controllers/gallery_unit_test.php +++ b/modules/gallery_unit_test/controllers/gallery_unit_test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -132,7 +132,6 @@ class Gallery_Unit_Test_Controller extends Controller { graphics::choose_default_toolkit(); $filter = count($_SERVER["argv"]) > 2 ? $_SERVER["argv"][2] : null; - set_time_limit(300); print new Unit_Test($modules, $filter); } catch (ORM_Validation_Exception $e) { print "Validation Exception: {$e->getMessage()}\n"; diff --git a/modules/gallery_unit_test/helpers/MY_request.php b/modules/gallery_unit_test/helpers/MY_request.php index c169be05..d6ea9e5a 100644 --- a/modules/gallery_unit_test/helpers/MY_request.php +++ b/modules/gallery_unit_test/helpers/MY_request.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/gallery_unit_test/helpers/test.php b/modules/gallery_unit_test/helpers/test.php index 1be82a74..b6b0055a 100644 --- a/modules/gallery_unit_test/helpers/test.php +++ b/modules/gallery_unit_test/helpers/test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ */ class test_Core { static function random_album_unsaved($parent=null) { - $rand = rand(); + $rand = random::string(6); $album = ORM::factory("item"); $album->type = "album"; @@ -34,7 +34,7 @@ class test_Core { } static function random_photo_unsaved($parent=null) { - $rand = rand(); + $rand = random::string(6); $photo = ORM::factory("item"); $photo->type = "photo"; $photo->parent_id = $parent ? $parent->id : 1; @@ -49,16 +49,16 @@ class test_Core { } static function random_user($password="password") { - $rand = "name_" . rand(); + $rand = "name_" . random::string(6); return identity::create_user($rand, $rand, $password, "$rand@rand.com"); } static function random_group() { - return identity::create_group((string)rand()); + return identity::create_group(random::string(6)); } static function random_name($item=null) { - $rand = "name_" . rand(); + $rand = "name_" . random::string(6); if ($item && $item->is_photo()) { $rand .= ".jpg"; } @@ -77,7 +77,7 @@ class test_Core { static function random_tag() { $tag = ORM::factory("tag"); - $tag->name = (string)rand(); + $tag->name = random::string(6); // Reload so that ORM coerces all fields into strings. return $tag->save()->reload(); diff --git a/modules/gallery_unit_test/libraries/Gallery_Unit_Test_Case.php b/modules/gallery_unit_test/libraries/Gallery_Unit_Test_Case.php index fa04667d..fd920603 100644 --- a/modules/gallery_unit_test/libraries/Gallery_Unit_Test_Case.php +++ b/modules/gallery_unit_test/libraries/Gallery_Unit_Test_Case.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/image_block/helpers/image_block_block.php b/modules/image_block/helpers/image_block_block.php index 0a53672c..44e63a29 100644 --- a/modules/image_block/helpers/image_block_block.php +++ b/modules/image_block/helpers/image_block_block.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -44,7 +44,7 @@ class image_block_block_Core { if ($items) { $block = new Block(); $block->css_id = "g-image-block"; - $block->title = t("Random image"); + $block->title = t2("Random image", "Random images", $image_count); $block->content = new View("image_block_block.html"); $block->content->items = $items; } diff --git a/modules/image_block/helpers/image_block_installer.php b/modules/image_block/helpers/image_block_installer.php index 62c38ba4..1b41bc0e 100644 --- a/modules/image_block/helpers/image_block_installer.php +++ b/modules/image_block/helpers/image_block_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,7 +21,7 @@ class image_block_installer { static function install() { module::set_var("image_block", "image_count", "1"); - module::set_version("image_block", $version = 2); + module::set_version("image_block", $version = 3); } static function upgrade($version) { @@ -30,5 +30,15 @@ class image_block_installer { module::set_var("image_block", "image_count", "1"); module::set_version("image_block", $version = 2); } + + // Oops, there was a bug in the installer for version 2 resulting + // in some folks not getting the image_count variable set. Bump + // to version 3 and fix it. + if ($version == 2) { + if (module::get_var("image_block", "image_count", 0) === 0) { + module::set_var("image_block", "image_count", "1"); + } + module::set_version("image_block", $version = 3); + } } } diff --git a/modules/image_block/module.info b/modules/image_block/module.info index b92b83df..6836fabc 100644 --- a/modules/image_block/module.info +++ b/modules/image_block/module.info @@ -1,3 +1,3 @@ name = "Image Block" description = "Display a random image in the sidebar" -version = 2 +version = 3 diff --git a/modules/info/helpers/info_block.php b/modules/info/helpers/info_block.php index 3cbbb12b..49923deb 100644 --- a/modules/info/helpers/info_block.php +++ b/modules/info/helpers/info_block.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,6 +31,48 @@ class info_block_Core { $block->css_id = "g-metadata"; $block->title = $theme->item()->is_album() ? t("Album info") : t("Photo info"); $block->content = new View("info_block.html"); + if ($theme->item->title && module::get_var("info", "show_title")) { + $info["title"] = array( + "label" => t("Title:"), + "value" => html::purify($theme->item->title) + ); + } + if ($theme->item->description && module::get_var("info", "show_description")) { + $info["description"] = array( + "label" => t("Description:"), + "value" => nl2br(html::purify($theme->item->description)) + ); + } + if (!$theme->item->is_album() && module::get_var("info", "show_name")) { + $info["file_name"] = array( + "label" => t("File name:"), + "value" => html::clean($theme->item->name) + ); + } + if ($theme->item->captured && module::get_var("info", "show_captured")) { + $info["captured"] = array( + "label" => t("Captured:"), + "value" => gallery::date_time($theme->item->captured) + ); + } + if ($theme->item->owner && module::get_var("info", "show_owner")) { + $display_name = $theme->item->owner->display_name(); + if ($theme->item->owner->url) { + $info["owner"] = array( + "label" => t("Owner:"), + "value" => "<a href=\"{$theme->item->owner->url}\">" . + html::clean($display_name) . "</a>" + ); + } else { + $info["owner"] = array( + "label" => t("Owner:"), + "value" => html::clean($display_name) + ); + } + } + $block->content->metadata = $info; + + module::event("info_block_get_metadata", $block, $theme->item); } break; } diff --git a/modules/organize/helpers/organize_theme.php b/modules/info/helpers/info_installer.php index d69ab82c..d9053e46 100644 --- a/modules/organize/helpers/organize_theme.php +++ b/modules/info/helpers/info_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,11 +17,25 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ -class organize_theme { - static function head($theme) { - $item = $theme->item(); - if ($item && access::can("edit", $item) && $item->is_album()) { - $theme->css("organize_theme.css"); +class info_installer { + + static function install() { + module::set_var("info", "show_title", 1); + module::set_var("info", "show_description", 1); + module::set_var("info", "show_owner", 1); + module::set_var("info", "show_name", 1); + module::set_var("info", "show_captured", 1); + module::set_version("info", 2); + } + + static function upgrade($version) { + if ($version == 1) { + module::set_var("info", "show_title", 1); + module::set_var("info", "show_description", 1); + module::set_var("info", "show_owner", 1); + module::set_var("info", "show_name", 1); + module::set_var("info", "show_captured", 1); + module::set_version("info", $version = 2); } } } diff --git a/modules/info/helpers/info_theme.php b/modules/info/helpers/info_theme.php index 05a19cf5..7599ad06 100644 --- a/modules/info/helpers/info_theme.php +++ b/modules/info/helpers/info_theme.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/info/module.info b/modules/info/module.info index e352213c..5f84cbb9 100644 --- a/modules/info/module.info +++ b/modules/info/module.info @@ -1,3 +1,3 @@ name = "Info" description = "Display extra information about photos and albums" -version = 1 +version = 2 diff --git a/modules/info/views/info_block.html.php b/modules/info/views/info_block.html.php index ebe9bd28..b296fa1d 100644 --- a/modules/info/views/info_block.html.php +++ b/modules/info/views/info_block.html.php @@ -1,35 +1,8 @@ <?php defined("SYSPATH") or die("No direct script access.") ?> <ul class="g-metadata"> + <? foreach($metadata as $info): ?> <li> - <strong class="caption"><?= t("Title:") ?></strong> - <?= html::purify($item->title) ?> + <strong class="caption"><?= $info["label"] ?></strong> <?= $info["value"] ?> </li> - <? if ($item->description): ?> - <li> - <strong class="caption"><?= t("Description:") ?></strong> - <?= nl2br(html::purify($item->description)) ?> - </li> - <? endif ?> - <? if (!$item->is_album()): ?> - <li> - <strong class="caption"><?= t("File name:") ?></strong> - <?= html::clean($item->name) ?> - </li> - <? endif ?> - <? if ($item->captured): ?> - <li> - <strong class="caption"><?= t("Captured:") ?></strong> - <?= gallery::date_time($item->captured)?> - </li> - <? endif ?> - <? if ($item->owner): ?> - <li> - <strong class="caption"><?= t("Owner:") ?></strong> - <? if ($item->owner->url): ?> - <a href="<?= $item->owner->url ?>"><?= html::clean($item->owner->display_name()) ?></a> - <? else: ?> - <?= html::clean($item->owner->display_name()) ?> - <? endif ?> - </li> - <? endif ?> + <? endforeach; ?> </ul> diff --git a/modules/kohana23_compat/config/pagination.php b/modules/kohana23_compat/config/pagination.php index 91ecc308..2f4cdff4 100644 --- a/modules/kohana23_compat/config/pagination.php +++ b/modules/kohana23_compat/config/pagination.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/kohana23_compat/libraries/MY_Database_Builder.php b/modules/kohana23_compat/libraries/MY_Database_Builder.php index 014efe0e..aab80820 100644 --- a/modules/kohana23_compat/libraries/MY_Database_Builder.php +++ b/modules/kohana23_compat/libraries/MY_Database_Builder.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/kohana23_compat/libraries/Pagination.php b/modules/kohana23_compat/libraries/Pagination.php index ee268051..38f39607 100644 --- a/modules/kohana23_compat/libraries/Pagination.php +++ b/modules/kohana23_compat/libraries/Pagination.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/notification/controllers/notification.php b/modules/notification/controllers/notification.php index 6458c2fb..437bc15a 100644 --- a/modules/notification/controllers/notification.php +++ b/modules/notification/controllers/notification.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/notification/helpers/notification.php b/modules/notification/helpers/notification.php index 0564d336..32e0f48c 100644 --- a/modules/notification/helpers/notification.php +++ b/modules/notification/helpers/notification.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -160,7 +160,7 @@ class notification { static function send_pending_notifications() { foreach (db::build() - ->select(new Database_Expression("DISTINCT `email`")) + ->select(db::expr("DISTINCT `email`")) ->from("pending_notifications") ->execute() as $row) { $email = $row->email; diff --git a/modules/notification/helpers/notification_event.php b/modules/notification/helpers/notification_event.php index 5cd10de8..c2ed3b03 100644 --- a/modules/notification/helpers/notification_event.php +++ b/modules/notification/helpers/notification_event.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/notification/helpers/notification_installer.php b/modules/notification/helpers/notification_installer.php index 2ba25298..2ac975fa 100644 --- a/modules/notification/helpers/notification_installer.php +++ b/modules/notification/helpers/notification_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/notification/models/pending_notification.php b/modules/notification/models/pending_notification.php index 5857ce8c..ca79fb9d 100644 --- a/modules/notification/models/pending_notification.php +++ b/modules/notification/models/pending_notification.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/notification/models/subscription.php b/modules/notification/models/subscription.php index 273b6ad9..16cb8adf 100644 --- a/modules/notification/models/subscription.php +++ b/modules/notification/models/subscription.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/organize/controllers/organize.php b/modules/organize/controllers/organize.php index 2b6e4186..9ce518ac 100644 --- a/modules/organize/controllers/organize.php +++ b/modules/organize/controllers/organize.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,43 +18,185 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ class Organize_Controller extends Controller { + function frame($album_id) { + $album = ORM::factory("item", $album_id); + access::required("view", $album); + access::required("edit", $album); + + $v = new View("organize_frame.html"); + $v->album = $album; + print $v; + } + function dialog($album_id) { + $album = ORM::factory("item", $album_id); + access::required("view", $album); + access::required("edit", $album); + + $v = new View("organize_dialog.html"); + $v->album = $album; + print $v; + } + + function tree($selected_album_id) { + $root = ORM::factory("item", Input::instance()->post("root_id", 1)); + $selected_album = ORM::factory("item", $selected_album_id); + access::required("view", $root); + access::required("view", $selected_album); + + $tree = $this->_get_tree($root, $selected_album); + json::reply($tree); + } + + function album_info($album_id) { + $album = ORM::factory("item", $album_id); + access::required("view", $album); + + $data = array( + "sort_column" => $album->sort_column, + "sort_order" => $album->sort_order, + "editable" => access::can("edit", $album), + "title" => $album->title, + "children" => array()); + + foreach ($album->viewable()->children() as $child) { + $dims = $child->scale_dimensions(120); + $data["children"][] = array( + "id" => $child->id, + "thumb_url" => $child->has_thumb() ? $child->thumb_url() : null, + "width" => $dims[1], + "height" => $dims[0], + "type" => $child->type, + "title" => $child->title); + } + json::reply($data); + } + + function reparent() { + access::verify_csrf(); + $input = Input::instance(); + $new_parent = ORM::factory("item", $input->post("target_id")); + access::required("edit", $new_parent); + + foreach (explode(",", $input->post("source_ids")) as $source_id) { + $source = ORM::factory("item", $source_id); + access::required("edit", $source->parent()); + if ($source->contains($new_parent) || $source->id == $new_parent->id) { + // Can't move an item into its own hierarchy. Silently skip this, + // since the UI shouldn't even allow this operation. + continue; + } + + $source->parent_id = $new_parent->id; + $source->save(); + } + json::reply(null); + } + + function set_sort($album_id) { + access::verify_csrf(); $album = ORM::factory("item", $album_id); access::required("view", $album); access::required("edit", $album); - $user = identity::active_user(); - $sort_fields = array(); - foreach (album::get_sort_order_options() as $field => $description) { - $sort_fields[$field] = (string)$description; + foreach (array("sort_column", "sort_order") as $key) { + if ($val = Input::instance()->post($key)) { + $album->$key = $val; + } } - $sort_order = array("ASC" => (string)t("Ascending"), "DESC" => (string)t("Descending")); - $file_filter = json_encode(array( - "photo" => array("label" => "Images", "types" => array("*.jpg", "*.jpeg", "*.png", "*.gif")), - "movie" => array("label" => "Movies", "types" => array("*.flv", "*.mp4", "*.m4v")))); + $album->save(); - $v = new View("organize_dialog.html"); - $v->album = $album; - $v->domain = $input->server("HTTP_HOST"); - $v->access_key = rest::access_key(); - $v->file_filter = addslashes($file_filter); - $v->sort_order = addslashes(json_encode($sort_order)); - $v->sort_fields = addslashes(json_encode($sort_fields)); - $v->selected_id = Input::instance()->get("selected_id", null); - $v->rest_uri = url::site("rest") . "/"; - $v->controller_uri = url::site("organize") . "/"; - $v->swf_uri = url::file("modules/organize/lib/Gallery3WebClient.swf?") . - filemtime(MODPATH . "organize/lib/Gallery3WebClient.swf"); - print $v; + json::reply(null); + } + + function rearrange() { + access::verify_csrf(); + + $input = Input::instance(); + $target = ORM::factory("item", $input->post("target_id")); + $album = $target->parent(); + access::required("edit", $album); + + if ($album->sort_column != "weight") { + // Force all the weights into the current order before changing the order to manual + $weight = 0; + foreach ($album->children() as $child) { + $child->weight = ++$weight; + $child->save(); + } + + $album->sort_column = "weight"; + $album->sort_order = "ASC"; + $album->save(); + } + + $source_ids = explode(",", $input->post("source_ids")); + $base_weight = $target->weight; + if ($input->post("relative") == "after") { + $base_weight++; + } + + if ($source_ids) { + // Make a hole the right size + db::build() + ->update("items") + ->set("weight", db::expr("`weight` + " . count($source_ids))) + ->where("parent_id", "=", $album->id) + ->where("weight", ">=", $base_weight) + ->execute(); + + // Move all the source items to the right spots. + for ($i = 0; $i < count($source_ids); $i++) { + $source = ORM::factory("item", $source_ids[$i]); + if ($source->parent_id = $album->id) { + $source->weight = $base_weight + $i; + $source->save(); + } + } + } + json::reply(null); } - function add_album_fields() { - json::reply(array("title" => (string)t("Title"), - "description" => (string)t("Description"), - "name" => (string)t("Directory name"), - "slug" => (string)t("Internet Address"))); + function delete() { + access::verify_csrf(); + + $input = Input::instance(); + + foreach (explode(",", $input->post("item_ids")) as $item_id) { + $item = ORM::factory("item", $item_id); + if (access::can("edit", $item)) { + $item->delete(); + } + } + + json::reply(null); } + private function _get_tree($item, $selected) { + $tree = array(); + $children = $item->viewable() + ->children(null, null, array(array("type", "=", "album"))) + ->as_array(); + foreach ($children as $child) { + $node = array( + "allowDrag" => false, + "allowDrop" => access::can("edit", $child), + "editable" => false, + "expandable" => false, + "id" => $child->id, + "leaf" => $child->children_count(array(array("type", "=", "album"))) == 0, + "text" => $child->title, + "nodeType" => "async"); + + // If the child is in the selected path, open it now. Else, mark it async. + if ($child->contains($selected)) { + $node["children"] = $this->_get_tree($child, $selected); + $node["expanded"] = true; + } + $tree[] = $node; + } + return $tree; + } } diff --git a/modules/organize/css/organize_dialog.css b/modules/organize/css/organize_dialog.css new file mode 100644 index 00000000..2b39cdf4 --- /dev/null +++ b/modules/organize/css/organize_dialog.css @@ -0,0 +1,17 @@ +#g-organize-frame { + border: 0px; + width: 100%; + height: 100%; +} + +#g-organize-app-loading { + display: block; + position: absolute; + top: 50%; + left: 50%; + width: 16px; + height: 16px; + background-image: url(../vendor/ext/images/default/tree/loading.gif); + background-position: center center; + background-repeat: no-repeat; +} diff --git a/modules/organize/css/organize_frame.css b/modules/organize/css/organize_frame.css new file mode 100644 index 00000000..12bc6091 --- /dev/null +++ b/modules/organize/css/organize_frame.css @@ -0,0 +1,118 @@ +.g-organize { + font-family: 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; +} + +.g-organize div.thumb { + padding: 8px; + width: 128px; + height: 128px; + vertical-align: middle; + float: left; +} + +.g-organize div.selected { + background: #C9D8EB; +} + +.g-organize div.thumb { + border: 4px solid white; + text-align: center; +} + +.g-organize div.thumb-missing span { + display: block; + background: #eee; + width: 120px; + height: 120px; + padding-top: 8px; + text-align: center; + font: 14px arial, tahoma; + border: 1px solid #ddd; + font-style: italic; +} + +.g-organize div.thumb:hover { + border: 2px solid #eee; + margin: 2px; + cursor: pointer; +} + +.g-organize div.thumb div.icon { + position: relative; + padding: 0px; + margin: 0px; + visibility: hidden; + width: 16px; + height: 16px; + top: -16px; + margin-bottom: -16px; + padding-bottom: -16px; +} + +.g-organize div.thumb-album div.icon { + visibility: visible; +} + +.g-organize div.drag-ghost { + width: 300px; + height: 180px; +} + +.g-organize div.drag-ghost div { + width: 72px; + height: 72px; + vertical-align: baseline; + float: left; +} + +.g-organize div.drop-target { + background: #eee; +} + +.g-organize div.active-left { + border-left: 4px solid #C9D8EB; +} + +.g-organize div.active-right { + border-right: 4px solid #C9D8EB; +} + +.g-organize label.sort { + font: 12px arial, tahoma; + vertical-align: middle; + font-weight: bold; + height: 22px; + text-align: center; + padding: 4px; +} + +.loading div { + font-size: 1.1em; + padding-left: 24px; + background-color: white; + background-image: url(../vendor/ext/images/default/tree/loading.gif); + background-position: 4px 8px; + background-repeat: no-repeat; +} + +button.delete { + background-image: url(../vendor/ext/images/fam/delete.gif); + background-position: 10px 8px; + background-repeat: no-repeat; +} + +/* IE specific overrides */ +body.ext-ie div.thumb { + width: 150px; + height: 150px; +} + +/* ExtJS overrides */ +.x-tree-node-el { + font-size: 12px; + line-height: 20px; +} + +.x-tree-node-leaf .x-tree-node-icon { + background-image:url(../vendor/ext/images/default/tree/folder.gif); +} diff --git a/modules/organize/css/organize_theme.css b/modules/organize/css/organize_theme.css deleted file mode 100644 index e698f88d..00000000 --- a/modules/organize/css/organize_theme.css +++ /dev/null @@ -1,18 +0,0 @@ -/** ******************************************************************* - * Organize styles that are theme overrideable - *********************************************************************/ -#g-organize { - background-color: #FFFFFF; - border: 0px solid #000000; - color: #0E2B52; -} - -#g-organize-hover { - background-color: #CFDEFF; - display: none; -} - -#g-organize-active { - background-color: #6699CC; - display: none; -} diff --git a/modules/organize/helpers/organize_event.php b/modules/organize/helpers/organize_event.php index 2f997600..fb755c01 100644 --- a/modules/organize/helpers/organize_event.php +++ b/modules/organize/helpers/organize_event.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,7 +26,7 @@ class organize_event_Core { ->append(Menu::factory("dialog") ->id("organize") ->label(t("Organize album")) - ->css_id("g-menu-organize-link") + ->css_id("g-organize-link") ->url(url::site("organize/dialog/{$item->id}"))); } } @@ -51,22 +51,4 @@ class organize_event_Core { } } } - - static function pre_deactivate($data) { - if ($data->module == "rest") { - $data->messages["warn"][] = t("The Organize module requires the Rest module."); - } - } - - static function module_change($changes) { - if (!module::is_active("rest") || in_array("rest", $changes->deactivate)) { - site_status::warning( - t("The Organize module requires the Rest module. <a href=\"%url\">Activate the Rest module now</a>", - array("url" => html::mark_clean(url::site("admin/modules")))), - "organize_needs_rest"); - } else { - site_status::clear("organize_needs_rest"); - } - } - } diff --git a/modules/organize/helpers/organize_installer.php b/modules/organize/helpers/organize_installer.php index 2faa598b..3f5c740b 100644 --- a/modules/organize/helpers/organize_installer.php +++ b/modules/organize/helpers/organize_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,32 +18,11 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ class organize_installer { - static function deactivate() { - site_status::clear("organize_needs_rest"); - } - - static function install() { - module::set_version("organize", $version = 2); - } - static function upgrade($version) { - if ($version == 1) { - if (!module::is_active("rest")) { - site_status::warning( - t("The Organize module requires the Rest module. <a href=\"%url\">Activate the Rest module now</a>", - array("url" => html::mark_clean(url::site("admin/modules")))), - "organize_needs_rest"); - } - - module::set_version("organize", $version = 2); - } - } - - static function can_activate() { - $messages = array(); - if (!module::is_active("rest")) { - $messages["warn"][] = t("The Organize module requires the Rest module."); + if ($version < 4) { + // No longer necessary, make sure that it's cleared. + site_status::clear("organize_needs_rest"); + module::set_version("organize", $version = 4); } - return $messages; } } diff --git a/modules/organize/lib/Gallery3WebClient.swf b/modules/organize/lib/Gallery3WebClient.swf Binary files differdeleted file mode 100644 index 356a1a2f..00000000 --- a/modules/organize/lib/Gallery3WebClient.swf +++ /dev/null diff --git a/modules/organize/module.info b/modules/organize/module.info index d7199571..0d16144d 100644 --- a/modules/organize/module.info +++ b/modules/organize/module.info @@ -1,3 +1,3 @@ name = "Organize" -description = "Organize your gallery by apply tags or moving images" -version = 2 +description = "Visually rearrange and move photos in your gallery" +version = 4 diff --git a/modules/organize/vendor/ext/css/ext-all.css b/modules/organize/vendor/ext/css/ext-all.css new file mode 100644 index 00000000..afef9809 --- /dev/null +++ b/modules/organize/vendor/ext/css/ext-all.css @@ -0,0 +1,6969 @@ +/*! + * Ext JS Library 3.3.1 + * Copyright(c) 2006-2010 Sencha Inc. + * licensing@sencha.com + * http://www.sencha.com/license + */ +html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;}img,body,html{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;}q:before,q:after{content:'';} + +.ext-forced-border-box, .ext-forced-border-box * { + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -webkit-box-sizing: border-box; +} +.ext-el-mask { + z-index: 100; + position: absolute; + top:0; + left:0; + -moz-opacity: 0.5; + opacity: .50; + filter: alpha(opacity=50); + width: 100%; + height: 100%; + zoom: 1; +} + +.ext-el-mask-msg { + z-index: 20001; + position: absolute; + top: 0; + left: 0; + border:1px solid; + background:repeat-x 0 -16px; + padding:2px; +} + +.ext-el-mask-msg div { + padding:5px 10px 5px 10px; + border:1px solid; + cursor:wait; +} + +.ext-shim { + position:absolute; + visibility:hidden; + left:0; + top:0; + overflow:hidden; +} + +.ext-ie .ext-shim { + filter: alpha(opacity=0); +} + +.ext-ie6 .ext-shim { + margin-left: 5px; + margin-top: 3px; +} + +.x-mask-loading div { + padding:5px 10px 5px 25px; + background:no-repeat 5px 5px; + line-height:16px; +} + +/* class for hiding elements without using display:none */ +.x-hidden, .x-hide-offsets { + position:absolute !important; + left:-10000px; + top:-10000px; + visibility:hidden; +} + +.x-hide-display { + display:none !important; +} + +.x-hide-nosize, +.x-hide-nosize * /* Emulate display:none for children */ + { + height:0px!important; + width:0px!important; + visibility:hidden!important; + border:none!important; + zoom:1; +} + +.x-hide-visibility { + visibility:hidden !important; +} + +.x-masked { + overflow: hidden !important; +} +.x-masked-relative { + position: relative !important; +} + +.x-masked select, .x-masked object, .x-masked embed { + visibility: hidden; +} + +.x-layer { + visibility: hidden; +} + +.x-unselectable, .x-unselectable * { + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select:ignore; +} + +.x-repaint { + zoom: 1; + background-color: transparent; + -moz-outline: none; + outline: none; +} + +.x-item-disabled { + cursor: default; + opacity: .6; + -moz-opacity: .6; + filter: alpha(opacity=60); +} + +.x-item-disabled * { + cursor: default !important; +} + +.x-form-radio-group .x-item-disabled { + filter: none; +} + +.x-splitbar-proxy { + position: absolute; + visibility: hidden; + z-index: 20001; + zoom: 1; + line-height: 1px; + font-size: 1px; + overflow: hidden; +} + +.x-splitbar-h, .x-splitbar-proxy-h { + cursor: e-resize; + cursor: col-resize; +} + +.x-splitbar-v, .x-splitbar-proxy-v { + cursor: s-resize; + cursor: row-resize; +} + +.x-color-palette { + width: 150px; + height: 92px; + cursor: pointer; +} + +.x-color-palette a { + border: 1px solid; + float: left; + padding: 2px; + text-decoration: none; + -moz-outline: 0 none; + outline: 0 none; + cursor: pointer; +} + +.x-color-palette a:hover, .x-color-palette a.x-color-palette-sel { + border: 1px solid; +} + +.x-color-palette em { + display: block; + border: 1px solid; +} + +.x-color-palette em span { + cursor: pointer; + display: block; + height: 10px; + line-height: 10px; + width: 10px; +} + +.x-ie-shadow { + display: none; + position: absolute; + overflow: hidden; + left:0; + top:0; + zoom:1; +} + +.x-shadow { + display: none; + position: absolute; + overflow: hidden; + left:0; + top:0; +} + +.x-shadow * { + overflow: hidden; +} + +.x-shadow * { + padding: 0; + border: 0; + margin: 0; + clear: none; + zoom: 1; +} + +/* top bottom */ +.x-shadow .xstc, .x-shadow .xsbc { + height: 6px; + float: left; +} + +/* corners */ +.x-shadow .xstl, .x-shadow .xstr, .x-shadow .xsbl, .x-shadow .xsbr { + width: 6px; + height: 6px; + float: left; +} + +/* sides */ +.x-shadow .xsc { + width: 100%; +} + +.x-shadow .xsml, .x-shadow .xsmr { + width: 6px; + float: left; + height: 100%; +} + +.x-shadow .xsmc { + float: left; + height: 100%; + background-color: transparent; +} + +.x-shadow .xst, .x-shadow .xsb { + height: 6px; + overflow: hidden; + width: 100%; +} + +.x-shadow .xsml { + background: transparent repeat-y 0 0; +} + +.x-shadow .xsmr { + background: transparent repeat-y -6px 0; +} + +.x-shadow .xstl { + background: transparent no-repeat 0 0; +} + +.x-shadow .xstc { + background: transparent repeat-x 0 -30px; +} + +.x-shadow .xstr { + background: transparent repeat-x 0 -18px; +} + +.x-shadow .xsbl { + background: transparent no-repeat 0 -12px; +} + +.x-shadow .xsbc { + background: transparent repeat-x 0 -36px; +} + +.x-shadow .xsbr { + background: transparent repeat-x 0 -6px; +} + +.loading-indicator { + background: no-repeat left; + padding-left: 20px; + line-height: 16px; + margin: 3px; +} + +.x-text-resize { + position: absolute; + left: -1000px; + top: -1000px; + visibility: hidden; + zoom: 1; +} + +.x-drag-overlay { + width: 100%; + height: 100%; + display: none; + position: absolute; + left: 0; + top: 0; + background-image:url(../images/default/s.gif); + z-index: 20000; +} + +.x-clear { + clear:both; + height:0; + overflow:hidden; + line-height:0; + font-size:0; +} + +.x-spotlight { + z-index: 8999; + position: absolute; + top:0; + left:0; + -moz-opacity: 0.5; + opacity: .50; + filter: alpha(opacity=50); + width:0; + height:0; + zoom: 1; +} + +#x-history-frame { + position:absolute; + top:-1px; + left:0; + width:1px; + height:1px; + visibility:hidden; +} + +#x-history-field { + position:absolute; + top:0; + left:-1px; + width:1px; + height:1px; + visibility:hidden; +} +.x-resizable-handle { + position:absolute; + z-index:100; + /* ie needs these */ + font-size:1px; + line-height:6px; + overflow:hidden; + filter:alpha(opacity=0); + opacity:0; + zoom:1; +} + +.x-resizable-handle-east{ + width:6px; + cursor:e-resize; + right:0; + top:0; + height:100%; +} + +.ext-ie .x-resizable-handle-east { + margin-right:-1px; /*IE rounding error*/ +} + +.x-resizable-handle-south{ + width:100%; + cursor:s-resize; + left:0; + bottom:0; + height:6px; +} + +.ext-ie .x-resizable-handle-south { + margin-bottom:-1px; /*IE rounding error*/ +} + +.x-resizable-handle-west{ + width:6px; + cursor:w-resize; + left:0; + top:0; + height:100%; +} + +.x-resizable-handle-north{ + width:100%; + cursor:n-resize; + left:0; + top:0; + height:6px; +} + +.x-resizable-handle-southeast{ + width:6px; + cursor:se-resize; + right:0; + bottom:0; + height:6px; + z-index:101; +} + +.x-resizable-handle-northwest{ + width:6px; + cursor:nw-resize; + left:0; + top:0; + height:6px; + z-index:101; +} + +.x-resizable-handle-northeast{ + width:6px; + cursor:ne-resize; + right:0; + top:0; + height:6px; + z-index:101; +} + +.x-resizable-handle-southwest{ + width:6px; + cursor:sw-resize; + left:0; + bottom:0; + height:6px; + z-index:101; +} + +.x-resizable-over .x-resizable-handle, .x-resizable-pinned .x-resizable-handle{ + filter:alpha(opacity=100); + opacity:1; +} + +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east, +.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west +{ + background-position: left; +} + +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south, +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north +{ + background-position: top; +} + +.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ + background-position: top left; +} + +.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{ + background-position:bottom right; +} + +.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{ + background-position: bottom left; +} + +.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{ + background-position: top right; +} + +.x-resizable-proxy{ + border: 1px dashed; + position:absolute; + overflow:hidden; + display:none; + left:0; + top:0; + z-index:50000; +} + +.x-resizable-overlay{ + width:100%; + height:100%; + display:none; + position:absolute; + left:0; + top:0; + z-index:200000; + -moz-opacity: 0; + opacity:0; + filter: alpha(opacity=0); +} +.x-tab-panel { + overflow:hidden; +} + +.x-tab-panel-header, .x-tab-panel-footer { + border: 1px solid; + overflow:hidden; + zoom:1; +} + +.x-tab-panel-header { + border: 1px solid; + padding-bottom: 2px; +} + +.x-tab-panel-footer { + border: 1px solid; + padding-top: 2px; +} + +.x-tab-strip-wrap { + width:100%; + overflow:hidden; + position:relative; + zoom:1; +} + +ul.x-tab-strip { + display:block; + width:5000px; + zoom:1; +} + +ul.x-tab-strip-top{ + padding-top: 1px; + background: repeat-x bottom; + border-bottom: 1px solid; +} + +ul.x-tab-strip-bottom{ + padding-bottom: 1px; + background: repeat-x top; + border-top: 1px solid; + border-bottom: 0 none; +} + +.x-tab-panel-header-plain .x-tab-strip-top { + background:transparent !important; + padding-top:0 !important; +} + +.x-tab-panel-header-plain { + background:transparent !important; + border-width:0 !important; + padding-bottom:0 !important; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer, +.x-tab-panel-footer-plain .x-tab-strip-spacer { + border:1px solid; + height:2px; + font-size:1px; + line-height:1px; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer { + border-top: 0 none; +} + +.x-tab-panel-footer-plain .x-tab-strip-spacer { + border-bottom: 0 none; +} + +.x-tab-panel-footer-plain .x-tab-strip-bottom { + background:transparent !important; + padding-bottom:0 !important; +} + +.x-tab-panel-footer-plain { + background:transparent !important; + border-width:0 !important; + padding-top:0 !important; +} + +.ext-border-box .x-tab-panel-header-plain .x-tab-strip-spacer, +.ext-border-box .x-tab-panel-footer-plain .x-tab-strip-spacer { + height:3px; +} + +ul.x-tab-strip li { + float:left; + margin-left:2px; +} + +ul.x-tab-strip li.x-tab-edge { + float:left; + margin:0 !important; + padding:0 !important; + border:0 none !important; + font-size:1px !important; + line-height:1px !important; + overflow:hidden; + zoom:1; + background:transparent !important; + width:1px; +} + +.x-tab-strip a, .x-tab-strip span, .x-tab-strip em { + display:block; +} + +.x-tab-strip a { + text-decoration:none !important; + -moz-outline: none; + outline: none; + cursor:pointer; +} + +.x-tab-strip-inner { + overflow:hidden; + text-overflow: ellipsis; +} + +.x-tab-strip span.x-tab-strip-text { + white-space: nowrap; + cursor:pointer; + padding:4px 0; +} + +.x-tab-strip-top .x-tab-with-icon .x-tab-right { + padding-left:6px; +} + +.x-tab-strip .x-tab-with-icon span.x-tab-strip-text { + padding-left:20px; + background-position: 0 3px; + background-repeat: no-repeat; +} + +.x-tab-strip-active, .x-tab-strip-active a.x-tab-right { + cursor:default; +} + +.x-tab-strip-active span.x-tab-strip-text { + cursor:default; +} + +.x-tab-strip-disabled .x-tabs-text { + cursor:default; +} + +.x-tab-panel-body { + overflow:hidden; +} + +.x-tab-panel-bwrap { + overflow:hidden; +} + +.ext-ie .x-tab-strip .x-tab-right { + position:relative; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-right { + margin-bottom:-1px; +} + +/* + * Horrible hack for IE8 in quirks mode + */ +.ext-ie8 .x-tab-strip li { + position: relative; +} +.ext-border-box .ext-ie8 .x-tab-strip-top .x-tab-right { + top: 1px; +} +.ext-ie8 .x-tab-strip-top { + padding-top: 1; +} +.ext-border-box .ext-ie8 .x-tab-strip-top { + padding-top: 0; +} +.ext-ie8 .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + top:3px; +} +.ext-border-box .ext-ie8 .x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + top:4px; +} +.ext-ie8 .x-tab-strip-bottom .x-tab-right{ + top:0; +} + + +.x-tab-strip-top .x-tab-strip-active .x-tab-right span.x-tab-strip-text { + padding-bottom:5px; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + margin-top:-1px; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right span.x-tab-strip-text { + padding-top:5px; +} + +.x-tab-strip-top .x-tab-right { + background: transparent no-repeat 0 -51px; + padding-left:10px; +} + +.x-tab-strip-top .x-tab-left { + background: transparent no-repeat right -351px; + padding-right:10px; +} + +.x-tab-strip-top .x-tab-strip-inner { + background: transparent repeat-x 0 -201px; +} + +.x-tab-strip-top .x-tab-strip-over .x-tab-right { + background-position:0 -101px; +} + +.x-tab-strip-top .x-tab-strip-over .x-tab-left { + background-position:right -401px; +} + +.x-tab-strip-top .x-tab-strip-over .x-tab-strip-inner { + background-position:0 -251px; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-right { + background-position: 0 0; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-left { + background-position: right -301px; +} + +.x-tab-strip-top .x-tab-strip-active .x-tab-strip-inner { + background-position: 0 -151px; +} + +.x-tab-strip-bottom .x-tab-right { + background: no-repeat bottom right; +} + +.x-tab-strip-bottom .x-tab-left { + background: no-repeat bottom left; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background: no-repeat bottom right; +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background: no-repeat bottom left; +} + +.x-tab-strip-bottom .x-tab-left { + margin-right: 3px; + padding:0 10px; +} + +.x-tab-strip-bottom .x-tab-right { + padding:0; +} + +.x-tab-strip .x-tab-strip-close { + display:none; +} + +.x-tab-strip-closable { + position:relative; +} + +.x-tab-strip-closable .x-tab-left { + padding-right:19px; +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + opacity:.6; + -moz-opacity:.6; + background-repeat:no-repeat; + display:block; + width:11px; + height:11px; + position:absolute; + top:3px; + right:3px; + cursor:pointer; + z-index:2; +} + +.x-tab-strip .x-tab-strip-active a.x-tab-strip-close { + opacity:.8; + -moz-opacity:.8; +} +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{ + opacity:1; + -moz-opacity:1; +} + +.x-tab-panel-body { + border: 1px solid; +} + +.x-tab-panel-body-top { + border-top: 0 none; +} + +.x-tab-panel-body-bottom { + border-bottom: 0 none; +} + +.x-tab-scroller-left { + background: transparent no-repeat -18px 0; + border-bottom: 1px solid; + width:18px; + position:absolute; + left:0; + top:0; + z-index:10; + cursor:pointer; +} +.x-tab-scroller-left-over { + background-position: 0 0; +} + +.x-tab-scroller-left-disabled { + background-position: -18px 0; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); + cursor:default; +} + +.x-tab-scroller-right { + background: transparent no-repeat 0 0; + border-bottom: 1px solid; + width:18px; + position:absolute; + right:0; + top:0; + z-index:10; + cursor:pointer; +} + +.x-tab-scroller-right-over { + background-position: -18px 0; +} + +.x-tab-scroller-right-disabled { + background-position: 0 0; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); + cursor:default; +} + +.x-tab-scrolling-bottom .x-tab-scroller-left, .x-tab-scrolling-bottom .x-tab-scroller-right{ + margin-top: 1px; +} + +.x-tab-scrolling .x-tab-strip-wrap { + margin-left:18px; + margin-right:18px; +} + +.x-tab-scrolling { + position:relative; +} + +.x-tab-panel-bbar .x-toolbar { + border:1px solid; + border-top:0 none; + overflow:hidden; + padding:2px; +} + +.x-tab-panel-tbar .x-toolbar { + border:1px solid; + border-top:0 none; + overflow:hidden; + padding:2px; +}/* all fields */ +.x-form-field{ + margin: 0 0 0 0; +} + +.ext-webkit *:focus{ + outline: none !important; +} + +/* ---- text fields ---- */ +.x-form-text, textarea.x-form-field{ + padding:1px 3px; + background:repeat-x 0 0; + border:1px solid; +} + +textarea.x-form-field { + padding:2px 3px; +} + +.x-form-text, .ext-ie .x-form-file { + height:22px; + line-height:18px; + vertical-align:middle; +} + +.ext-ie6 .x-form-text, .ext-ie7 .x-form-text { + margin:-1px 0; /* ie bogus margin bug */ + height:22px; /* ie quirks */ + line-height:18px; +} + +.ext-ie6 .x-form-field-wrap .x-form-file-btn, .ext-ie7 .x-form-field-wrap .x-form-file-btn { + top: -1px; /* because of all these margin hacks, these buttons are off by one pixel in IE6,7 */ +} + +.ext-ie6 textarea.x-form-field, .ext-ie7 textarea.x-form-field { + margin:-1px 0; /* ie bogus margin bug */ +} + +.ext-strict .x-form-text { + height:18px; +} + +.ext-safari.ext-mac textarea.x-form-field { + margin-bottom:-2px; /* another bogus margin bug, safari/mac only */ +} + +/* +.ext-strict .ext-ie8 .x-form-text, .ext-strict .ext-ie8 textarea.x-form-field { + margin-bottom: 1px; +} +*/ + +.ext-gecko .x-form-text , .ext-ie8 .x-form-text { + padding-top:2px; /* FF won't center the text vertically */ + padding-bottom:0; +} + +.ext-ie6 .x-form-composite .x-form-text.x-box-item, .ext-ie7 .x-form-composite .x-form-text.x-box-item { + margin: 0 !important; /* clear ie bogus margin bug fix */ +} + +textarea { + resize: none; /* Disable browser resizable textarea */ +} + +/* select boxes */ +.x-form-select-one { + height:20px; + line-height:18px; + vertical-align:middle; + border: 1px solid; +} + +/* multi select boxes */ + +/* --- TODO --- */ + +/* 2.0.2 style */ +.x-form-check-wrap { + line-height:18px; + height: auto; +} + +.ext-ie .x-form-check-wrap input { + width:15px; + height:15px; +} + +.x-form-check-wrap input{ + vertical-align: bottom; +} + +.x-editor .x-form-check-wrap { + padding:3px; +} + +.x-editor .x-form-checkbox { + height:13px; +} + +.x-form-check-group-label { + border-bottom: 1px solid; + margin-bottom: 5px; + padding-left: 3px !important; + float: none !important; +} + +/* wrapped fields and triggers */ +.x-form-field-wrap .x-form-trigger{ + width:17px; + height:21px; + border:0; + background:transparent no-repeat 0 0; + cursor:pointer; + border-bottom: 1px solid; + position:absolute; + top:0; +} + +.x-form-field-wrap .x-form-date-trigger, .x-form-field-wrap .x-form-clear-trigger, .x-form-field-wrap .x-form-search-trigger{ + cursor:pointer; +} + +.x-form-field-wrap .x-form-twin-triggers .x-form-trigger{ + position:static; + top:auto; + vertical-align:top; +} + +.x-form-field-wrap { + position:relative; + left:0;top:0; + text-align: left; + zoom:1; + white-space: nowrap; +} + +.ext-strict .ext-ie8 .x-toolbar-cell .x-form-field-trigger-wrap .x-form-trigger { + right: 0; /* IE8 Strict mode trigger bug */ +} + +.x-form-field-wrap .x-form-trigger-over{ + background-position:-17px 0; +} + +.x-form-field-wrap .x-form-trigger-click{ + background-position:-34px 0; +} + +.x-trigger-wrap-focus .x-form-trigger{ + background-position:-51px 0; +} + +.x-trigger-wrap-focus .x-form-trigger-over{ + background-position:-68px 0; +} + +.x-trigger-wrap-focus .x-form-trigger-click{ + background-position:-85px 0; +} + +.x-trigger-wrap-focus .x-form-trigger{ + border-bottom: 1px solid; +} + +.x-item-disabled .x-form-trigger-over{ + background-position:0 0 !important; + border-bottom: 1px solid; +} + +.x-item-disabled .x-form-trigger-click{ + background-position:0 0 !important; + border-bottom: 1px solid; +} + +.x-trigger-noedit{ + cursor:pointer; +} + +/* field focus style */ +.x-form-focus, textarea.x-form-focus{ + border: 1px solid; +} + +/* invalid fields */ +.x-form-invalid, textarea.x-form-invalid{ + background:repeat-x bottom; + border: 1px solid; +} + +.x-form-inner-invalid, textarea.x-form-inner-invalid{ + background:repeat-x bottom; +} + +/* editors */ +.x-editor { + visibility:hidden; + padding:0; + margin:0; +} + +.x-form-grow-sizer { + left: -10000px; + padding: 8px 3px; + position: absolute; + visibility:hidden; + top: -10000px; + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; + zoom:1; +} + +.x-form-grow-sizer p { + margin:0 !important; + border:0 none !important; + padding:0 !important; +} + +/* Form Items CSS */ + +.x-form-item { + display:block; + margin-bottom:4px; + zoom:1; +} + +.x-form-item label.x-form-item-label { + display:block; + float:left; + width:100px; + padding:3px; + padding-left:0; + clear:left; + z-index:2; + position:relative; +} + +.x-form-element { + padding-left:105px; + position:relative; +} + +.x-form-invalid-msg { + padding:2px; + padding-left:18px; + background: transparent no-repeat 0 2px; + line-height:16px; + width:200px; +} + +.x-form-label-left label.x-form-item-label { + text-align:left; +} + +.x-form-label-right label.x-form-item-label { + text-align:right; +} + +.x-form-label-top .x-form-item label.x-form-item-label { + width:auto; + float:none; + clear:none; + display:inline; + margin-bottom:4px; + position:static; +} + +.x-form-label-top .x-form-element { + padding-left:0; + padding-top:4px; +} + +.x-form-label-top .x-form-item { + padding-bottom:4px; +} + +/* Editor small font for grid, toolbar and tree */ +.x-small-editor .x-form-text { + height:20px; + line-height:16px; + vertical-align:middle; +} + +.ext-ie6 .x-small-editor .x-form-text, .ext-ie7 .x-small-editor .x-form-text { + margin-top:-1px !important; /* ie bogus margin bug */ + margin-bottom:-1px !important; + height:20px !important; /* ie quirks */ + line-height:16px !important; +} + +.ext-strict .x-small-editor .x-form-text { + height:16px !important; +} + +.ext-ie6 .x-small-editor .x-form-text, .ext-ie7 .x-small-editor .x-form-text { + height:20px; + line-height:16px; +} + +.ext-border-box .x-small-editor .x-form-text { + height:20px; +} + +.x-small-editor .x-form-select-one { + height:20px; + line-height:16px; + vertical-align:middle; +} + +.x-small-editor .x-form-num-field { + text-align:right; +} + +.x-small-editor .x-form-field-wrap .x-form-trigger{ + height:19px; +} + +.ext-webkit .x-small-editor .x-form-text{padding-top:3px;font-size:100%;} + +.x-form-clear { + clear:both; + height:0; + overflow:hidden; + line-height:0; + font-size:0; +} +.x-form-clear-left { + clear:left; + height:0; + overflow:hidden; + line-height:0; + font-size:0; +} + +.ext-ie6 .x-form-check-wrap input, .ext-border-box .x-form-check-wrap input{ + margin-top: 3px; +} + +.x-form-cb-label { + position: relative; + margin-left:4px; + top: 2px; +} + +.ext-ie .x-form-cb-label{ + top: 1px; +} + +.ext-ie6 .x-form-cb-label, .ext-border-box .x-form-cb-label{ + top: 3px; +} + +.x-form-display-field{ + padding-top: 2px; +} + +.ext-gecko .x-form-display-field, .ext-strict .ext-ie7 .x-form-display-field{ + padding-top: 1px; +} + +.ext-ie .x-form-display-field{ + padding-top: 3px; +} + +.ext-strict .ext-ie8 .x-form-display-field{ + padding-top: 0; +} + +.x-form-column { + float:left; + padding:0; + margin:0; + width:48%; + overflow:hidden; + zoom:1; +} + +/* buttons */ +.x-form .x-form-btns-ct .x-btn{ + float:right; + clear:none; +} + +.x-form .x-form-btns-ct .x-form-btns td { + border:0; + padding:0; +} + +.x-form .x-form-btns-ct .x-form-btns-right table{ + float:right; + clear:none; +} + +.x-form .x-form-btns-ct .x-form-btns-left table{ + float:left; + clear:none; +} + +.x-form .x-form-btns-ct .x-form-btns-center{ + text-align:center; /*ie*/ +} + +.x-form .x-form-btns-ct .x-form-btns-center table{ + margin:0 auto; /*everyone else*/ +} + +.x-form .x-form-btns-ct table td.x-form-btn-td{ + padding:3px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-left{ + background-position:0 -147px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-right{ + background-position:0 -168px; +} + +.x-form .x-form-btns-ct .x-btn-focus .x-btn-center{ + background-position:0 -189px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-center{ + background-position:0 -126px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-right{ + background-position:0 -84px; +} + +.x-form .x-form-btns-ct .x-btn-click .x-btn-left{ + background-position:0 -63px; +} + +.x-form-invalid-icon { + width:16px; + height:18px; + visibility:hidden; + position:absolute; + left:0; + top:0; + display:block; + background:transparent no-repeat 0 2px; +} + +/* fieldsets */ +.x-fieldset { + border:1px solid; + padding:10px; + margin-bottom:10px; + display:block; /* preserve margins in IE */ +} + +/* make top of checkbox/tools visible in webkit */ +.ext-webkit .x-fieldset-header { + padding-top: 1px; +} + +.ext-ie .x-fieldset legend { + margin-bottom:10px; +} + +.ext-ie .x-fieldset { + padding-top: 0; + padding-bottom:10px; +} + +.x-fieldset legend .x-tool-toggle { + margin-right:3px; + margin-left:0; + float:left !important; +} + +.x-fieldset legend input { + margin-right:3px; + float:left !important; + height:13px; + width:13px; +} + +fieldset.x-panel-collapsed { + padding-bottom:0 !important; + border-width: 1px 1px 0 1px !important; + border-left-color: transparent; + border-right-color: transparent; +} + +.ext-ie6 fieldset.x-panel-collapsed{ + padding-bottom:0 !important; + border-width: 1px 0 0 0 !important; + margin-left: 1px; + margin-right: 1px; +} + +fieldset.x-panel-collapsed .x-fieldset-bwrap { + visibility:hidden; + position:absolute; + left:-1000px; + top:-1000px; +} + +.ext-ie .x-fieldset-bwrap { + zoom:1; +} + +.x-fieldset-noborder { + border:0px none transparent; +} + +.x-fieldset-noborder legend { + margin-left:-3px; +} + +/* IE legend positioning bug */ +.ext-ie .x-fieldset-noborder legend { + position: relative; + margin-bottom:23px; +} +.ext-ie .x-fieldset-noborder legend span { + position: absolute; + left:16px; +} + +.ext-gecko .x-window-body .x-form-item { + -moz-outline: none; + outline: none; + overflow: auto; +} + +.ext-mac.ext-gecko .x-window-body .x-form-item { + overflow:hidden; +} + +.ext-gecko .x-form-item { + -moz-outline: none; + outline: none; +} + +.x-hide-label label.x-form-item-label { + display:none; +} + +.x-hide-label .x-form-element { + padding-left: 0 !important; +} + +.x-form-label-top .x-hide-label label.x-form-item-label{ + display: none; +} + +.x-fieldset { + overflow:hidden; +} + +.x-fieldset-bwrap { + overflow:hidden; + zoom:1; +} + +.x-fieldset-body { + overflow:hidden; +} +.x-btn{ + cursor:pointer; + white-space: nowrap; +} + +.x-btn button{ + border:0 none; + background-color:transparent; + padding-left:3px; + padding-right:3px; + cursor:pointer; + margin:0; + overflow:visible; + width:auto; + -moz-outline:0 none; + outline:0 none; +} + +* html .ext-ie .x-btn button { + width:1px; +} + +.ext-gecko .x-btn button, .ext-webkit .x-btn button { + padding-left:0; + padding-right:0; +} + +.ext-gecko .x-btn button::-moz-focus-inner { + padding:0; +} + +.ext-ie .x-btn button { + padding-top:2px; +} + +.x-btn td { + padding:0 !important; +} + +.x-btn-text { + cursor:pointer; + white-space: nowrap; + padding:0; +} + +/* icon placement and sizing styles */ + +/* Only text */ +.x-btn-noicon .x-btn-small .x-btn-text{ + height: 16px; +} + +.x-btn-noicon .x-btn-medium .x-btn-text{ + height: 24px; +} + +.x-btn-noicon .x-btn-large .x-btn-text{ + height: 32px; +} + +/* Only icons */ +.x-btn-icon .x-btn-text{ + background-position: center; + background-repeat: no-repeat; +} + +.x-btn-icon .x-btn-small .x-btn-text{ + height: 16px; + width: 16px; +} + +.x-btn-icon .x-btn-medium .x-btn-text{ + height: 24px; + width: 24px; +} + +.x-btn-icon .x-btn-large .x-btn-text{ + height: 32px; + width: 32px; +} + +/* Icons and text */ +/* left */ +.x-btn-text-icon .x-btn-icon-small-left .x-btn-text{ + background-position: 0 center; + background-repeat: no-repeat; + padding-left:18px; + height:16px; +} + +.x-btn-text-icon .x-btn-icon-medium-left .x-btn-text{ + background-position: 0 center; + background-repeat: no-repeat; + padding-left:26px; + height:24px; +} + +.x-btn-text-icon .x-btn-icon-large-left .x-btn-text{ + background-position: 0 center; + background-repeat: no-repeat; + padding-left:34px; + height:32px; +} + +/* top */ +.x-btn-text-icon .x-btn-icon-small-top .x-btn-text{ + background-position: center 0; + background-repeat: no-repeat; + padding-top:18px; +} + +.x-btn-text-icon .x-btn-icon-medium-top .x-btn-text{ + background-position: center 0; + background-repeat: no-repeat; + padding-top:26px; +} + +.x-btn-text-icon .x-btn-icon-large-top .x-btn-text{ + background-position: center 0; + background-repeat: no-repeat; + padding-top:34px; +} + +/* right */ +.x-btn-text-icon .x-btn-icon-small-right .x-btn-text{ + background-position: right center; + background-repeat: no-repeat; + padding-right:18px; + height:16px; +} + +.x-btn-text-icon .x-btn-icon-medium-right .x-btn-text{ + background-position: right center; + background-repeat: no-repeat; + padding-right:26px; + height:24px; +} + +.x-btn-text-icon .x-btn-icon-large-right .x-btn-text{ + background-position: right center; + background-repeat: no-repeat; + padding-right:34px; + height:32px; +} + +/* bottom */ +.x-btn-text-icon .x-btn-icon-small-bottom .x-btn-text{ + background-position: center bottom; + background-repeat: no-repeat; + padding-bottom:18px; +} + +.x-btn-text-icon .x-btn-icon-medium-bottom .x-btn-text{ + background-position: center bottom; + background-repeat: no-repeat; + padding-bottom:26px; +} + +.x-btn-text-icon .x-btn-icon-large-bottom .x-btn-text{ + background-position: center bottom; + background-repeat: no-repeat; + padding-bottom:34px; +} + +/* background positioning */ +.x-btn-tr i, .x-btn-tl i, .x-btn-mr i, .x-btn-ml i, .x-btn-br i, .x-btn-bl i{ + font-size:1px; + line-height:1px; + width:3px; + display:block; + overflow:hidden; +} + +.x-btn-tr i, .x-btn-tl i, .x-btn-br i, .x-btn-bl i{ + height:3px; +} + +.x-btn-tl{ + width:3px; + height:3px; + background:no-repeat 0 0; +} +.x-btn-tr{ + width:3px; + height:3px; + background:no-repeat -3px 0; +} +.x-btn-tc{ + height:3px; + background:repeat-x 0 -6px; +} + +.x-btn-ml{ + width:3px; + background:no-repeat 0 -24px; +} +.x-btn-mr{ + width:3px; + background:no-repeat -3px -24px; +} + +.x-btn-mc{ + background:repeat-x 0 -1096px; + vertical-align: middle; + text-align:center; + padding:0 5px; + cursor:pointer; + white-space:nowrap; +} + +/* Fixes an issue with the button height */ +.ext-strict .ext-ie6 .x-btn-mc, .ext-strict .ext-ie7 .x-btn-mc { + height: 100%; +} + +.x-btn-bl{ + width:3px; + height:3px; + background:no-repeat 0 -3px; +} + +.x-btn-br{ + width:3px; + height:3px; + background:no-repeat -3px -3px; +} + +.x-btn-bc{ + height:3px; + background:repeat-x 0 -15px; +} + +.x-btn-over .x-btn-tl{ + background-position: -6px 0; +} + +.x-btn-over .x-btn-tr{ + background-position: -9px 0; +} + +.x-btn-over .x-btn-tc{ + background-position: 0 -9px; +} + +.x-btn-over .x-btn-ml{ + background-position: -6px -24px; +} + +.x-btn-over .x-btn-mr{ + background-position: -9px -24px; +} + +.x-btn-over .x-btn-mc{ + background-position: 0 -2168px; +} + +.x-btn-over .x-btn-bl{ + background-position: -6px -3px; +} + +.x-btn-over .x-btn-br{ + background-position: -9px -3px; +} + +.x-btn-over .x-btn-bc{ + background-position: 0 -18px; +} + +.x-btn-click .x-btn-tl, .x-btn-menu-active .x-btn-tl, .x-btn-pressed .x-btn-tl{ + background-position: -12px 0; +} + +.x-btn-click .x-btn-tr, .x-btn-menu-active .x-btn-tr, .x-btn-pressed .x-btn-tr{ + background-position: -15px 0; +} + +.x-btn-click .x-btn-tc, .x-btn-menu-active .x-btn-tc, .x-btn-pressed .x-btn-tc{ + background-position: 0 -12px; +} + +.x-btn-click .x-btn-ml, .x-btn-menu-active .x-btn-ml, .x-btn-pressed .x-btn-ml{ + background-position: -12px -24px; +} + +.x-btn-click .x-btn-mr, .x-btn-menu-active .x-btn-mr, .x-btn-pressed .x-btn-mr{ + background-position: -15px -24px; +} + +.x-btn-click .x-btn-mc, .x-btn-menu-active .x-btn-mc, .x-btn-pressed .x-btn-mc{ + background-position: 0 -3240px; +} + +.x-btn-click .x-btn-bl, .x-btn-menu-active .x-btn-bl, .x-btn-pressed .x-btn-bl{ + background-position: -12px -3px; +} + +.x-btn-click .x-btn-br, .x-btn-menu-active .x-btn-br, .x-btn-pressed .x-btn-br{ + background-position: -15px -3px; +} + +.x-btn-click .x-btn-bc, .x-btn-menu-active .x-btn-bc, .x-btn-pressed .x-btn-bc{ + background-position: 0 -21px; +} + +.x-btn-disabled *{ + cursor:default !important; +} + + +/* With a menu arrow */ +/* right */ +.x-btn-mc em.x-btn-arrow { + display:block; + background:transparent no-repeat right center; + padding-right:10px; +} + +.x-btn-mc em.x-btn-split { + display:block; + background:transparent no-repeat right center; + padding-right:14px; +} + +/* bottom */ +.x-btn-mc em.x-btn-arrow-bottom { + display:block; + background:transparent no-repeat center bottom; + padding-bottom:14px; +} + +.x-btn-mc em.x-btn-split-bottom { + display:block; + background:transparent no-repeat center bottom; + padding-bottom:14px; +} + +/* height adjustment class */ +.x-btn-as-arrow .x-btn-mc em { + display:block; + background-color:transparent; + padding-bottom:14px; +} + +/* groups */ +.x-btn-group { + padding:1px; +} + +.x-btn-group-header { + padding:2px; + text-align:center; +} + +.x-btn-group-tc { + background: transparent repeat-x 0 0; + overflow:hidden; +} + +.x-btn-group-tl { + background: transparent no-repeat 0 0; + padding-left:3px; + zoom:1; +} + +.x-btn-group-tr { + background: transparent no-repeat right 0; + zoom:1; + padding-right:3px; +} + +.x-btn-group-bc { + background: transparent repeat-x 0 bottom; + zoom:1; +} + +.x-btn-group-bc .x-panel-footer { + zoom:1; +} + +.x-btn-group-bl { + background: transparent no-repeat 0 bottom; + padding-left:3px; + zoom:1; +} + +.x-btn-group-br { + background: transparent no-repeat right bottom; + padding-right:3px; + zoom:1; +} + +.x-btn-group-mc { + border:0 none; + padding:1px 0 0 0; + margin:0; +} + +.x-btn-group-mc .x-btn-group-body { + background-color:transparent; + border: 0 none; +} + +.x-btn-group-ml { + background: transparent repeat-y 0 0; + padding-left:3px; + zoom:1; +} + +.x-btn-group-mr { + background: transparent repeat-y right 0; + padding-right:3px; + zoom:1; +} + +.x-btn-group-bc .x-btn-group-footer { + padding-bottom:6px; +} + +.x-panel-nofooter .x-btn-group-bc { + height:3px; + font-size:0; + line-height:0; +} + +.x-btn-group-bwrap { + overflow:hidden; + zoom:1; +} + +.x-btn-group-body { + overflow:hidden; + zoom:1; +} + +.x-btn-group-notitle .x-btn-group-tc { + background: transparent repeat-x 0 0; + overflow:hidden; + height:2px; +}.x-toolbar{ + border-style:solid; + border-width:0 0 1px 0; + display: block; + padding:2px; + background:repeat-x top left; + position:relative; + left:0; + top:0; + zoom:1; + overflow:hidden; +} + +.x-toolbar-left { + width: 100%; +} + +.x-toolbar .x-item-disabled .x-btn-icon { + opacity: .35; + -moz-opacity: .35; + filter: alpha(opacity=35); +} + +.x-toolbar td { + vertical-align:middle; +} + +.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{ + white-space: nowrap; +} + +.x-toolbar .x-item-disabled { + cursor:default; + opacity:.6; + -moz-opacity:.6; + filter:alpha(opacity=60); +} + +.x-toolbar .x-item-disabled * { + cursor:default; +} + +.x-toolbar .x-toolbar-cell { + vertical-align:middle; +} + +.x-toolbar .x-btn-tl, .x-toolbar .x-btn-tr, .x-toolbar .x-btn-tc, .x-toolbar .x-btn-ml, .x-toolbar .x-btn-mr, +.x-toolbar .x-btn-mc, .x-toolbar .x-btn-bl, .x-toolbar .x-btn-br, .x-toolbar .x-btn-bc +{ + background-position: 500px 500px; +} + +/* These rules are duplicated from button.css to give priority of x-toolbar rules above */ +.x-toolbar .x-btn-over .x-btn-tl{ + background-position: -6px 0; +} + +.x-toolbar .x-btn-over .x-btn-tr{ + background-position: -9px 0; +} + +.x-toolbar .x-btn-over .x-btn-tc{ + background-position: 0 -9px; +} + +.x-toolbar .x-btn-over .x-btn-ml{ + background-position: -6px -24px; +} + +.x-toolbar .x-btn-over .x-btn-mr{ + background-position: -9px -24px; +} + +.x-toolbar .x-btn-over .x-btn-mc{ + background-position: 0 -2168px; +} + +.x-toolbar .x-btn-over .x-btn-bl{ + background-position: -6px -3px; +} + +.x-toolbar .x-btn-over .x-btn-br{ + background-position: -9px -3px; +} + +.x-toolbar .x-btn-over .x-btn-bc{ + background-position: 0 -18px; +} + +.x-toolbar .x-btn-click .x-btn-tl, .x-toolbar .x-btn-menu-active .x-btn-tl, .x-toolbar .x-btn-pressed .x-btn-tl{ + background-position: -12px 0; +} + +.x-toolbar .x-btn-click .x-btn-tr, .x-toolbar .x-btn-menu-active .x-btn-tr, .x-toolbar .x-btn-pressed .x-btn-tr{ + background-position: -15px 0; +} + +.x-toolbar .x-btn-click .x-btn-tc, .x-toolbar .x-btn-menu-active .x-btn-tc, .x-toolbar .x-btn-pressed .x-btn-tc{ + background-position: 0 -12px; +} + +.x-toolbar .x-btn-click .x-btn-ml, .x-toolbar .x-btn-menu-active .x-btn-ml, .x-toolbar .x-btn-pressed .x-btn-ml{ + background-position: -12px -24px; +} + +.x-toolbar .x-btn-click .x-btn-mr, .x-toolbar .x-btn-menu-active .x-btn-mr, .x-toolbar .x-btn-pressed .x-btn-mr{ + background-position: -15px -24px; +} + +.x-toolbar .x-btn-click .x-btn-mc, .x-toolbar .x-btn-menu-active .x-btn-mc, .x-toolbar .x-btn-pressed .x-btn-mc{ + background-position: 0 -3240px; +} + +.x-toolbar .x-btn-click .x-btn-bl, .x-toolbar .x-btn-menu-active .x-btn-bl, .x-toolbar .x-btn-pressed .x-btn-bl{ + background-position: -12px -3px; +} + +.x-toolbar .x-btn-click .x-btn-br, .x-toolbar .x-btn-menu-active .x-btn-br, .x-toolbar .x-btn-pressed .x-btn-br{ + background-position: -15px -3px; +} + +.x-toolbar .x-btn-click .x-btn-bc, .x-toolbar .x-btn-menu-active .x-btn-bc, .x-toolbar .x-btn-pressed .x-btn-bc{ + background-position: 0 -21px; +} + +.x-toolbar div.xtb-text{ + padding:2px 2px 0; + line-height:16px; + display:block; +} + +.x-toolbar .xtb-sep { + background-position: center; + background-repeat: no-repeat; + display: block; + font-size: 1px; + height: 16px; + width:4px; + overflow: hidden; + cursor:default; + margin: 0 2px 0; + border:0; +} + +.x-toolbar .xtb-spacer { + width:2px; +} + +/* Paging Toolbar */ +.x-tbar-page-number{ + width:30px; + height:14px; +} + +.ext-ie .x-tbar-page-number{ + margin-top: 2px; +} + +.x-paging-info { + position:absolute; + top:5px; + right: 8px; +} + +/* floating */ +.x-toolbar-ct { + width:100%; +} + +.x-toolbar-right td { + text-align: center; +} + +.x-panel-tbar, .x-panel-bbar, .x-window-tbar, .x-window-bbar, .x-tab-panel-tbar, .x-tab-panel-bbar, .x-plain-tbar, .x-plain-bbar { + overflow:hidden; + zoom:1; +} + +.x-toolbar-more .x-btn-small .x-btn-text{ + height: 16px; + width: 12px; +} + +.x-toolbar-more em.x-btn-arrow { + display:inline; + background-color:transparent; + padding-right:0; +} + +.x-toolbar-more .x-btn-mc em.x-btn-arrow { + background-image: none; +} + +div.x-toolbar-no-items { + color:gray !important; + padding:5px 10px !important; +} + +/* fix ie toolbar form items */ +.ext-border-box .x-toolbar-cell .x-form-text { + margin-bottom:-1px !important; +} + +.ext-border-box .x-toolbar-cell .x-form-field-wrap .x-form-text { + margin:0 !important; +} + +.ext-ie .x-toolbar-cell .x-form-field-wrap { + height:21px; +} + +.ext-ie .x-toolbar-cell .x-form-text { + position:relative; + top:-1px; +} + +.ext-strict .ext-ie8 .x-toolbar-cell .x-form-field-trigger-wrap .x-form-text, .ext-strict .ext-ie .x-toolbar-cell .x-form-text { + top: 0px; +} + +.x-toolbar-right td .x-form-field-trigger-wrap{ + text-align: left; +} + +.x-toolbar-cell .x-form-checkbox, .x-toolbar-cell .x-form-radio{ + margin-top: 5px; +} + +.x-toolbar-cell .x-form-cb-label{ + vertical-align: bottom; + top: 1px; +} + +.ext-ie .x-toolbar-cell .x-form-checkbox, .ext-ie .x-toolbar-cell .x-form-radio{ + margin-top: 4px; +} + +.ext-ie .x-toolbar-cell .x-form-cb-label{ + top: 0; +} +/* Grid3 styles */ +.x-grid3 { + position:relative; + overflow:hidden; +} + +.x-grid-panel .x-panel-body { + overflow:hidden !important; +} + +.x-grid-panel .x-panel-mc .x-panel-body { + border:1px solid; +} + +.x-grid3 table { + table-layout:fixed; +} + +.x-grid3-viewport{ + overflow:hidden; +} + +.x-grid3-hd-row td, .x-grid3-row td, .x-grid3-summary-row td{ + -moz-outline: none; + outline: none; + -moz-user-focus: normal; +} + +.x-grid3-row td, .x-grid3-summary-row td { + line-height:13px; + vertical-align: top; + padding-left:1px; + padding-right:1px; + -moz-user-select: none; + -khtml-user-select:none; + -webkit-user-select:ignore; +} + +.x-grid3-cell{ + -moz-user-select: none; + -khtml-user-select:none; + -webkit-user-select:ignore; +} + +.x-grid3-hd-row td { + line-height:15px; + vertical-align:middle; + border-left:1px solid; + border-right:1px solid; +} + +.x-grid3-hd-row .x-grid3-marker-hd { + padding:3px; +} + +.x-grid3-row .x-grid3-marker { + padding:3px; +} + +.x-grid3-cell-inner, .x-grid3-hd-inner{ + overflow:hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + padding:3px 3px 3px 5px; + white-space: nowrap; +} + +/* ActionColumn, reduce padding to accommodate 16x16 icons in normal row height */ +.x-action-col-cell .x-grid3-cell-inner { + padding-top: 1px; + padding-bottom: 1px; +} + +.x-action-col-icon { + cursor: pointer; +} + +.x-grid3-hd-inner { + position:relative; + cursor:inherit; + padding:4px 3px 4px 5px; +} + +.x-grid3-row-body { + white-space:normal; +} + +.x-grid3-body-cell { + -moz-outline:0 none; + outline:0 none; +} + +/* IE Quirks to clip */ +.ext-ie .x-grid3-cell-inner, .ext-ie .x-grid3-hd-inner{ + width:100%; +} + +/* reverse above in strict mode */ +.ext-strict .x-grid3-cell-inner, .ext-strict .x-grid3-hd-inner{ + width:auto; +} + +.x-grid-row-loading { + background: no-repeat center center; +} + +.x-grid-page { + overflow:hidden; +} + +.x-grid3-row { + cursor: default; + border: 1px solid; + width:100%; +} + +.x-grid3-row-over { + border:1px solid; + background: repeat-x left top; +} + +.x-grid3-resize-proxy { + width:1px; + left:0; + cursor: e-resize; + cursor: col-resize; + position:absolute; + top:0; + height:100px; + overflow:hidden; + visibility:hidden; + border:0 none; + z-index:7; +} + +.x-grid3-resize-marker { + width:1px; + left:0; + position:absolute; + top:0; + height:100px; + overflow:hidden; + visibility:hidden; + border:0 none; + z-index:7; +} + +.x-grid3-focus { + position:absolute; + left:0; + top:0; + width:1px; + height:1px; + line-height:1px; + font-size:1px; + -moz-outline:0 none; + outline:0 none; + -moz-user-select: text; + -khtml-user-select: text; + -webkit-user-select:ignore; +} + +/* header styles */ +.x-grid3-header{ + background: repeat-x 0 bottom; + cursor:default; + zoom:1; + padding:1px 0 0 0; +} + +.x-grid3-header-pop { + border-left:1px solid; + float:right; + clear:none; +} + +.x-grid3-header-pop-inner { + border-left:1px solid; + width:14px; + height:19px; + background: transparent no-repeat center center; +} + +.ext-ie .x-grid3-header-pop-inner { + width:15px; +} + +.ext-strict .x-grid3-header-pop-inner { + width:14px; +} + +.x-grid3-header-inner { + overflow:hidden; + zoom:1; + float:left; +} + +.x-grid3-header-offset { + padding-left:1px; + text-align: left; +} + +td.x-grid3-hd-over, td.sort-desc, td.sort-asc, td.x-grid3-hd-menu-open { + border-left:1px solid; + border-right:1px solid; +} + +td.x-grid3-hd-over .x-grid3-hd-inner, td.sort-desc .x-grid3-hd-inner, td.sort-asc .x-grid3-hd-inner, td.x-grid3-hd-menu-open .x-grid3-hd-inner { + background: repeat-x left bottom; + +} + +.x-grid3-sort-icon{ + background-repeat: no-repeat; + display: none; + height: 4px; + width: 13px; + margin-left:3px; + vertical-align: middle; +} + +.sort-asc .x-grid3-sort-icon, .sort-desc .x-grid3-sort-icon { + display: inline; +} + +/* Header position fixes for IE strict mode */ +.ext-strict .ext-ie .x-grid3-header-inner, .ext-strict .ext-ie6 .x-grid3-hd { + position:relative; +} + +.ext-strict .ext-ie6 .x-grid3-hd-inner{ + position:static; +} + +/* Body Styles */ +.x-grid3-body { + zoom:1; +} + +.x-grid3-scroller { + overflow:auto; + zoom:1; + position:relative; +} + +.x-grid3-cell-text, .x-grid3-hd-text { + display: block; + padding: 3px 5px 3px 5px; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select:ignore; +} + +.x-grid3-split { + background-position: center; + background-repeat: no-repeat; + cursor: e-resize; + cursor: col-resize; + display: block; + font-size: 1px; + height: 16px; + overflow: hidden; + position: absolute; + top: 2px; + width: 6px; + z-index: 3; +} + +/* Column Reorder DD */ +.x-dd-drag-proxy .x-grid3-hd-inner{ + background: repeat-x left bottom; + width:120px; + padding:3px; + border:1px solid; + overflow:hidden; +} + +.col-move-top, .col-move-bottom{ + width:9px; + height:9px; + position:absolute; + top:0; + line-height:1px; + font-size:1px; + overflow:hidden; + visibility:hidden; + z-index:20000; + background:transparent no-repeat left top; +} + +/* Selection Styles */ +.x-grid3-row-selected { + border:1px dotted; +} + +.x-grid3-locked td.x-grid3-row-marker, .x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker{ + background: repeat-x 0 bottom !important; + vertical-align:middle !important; + padding:0; + border-top:1px solid; + border-bottom:none !important; + border-right:1px solid !important; + text-align:center; +} + +.x-grid3-locked td.x-grid3-row-marker div, .x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div{ + padding:0 4px; + text-align:center; +} + +/* dirty cells */ +.x-grid3-dirty-cell { + background: transparent no-repeat 0 0; +} + +/* Grid Toolbars */ +.x-grid3-topbar, .x-grid3-bottombar{ + overflow:hidden; + display:none; + zoom:1; + position:relative; +} + +.x-grid3-topbar .x-toolbar{ + border-right:0 none; +} + +.x-grid3-bottombar .x-toolbar{ + border-right:0 none; + border-bottom:0 none; + border-top:1px solid; +} + +/* Props Grid Styles */ +.x-props-grid .x-grid3-cell{ + padding:1px; +} + +.x-props-grid .x-grid3-td-name .x-grid3-cell-inner{ + background:transparent repeat-y -16px !important; + padding-left:12px; +} + +.x-props-grid .x-grid3-body .x-grid3-td-name{ + padding:1px; + padding-right:0; + border:0 none; + border-right:1px solid; +} + +/* dd */ +.x-grid3-col-dd { + border:0 none; + padding:0; + background-color:transparent; +} + +.x-dd-drag-ghost .x-grid3-dd-wrap { + padding:1px 3px 3px 1px; +} + +.x-grid3-hd { + -moz-user-select:none; + -khtml-user-select:none; + -webkit-user-select:ignore; +} + +.x-grid3-hd-btn { + display:none; + position:absolute; + width:14px; + background:no-repeat left center; + right:0; + top:0; + z-index:2; + cursor:pointer; +} + +.x-grid3-hd-over .x-grid3-hd-btn, .x-grid3-hd-menu-open .x-grid3-hd-btn { + display:block; +} + +a.x-grid3-hd-btn:hover { + background-position:-14px center; +} + +/* Expanders */ +.x-grid3-body .x-grid3-td-expander { + background:transparent repeat-y right; +} + +.x-grid3-body .x-grid3-td-expander .x-grid3-cell-inner { + padding:0 !important; + height:100%; +} + +.x-grid3-row-expander { + width:100%; + height:18px; + background-position:4px 2px; + background-repeat:no-repeat; + background-color:transparent; +} + +.x-grid3-row-collapsed .x-grid3-row-expander { + background-position:4px 2px; +} + +.x-grid3-row-expanded .x-grid3-row-expander { + background-position:-21px 2px; +} + +.x-grid3-row-collapsed .x-grid3-row-body { + display:none !important; +} + +.x-grid3-row-expanded .x-grid3-row-body { + display:block !important; +} + +/* Checkers */ +.x-grid3-body .x-grid3-td-checker { + background:transparent repeat-y right; +} + +.x-grid3-body .x-grid3-td-checker .x-grid3-cell-inner, .x-grid3-header .x-grid3-td-checker .x-grid3-hd-inner { + padding:0 !important; + height:100%; +} + +.x-grid3-row-checker, .x-grid3-hd-checker { + width:100%; + height:18px; + background-position:2px 2px; + background-repeat:no-repeat; + background-color:transparent; +} + +.x-grid3-row .x-grid3-row-checker { + background-position:2px 2px; +} + +.x-grid3-row-selected .x-grid3-row-checker, .x-grid3-hd-checker-on .x-grid3-hd-checker,.x-grid3-row-checked .x-grid3-row-checker { + background-position:-23px 2px; +} + +.x-grid3-hd-checker { + background-position:2px 1px; +} + +.ext-border-box .x-grid3-hd-checker { + background-position:2px 3px; +} + +.x-grid3-hd-checker-on .x-grid3-hd-checker { + background-position:-23px 1px; +} + +.ext-border-box .x-grid3-hd-checker-on .x-grid3-hd-checker { + background-position:-23px 3px; +} + +/* Numberer */ +.x-grid3-body .x-grid3-td-numberer { + background:transparent repeat-y right; +} + +.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner { + padding:3px 5px 0 0 !important; + text-align:right; +} + +/* Row Icon */ + +.x-grid3-body .x-grid3-td-row-icon { + background:transparent repeat-y right; + vertical-align:top; + text-align:center; +} + +.x-grid3-body .x-grid3-td-row-icon .x-grid3-cell-inner { + padding:0 !important; + background-position:center center; + background-repeat:no-repeat; + width:16px; + height:16px; + margin-left:2px; + margin-top:3px; +} + +/* All specials */ +.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer, +.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker, +.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander { + background:transparent repeat-y right; +} + +.x-grid3-body .x-grid3-check-col-td .x-grid3-cell-inner { + padding: 1px 0 0 0 !important; +} + +.x-grid3-check-col { + width:100%; + height:16px; + background-position:center center; + background-repeat:no-repeat; + background-color:transparent; +} + +.x-grid3-check-col-on { + width:100%; + height:16px; + background-position:center center; + background-repeat:no-repeat; + background-color:transparent; +} + +/* Grouping classes */ +.x-grid-group, .x-grid-group-body, .x-grid-group-hd { + zoom:1; +} + +.x-grid-group-hd { + border-bottom: 2px solid; + cursor:pointer; + padding-top:6px; +} + +.x-grid-group-hd div.x-grid-group-title { + background:transparent no-repeat 3px 3px; + padding:4px 4px 4px 17px; +} + +.x-grid-group-collapsed .x-grid-group-body { + display:none; +} + +.ext-ie6 .x-grid3 .x-editor .x-form-text, .ext-ie7 .x-grid3 .x-editor .x-form-text { + position:relative; + top:-1px; +} + +.ext-ie .x-props-grid .x-editor .x-form-text { + position:static; + top:0; +} + +.x-grid-empty { + padding:10px; +} + +/* fix floating toolbar issue */ +.ext-ie7 .x-grid-panel .x-panel-bbar { + position:relative; +} + + +/* Reset position to static when Grid Panel has been framed */ +/* to resolve 'snapping' from top to bottom behavior. */ +/* @forumThread 86656 */ +.ext-ie7 .x-grid-panel .x-panel-mc .x-panel-bbar { + position: static; +} + +.ext-ie6 .x-grid3-header { + position: relative; +} + +/* Fix WebKit bug in Grids */ +.ext-webkit .x-grid-panel .x-panel-bwrap{ + -webkit-user-select:none; +} +.ext-webkit .x-tbar-page-number{ + -webkit-user-select:ignore; +} +/* end*/ + +/* column lines */ +.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell { + padding-right:0; + border-right:1px solid; +} +.x-pivotgrid .x-grid3-header-offset table { + width: 100%; + border-collapse: collapse; +} + +.x-pivotgrid .x-grid3-header-offset table td { + padding: 4px 3px 4px 5px; + text-align: center; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: 11px; + line-height: 13px; + font-family: tahoma; +} + +.x-pivotgrid .x-grid3-row-headers { + display: block; + float: left; +} + +.x-pivotgrid .x-grid3-row-headers table { + height: 100%; + width: 100%; + border-collapse: collapse; +} + +.x-pivotgrid .x-grid3-row-headers table td { + height: 18px; + padding: 2px 7px 0 0; + text-align: right; + text-overflow: ellipsis; + font-size: 11px; + font-family: tahoma; +} + +.ext-gecko .x-pivotgrid .x-grid3-row-headers table td { + height: 21px; +} + +.x-grid3-header-title { + top: 0%; + left: 0%; + position: absolute; + text-align: center; + vertical-align: middle; + font-family: tahoma; + font-size: 11px; + padding: auto 1px; + display: table-cell; +} + +.x-grid3-header-title span { + position: absolute; + top: 50%; + left: 0%; + width: 100%; + margin-top: -6px; +}.x-dd-drag-proxy{ + position:absolute; + left:0; + top:0; + visibility:hidden; + z-index:15000; +} + +.x-dd-drag-ghost{ + -moz-opacity: 0.85; + opacity:.85; + filter: alpha(opacity=85); + border: 1px solid; + padding:3px; + padding-left:20px; + white-space:nowrap; +} + +.x-dd-drag-repair .x-dd-drag-ghost{ + -moz-opacity: 0.4; + opacity:.4; + filter: alpha(opacity=40); + border:0 none; + padding:0; + background-color:transparent; +} + +.x-dd-drag-repair .x-dd-drop-icon{ + visibility:hidden; +} + +.x-dd-drop-icon{ + position:absolute; + top:3px; + left:3px; + display:block; + width:16px; + height:16px; + background-color:transparent; + background-position: center; + background-repeat: no-repeat; + z-index:1; +} + +.x-view-selector { + position:absolute; + left:0; + top:0; + width:0; + border:1px dotted; + opacity: .5; + -moz-opacity: .5; + filter:alpha(opacity=50); + zoom:1; +}.ext-strict .ext-ie .x-tree .x-panel-bwrap{ + position:relative; + overflow:hidden; +} + +.x-tree-icon, .x-tree-ec-icon, .x-tree-elbow-line, .x-tree-elbow, .x-tree-elbow-end, .x-tree-elbow-plus, .x-tree-elbow-minus, .x-tree-elbow-end-plus, .x-tree-elbow-end-minus{ + border: 0 none; + height: 18px; + margin: 0; + padding: 0; + vertical-align: top; + width: 16px; + background-repeat: no-repeat; +} + +.x-tree-node-collapsed .x-tree-node-icon, .x-tree-node-expanded .x-tree-node-icon, .x-tree-node-leaf .x-tree-node-icon{ + border: 0 none; + height: 18px; + margin: 0; + padding: 0; + vertical-align: top; + width: 16px; + background-position:center; + background-repeat: no-repeat; +} + +.ext-ie .x-tree-node-indent img, .ext-ie .x-tree-node-icon, .ext-ie .x-tree-ec-icon { + vertical-align: middle !important; +} + +.ext-strict .ext-ie8 .x-tree-node-indent img, .ext-strict .ext-ie8 .x-tree-node-icon, .ext-strict .ext-ie8 .x-tree-ec-icon { + vertical-align: top !important; +} + +/* checkboxes */ + +input.x-tree-node-cb { + margin-left:1px; + height: 19px; + vertical-align: bottom; +} + +.ext-ie input.x-tree-node-cb { + margin-left:0; + margin-top: 1px; + width: 16px; + height: 16px; + vertical-align: middle; +} + +.ext-strict .ext-ie8 input.x-tree-node-cb{ + margin: 1px 1px; + height: 14px; + vertical-align: bottom; +} + +.ext-strict .ext-ie8 input.x-tree-node-cb + a{ + vertical-align: bottom; +} + +.ext-opera input.x-tree-node-cb { + height: 14px; + vertical-align: middle; +} + +.x-tree-noicon .x-tree-node-icon{ + width:0; height:0; +} + +/* No line styles */ +.x-tree-no-lines .x-tree-elbow{ + background-color:transparent; +} + +.x-tree-no-lines .x-tree-elbow-end{ + background-color:transparent; +} + +.x-tree-no-lines .x-tree-elbow-line{ + background-color:transparent; +} + +/* Arrows */ +.x-tree-arrows .x-tree-elbow{ + background-color:transparent; +} + +.x-tree-arrows .x-tree-elbow-plus{ + background:transparent no-repeat 0 0; +} + +.x-tree-arrows .x-tree-elbow-minus{ + background:transparent no-repeat -16px 0; +} + +.x-tree-arrows .x-tree-elbow-end{ + background-color:transparent; +} + +.x-tree-arrows .x-tree-elbow-end-plus{ + background:transparent no-repeat 0 0; +} + +.x-tree-arrows .x-tree-elbow-end-minus{ + background:transparent no-repeat -16px 0; +} + +.x-tree-arrows .x-tree-elbow-line{ + background-color:transparent; +} + +.x-tree-arrows .x-tree-ec-over .x-tree-elbow-plus{ + background-position:-32px 0; +} + +.x-tree-arrows .x-tree-ec-over .x-tree-elbow-minus{ + background-position:-48px 0; +} + +.x-tree-arrows .x-tree-ec-over .x-tree-elbow-end-plus{ + background-position:-32px 0; +} + +.x-tree-arrows .x-tree-ec-over .x-tree-elbow-end-minus{ + background-position:-48px 0; +} + +.x-tree-elbow-plus, .x-tree-elbow-minus, .x-tree-elbow-end-plus, .x-tree-elbow-end-minus{ + cursor:pointer; +} + +.ext-ie ul.x-tree-node-ct{ + font-size:0; + line-height:0; + zoom:1; +} + +.x-tree-node{ + white-space: nowrap; +} + +.x-tree-node-el { + line-height:18px; + cursor:pointer; +} + +.x-tree-node a, .x-dd-drag-ghost a{ + text-decoration:none; + -khtml-user-select:none; + -moz-user-select:none; + -webkit-user-select:ignore; + -kthml-user-focus:normal; + -moz-user-focus:normal; + -moz-outline: 0 none; + outline:0 none; +} + +.x-tree-node a span, .x-dd-drag-ghost a span{ + text-decoration:none; + padding:1px 3px 1px 2px; +} + +.x-tree-node .x-tree-node-disabled .x-tree-node-icon{ + -moz-opacity: 0.5; + opacity:.5; + filter: alpha(opacity=50); +} + +.x-tree-node .x-tree-node-inline-icon{ + background-color:transparent; +} + +.x-tree-node a:hover, .x-dd-drag-ghost a:hover{ + text-decoration:none; +} + +.x-tree-node div.x-tree-drag-insert-below{ + border-bottom:1px dotted; +} + +.x-tree-node div.x-tree-drag-insert-above{ + border-top:1px dotted; +} + +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below{ + border-bottom:0 none; +} + +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above{ + border-top:0 none; +} + +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a{ + border-bottom:2px solid; +} + +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a{ + border-top:2px solid; +} + +.x-tree-node .x-tree-drag-append a span{ + border:1px dotted; +} + +.x-dd-drag-ghost .x-tree-node-indent, .x-dd-drag-ghost .x-tree-ec-icon{ + display:none !important; +} + +/* Fix for ie rootVisible:false issue */ +.x-tree-root-ct { + zoom:1; +} +.x-date-picker { + border: 1px solid; + border-top:0 none; + position:relative; +} + +.x-date-picker a { + -moz-outline:0 none; + outline:0 none; +} + +.x-date-inner, .x-date-inner td, .x-date-inner th{ + border-collapse:separate; +} + +.x-date-middle,.x-date-left,.x-date-right { + background: repeat-x 0 -83px; + overflow:hidden; +} + +.x-date-middle .x-btn-tc,.x-date-middle .x-btn-tl,.x-date-middle .x-btn-tr, +.x-date-middle .x-btn-mc,.x-date-middle .x-btn-ml,.x-date-middle .x-btn-mr, +.x-date-middle .x-btn-bc,.x-date-middle .x-btn-bl,.x-date-middle .x-btn-br{ + background:transparent !important; + vertical-align:middle; +} + +.x-date-middle .x-btn-mc em.x-btn-arrow { + background:transparent no-repeat right 0; +} + +.x-date-right, .x-date-left { + width:18px; +} + +.x-date-right{ + text-align:right; +} + +.x-date-middle { + padding-top:2px; + padding-bottom:2px; + width:130px; /* FF3 */ +} + +.x-date-right a, .x-date-left a{ + display:block; + width:16px; + height:16px; + background-position: center; + background-repeat: no-repeat; + cursor:pointer; + -moz-opacity: 0.6; + opacity:.6; + filter: alpha(opacity=60); +} + +.x-date-right a:hover, .x-date-left a:hover{ + -moz-opacity: 1; + opacity:1; + filter: alpha(opacity=100); +} + +.x-item-disabled .x-date-right a:hover, .x-item-disabled .x-date-left a:hover{ + -moz-opacity: 0.6; + opacity:.6; + filter: alpha(opacity=60); +} + +.x-date-right a { + margin-right:2px; + text-decoration:none !important; +} + +.x-date-left a{ + margin-left:2px; + text-decoration:none !important; +} + +table.x-date-inner { + width: 100%; + table-layout:fixed; +} + +.ext-webkit table.x-date-inner{ + /* Fix for webkit browsers */ + width: 175px; +} + + +.x-date-inner th { + width:25px; +} + +.x-date-inner th { + background: repeat-x left top; + text-align:right !important; + border-bottom: 1px solid; + cursor:default; + padding:0; + border-collapse:separate; +} + +.x-date-inner th span { + display:block; + padding:2px; + padding-right:7px; +} + +.x-date-inner td { + border: 1px solid; + text-align:right; + padding:0; +} + +.x-date-inner a { + padding:2px 5px; + display:block; + text-decoration:none; + text-align:right; + zoom:1; +} + +.x-date-inner .x-date-active{ + cursor:pointer; + color:black; +} + +.x-date-inner .x-date-selected a{ + background: repeat-x left top; + border:1px solid; + padding:1px 4px; +} + +.x-date-inner .x-date-today a{ + border: 1px solid; + padding:1px 4px; +} + +.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a { + text-decoration:none !important; +} + +.x-date-bottom { + padding:4px; + border-top: 1px solid; + background: repeat-x left top; +} + +.x-date-inner a:hover, .x-date-inner .x-date-disabled a:hover{ + text-decoration:none !important; +} + +.x-item-disabled .x-date-inner a:hover{ + background: none; +} + +.x-date-inner .x-date-disabled a { + cursor:default; +} + +.x-date-menu .x-menu-item { + padding:1px 24px 1px 4px; + white-space: nowrap; +} + +.x-date-menu .x-menu-item .x-menu-item-icon { + width:10px; + height:10px; + margin-right:5px; + background-position:center -4px !important; +} + +.x-date-mp { + position:absolute; + left:0; + top:0; + display:none; +} + +.x-date-mp td { + padding:2px; + font:normal 11px arial, helvetica,tahoma,sans-serif; +} + +td.x-date-mp-month,td.x-date-mp-year,td.x-date-mp-ybtn { + border: 0 none; + text-align:center; + vertical-align: middle; + width:25%; +} + +.x-date-mp-ok { + margin-right:3px; +} + +.x-date-mp-btns button { + text-decoration:none; + text-align:center; + text-decoration:none !important; + border:1px solid; + padding:1px 3px 1px; + cursor:pointer; +} + +.x-date-mp-btns { + background: repeat-x left top; +} + +.x-date-mp-btns td { + border-top: 1px solid; + text-align:center; +} + +td.x-date-mp-month a,td.x-date-mp-year a { + display:block; + padding:2px 4px; + text-decoration:none; + text-align:center; +} + +td.x-date-mp-month a:hover,td.x-date-mp-year a:hover { + text-decoration:none; + cursor:pointer; +} + +td.x-date-mp-sel a { + padding:1px 3px; + background: repeat-x left top; + border:1px solid; +} + +.x-date-mp-ybtn a { + overflow:hidden; + width:15px; + height:15px; + cursor:pointer; + background:transparent no-repeat; + display:block; + margin:0 auto; +} + +.x-date-mp-ybtn a.x-date-mp-next { + background-position:0 -120px; +} + +.x-date-mp-ybtn a.x-date-mp-next:hover { + background-position:-15px -120px; +} + +.x-date-mp-ybtn a.x-date-mp-prev { + background-position:0 -105px; +} + +.x-date-mp-ybtn a.x-date-mp-prev:hover { + background-position:-15px -105px; +} + +.x-date-mp-ybtn { + text-align:center; +} + +td.x-date-mp-sep { + border-right:1px solid; +}.x-tip{ + position: absolute; + top: 0; + left:0; + visibility: hidden; + z-index: 20002; + border:0 none; +} + +.x-tip .x-tip-close{ + height: 15px; + float:right; + width: 15px; + margin:0 0 2px 2px; + cursor:pointer; + display:none; +} + +.x-tip .x-tip-tc { + background: transparent no-repeat 0 -62px; + padding-top:3px; + overflow:hidden; + zoom:1; +} + +.x-tip .x-tip-tl { + background: transparent no-repeat 0 0; + padding-left:6px; + overflow:hidden; + zoom:1; +} + +.x-tip .x-tip-tr { + background: transparent no-repeat right 0; + padding-right:6px; + overflow:hidden; + zoom:1; +} + +.x-tip .x-tip-bc { + background: transparent no-repeat 0 -121px; + height:3px; + overflow:hidden; +} + +.x-tip .x-tip-bl { + background: transparent no-repeat 0 -59px; + padding-left:6px; + zoom:1; +} + +.x-tip .x-tip-br { + background: transparent no-repeat right -59px; + padding-right:6px; + zoom:1; +} + +.x-tip .x-tip-mc { + border:0 none; +} + +.x-tip .x-tip-ml { + background: no-repeat 0 -124px; + padding-left:6px; + zoom:1; +} + +.x-tip .x-tip-mr { + background: transparent no-repeat right -124px; + padding-right:6px; + zoom:1; +} + +.ext-ie .x-tip .x-tip-header,.ext-ie .x-tip .x-tip-tc { + font-size:0; + line-height:0; +} + +.ext-border-box .x-tip .x-tip-header, .ext-border-box .x-tip .x-tip-tc{ + line-height: 1px; +} + +.x-tip .x-tip-header-text { + padding:0; + margin:0 0 2px 0; +} + +.x-tip .x-tip-body { + margin:0 !important; + line-height:14px; + padding:0; +} + +.x-tip .x-tip-body .loading-indicator { + margin:0; +} + +.x-tip-draggable .x-tip-header,.x-tip-draggable .x-tip-header-text { + cursor:move; +} + +.x-form-invalid-tip .x-tip-tc { + background: repeat-x 0 -12px; + padding-top:6px; +} + +.x-form-invalid-tip .x-tip-bc { + background: repeat-x 0 -18px; + height:6px; +} + +.x-form-invalid-tip .x-tip-bl { + background: no-repeat 0 -6px; +} + +.x-form-invalid-tip .x-tip-br { + background: no-repeat right -6px; +} + +.x-form-invalid-tip .x-tip-body { + padding:2px; +} + +.x-form-invalid-tip .x-tip-body { + padding-left:24px; + background:transparent no-repeat 2px 2px; +} + +.x-tip-anchor { + position: absolute; + width: 9px; + height: 10px; + overflow:hidden; + background: transparent no-repeat 0 0; + zoom:1; +} +.x-tip-anchor-bottom { + background-position: -9px 0; +} +.x-tip-anchor-right { + background-position: -18px 0; + width: 10px; +} +.x-tip-anchor-left { + background-position: -28px 0; + width: 10px; +}.x-menu { + z-index: 15000; + zoom: 1; + background: repeat-y; +} + +.x-menu-floating{ + border: 1px solid; +} + +.x-menu a { + text-decoration: none !important; +} + +.ext-ie .x-menu { + zoom:1; + overflow:hidden; +} + +.x-menu-list{ + padding: 2px; + background-color:transparent; + border:0 none; + overflow:hidden; + overflow-y: hidden; +} + +.ext-strict .ext-ie .x-menu-list{ + position: relative; +} + +.x-menu li{ + line-height:100%; +} + +.x-menu li.x-menu-sep-li{ + font-size:1px; + line-height:1px; +} + +.x-menu-list-item{ + white-space: nowrap; + display:block; + padding:1px; +} + +.x-menu-item{ + -moz-user-select: none; + -khtml-user-select:none; + -webkit-user-select:ignore; +} + +.x-menu-item-arrow{ + background:transparent no-repeat right; +} + +.x-menu-sep { + display:block; + font-size:1px; + line-height:1px; + margin: 2px 3px; + border-bottom:1px solid; + overflow:hidden; +} + +.x-menu-focus { + position:absolute; + left:-1px; + top:-1px; + width:1px; + height:1px; + line-height:1px; + font-size:1px; + -moz-outline:0 none; + outline:0 none; + -moz-user-select: none; + -khtml-user-select:none; + -webkit-user-select:ignore; + overflow:hidden; + display:block; +} + +a.x-menu-item { + cursor: pointer; + display: block; + line-height: 16px; + outline-color: -moz-use-text-color; + outline-style: none; + outline-width: 0; + padding: 3px 21px 3px 27px; + position: relative; + text-decoration: none; + white-space: nowrap; +} + +.x-menu-item-active { + background-repeat: repeat-x; + background-position: left bottom; + border-style:solid; + border-width: 1px 0; + margin:0 1px; + padding: 0; +} + +.x-menu-item-active a.x-menu-item { + border-style:solid; + border-width:0 1px; + margin:0 -1px; +} + +.x-menu-item-icon { + border: 0 none; + height: 16px; + padding: 0; + vertical-align: top; + width: 16px; + position: absolute; + left: 3px; + top: 3px; + margin: 0; + background-position:center; +} + +.ext-ie .x-menu-item-icon { + left: -24px; +} +.ext-strict .x-menu-item-icon { + left: 3px; +} + +.ext-ie6 .x-menu-item-icon { + left: -24px; +} + +.ext-ie .x-menu-item-icon { + vertical-align: middle; +} + +.x-menu-check-item .x-menu-item-icon{ + background: transparent no-repeat center; +} + +.x-menu-group-item .x-menu-item-icon{ + background-color: transparent; +} + +.x-menu-item-checked .x-menu-group-item .x-menu-item-icon{ + background: transparent no-repeat center; +} + +.x-date-menu .x-menu-list{ + padding: 0; +} + +.x-menu-date-item{ + padding:0; +} + +.x-menu .x-color-palette, .x-menu .x-date-picker{ + margin-left: 26px; + margin-right:4px; +} + +.x-menu .x-date-picker{ + border:1px solid; + margin-top:2px; + margin-bottom:2px; +} + +.x-menu-plain .x-color-palette, .x-menu-plain .x-date-picker{ + margin: 0; + border: 0 none; +} + +.x-date-menu { + padding:0 !important; +} + +/* + * fixes separator visibility problem in IE 6 + */ +.ext-strict .ext-ie6 .x-menu-sep-li { + padding: 3px 4px; +} +.ext-strict .ext-ie6 .x-menu-sep { + margin: 0; + height: 1px; +} + +/* + * Fixes an issue with "fat" separators in webkit + */ +.ext-webkit .x-menu-sep{ + height: 1px; +} + +/* + * Ugly mess to remove the white border under the picker + */ +.ext-ie .x-date-menu{ + height: 199px; +} + +.ext-strict .ext-ie .x-date-menu, .ext-border-box .ext-ie8 .x-date-menu{ + height: 197px; +} + +.ext-strict .ext-ie7 .x-date-menu{ + height: 195px; +} + +.ext-strict .ext-ie8 .x-date-menu{ + height: auto; +} + +.x-cycle-menu .x-menu-item-checked { + border:1px dotted !important; + padding:0; +} + +.x-menu .x-menu-scroller { + width: 100%; + background-repeat:no-repeat; + background-position:center; + height:8px; + line-height: 8px; + cursor:pointer; + margin: 0; + padding: 0; +} + +.x-menu .x-menu-scroller-active{ + height: 6px; + line-height: 6px; +} + +.x-menu-list-item-indent{ + padding-left: 27px; +}/* + Creates rounded, raised boxes like on the Ext website - the markup isn't pretty: + <div class="x-box-blue"> + <div class="x-box-tl"><div class="x-box-tr"><div class="x-box-tc"></div></div></div> + <div class="x-box-ml"><div class="x-box-mr"><div class="x-box-mc"> + <h3>YOUR TITLE HERE (optional)</h3> + <div>YOUR CONTENT HERE</div> + </div></div></div> + <div class="x-box-bl"><div class="x-box-br"><div class="x-box-bc"></div></div></div> + </div> + */ + +.x-box-tl { + background: transparent no-repeat 0 0; + zoom:1; +} + +.x-box-tc { + height: 8px; + background: transparent repeat-x 0 0; + overflow: hidden; +} + +.x-box-tr { + background: transparent no-repeat right -8px; +} + +.x-box-ml { + background: transparent repeat-y 0; + padding-left: 4px; + overflow: hidden; + zoom:1; +} + +.x-box-mc { + background: repeat-x 0 -16px; + padding: 4px 10px; +} + +.x-box-mc h3 { + margin: 0 0 4px 0; + zoom:1; +} + +.x-box-mr { + background: transparent repeat-y right; + padding-right: 4px; + overflow: hidden; +} + +.x-box-bl { + background: transparent no-repeat 0 -16px; + zoom:1; +} + +.x-box-bc { + background: transparent repeat-x 0 -8px; + height: 8px; + overflow: hidden; +} + +.x-box-br { + background: transparent no-repeat right -24px; +} + +.x-box-tl, .x-box-bl { + padding-left: 8px; + overflow: hidden; +} + +.x-box-tr, .x-box-br { + padding-right: 8px; + overflow: hidden; +}.x-combo-list { + border:1px solid; + zoom:1; + overflow:hidden; +} + +.x-combo-list-inner { + overflow:auto; + position:relative; /* for calculating scroll offsets */ + zoom:1; + overflow-x:hidden; +} + +.x-combo-list-hd { + border-bottom:1px solid; + padding:3px; +} + +.x-resizable-pinned .x-combo-list-inner { + border-bottom:1px solid; +} + +.x-combo-list-item { + padding:2px; + border:1px solid; + white-space: nowrap; + overflow:hidden; + text-overflow: ellipsis; +} + +.x-combo-list .x-combo-selected{ + border:1px dotted !important; + cursor:pointer; +} + +.x-combo-list .x-toolbar { + border-top:1px solid; + border-bottom:0 none; +}.x-panel { + border-style: solid; + border-width:0; +} + +.x-panel-header { + overflow:hidden; + zoom:1; + padding:5px 3px 4px 5px; + border:1px solid; + line-height: 15px; + background: transparent repeat-x 0 -1px; +} + +.x-panel-body { + border:1px solid; + border-top:0 none; + overflow:hidden; + position: relative; /* added for item scroll positioning */ +} + +.x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar { + border:1px solid; + border-top:0 none; + overflow:hidden; + padding:2px; +} + +.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { + border-top:1px solid; + border-bottom: 0 none; +} + +.x-panel-body-noheader, .x-panel-mc .x-panel-body { + border-top:1px solid; +} + +.x-panel-header { + overflow:hidden; + zoom:1; +} + +.x-panel-tl .x-panel-header { + padding:5px 0 4px 0; + border:0 none; + background:transparent no-repeat; +} + +.x-panel-tl .x-panel-icon, .x-window-tl .x-panel-icon { + padding-left:20px !important; + background-repeat:no-repeat; + background-position:0 4px; + zoom:1; +} + +.x-panel-inline-icon { + width:16px; + height:16px; + background-repeat:no-repeat; + background-position:0 0; + vertical-align:middle; + margin-right:4px; + margin-top:-1px; + margin-bottom:-1px; +} + +.x-panel-tc { + background: transparent repeat-x 0 0; + overflow:hidden; +} + +/* fix ie7 strict mode bug */ +.ext-strict .ext-ie7 .x-panel-tc { + overflow: visible; +} + +.x-panel-tl { + background: transparent no-repeat 0 0; + padding-left:6px; + zoom:1; + border-bottom:1px solid; +} + +.x-panel-tr { + background: transparent no-repeat right 0; + zoom:1; + padding-right:6px; +} + +.x-panel-bc { + background: transparent repeat-x 0 bottom; + zoom:1; +} + +.x-panel-bc .x-panel-footer { + zoom:1; +} + +.x-panel-bl { + background: transparent no-repeat 0 bottom; + padding-left:6px; + zoom:1; +} + +.x-panel-br { + background: transparent no-repeat right bottom; + padding-right:6px; + zoom:1; +} + +.x-panel-mc { + border:0 none; + padding:0; + margin:0; + padding-top:6px; +} + +.x-panel-mc .x-panel-body { + background-color:transparent; + border: 0 none; +} + +.x-panel-ml { + background: repeat-y 0 0; + padding-left:6px; + zoom:1; +} + +.x-panel-mr { + background: transparent repeat-y right 0; + padding-right:6px; + zoom:1; +} + +.x-panel-bc .x-panel-footer { + padding-bottom:6px; +} + +.x-panel-nofooter .x-panel-bc, .x-panel-nofooter .x-window-bc { + height:6px; + font-size:0; + line-height:0; +} + +.x-panel-bwrap { + overflow:hidden; + zoom:1; + left:0; + top:0; +} +.x-panel-body { + overflow:hidden; + zoom:1; +} + +.x-panel-collapsed .x-resizable-handle{ + display:none; +} + +.ext-gecko .x-panel-animated div { + overflow:hidden !important; +} + +/* Plain */ +.x-plain-body { + overflow:hidden; +} + +.x-plain-bbar .x-toolbar { + overflow:hidden; + padding:2px; +} + +.x-plain-tbar .x-toolbar { + overflow:hidden; + padding:2px; +} + +.x-plain-bwrap { + overflow:hidden; + zoom:1; +} + +.x-plain { + overflow:hidden; +} + +/* Tools */ +.x-tool { + overflow:hidden; + width:15px; + height:15px; + float:right; + cursor:pointer; + background:transparent no-repeat; + margin-left:2px; +} + +/* expand / collapse tools */ +.x-tool-toggle { + background-position:0 -60px; +} + +.x-tool-toggle-over { + background-position:-15px -60px; +} + +.x-panel-collapsed .x-tool-toggle { + background-position:0 -75px; +} + +.x-panel-collapsed .x-tool-toggle-over { + background-position:-15px -75px; +} + + +.x-tool-close { + background-position:0 -0; +} + +.x-tool-close-over { + background-position:-15px 0; +} + +.x-tool-minimize { + background-position:0 -15px; +} + +.x-tool-minimize-over { + background-position:-15px -15px; +} + +.x-tool-maximize { + background-position:0 -30px; +} + +.x-tool-maximize-over { + background-position:-15px -30px; +} + +.x-tool-restore { + background-position:0 -45px; +} + +.x-tool-restore-over { + background-position:-15px -45px; +} + +.x-tool-gear { + background-position:0 -90px; +} + +.x-tool-gear-over { + background-position:-15px -90px; +} + +.x-tool-prev { + background-position:0 -105px; +} + +.x-tool-prev-over { + background-position:-15px -105px; +} + +.x-tool-next { + background-position:0 -120px; +} + +.x-tool-next-over { + background-position:-15px -120px; +} + +.x-tool-pin { + background-position:0 -135px; +} + +.x-tool-pin-over { + background-position:-15px -135px; +} + +.x-tool-unpin { + background-position:0 -150px; +} + +.x-tool-unpin-over { + background-position:-15px -150px; +} + +.x-tool-right { + background-position:0 -165px; +} + +.x-tool-right-over { + background-position:-15px -165px; +} + +.x-tool-left { + background-position:0 -180px; +} + +.x-tool-left-over { + background-position:-15px -180px; +} + +.x-tool-down { + background-position:0 -195px; +} + +.x-tool-down-over { + background-position:-15px -195px; +} + +.x-tool-up { + background-position:0 -210px; +} + +.x-tool-up-over { + background-position:-15px -210px; +} + +.x-tool-refresh { + background-position:0 -225px; +} + +.x-tool-refresh-over { + background-position:-15px -225px; +} + +.x-tool-plus { + background-position:0 -240px; +} + +.x-tool-plus-over { + background-position:-15px -240px; +} + +.x-tool-minus { + background-position:0 -255px; +} + +.x-tool-minus-over { + background-position:-15px -255px; +} + +.x-tool-search { + background-position:0 -270px; +} + +.x-tool-search-over { + background-position:-15px -270px; +} + +.x-tool-save { + background-position:0 -285px; +} + +.x-tool-save-over { + background-position:-15px -285px; +} + +.x-tool-help { + background-position:0 -300px; +} + +.x-tool-help-over { + background-position:-15px -300px; +} + +.x-tool-print { + background-position:0 -315px; +} + +.x-tool-print-over { + background-position:-15px -315px; +} + +.x-tool-expand { + background-position:0 -330px; +} + +.x-tool-expand-over { + background-position:-15px -330px; +} + +.x-tool-collapse { + background-position:0 -345px; +} + +.x-tool-collapse-over { + background-position:-15px -345px; +} + +.x-tool-resize { + background-position:0 -360px; +} + +.x-tool-resize-over { + background-position:-15px -360px; +} + +.x-tool-move { + background-position:0 -375px; +} + +.x-tool-move-over { + background-position:-15px -375px; +} + +/* Ghosting */ +.x-panel-ghost { + z-index:12000; + overflow:hidden; + position:absolute; + left:0;top:0; + opacity:.65; + -moz-opacity:.65; + filter:alpha(opacity=65); +} + +.x-panel-ghost ul { + margin:0; + padding:0; + overflow:hidden; + font-size:0; + line-height:0; + border:1px solid; + border-top:0 none; + display:block; +} + +.x-panel-ghost * { + cursor:move !important; +} + +.x-panel-dd-spacer { + border:2px dashed; +} + +/* Buttons */ +.x-panel-btns { + padding:5px; + overflow:hidden; +} + +.x-panel-btns td.x-toolbar-cell{ + padding:3px; +} + +.x-panel-btns .x-btn-focus .x-btn-left{ + background-position:0 -147px; +} + +.x-panel-btns .x-btn-focus .x-btn-right{ + background-position:0 -168px; +} + +.x-panel-btns .x-btn-focus .x-btn-center{ + background-position:0 -189px; +} + +.x-panel-btns .x-btn-over .x-btn-left{ + background-position:0 -63px; +} + +.x-panel-btns .x-btn-over .x-btn-right{ + background-position:0 -84px; +} + +.x-panel-btns .x-btn-over .x-btn-center{ + background-position:0 -105px; +} + +.x-panel-btns .x-btn-click .x-btn-center{ + background-position:0 -126px; +} + +.x-panel-btns .x-btn-click .x-btn-right{ + background-position:0 -84px; +} + +.x-panel-btns .x-btn-click .x-btn-left{ + background-position:0 -63px; +} + +.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{ + white-space: nowrap; +} +/** + * W3C Suggested Default style sheet for HTML 4 + * http://www.w3.org/TR/CSS21/sample.html + * + * Resets for Ext.Panel @cfg normal: true + */ +.x-panel-reset .x-panel-body html, +.x-panel-reset .x-panel-body address, +.x-panel-reset .x-panel-body blockquote, +.x-panel-reset .x-panel-body body, +.x-panel-reset .x-panel-body dd, +.x-panel-reset .x-panel-body div, +.x-panel-reset .x-panel-body dl, +.x-panel-reset .x-panel-body dt, +.x-panel-reset .x-panel-body fieldset, +.x-panel-reset .x-panel-body form, +.x-panel-reset .x-panel-body frame, frameset, +.x-panel-reset .x-panel-body h1, +.x-panel-reset .x-panel-body h2, +.x-panel-reset .x-panel-body h3, +.x-panel-reset .x-panel-body h4, +.x-panel-reset .x-panel-body h5, +.x-panel-reset .x-panel-body h6, +.x-panel-reset .x-panel-body noframes, +.x-panel-reset .x-panel-body ol, +.x-panel-reset .x-panel-body p, +.x-panel-reset .x-panel-body ul, +.x-panel-reset .x-panel-body center, +.x-panel-reset .x-panel-body dir, +.x-panel-reset .x-panel-body hr, +.x-panel-reset .x-panel-body menu, +.x-panel-reset .x-panel-body pre { display: block } +.x-panel-reset .x-panel-body li { display: list-item } +.x-panel-reset .x-panel-body head { display: none } +.x-panel-reset .x-panel-body table { display: table } +.x-panel-reset .x-panel-body tr { display: table-row } +.x-panel-reset .x-panel-body thead { display: table-header-group } +.x-panel-reset .x-panel-body tbody { display: table-row-group } +.x-panel-reset .x-panel-body tfoot { display: table-footer-group } +.x-panel-reset .x-panel-body col { display: table-column } +.x-panel-reset .x-panel-body colgroup { display: table-column-group } +.x-panel-reset .x-panel-body td, +.x-panel-reset .x-panel-body th { display: table-cell } +.x-panel-reset .x-panel-body caption { display: table-caption } +.x-panel-reset .x-panel-body th { font-weight: bolder; text-align: center } +.x-panel-reset .x-panel-body caption { text-align: center } +.x-panel-reset .x-panel-body body { margin: 8px } +.x-panel-reset .x-panel-body h1 { font-size: 2em; margin: .67em 0 } +.x-panel-reset .x-panel-body h2 { font-size: 1.5em; margin: .75em 0 } +.x-panel-reset .x-panel-body h3 { font-size: 1.17em; margin: .83em 0 } +.x-panel-reset .x-panel-body h4, +.x-panel-reset .x-panel-body p, +.x-panel-reset .x-panel-body blockquote, +.x-panel-reset .x-panel-body ul, +.x-panel-reset .x-panel-body fieldset, +.x-panel-reset .x-panel-body form, +.x-panel-reset .x-panel-body ol, +.x-panel-reset .x-panel-body dl, +.x-panel-reset .x-panel-body dir, +.x-panel-reset .x-panel-body menu { margin: 1.12em 0 } +.x-panel-reset .x-panel-body h5 { font-size: .83em; margin: 1.5em 0 } +.x-panel-reset .x-panel-body h6 { font-size: .75em; margin: 1.67em 0 } +.x-panel-reset .x-panel-body h1, +.x-panel-reset .x-panel-body h2, +.x-panel-reset .x-panel-body h3, +.x-panel-reset .x-panel-body h4, +.x-panel-reset .x-panel-body h5, +.x-panel-reset .x-panel-body h6, +.x-panel-reset .x-panel-body b, +.x-panel-reset .x-panel-body strong { font-weight: bolder } +.x-panel-reset .x-panel-body blockquote { margin-left: 40px; margin-right: 40px } +.x-panel-reset .x-panel-body i, +.x-panel-reset .x-panel-body cite, +.x-panel-reset .x-panel-body em, +.x-panel-reset .x-panel-body var, +.x-panel-reset .x-panel-body address { font-style: italic } +.x-panel-reset .x-panel-body pre, +.x-panel-reset .x-panel-body tt, +.x-panel-reset .x-panel-body code, +.x-panel-reset .x-panel-body kbd, +.x-panel-reset .x-panel-body samp { font-family: monospace } +.x-panel-reset .x-panel-body pre { white-space: pre } +.x-panel-reset .x-panel-body button, +.x-panel-reset .x-panel-body textarea, +.x-panel-reset .x-panel-body input, +.x-panel-reset .x-panel-body select { display: inline-block } +.x-panel-reset .x-panel-body big { font-size: 1.17em } +.x-panel-reset .x-panel-body small, +.x-panel-reset .x-panel-body sub, +.x-panel-reset .x-panel-body sup { font-size: .83em } +.x-panel-reset .x-panel-body sub { vertical-align: sub } +.x-panel-reset .x-panel-body sup { vertical-align: super } +.x-panel-reset .x-panel-body table { border-spacing: 2px; } +.x-panel-reset .x-panel-body thead, +.x-panel-reset .x-panel-body tbody, +.x-panel-reset .x-panel-body tfoot { vertical-align: middle } +.x-panel-reset .x-panel-body td, +.x-panel-reset .x-panel-body th { vertical-align: inherit } +.x-panel-reset .x-panel-body s, +.x-panel-reset .x-panel-body strike, +.x-panel-reset .x-panel-body del { text-decoration: line-through } +.x-panel-reset .x-panel-body hr { border: 1px inset } +.x-panel-reset .x-panel-body ol, +.x-panel-reset .x-panel-body ul, +.x-panel-reset .x-panel-body dir, +.x-panel-reset .x-panel-body menu, +.x-panel-reset .x-panel-body dd { margin-left: 40px } +.x-panel-reset .x-panel-body ul, .x-panel-reset .x-panel-body menu, .x-panel-reset .x-panel-body dir { list-style-type: disc;} +.x-panel-reset .x-panel-body ol { list-style-type: decimal } +.x-panel-reset .x-panel-body ol ul, +.x-panel-reset .x-panel-body ul ol, +.x-panel-reset .x-panel-body ul ul, +.x-panel-reset .x-panel-body ol ol { margin-top: 0; margin-bottom: 0 } +.x-panel-reset .x-panel-body u, +.x-panel-reset .x-panel-body ins { text-decoration: underline } +.x-panel-reset .x-panel-body br:before { content: "\A" } +.x-panel-reset .x-panel-body :before, .x-panel-reset .x-panel-body :after { white-space: pre-line } +.x-panel-reset .x-panel-body center { text-align: center } +.x-panel-reset .x-panel-body :link, .x-panel-reset .x-panel-body :visited { text-decoration: underline } +.x-panel-reset .x-panel-body :focus { outline: invert dotted thin } + +/* Begin bidirectionality settings (do not change) */ +.x-panel-reset .x-panel-body BDO[DIR="ltr"] { direction: ltr; unicode-bidi: bidi-override } +.x-panel-reset .x-panel-body BDO[DIR="rtl"] { direction: rtl; unicode-bidi: bidi-override } +.x-window { + zoom:1; +} + +.x-window .x-window-handle { + opacity:0; + -moz-opacity:0; + filter:alpha(opacity=0); +} + +.x-window-proxy { + border:1px solid; + z-index:12000; + overflow:hidden; + position:absolute; + left:0;top:0; + display:none; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); +} + +.x-window-header { + overflow:hidden; + zoom:1; +} + +.x-window-bwrap { + z-index:1; + position:relative; + zoom:1; + left:0;top:0; +} + +.x-window-tl .x-window-header { + padding:5px 0 4px 0; +} + +.x-window-header-text { + cursor:pointer; +} + +.x-window-tc { + background: transparent repeat-x 0 0; + overflow:hidden; + zoom:1; +} + +.x-window-tl { + background: transparent no-repeat 0 0; + padding-left:6px; + zoom:1; + z-index:1; + position:relative; +} + +.x-window-tr { + background: transparent no-repeat right 0; + padding-right:6px; +} + +.x-window-bc { + background: transparent repeat-x 0 bottom; + zoom:1; +} + +.x-window-bc .x-window-footer { + padding-bottom:6px; + zoom:1; + font-size:0; + line-height:0; +} + +.x-window-bl { + background: transparent no-repeat 0 bottom; + padding-left:6px; + zoom:1; +} + +.x-window-br { + background: transparent no-repeat right bottom; + padding-right:6px; + zoom:1; +} + +.x-window-mc { + border:1px solid; + padding:0; + margin:0; +} + +.x-window-ml { + background: transparent repeat-y 0 0; + padding-left:6px; + zoom:1; +} + +.x-window-mr { + background: transparent repeat-y right 0; + padding-right:6px; + zoom:1; +} + +.x-window-body { + overflow:hidden; +} + +.x-window-bwrap { + overflow:hidden; +} + +.x-window-maximized .x-window-bl, .x-window-maximized .x-window-br, + .x-window-maximized .x-window-ml, .x-window-maximized .x-window-mr, + .x-window-maximized .x-window-tl, .x-window-maximized .x-window-tr { + padding:0; +} + +.x-window-maximized .x-window-footer { + padding-bottom:0; +} + +.x-window-maximized .x-window-tc { + padding-left:3px; + padding-right:3px; +} + +.x-window-maximized .x-window-mc { + border-left:0 none; + border-right:0 none; +} + +.x-window-tbar .x-toolbar, .x-window-bbar .x-toolbar { + border-left:0 none; + border-right: 0 none; +} + +.x-window-bbar .x-toolbar { + border-top:1px solid; + border-bottom:0 none; +} + +.x-window-draggable, .x-window-draggable .x-window-header-text { + cursor:move; +} + +.x-window-maximized .x-window-draggable, .x-window-maximized .x-window-draggable .x-window-header-text { + cursor:default; +} + +.x-window-body { + background-color:transparent; +} + +.x-panel-ghost .x-window-tl { + border-bottom:1px solid; +} + +.x-panel-collapsed .x-window-tl { + border-bottom:1px solid; +} + +.x-window-maximized-ct { + overflow:hidden; +} + +.x-window-maximized .x-window-handle { + display:none; +} + +.x-window-sizing-ghost ul { + border:0 none !important; +} + +.x-dlg-focus{ + -moz-outline:0 none; + outline:0 none; + width:0; + height:0; + overflow:hidden; + position:absolute; + top:0; + left:0; +} + +.ext-webkit .x-dlg-focus{ + width: 1px; + height: 1px; +} + +.x-dlg-mask{ + z-index:10000; + display:none; + position:absolute; + top:0; + left:0; + -moz-opacity: 0.5; + opacity:.50; + filter: alpha(opacity=50); +} + +body.ext-ie6.x-body-masked select { + visibility:hidden; +} + +body.ext-ie6.x-body-masked .x-window select { + visibility:visible; +} + +.x-window-plain .x-window-mc { + border: 1px solid; +} + +.x-window-plain .x-window-body { + border: 1px solid; + background:transparent !important; +}.x-html-editor-wrap { + border:1px solid; +} + +.x-html-editor-tb .x-btn-text { + background:transparent no-repeat; +} + +.x-html-editor-tb .x-edit-bold, .x-menu-item img.x-edit-bold { + background-position:0 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-italic, .x-menu-item img.x-edit-italic { + background-position:-16px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-underline, .x-menu-item img.x-edit-underline { + background-position:-32px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-forecolor, .x-menu-item img.x-edit-forecolor { + background-position:-160px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-backcolor, .x-menu-item img.x-edit-backcolor { + background-position:-176px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-justifyleft, .x-menu-item img.x-edit-justifyleft { + background-position:-112px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-justifycenter, .x-menu-item img.x-edit-justifycenter { + background-position:-128px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-justifyright, .x-menu-item img.x-edit-justifyright { + background-position:-144px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-insertorderedlist, .x-menu-item img.x-edit-insertorderedlist { + background-position:-80px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-insertunorderedlist, .x-menu-item img.x-edit-insertunorderedlist { + background-position:-96px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-increasefontsize, .x-menu-item img.x-edit-increasefontsize { + background-position:-48px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-decreasefontsize, .x-menu-item img.x-edit-decreasefontsize { + background-position:-64px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-sourceedit, .x-menu-item img.x-edit-sourceedit { + background-position:-192px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tb .x-edit-createlink, .x-menu-item img.x-edit-createlink { + background-position:-208px 0; + background-image:url(../images/default/editor/tb-sprite.gif); +} + +.x-html-editor-tip .x-tip-bd .x-tip-bd-inner { + padding:5px; + padding-bottom:1px; +} + +.x-html-editor-tb .x-toolbar { + position:static !important; +}.x-panel-noborder .x-panel-body-noborder { + border-width:0; +} + +.x-panel-noborder .x-panel-header-noborder { + border-width:0 0 1px; + border-style:solid; +} + +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar { + border-width:0 0 1px; + border-style:solid; +} + +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar { + border-width:1px 0 0 0; + border-style:solid; +} + +.x-window-noborder .x-window-mc { + border-width:0; +} + +.x-window-plain .x-window-body-noborder { + border-width:0; +} + +.x-tab-panel-noborder .x-tab-panel-body-noborder { + border-width:0; +} + +.x-tab-panel-noborder .x-tab-panel-header-noborder { + border-width: 0 0 1px 0; +} + +.x-tab-panel-noborder .x-tab-panel-footer-noborder { + border-width: 1px 0 0 0; +} + +.x-tab-panel-bbar-noborder .x-toolbar { + border-width: 1px 0 0 0; + border-style:solid; +} + +.x-tab-panel-tbar-noborder .x-toolbar { + border-width:0 0 1px; + border-style:solid; +}.x-border-layout-ct { + position: relative; +} + +.x-border-panel { + position:absolute; + left:0; + top:0; +} + +.x-tool-collapse-south { + background-position:0 -195px; +} + +.x-tool-collapse-south-over { + background-position:-15px -195px; +} + +.x-tool-collapse-north { + background-position:0 -210px; +} + +.x-tool-collapse-north-over { + background-position:-15px -210px; +} + +.x-tool-collapse-west { + background-position:0 -180px; +} + +.x-tool-collapse-west-over { + background-position:-15px -180px; +} + +.x-tool-collapse-east { + background-position:0 -165px; +} + +.x-tool-collapse-east-over { + background-position:-15px -165px; +} + +.x-tool-expand-south { + background-position:0 -210px; +} + +.x-tool-expand-south-over { + background-position:-15px -210px; +} + +.x-tool-expand-north { + background-position:0 -195px; +} +.x-tool-expand-north-over { + background-position:-15px -195px; +} + +.x-tool-expand-west { + background-position:0 -165px; +} + +.x-tool-expand-west-over { + background-position:-15px -165px; +} + +.x-tool-expand-east { + background-position:0 -180px; +} + +.x-tool-expand-east-over { + background-position:-15px -180px; +} + +.x-tool-expand-north, .x-tool-expand-south { + float:right; + margin:3px; +} + +.x-tool-expand-east, .x-tool-expand-west { + float:none; + margin:3px 2px; +} + +.x-accordion-hd .x-tool-toggle { + background-position:0 -255px; +} + +.x-accordion-hd .x-tool-toggle-over { + background-position:-15px -255px; +} + +.x-panel-collapsed .x-accordion-hd .x-tool-toggle { + background-position:0 -240px; +} + +.x-panel-collapsed .x-accordion-hd .x-tool-toggle-over { + background-position:-15px -240px; +} + +.x-accordion-hd { + padding-top:4px; + padding-bottom:3px; + border-top:0 none; + background: transparent repeat-x 0 -9px; +} + +.x-layout-collapsed{ + position:absolute; + left:-10000px; + top:-10000px; + visibility:hidden; + width:20px; + height:20px; + overflow:hidden; + border:1px solid; + z-index:20; +} + +.ext-border-box .x-layout-collapsed{ + width:22px; + height:22px; +} + +.x-layout-collapsed-over{ + cursor:pointer; +} + +.x-layout-collapsed-west .x-layout-collapsed-tools, .x-layout-collapsed-east .x-layout-collapsed-tools{ + position:absolute; + top:0; + left:0; + width:20px; + height:20px; +} + + +.x-layout-split{ + position:absolute; + height:5px; + width:5px; + line-height:1px; + font-size:1px; + z-index:3; + background-color:transparent; +} + +/* IE6 strict won't drag w/out a color */ +.ext-strict .ext-ie6 .x-layout-split{ + background-color: #fff !important; + filter: alpha(opacity=1); +} + +.x-layout-split-h{ + background-image:url(../images/default/s.gif); + background-position: left; +} + +.x-layout-split-v{ + background-image:url(../images/default/s.gif); + background-position: top; +} + +.x-column-layout-ct { + overflow:hidden; + zoom:1; +} + +.x-column { + float:left; + padding:0; + margin:0; + overflow:hidden; + zoom:1; +} + +.x-column-inner { + overflow:hidden; + zoom:1; +} + +/* mini mode */ +.x-layout-mini { + position:absolute; + top:0; + left:0; + display:block; + width:5px; + height:35px; + cursor:pointer; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); +} + +.x-layout-mini-over, .x-layout-collapsed-over .x-layout-mini{ + opacity:1; + -moz-opacity:1; + filter:none; +} + +.x-layout-split-west .x-layout-mini { + top:48%; +} + +.x-layout-split-east .x-layout-mini { + top:48%; +} + +.x-layout-split-north .x-layout-mini { + left:48%; + height:5px; + width:35px; +} + +.x-layout-split-south .x-layout-mini { + left:48%; + height:5px; + width:35px; +} + +.x-layout-cmini-west .x-layout-mini { + top:48%; +} + +.x-layout-cmini-east .x-layout-mini { + top:48%; +} + +.x-layout-cmini-north .x-layout-mini { + left:48%; + height:5px; + width:35px; +} + +.x-layout-cmini-south .x-layout-mini { + left:48%; + height:5px; + width:35px; +} + +.x-layout-cmini-west, .x-layout-cmini-east { + border:0 none; + width:5px !important; + padding:0; + background-color:transparent; +} + +.x-layout-cmini-north, .x-layout-cmini-south { + border:0 none; + height:5px !important; + padding:0; + background-color:transparent; +} + +.x-viewport, .x-viewport body { + margin: 0; + padding: 0; + border: 0 none; + overflow: hidden; + height: 100%; +} + +.x-abs-layout-item { + position:absolute; + left:0; + top:0; +} + +.ext-ie input.x-abs-layout-item, .ext-ie textarea.x-abs-layout-item { + margin:0; +} + +.x-box-layout-ct { + overflow:hidden; + zoom:1; +} + +.x-box-inner { + overflow:hidden; + zoom:1; + position:relative; + left:0; + top:0; +} + +.x-box-item { + position:absolute; + left:0; + top:0; +}.x-progress-wrap { + border:1px solid; + overflow:hidden; +} + +.x-progress-inner { + height:18px; + background:repeat-x; + position:relative; +} + +.x-progress-bar { + height:18px; + float:left; + width:0; + background: repeat-x left center; + border-top:1px solid; + border-bottom:1px solid; + border-right:1px solid; +} + +.x-progress-text { + padding:1px 5px; + overflow:hidden; + position:absolute; + left:0; + text-align:center; +} + +.x-progress-text-back { + line-height:16px; +} + +.ext-ie .x-progress-text-back { + line-height:15px; +} + +.ext-strict .ext-ie7 .x-progress-text-back{ + width: 100%; +} +.x-list-header{ + background: repeat-x 0 bottom; + cursor:default; + zoom:1; + height:22px; +} + +.x-list-header-inner div { + display:block; + float:left; + overflow:hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; +} + +.x-list-header-inner div em { + display:block; + border-left:1px solid; + padding:4px 4px; + overflow:hidden; + -moz-user-select: none; + -khtml-user-select: none; + line-height:14px; +} + +.x-list-body { + overflow:auto; + overflow-x:hidden; + overflow-y:auto; + zoom:1; + float: left; + width: 100%; +} + +.x-list-body dl { + zoom:1; +} + +.x-list-body dt { + display:block; + float:left; + overflow:hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; + cursor:pointer; + zoom:1; +} + +.x-list-body dt em { + display:block; + padding:3px 4px; + overflow:hidden; + -moz-user-select: none; + -khtml-user-select: none; +} + +.x-list-resizer { + border-left:1px solid; + border-right:1px solid; + position:absolute; + left:0; + top:0; +} + +.x-list-header-inner em.sort-asc { + background: transparent no-repeat center 0; + border-style:solid; + border-width: 0 1px 1px; + padding-bottom:3px; +} + +.x-list-header-inner em.sort-desc { + background: transparent no-repeat center -23px; + border-style:solid; + border-width: 0 1px 1px; + padding-bottom:3px; +} + +/* Shared styles */ +.x-slider { + zoom:1; +} + +.x-slider-inner { + position:relative; + left:0; + top:0; + overflow:visible; + zoom:1; +} + +.x-slider-focus { + position:absolute; + left:0; + top:0; + width:1px; + height:1px; + line-height:1px; + font-size:1px; + -moz-outline:0 none; + outline:0 none; + -moz-user-select: none; + -khtml-user-select:none; + -webkit-user-select:ignore; + display:block; + overflow:hidden; +} + +/* Horizontal styles */ +.x-slider-horz { + padding-left:7px; + background:transparent no-repeat 0 -22px; +} + +.x-slider-horz .x-slider-end { + padding-right:7px; + zoom:1; + background:transparent no-repeat right -44px; +} + +.x-slider-horz .x-slider-inner { + background:transparent repeat-x 0 0; + height:22px; +} + +.x-slider-horz .x-slider-thumb { + width:14px; + height:15px; + position:absolute; + left:0; + top:3px; + background:transparent no-repeat 0 0; +} + +.x-slider-horz .x-slider-thumb-over { + background-position: -14px -15px; +} + +.x-slider-horz .x-slider-thumb-drag { + background-position: -28px -30px; +} + +/* Vertical styles */ +.x-slider-vert { + padding-top:7px; + background:transparent no-repeat -44px 0; + width:22px; +} + +.x-slider-vert .x-slider-end { + padding-bottom:7px; + zoom:1; + background:transparent no-repeat -22px bottom; +} + +.x-slider-vert .x-slider-inner { + background:transparent repeat-y 0 0; +} + +.x-slider-vert .x-slider-thumb { + width:15px; + height:14px; + position:absolute; + left:3px; + bottom:0; + background:transparent no-repeat 0 0; +} + +.x-slider-vert .x-slider-thumb-over { + background-position: -15px -14px; +} + +.x-slider-vert .x-slider-thumb-drag { + background-position: -30px -28px; +}.x-window-dlg .x-window-body { + border:0 none !important; + padding:5px 10px; + overflow:hidden !important; +} + +.x-window-dlg .x-window-mc { + border:0 none !important; +} + +.x-window-dlg .ext-mb-input { + margin-top:4px; + width:95%; +} + +.x-window-dlg .ext-mb-textarea { + margin-top:4px; +} + +.x-window-dlg .x-progress-wrap { + margin-top:4px; +} + +.ext-ie .x-window-dlg .x-progress-wrap { + margin-top:6px; +} + +.x-window-dlg .x-msg-box-wait { + background:transparent no-repeat left; + display:block; + width:300px; + padding-left:18px; + line-height:18px; +} + +.x-window-dlg .ext-mb-icon { + float:left; + width:47px; + height:32px; +} + +.x-window-dlg .x-dlg-icon .ext-mb-content{ + zoom: 1; + margin-left: 47px; +} + +.x-window-dlg .ext-mb-info, .x-window-dlg .ext-mb-warning, .x-window-dlg .ext-mb-question, .x-window-dlg .ext-mb-error { + background:transparent no-repeat top left; +} + +.ext-gecko2 .ext-mb-fix-cursor { + overflow:auto; +}.ext-el-mask { + background-color: #ccc; +} + +.ext-el-mask-msg { + border-color:#6593cf; + background-color:#c3daf9; + background-image:url(../images/default/box/tb-blue.gif); +} +.ext-el-mask-msg div { + background-color: #eee; + border-color:#a3bad9; + color:#222; + font:normal 11px tahoma, arial, helvetica, sans-serif; +} + +.x-mask-loading div { + background-color:#fbfbfb; + background-image:url(../images/default/grid/loading.gif); +} + +.x-item-disabled { + color: gray; +} + +.x-item-disabled * { + color: gray !important; +} + +.x-splitbar-proxy { + background-color: #aaa; +} + +.x-color-palette a { + border-color:#fff; +} + +.x-color-palette a:hover, .x-color-palette a.x-color-palette-sel { + border-color:#8bb8f3; + background-color: #deecfd; +} + +/* +.x-color-palette em:hover, .x-color-palette span:hover{ + background-color: #deecfd; +} +*/ + +.x-color-palette em { + border-color:#aca899; +} + +.x-ie-shadow { + background-color:#777; +} + +.x-shadow .xsmc { + background-image: url(../images/default/shadow-c.png); +} + +.x-shadow .xsml, .x-shadow .xsmr { + background-image: url(../images/default/shadow-lr.png); +} + +.x-shadow .xstl, .x-shadow .xstc, .x-shadow .xstr, .x-shadow .xsbl, .x-shadow .xsbc, .x-shadow .xsbr{ + background-image: url(../images/default/shadow.png); +} + +.loading-indicator { + font-size: 11px; + background-image: url(../images/default/grid/loading.gif); +} + +.x-spotlight { + background-color: #ccc; +} +.x-tab-panel-header, .x-tab-panel-footer { + background-color: #deecfd; + border-color:#8db2e3; + overflow:hidden; + zoom:1; +} + +.x-tab-panel-header, .x-tab-panel-footer { + border-color:#8db2e3; +} + +ul.x-tab-strip-top{ + background-color:#cedff5; + background-image: url(../images/default/tabs/tab-strip-bg.gif); + border-bottom-color:#8db2e3; +} + +ul.x-tab-strip-bottom{ + background-color:#cedff5; + background-image: url(../images/default/tabs/tab-strip-btm-bg.gif); + border-top-color:#8db2e3; +} + +.x-tab-panel-header-plain .x-tab-strip-spacer, +.x-tab-panel-footer-plain .x-tab-strip-spacer { + border-color:#8db2e3; + background-color: #deecfd; +} + +.x-tab-strip span.x-tab-strip-text { + font:normal 11px tahoma,arial,helvetica; + color:#416aa3; +} + +.x-tab-strip-over span.x-tab-strip-text { + color:#15428b; +} + +.x-tab-strip-active span.x-tab-strip-text { + color:#15428b; + font-weight:bold; +} + +.x-tab-strip-disabled .x-tabs-text { + color:#aaaaaa; +} + +.x-tab-strip-top .x-tab-right, .x-tab-strip-top .x-tab-left, .x-tab-strip-top .x-tab-strip-inner{ + background-image: url(../images/default/tabs/tabs-sprite.gif); +} + +.x-tab-strip-bottom .x-tab-right { + background-image: url(../images/default/tabs/tab-btm-inactive-right-bg.gif); +} + +.x-tab-strip-bottom .x-tab-left { + background-image: url(../images/default/tabs/tab-btm-inactive-left-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-over .x-tab-right { + background-image: url(../images/default/tabs/tab-btm-over-right-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-over .x-tab-left { + background-image: url(../images/default/tabs/tab-btm-over-left-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-right { + background-image: url(../images/default/tabs/tab-btm-right-bg.gif); +} + +.x-tab-strip-bottom .x-tab-strip-active .x-tab-left { + background-image: url(../images/default/tabs/tab-btm-left-bg.gif); +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close { + background-image:url(../images/default/tabs/tab-close.gif); +} + +.x-tab-strip .x-tab-strip-closable a.x-tab-strip-close:hover{ + background-image:url(../images/default/tabs/tab-close.gif); +} + +.x-tab-panel-body { + border-color:#8db2e3; + background-color:#fff; +} + +.x-tab-panel-body-top { + border-top: 0 none; +} + +.x-tab-panel-body-bottom { + border-bottom: 0 none; +} + +.x-tab-scroller-left { + background-image:url(../images/default/tabs/scroll-left.gif); + border-bottom-color:#8db2e3; +} + +.x-tab-scroller-left-over { + background-position: 0 0; +} + +.x-tab-scroller-left-disabled { + background-position: -18px 0; + opacity:.5; + -moz-opacity:.5; + filter:alpha(opacity=50); + cursor:default; +} + +.x-tab-scroller-right { + background-image:url(../images/default/tabs/scroll-right.gif); + border-bottom-color:#8db2e3; +} + +.x-tab-panel-bbar .x-toolbar, .x-tab-panel-tbar .x-toolbar { + border-color:#99bbe8; +}.x-form-field { + font:normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-text, textarea.x-form-field { + background-color:#fff; + background-image:url(../images/default/form/text-bg.gif); + border-color:#b5b8c8; +} + +.x-form-select-one { + background-color:#fff; + border-color:#b5b8c8; +} + +.x-form-check-group-label { + border-bottom: 1px solid #99bbe8; + color: #15428b; +} + +.x-editor .x-form-check-wrap { + background-color:#fff; +} + +.x-form-field-wrap .x-form-trigger { + background-image:url(../images/default/form/trigger.gif); + border-bottom-color:#b5b8c8; +} + +.x-form-field-wrap .x-form-date-trigger { + background-image: url(../images/default/form/date-trigger.gif); +} + +.x-form-field-wrap .x-form-clear-trigger { + background-image: url(../images/default/form/clear-trigger.gif); +} + +.x-form-field-wrap .x-form-search-trigger { + background-image: url(../images/default/form/search-trigger.gif); +} + +.x-trigger-wrap-focus .x-form-trigger { + border-bottom-color:#7eadd9; +} + +.x-item-disabled .x-form-trigger-over { + border-bottom-color:#b5b8c8; +} + +.x-item-disabled .x-form-trigger-click { + border-bottom-color:#b5b8c8; +} + +.x-form-focus, textarea.x-form-focus { + border-color:#7eadd9; +} + +.x-form-invalid, textarea.x-form-invalid { + background-color:#fff; + background-image:url(../images/default/grid/invalid_line.gif); + border-color:#c30; +} + +.x-form-invalid.x-form-composite { + border: none; + background-image: none; +} + +.x-form-invalid.x-form-composite .x-form-invalid { + background-color:#fff; + background-image:url(../images/default/grid/invalid_line.gif); + border-color:#c30; +} + +.x-form-inner-invalid, textarea.x-form-inner-invalid { + background-color:#fff; + background-image:url(../images/default/grid/invalid_line.gif); +} + +.x-form-grow-sizer { + font:normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-item { + font:normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-form-invalid-msg { + color:#c0272b; + font:normal 11px tahoma, arial, helvetica, sans-serif; + background-image:url(../images/default/shared/warning.gif); +} + +.x-form-empty-field { + color:gray; +} + +.x-small-editor .x-form-field { + font:normal 11px arial, tahoma, helvetica, sans-serif; +} + +.ext-webkit .x-small-editor .x-form-field { + font:normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-form-invalid-icon { + background-image:url(../images/default/form/exclamation.gif); +} + +.x-fieldset { + border-color:#b5b8c8; +} + +.x-fieldset legend { + font:bold 11px tahoma, arial, helvetica, sans-serif; + color:#15428b; +} +.x-btn{ + font:normal 11px tahoma, verdana, helvetica; +} + +.x-btn button{ + font:normal 11px arial,tahoma,verdana,helvetica; + color:#333; +} + +.x-btn em { + font-style:normal; + font-weight:normal; +} + +.x-btn-tl, .x-btn-tr, .x-btn-tc, .x-btn-ml, .x-btn-mr, .x-btn-mc, .x-btn-bl, .x-btn-br, .x-btn-bc{ + background-image:url(../images/default/button/btn.gif); +} + +.x-btn-click .x-btn-text, .x-btn-menu-active .x-btn-text, .x-btn-pressed .x-btn-text{ + color:#000; +} + +.x-btn-disabled *{ + color:gray !important; +} + +.x-btn-mc em.x-btn-arrow { + background-image:url(../images/default/button/arrow.gif); +} + +.x-btn-mc em.x-btn-split { + background-image:url(../images/default/button/s-arrow.gif); +} + +.x-btn-over .x-btn-mc em.x-btn-split, .x-btn-click .x-btn-mc em.x-btn-split, .x-btn-menu-active .x-btn-mc em.x-btn-split, .x-btn-pressed .x-btn-mc em.x-btn-split { + background-image:url(../images/default/button/s-arrow-o.gif); +} + +.x-btn-mc em.x-btn-arrow-bottom { + background-image:url(../images/default/button/s-arrow-b-noline.gif); +} + +.x-btn-mc em.x-btn-split-bottom { + background-image:url(../images/default/button/s-arrow-b.gif); +} + +.x-btn-over .x-btn-mc em.x-btn-split-bottom, .x-btn-click .x-btn-mc em.x-btn-split-bottom, .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom, .x-btn-pressed .x-btn-mc em.x-btn-split-bottom { + background-image:url(../images/default/button/s-arrow-bo.gif); +} + +.x-btn-group-header { + color: #3e6aaa; +} + +.x-btn-group-tc { + background-image: url(../images/default/button/group-tb.gif); +} + +.x-btn-group-tl { + background-image: url(../images/default/button/group-cs.gif); +} + +.x-btn-group-tr { + background-image: url(../images/default/button/group-cs.gif); +} + +.x-btn-group-bc { + background-image: url(../images/default/button/group-tb.gif); +} + +.x-btn-group-bl { + background-image: url(../images/default/button/group-cs.gif); +} + +.x-btn-group-br { + background-image: url(../images/default/button/group-cs.gif); +} + +.x-btn-group-ml { + background-image: url(../images/default/button/group-lr.gif); +} +.x-btn-group-mr { + background-image: url(../images/default/button/group-lr.gif); +} + +.x-btn-group-notitle .x-btn-group-tc { + background-image: url(../images/default/button/group-tb.gif); +}.x-toolbar{ + border-color:#a9bfd3; + background-color:#d0def0; + background-image:url(../images/default/toolbar/bg.gif); +} + +.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{ + font:normal 11px arial,tahoma, helvetica, sans-serif; +} + +.x-toolbar .x-item-disabled { + color:gray; +} + +.x-toolbar .x-item-disabled * { + color:gray; +} + +.x-toolbar .x-btn-mc em.x-btn-split { + background-image:url(../images/default/button/s-arrow-noline.gif); +} + +.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split, .x-toolbar .x-btn-click .x-btn-mc em.x-btn-split, +.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split, .x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split +{ + background-image:url(../images/default/button/s-arrow-o.gif); +} + +.x-toolbar .x-btn-mc em.x-btn-split-bottom { + background-image:url(../images/default/button/s-arrow-b-noline.gif); +} + +.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split-bottom, .x-toolbar .x-btn-click .x-btn-mc em.x-btn-split-bottom, +.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom, .x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split-bottom +{ + background-image:url(../images/default/button/s-arrow-bo.gif); +} + +.x-toolbar .xtb-sep { + background-image: url(../images/default/grid/grid-blue-split.gif); +} + +.x-tbar-page-first{ + background-image: url(../images/default/grid/page-first.gif) !important; +} + +.x-tbar-loading{ + background-image: url(../images/default/grid/refresh.gif) !important; +} + +.x-tbar-page-last{ + background-image: url(../images/default/grid/page-last.gif) !important; +} + +.x-tbar-page-next{ + background-image: url(../images/default/grid/page-next.gif) !important; +} + +.x-tbar-page-prev{ + background-image: url(../images/default/grid/page-prev.gif) !important; +} + +.x-item-disabled .x-tbar-loading{ + background-image: url(../images/default/grid/refresh-disabled.gif) !important; +} + +.x-item-disabled .x-tbar-page-first{ + background-image: url(../images/default/grid/page-first-disabled.gif) !important; +} + +.x-item-disabled .x-tbar-page-last{ + background-image: url(../images/default/grid/page-last-disabled.gif) !important; +} + +.x-item-disabled .x-tbar-page-next{ + background-image: url(../images/default/grid/page-next-disabled.gif) !important; +} + +.x-item-disabled .x-tbar-page-prev{ + background-image: url(../images/default/grid/page-prev-disabled.gif) !important; +} + +.x-paging-info { + color:#444; +} + +.x-toolbar-more-icon { + background-image: url(../images/default/toolbar/more.gif) !important; +}.x-resizable-handle { + background-color:#fff; +} + +.x-resizable-over .x-resizable-handle-east, .x-resizable-pinned .x-resizable-handle-east, +.x-resizable-over .x-resizable-handle-west, .x-resizable-pinned .x-resizable-handle-west +{ + background-image:url(../images/default/sizer/e-handle.gif); +} + +.x-resizable-over .x-resizable-handle-south, .x-resizable-pinned .x-resizable-handle-south, +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north +{ + background-image:url(../images/default/sizer/s-handle.gif); +} + +.x-resizable-over .x-resizable-handle-north, .x-resizable-pinned .x-resizable-handle-north{ + background-image:url(../images/default/sizer/s-handle.gif); +} +.x-resizable-over .x-resizable-handle-southeast, .x-resizable-pinned .x-resizable-handle-southeast{ + background-image:url(../images/default/sizer/se-handle.gif); +} +.x-resizable-over .x-resizable-handle-northwest, .x-resizable-pinned .x-resizable-handle-northwest{ + background-image:url(../images/default/sizer/nw-handle.gif); +} +.x-resizable-over .x-resizable-handle-northeast, .x-resizable-pinned .x-resizable-handle-northeast{ + background-image:url(../images/default/sizer/ne-handle.gif); +} +.x-resizable-over .x-resizable-handle-southwest, .x-resizable-pinned .x-resizable-handle-southwest{ + background-image:url(../images/default/sizer/sw-handle.gif); +} +.x-resizable-proxy{ + border-color:#3b5a82; +} +.x-resizable-overlay{ + background-color:#fff; +} +.x-grid3 { + background-color:#fff; +} + +.x-grid-panel .x-panel-mc .x-panel-body { + border-color:#99bbe8; +} + +.x-grid3-row td, .x-grid3-summary-row td{ + font:normal 11px/13px arial, tahoma, helvetica, sans-serif; +} + +.x-grid3-hd-row td { + font:normal 11px/15px arial, tahoma, helvetica, sans-serif; +} + + +.x-grid3-hd-row td { + border-left-color:#eee; + border-right-color:#d0d0d0; +} + +.x-grid-row-loading { + background-color: #fff; + background-image:url(../images/default/shared/loading-balls.gif); +} + +.x-grid3-row { + border-color:#ededed; + border-top-color:#fff; +} + +.x-grid3-row-alt{ + background-color:#fafafa; +} + +.x-grid3-row-over { + border-color:#ddd; + background-color:#efefef; + background-image:url(../images/default/grid/row-over.gif); +} + +.x-grid3-resize-proxy { + background-color:#777; +} + +.x-grid3-resize-marker { + background-color:#777; +} + +.x-grid3-header{ + background-color:#f9f9f9; + background-image:url(../images/default/grid/grid3-hrow.gif); +} + +.x-grid3-header-pop { + border-left-color:#d0d0d0; +} + +.x-grid3-header-pop-inner { + border-left-color:#eee; + background-image:url(../images/default/grid/hd-pop.gif); +} + +td.x-grid3-hd-over, td.sort-desc, td.sort-asc, td.x-grid3-hd-menu-open { + border-left-color:#aaccf6; + border-right-color:#aaccf6; +} + +td.x-grid3-hd-over .x-grid3-hd-inner, td.sort-desc .x-grid3-hd-inner, td.sort-asc .x-grid3-hd-inner, td.x-grid3-hd-menu-open .x-grid3-hd-inner { + background-color:#ebf3fd; + background-image:url(../images/default/grid/grid3-hrow-over.gif); + +} + +.sort-asc .x-grid3-sort-icon { + background-image: url(../images/default/grid/sort_asc.gif); +} + +.sort-desc .x-grid3-sort-icon { + background-image: url(../images/default/grid/sort_desc.gif); +} + +.x-grid3-cell-text, .x-grid3-hd-text { + color:#000; +} + +.x-grid3-split { + background-image: url(../images/default/grid/grid-split.gif); +} + +.x-grid3-hd-text { + color:#15428b; +} + +.x-dd-drag-proxy .x-grid3-hd-inner{ + background-color:#ebf3fd; + background-image:url(../images/default/grid/grid3-hrow-over.gif); + border-color:#aaccf6; +} + +.col-move-top{ + background-image:url(../images/default/grid/col-move-top.gif); +} + +.col-move-bottom{ + background-image:url(../images/default/grid/col-move-bottom.gif); +} + +td.grid-hd-group-cell { + background: url(../images/default/grid/grid3-hrow.gif) repeat-x bottom; +} + +.x-grid3-row-selected { + background-color: #dfe8f6 !important; + background-image: none; + border-color:#a3bae9; +} + +.x-grid3-cell-selected{ + background-color: #b8cfee !important; + color:#000; +} + +.x-grid3-cell-selected span{ + color:#000 !important; +} + +.x-grid3-cell-selected .x-grid3-cell-text{ + color:#000; +} + +.x-grid3-locked td.x-grid3-row-marker, .x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker{ + background-color:#ebeadb !important; + background-image:url(../images/default/grid/grid-hrow.gif) !important; + color:#000; + border-top-color:#fff; + border-right-color:#6fa0df !important; +} + +.x-grid3-locked td.x-grid3-row-marker div, .x-grid3-locked .x-grid3-row-selected td.x-grid3-row-marker div{ + color:#15428b !important; +} + +.x-grid3-dirty-cell { + background-image:url(../images/default/grid/dirty.gif); +} + +.x-grid3-topbar, .x-grid3-bottombar{ + font:normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-grid3-bottombar .x-toolbar{ + border-top-color:#a9bfd3; +} + +.x-props-grid .x-grid3-td-name .x-grid3-cell-inner{ + background-image:url(../images/default/grid/grid3-special-col-bg.gif) !important; + color:#000 !important; +} + +.x-props-grid .x-grid3-body .x-grid3-td-name{ + background-color:#fff !important; + border-right-color:#eee; +} + +.xg-hmenu-sort-asc .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-asc.gif); +} + +.xg-hmenu-sort-desc .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-desc.gif); +} + +.xg-hmenu-lock .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-lock.gif); +} + +.xg-hmenu-unlock .x-menu-item-icon{ + background-image: url(../images/default/grid/hmenu-unlock.gif); +} + +.x-grid3-hd-btn { + background-color:#c3daf9; + background-image:url(../images/default/grid/grid3-hd-btn.gif); +} + +.x-grid3-body .x-grid3-td-expander { + background-image:url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-row-expander { + background-image:url(../images/default/grid/row-expand-sprite.gif); +} + +.x-grid3-body .x-grid3-td-checker { + background-image: url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-row-checker, .x-grid3-hd-checker { + background-image:url(../images/default/grid/row-check-sprite.gif); +} + +.x-grid3-body .x-grid3-td-numberer { + background-image:url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-body .x-grid3-td-numberer .x-grid3-cell-inner { + color:#444; +} + +.x-grid3-body .x-grid3-td-row-icon { + background-image:url(../images/default/grid/grid3-special-col-bg.gif); +} + +.x-grid3-body .x-grid3-row-selected .x-grid3-td-numberer, +.x-grid3-body .x-grid3-row-selected .x-grid3-td-checker, +.x-grid3-body .x-grid3-row-selected .x-grid3-td-expander { + background-image:url(../images/default/grid/grid3-special-col-sel-bg.gif); +} + +.x-grid3-check-col { + background-image:url(../images/default/menu/unchecked.gif); +} + +.x-grid3-check-col-on { + background-image:url(../images/default/menu/checked.gif); +} + +.x-grid-group, .x-grid-group-body, .x-grid-group-hd { + zoom:1; +} + +.x-grid-group-hd { + border-bottom-color:#99bbe8; +} + +.x-grid-group-hd div.x-grid-group-title { + background-image:url(../images/default/grid/group-collapse.gif); + color:#3764a0; + font:bold 11px tahoma, arial, helvetica, sans-serif; +} + +.x-grid-group-collapsed .x-grid-group-hd div.x-grid-group-title { + background-image:url(../images/default/grid/group-expand.gif); +} + +.x-group-by-icon { + background-image:url(../images/default/grid/group-by.gif); +} + +.x-cols-icon { + background-image:url(../images/default/grid/columns.gif); +} + +.x-show-groups-icon { + background-image:url(../images/default/grid/group-by.gif); +} + +.x-grid-empty { + color:gray; + font:normal 11px tahoma, arial, helvetica, sans-serif; +} + +.x-grid-with-col-lines .x-grid3-row td.x-grid3-cell { + border-right-color:#ededed; +} + +.x-grid-with-col-lines .x-grid3-row-selected { + border-top-color:#a3bae9; +}.x-pivotgrid .x-grid3-header-offset table td { + background: url(../images/default/grid/grid3-hrow.gif) repeat-x 50% 100%; + border-left: 1px solid; + border-right: 1px solid; + border-left-color: #EEE; + border-right-color: #D0D0D0; +} + +.x-pivotgrid .x-grid3-row-headers { + background-color: #f9f9f9; +} + +.x-pivotgrid .x-grid3-row-headers table td { + background: #EEE url(../images/default/grid/grid3-rowheader.gif) repeat-x left top; + border-left: 1px solid; + border-right: 1px solid; + border-left-color: #EEE; + border-right-color: #D0D0D0; + border-bottom: 1px solid; + border-bottom-color: #D0D0D0; + height: 18px; +} +.x-dd-drag-ghost{ + color:#000; + font: normal 11px arial, helvetica, sans-serif; + border-color: #ddd #bbb #bbb #ddd; + background-color:#fff; +} + +.x-dd-drop-nodrop .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-no.gif); +} + +.x-dd-drop-ok .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-yes.gif); +} + +.x-dd-drop-ok-add .x-dd-drop-icon{ + background-image: url(../images/default/dd/drop-add.gif); +} + +.x-view-selector { + background-color:#c3daf9; + border-color:#3399bb; +}.x-tree-node-expanded .x-tree-node-icon{ + background-image:url(../images/default/tree/folder-open.gif); +} + +.x-tree-node-leaf .x-tree-node-icon{ + background-image:url(../images/default/tree/leaf.gif); +} + +.x-tree-node-collapsed .x-tree-node-icon{ + background-image:url(../images/default/tree/folder.gif); +} + +.x-tree-node-loading .x-tree-node-icon{ + background-image:url(../images/default/tree/loading.gif) !important; +} + +.x-tree-node .x-tree-node-inline-icon { + background-image: none; +} + +.x-tree-node-loading a span{ + font-style: italic; + color:#444444; +} + +.x-tree-lines .x-tree-elbow{ + background-image:url(../images/default/tree/elbow.gif); +} + +.x-tree-lines .x-tree-elbow-plus{ + background-image:url(../images/default/tree/elbow-plus.gif); +} + +.x-tree-lines .x-tree-elbow-minus{ + background-image:url(../images/default/tree/elbow-minus.gif); +} + +.x-tree-lines .x-tree-elbow-end{ + background-image:url(../images/default/tree/elbow-end.gif); +} + +.x-tree-lines .x-tree-elbow-end-plus{ + background-image:url(../images/default/tree/elbow-end-plus.gif); +} + +.x-tree-lines .x-tree-elbow-end-minus{ + background-image:url(../images/default/tree/elbow-end-minus.gif); +} + +.x-tree-lines .x-tree-elbow-line{ + background-image:url(../images/default/tree/elbow-line.gif); +} + +.x-tree-no-lines .x-tree-elbow-plus{ + background-image:url(../images/default/tree/elbow-plus-nl.gif); +} + +.x-tree-no-lines .x-tree-elbow-minus{ + background-image:url(../images/default/tree/elbow-minus-nl.gif); +} + +.x-tree-no-lines .x-tree-elbow-end-plus{ + background-image:url(../images/default/tree/elbow-end-plus-nl.gif); +} + +.x-tree-no-lines .x-tree-elbow-end-minus{ + background-image:url(../images/default/tree/elbow-end-minus-nl.gif); +} + +.x-tree-arrows .x-tree-elbow-plus{ + background-image:url(../images/default/tree/arrows.gif); +} + +.x-tree-arrows .x-tree-elbow-minus{ + background-image:url(../images/default/tree/arrows.gif); +} + +.x-tree-arrows .x-tree-elbow-end-plus{ + background-image:url(../images/default/tree/arrows.gif); +} + +.x-tree-arrows .x-tree-elbow-end-minus{ + background-image:url(../images/default/tree/arrows.gif); +} + +.x-tree-node{ + color:#000; + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-tree-node a, .x-dd-drag-ghost a{ + color:#000; +} + +.x-tree-node a span, .x-dd-drag-ghost a span{ + color:#000; +} + +.x-tree-node .x-tree-node-disabled a span{ + color:gray !important; +} + +.x-tree-node div.x-tree-drag-insert-below{ + border-bottom-color:#36c; +} + +.x-tree-node div.x-tree-drag-insert-above{ + border-top-color:#36c; +} + +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a{ + border-bottom-color:#36c; +} + +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a{ + border-top-color:#36c; +} + +.x-tree-node .x-tree-drag-append a span{ + background-color:#ddd; + border-color:gray; +} + +.x-tree-node .x-tree-node-over { + background-color: #eee; +} + +.x-tree-node .x-tree-selected { + background-color: #d9e8fb; +} + +.x-tree-drop-ok-append .x-dd-drop-icon{ + background-image: url(../images/default/tree/drop-add.gif); +} + +.x-tree-drop-ok-above .x-dd-drop-icon{ + background-image: url(../images/default/tree/drop-over.gif); +} + +.x-tree-drop-ok-below .x-dd-drop-icon{ + background-image: url(../images/default/tree/drop-under.gif); +} + +.x-tree-drop-ok-between .x-dd-drop-icon{ + background-image: url(../images/default/tree/drop-between.gif); +}.x-date-picker { + border-color: #1b376c; + background-color:#fff; +} + +.x-date-middle,.x-date-left,.x-date-right { + background-image: url(../images/default/shared/hd-sprite.gif); + color:#fff; + font:bold 11px "sans serif", tahoma, verdana, helvetica; +} + +.x-date-middle .x-btn .x-btn-text { + color:#fff; +} + +.x-date-middle .x-btn-mc em.x-btn-arrow { + background-image:url(../images/default/toolbar/btn-arrow-light.gif); +} + +.x-date-right a { + background-image: url(../images/default/shared/right-btn.gif); +} + +.x-date-left a{ + background-image: url(../images/default/shared/left-btn.gif); +} + +.x-date-inner th { + background-color:#dfecfb; + background-image:url(../images/default/shared/glass-bg.gif); + border-bottom-color:#a3bad9; + font:normal 10px arial, helvetica,tahoma,sans-serif; + color:#233d6d; +} + +.x-date-inner td { + border-color:#fff; +} + +.x-date-inner a { + font:normal 11px arial, helvetica,tahoma,sans-serif; + color:#000; +} + +.x-date-inner .x-date-active{ + color:#000; +} + +.x-date-inner .x-date-selected a{ + background-color:#dfecfb; + background-image:url(../images/default/shared/glass-bg.gif); + border-color:#8db2e3; +} + +.x-date-inner .x-date-today a{ + border-color:darkred; +} + +.x-date-inner .x-date-selected span{ + font-weight:bold; +} + +.x-date-inner .x-date-prevday a,.x-date-inner .x-date-nextday a { + color:#aaa; +} + +.x-date-bottom { + border-top-color:#a3bad9; + background-color:#dfecfb; + background-image:url(../images/default/shared/glass-bg.gif); +} + +.x-date-inner a:hover, .x-date-inner .x-date-disabled a:hover{ + color:#000; + background-color:#ddecfe; +} + +.x-date-inner .x-date-disabled a { + background-color:#eee; + color:#bbb; +} + +.x-date-mmenu{ + background-color:#eee !important; +} + +.x-date-mmenu .x-menu-item { + font-size:10px; + color:#000; +} + +.x-date-mp { + background-color:#fff; +} + +.x-date-mp td { + font:normal 11px arial, helvetica,tahoma,sans-serif; +} + +.x-date-mp-btns button { + background-color:#083772; + color:#fff; + border-color: #3366cc #000055 #000055 #3366cc; + font:normal 11px arial, helvetica,tahoma,sans-serif; +} + +.x-date-mp-btns { + background-color: #dfecfb; + background-image: url(../images/default/shared/glass-bg.gif); +} + +.x-date-mp-btns td { + border-top-color: #c5d2df; +} + +td.x-date-mp-month a,td.x-date-mp-year a { + color:#15428b; +} + +td.x-date-mp-month a:hover,td.x-date-mp-year a:hover { + color:#15428b; + background-color: #ddecfe; +} + +td.x-date-mp-sel a { + background-color: #dfecfb; + background-image: url(../images/default/shared/glass-bg.gif); + border-color:#8db2e3; +} + +.x-date-mp-ybtn a { + background-image:url(../images/default/panel/tool-sprites.gif); +} + +td.x-date-mp-sep { + border-right-color:#c5d2df; +}.x-tip .x-tip-close{ + background-image: url(../images/default/qtip/close.gif); +} + +.x-tip .x-tip-tc, .x-tip .x-tip-tl, .x-tip .x-tip-tr, .x-tip .x-tip-bc, .x-tip .x-tip-bl, .x-tip .x-tip-br, .x-tip .x-tip-ml, .x-tip .x-tip-mr { + background-image: url(../images/default/qtip/tip-sprite.gif); +} + +.x-tip .x-tip-mc { + font: normal 11px tahoma,arial,helvetica,sans-serif; +} +.x-tip .x-tip-ml { + background-color: #fff; +} + +.x-tip .x-tip-header-text { + font: bold 11px tahoma,arial,helvetica,sans-serif; + color:#444; +} + +.x-tip .x-tip-body { + font: normal 11px tahoma,arial,helvetica,sans-serif; + color:#444; +} + +.x-form-invalid-tip .x-tip-tc, .x-form-invalid-tip .x-tip-tl, .x-form-invalid-tip .x-tip-tr, .x-form-invalid-tip .x-tip-bc, +.x-form-invalid-tip .x-tip-bl, .x-form-invalid-tip .x-tip-br, .x-form-invalid-tip .x-tip-ml, .x-form-invalid-tip .x-tip-mr +{ + background-image: url(../images/default/form/error-tip-corners.gif); +} + +.x-form-invalid-tip .x-tip-body { + background-image:url(../images/default/form/exclamation.gif); +} + +.x-tip-anchor { + background-image:url(../images/default/qtip/tip-anchor-sprite.gif); +}.x-menu { + background-color:#f0f0f0; + background-image:url(../images/default/menu/menu.gif); +} + +.x-menu-floating{ + border-color:#718bb7; +} + +.x-menu-nosep { + background-image:none; +} + +.x-menu-list-item{ + font:normal 11px arial,tahoma,sans-serif; +} + +.x-menu-item-arrow{ + background-image:url(../images/default/menu/menu-parent.gif); +} + +.x-menu-sep { + background-color:#e0e0e0; + border-bottom-color:#fff; +} + +a.x-menu-item { + color:#222; +} + +.x-menu-item-active { + background-image: url(../images/default/menu/item-over.gif); + background-color: #dbecf4; + border-color:#aaccf6; +} + +.x-menu-item-active a.x-menu-item { + border-color:#aaccf6; +} + +.x-menu-check-item .x-menu-item-icon{ + background-image:url(../images/default/menu/unchecked.gif); +} + +.x-menu-item-checked .x-menu-item-icon{ + background-image:url(../images/default/menu/checked.gif); +} + +.x-menu-item-checked .x-menu-group-item .x-menu-item-icon{ + background-image:url(../images/default/menu/group-checked.gif); +} + +.x-menu-group-item .x-menu-item-icon{ + background-image:none; +} + +.x-menu-plain { + background-color:#f0f0f0 !important; + background-image: none; +} + +.x-date-menu, .x-color-menu{ + background-color: #fff !important; +} + +.x-menu .x-date-picker{ + border-color:#a3bad9; +} + +.x-cycle-menu .x-menu-item-checked { + border-color:#a3bae9 !important; + background-color:#def8f6; +} + +.x-menu-scroller-top { + background-image:url(../images/default/layout/mini-top.gif); +} + +.x-menu-scroller-bottom { + background-image:url(../images/default/layout/mini-bottom.gif); +} +.x-box-tl { + background-image: url(../images/default/box/corners.gif); +} + +.x-box-tc { + background-image: url(../images/default/box/tb.gif); +} + +.x-box-tr { + background-image: url(../images/default/box/corners.gif); +} + +.x-box-ml { + background-image: url(../images/default/box/l.gif); +} + +.x-box-mc { + background-color: #eee; + background-image: url(../images/default/box/tb.gif); + font-family: "Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif; + color: #393939; + font-size: 12px; +} + +.x-box-mc h3 { + font-size: 14px; + font-weight: bold; +} + +.x-box-mr { + background-image: url(../images/default/box/r.gif); +} + +.x-box-bl { + background-image: url(../images/default/box/corners.gif); +} + +.x-box-bc { + background-image: url(../images/default/box/tb.gif); +} + +.x-box-br { + background-image: url(../images/default/box/corners.gif); +} + +.x-box-blue .x-box-bl, .x-box-blue .x-box-br, .x-box-blue .x-box-tl, .x-box-blue .x-box-tr { + background-image: url(../images/default/box/corners-blue.gif); +} + +.x-box-blue .x-box-bc, .x-box-blue .x-box-mc, .x-box-blue .x-box-tc { + background-image: url(../images/default/box/tb-blue.gif); +} + +.x-box-blue .x-box-mc { + background-color: #c3daf9; +} + +.x-box-blue .x-box-mc h3 { + color: #17385b; +} + +.x-box-blue .x-box-ml { + background-image: url(../images/default/box/l-blue.gif); +} + +.x-box-blue .x-box-mr { + background-image: url(../images/default/box/r-blue.gif); +}.x-combo-list { + border-color:#98c0f4; + background-color:#ddecfe; + font:normal 12px tahoma, arial, helvetica, sans-serif; +} + +.x-combo-list-inner { + background-color:#fff; +} + +.x-combo-list-hd { + font:bold 11px tahoma, arial, helvetica, sans-serif; + color:#15428b; + background-image: url(../images/default/layout/panel-title-light-bg.gif); + border-bottom-color:#98c0f4; +} + +.x-resizable-pinned .x-combo-list-inner { + border-bottom-color:#98c0f4; +} + +.x-combo-list-item { + border-color:#fff; +} + +.x-combo-list .x-combo-selected{ + border-color:#a3bae9 !important; + background-color:#dfe8f6; +} + +.x-combo-list .x-toolbar { + border-top-color:#98c0f4; +} + +.x-combo-list-small { + font:normal 11px tahoma, arial, helvetica, sans-serif; +}.x-panel { + border-color: #99bbe8; +} + +.x-panel-header { + color:#15428b; + font-weight:bold; + font-size: 11px; + font-family: tahoma,arial,verdana,sans-serif; + border-color:#99bbe8; + background-image: url(../images/default/panel/white-top-bottom.gif); +} + +.x-panel-body { + border-color:#99bbe8; + background-color:#fff; +} + +.x-panel-bbar .x-toolbar, .x-panel-tbar .x-toolbar { + border-color:#99bbe8; +} + +.x-panel-tbar-noheader .x-toolbar, .x-panel-mc .x-panel-tbar .x-toolbar { + border-top-color:#99bbe8; +} + +.x-panel-body-noheader, .x-panel-mc .x-panel-body { + border-top-color:#99bbe8; +} + +.x-panel-tl .x-panel-header { + color:#15428b; + font:bold 11px tahoma,arial,verdana,sans-serif; +} + +.x-panel-tc { + background-image: url(../images/default/panel/top-bottom.gif); +} + +.x-panel-tl, .x-panel-tr, .x-panel-bl, .x-panel-br{ + background-image: url(../images/default/panel/corners-sprite.gif); + border-bottom-color:#99bbe8; +} + +.x-panel-bc { + background-image: url(../images/default/panel/top-bottom.gif); +} + +.x-panel-mc { + font: normal 11px tahoma,arial,helvetica,sans-serif; + background-color:#dfe8f6; +} + +.x-panel-ml { + background-color: #fff; + background-image:url(../images/default/panel/left-right.gif); +} + +.x-panel-mr { + background-image: url(../images/default/panel/left-right.gif); +} + +.x-tool { + background-image:url(../images/default/panel/tool-sprites.gif); +} + +.x-panel-ghost { + background-color:#cbddf3; +} + +.x-panel-ghost ul { + border-color:#99bbe8; +} + +.x-panel-dd-spacer { + border-color:#99bbe8; +} + +.x-panel-fbar td,.x-panel-fbar span,.x-panel-fbar input,.x-panel-fbar div,.x-panel-fbar select,.x-panel-fbar label{ + font:normal 11px arial,tahoma, helvetica, sans-serif; +} +.x-window-proxy { + background-color:#c7dffc; + border-color:#99bbe8; +} + +.x-window-tl .x-window-header { + color:#15428b; + font:bold 11px tahoma,arial,verdana,sans-serif; +} + +.x-window-tc { + background-image: url(../images/default/window/top-bottom.png); +} + +.x-window-tl { + background-image: url(../images/default/window/left-corners.png); +} + +.x-window-tr { + background-image: url(../images/default/window/right-corners.png); +} + +.x-window-bc { + background-image: url(../images/default/window/top-bottom.png); +} + +.x-window-bl { + background-image: url(../images/default/window/left-corners.png); +} + +.x-window-br { + background-image: url(../images/default/window/right-corners.png); +} + +.x-window-mc { + border-color:#99bbe8; + font: normal 11px tahoma,arial,helvetica,sans-serif; + background-color:#dfe8f6; +} + +.x-window-ml { + background-image: url(../images/default/window/left-right.png); +} + +.x-window-mr { + background-image: url(../images/default/window/left-right.png); +} + +.x-window-maximized .x-window-tc { + background-color:#fff; +} + +.x-window-bbar .x-toolbar { + border-top-color:#99bbe8; +} + +.x-panel-ghost .x-window-tl { + border-bottom-color:#99bbe8; +} + +.x-panel-collapsed .x-window-tl { + border-bottom-color:#84a0c4; +} + +.x-dlg-mask{ + background-color:#ccc; +} + +.x-window-plain .x-window-mc { + background-color: #ccd9e8; + border-color: #a3bae9 #dfe8f6 #dfe8f6 #a3bae9; +} + +.x-window-plain .x-window-body { + border-color: #dfe8f6 #a3bae9 #a3bae9 #dfe8f6; +} + +body.x-body-masked .x-window-plain .x-window-mc { + background-color: #ccd9e8; +}.x-html-editor-wrap { + border-color:#a9bfd3; + background-color:#fff; +} +.x-html-editor-tb .x-btn-text { + background-image:url(../images/default/editor/tb-sprite.gif); +}.x-panel-noborder .x-panel-header-noborder { + border-bottom-color:#99bbe8; +} + +.x-panel-noborder .x-panel-tbar-noborder .x-toolbar { + border-bottom-color:#99bbe8; +} + +.x-panel-noborder .x-panel-bbar-noborder .x-toolbar { + border-top-color:#99bbe8; +} + +.x-tab-panel-bbar-noborder .x-toolbar { + border-top-color:#99bbe8; +} + +.x-tab-panel-tbar-noborder .x-toolbar { + border-bottom-color:#99bbe8; +}.x-border-layout-ct { + background-color:#dfe8f6; +} + +.x-accordion-hd { + color:#222; + font-weight:normal; + background-image: url(../images/default/panel/light-hd.gif); +} + +.x-layout-collapsed{ + background-color:#d2e0f2; + border-color:#98c0f4; +} + +.x-layout-collapsed-over{ + background-color:#d9e8fb; +} + +.x-layout-split-west .x-layout-mini { + background-image:url(../images/default/layout/mini-left.gif); +} +.x-layout-split-east .x-layout-mini { + background-image:url(../images/default/layout/mini-right.gif); +} +.x-layout-split-north .x-layout-mini { + background-image:url(../images/default/layout/mini-top.gif); +} +.x-layout-split-south .x-layout-mini { + background-image:url(../images/default/layout/mini-bottom.gif); +} + +.x-layout-cmini-west .x-layout-mini { + background-image:url(../images/default/layout/mini-right.gif); +} + +.x-layout-cmini-east .x-layout-mini { + background-image:url(../images/default/layout/mini-left.gif); +} + +.x-layout-cmini-north .x-layout-mini { + background-image:url(../images/default/layout/mini-bottom.gif); +} + +.x-layout-cmini-south .x-layout-mini { + background-image:url(../images/default/layout/mini-top.gif); +}.x-progress-wrap { + border-color:#6593cf; +} + +.x-progress-inner { + background-color:#e0e8f3; + background-image:url(../images/default/qtip/bg.gif); +} + +.x-progress-bar { + background-color:#9cbfee; + background-image:url(../images/default/progress/progress-bg.gif); + border-top-color:#d1e4fd; + border-bottom-color:#7fa9e4; + border-right-color:#7fa9e4; +} + +.x-progress-text { + font-size:11px; + font-weight:bold; + color:#fff; +} + +.x-progress-text-back { + color:#396095; +}.x-list-header{ + background-color:#f9f9f9; + background-image:url(../images/default/grid/grid3-hrow.gif); +} + +.x-list-header-inner div em { + border-left-color:#ddd; + font:normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-list-body dt em { + font:normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-list-over { + background-color:#eee; +} + +.x-list-selected { + background-color:#dfe8f6; +} + +.x-list-resizer { + border-left-color:#555; + border-right-color:#555; +} + +.x-list-header-inner em.sort-asc, .x-list-header-inner em.sort-desc { + background-image:url(../images/default/grid/sort-hd.gif); + border-color: #99bbe8; +}.x-slider-horz, .x-slider-horz .x-slider-end, .x-slider-horz .x-slider-inner { + background-image:url(../images/default/slider/slider-bg.png); +} + +.x-slider-horz .x-slider-thumb { + background-image:url(../images/default/slider/slider-thumb.png); +} + +.x-slider-vert, .x-slider-vert .x-slider-end, .x-slider-vert .x-slider-inner { + background-image:url(../images/default/slider/slider-v-bg.png); +} + +.x-slider-vert .x-slider-thumb { + background-image:url(../images/default/slider/slider-v-thumb.png); +}.x-window-dlg .ext-mb-text, +.x-window-dlg .x-window-header-text { + font-size:12px; +} + +.x-window-dlg .ext-mb-textarea { + font:normal 12px tahoma,arial,helvetica,sans-serif; +} + +.x-window-dlg .x-msg-box-wait { + background-image:url(../images/default/grid/loading.gif); +} + +.x-window-dlg .ext-mb-info { + background-image:url(../images/default/window/icon-info.gif); +} + +.x-window-dlg .ext-mb-warning { + background-image:url(../images/default/window/icon-warning.gif); +} + +.x-window-dlg .ext-mb-question { + background-image:url(../images/default/window/icon-question.gif); +} + +.x-window-dlg .ext-mb-error { + background-image:url(../images/default/window/icon-error.gif); +}
\ No newline at end of file diff --git a/modules/organize/vendor/ext/css/ux-all.css b/modules/organize/vendor/ext/css/ux-all.css new file mode 100644 index 00000000..42943be7 --- /dev/null +++ b/modules/organize/vendor/ext/css/ux-all.css @@ -0,0 +1,772 @@ +/*! + * Ext JS Library 3.3.1 + * Copyright(c) 2006-2010 Sencha Inc. + * licensing@sencha.com + * http://www.sencha.com/license + */ +.ux-layout-center-item { + margin:0 auto; + text-align:left; +} +.ux-layout-center .x-panel-body, +body.ux-layout-center { + text-align:center; +} +td.ux-grid-hd-group-cell { + background: url(../../../resources/images/default/grid/grid3-hrow.gif) repeat-x bottom; +}.x-column-tree .x-panel-header { + padding: 3px 0px 0px 0px; + border-bottom-width: 0px; +} + +.x-column-tree .x-panel-header .x-panel-header-text { + margin-left: 3px +} + +.x-column-tree .x-tree-node { + zoom:1; +} +.x-column-tree .x-tree-node-el { + /*border-bottom:1px solid #eee; borders? */ + zoom:1; +} +.x-column-tree .x-tree-selected { + background: #d9e8fb; +} +.x-column-tree .x-tree-node a { + line-height:18px; + vertical-align:middle; +} +.x-column-tree .x-tree-node a span{ + +} +.x-column-tree .x-tree-node .x-tree-selected a span{ + background:transparent; + color:#000; +} +.x-tree-col { + float:left; + overflow:hidden; + padding:0 1px; + zoom:1; +} + +.x-tree-col-text, .x-tree-hd-text { + color:#000; + overflow:hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + padding:3px 3px 3px 5px; + white-space: nowrap; + font:normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-tree-headers { + margin-top: 3px; + background: #f9f9f9 url(../../../resources/images/default/grid/grid3-hrow.gif) repeat-x 0 bottom; + cursor:default; + zoom:1; +} + +.x-tree-hd { + float:left; + overflow:hidden; + border-left:1px solid #eee; + border-right:1px solid #d0d0d0; +} +/* + * FileUploadField component styles + */ +.x-form-file-wrap { + position: relative; + height: 22px; +} +.x-form-file-wrap .x-form-file { + position: absolute; + right: 0; + -moz-opacity: 0; + filter:alpha(opacity: 0); + opacity: 0; + z-index: 2; + height: 22px; +} +.x-form-file-wrap .x-form-file-btn { + position: absolute; + right: 0; + z-index: 1; +} +.x-form-file-wrap .x-form-file-text { + position: absolute; + left: 0; + z-index: 3; + color: #777; +}/** + * GridFilters Styles + **/ +/* +.x-grid3-hd-row .ux-filtered-column { + border-left: 1px solid #C7E3B4; + border-right: 1px solid #C7E3B4; +} + +.x-grid3-hd-row .ux-filtered-column .x-grid3-hd-inner { + background-image: url(../images/header_bg.gif); +} + +.ux-filtered-column .x-grid3-hd-btn { + background-image: url(../images/hd-btn.gif); +} +*/ +.x-grid3-hd-row td.ux-filtered-column { + font-style: italic; + font-weight: bold; +} + +.ux-filtered-column.sort-asc .x-grid3-sort-icon { + background-image: url(../images/sort_filtered_asc.gif) !important; +} + +.ux-filtered-column.sort-desc .x-grid3-sort-icon { + background-image: url(../images/sort_filtered_desc.gif) !important; +} + +.ux-gridfilter-text-icon { + background-image: url(../images/find.png) !important; +} + +/* Temporary Patch for Bug ??? */ +.x-menu-list-item-indent .x-menu-item-icon { + position: relative; + top: 3px; + left: 3px; + margin-right: 10px; +} +li.x-menu-list-item-indent { + padding-left:0px; +} +li.x-menu-list-item div { + display: block; +} + +/** + * RangeMenu Styles + **/ +.ux-rangemenu-gt { + background-image: url(../images/greater_than.png) !important; +} + +.ux-rangemenu-lt { + background-image: url(../images/less_than.png) !important; +} + +.ux-rangemenu-eq { + background-image: url(../images/equals.png) !important; +} +.x-grid3-summary-row { + border-left:1px solid #fff; + border-right:1px solid #fff; + color:#333; + background: #f1f2f4; +} +.x-grid3-summary-row .x-grid3-cell-inner { + font-weight:bold; + padding-bottom:4px; +} +.x-grid3-cell-first .x-grid3-cell-inner { + padding-left:16px; +} +.x-grid-hide-summary .x-grid3-summary-row { + display:none; +} +.x-grid3-summary-msg { + padding:4px 16px; + font-weight:bold; +}.x-grouptabs-panel { + background-color: #4E78B1; + border: solid 15px #4E78B1; +} +.x-tab-panel-left .x-grouptabs-panel-header, +.x-tab-panel-right .x-grouptabs-panel-header { + float: left; + border: 0; + background: transparent; +} +.x-tab-panel-right .x-grouptabs-panel-header { + float:right; +} +.x-tab-panel-left .x-grouptabs-bwrap { + float: right; + position: relative; +} +.x-tab-panel-right .x-grouptabs-bwrap { + float: left; + position: relative; +} +.x-tab-panel-left ul.x-grouptabs-strip, +.x-tab-panel-right ul.x-grouptabs-strip { + width: auto; + display: block; +} +.x-tab-panel-left ul.x-grouptabs-strip li, +.x-tab-panel-right ul.x-grouptabs-strip li { + padding: 6px 0 2px 6px; + float: none; + margin: 0; + position: relative; + clear: both; +} +.x-tab-panel-left .x-tab-panel-header ul.x-grouptabs-strip a.x-grouptabs-text, +.x-tab-panel-right .x-tab-panel-header ul.x-grouptabs-strip a.x-grouptabs-text{ + font-size: 13px; + line-height: 18px; + cursor: pointer; +} + +.x-tab-panel-left .x-tab-panel-header ul.x-grouptabs-strip a.x-grouptabs-text{ + padding-left: 18px; +} +.x-tab-panel-right .x-tab-panel-header ul.x-grouptabs-strip a.x-grouptabs-text{ + padding-right: 18px; +} + +.x-tab-panel-left .x-tab-panel-header ul.x-grouptabs-sub a.x-grouptabs-text, +.x-tab-panel-right .x-tab-panel-header ul.x-grouptabs-sub a.x-grouptabs-text{ + font-size: 12px; + padding: 0; +} + +.x-tab-panel-left .x-tab-panel-header ul.x-grouptabs-sub a.x-grouptabs-text{ + margin-left: 4px; +} +.x-tab-panel-right .x-tab-panel-header ul.x-grouptabs-sub a.x-grouptabs-text{ + margin-right: 4px; +} + +.x-grouptabs-panel .x-grouptabs-strip a.x-grouptabs-text{ + overflow: hidden; + white-space: nowrap; + display: block; + color: #DFE8F6; + font-family: tahoma, arial, sans-serif; + font-weight: bold; + text-decoration: none; +} +.x-tab-panel-right .x-grouptabs-strip a.x-grouptabs-text { + text-align: right; +} + +.x-grouptabs-panel .x-grouptabs-strip-active a.x-grouptabs-text { + color: #395B8E; +} + +.x-grouptabs-panel ul.x-grouptabs-sub a.x-grouptabs-text { + font-weight: normal; +} +.x-tab-joint { + position: absolute; + width: 3px; + top: 1px; + background: #fff; + z-index: 8999; +} + +.x-grouptabs-panel .x-grouptabs-panel-body { + border: 1px solid #999; +} + +.x-grouptabs-panel ul.x-grouptabs-strip li { + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + border-left: 1px solid transparent; +} + +.x-grouptabs-panel ul.x-grouptabs-strip li.x-grouptabs-strip-active { + border: 0; + background: #fff; + border-top: 1px solid #999; + border-bottom: 1px solid #999; +} + +.x-tab-panel-left ul.x-grouptabs-strip li.x-grouptabs-strip-active { + border-left: 1px solid #999; +} +.x-tab-panel-right ul.x-grouptabs-strip li.x-grouptabs-strip-active { + border-right: 1px solid #999; +} + +.x-grouptabs-panel li.x-grouptabs-strip-active ul.x-grouptabs-sub li.x-grouptabs-strip-active{ + background-color: #EDEEF0; +} + +.x-grouptabs-panel li.x-grouptabs-strip-active ul.x-grouptabs-sub { + background-color: transparent; +} + +.x-grouptabs-panel li.x-grouptabs-strip-active ul.x-grouptabs-sub li { + border-color: transparent; +} + +/* Tab corners */ +.x-grouptabs-panel .x-grouptabs-corner { + background-image: url('../images/x-grouptabs-corners.gif'); + display: none; + width: 11px; + height: 11px; + position: absolute; + font-size: 1px; + line-height: 6px; + overflow: hidden; + zoom:1; +} +.x-grouptabs-panel .x-grouptabs-strip-active .x-grouptabs-corner { + display: block; +} +.x-grouptabs-panel .x-grouptabs-main.x-grouptabs-strip-active ul.x-grouptabs-sub .x-grouptabs-corner { + display: none; +} + +.x-grouptabs-panel .x-grouptabs-corner-top-left { + background-position: top left; + left: 0; top: 0; +} +.x-grouptabs-panel .x-grouptabs-corner-bottom-left { + background-position: bottom left; + left: 0; bottom: 0; +} +.x-grouptabs-panel .x-grouptabs-corner-top-right { + background-position: top right; + right: 0; top: 0; +} +.x-grouptabs-panel .x-grouptabs-corner-bottom-right { + background-position: bottom right; + right: 0; bottom: 0; +} +.x-grouptabs-panel li.x-grouptabs-strip-active .x-grouptabs-corner-bottom-left{ + bottom: -4px; left: -4px; +} +.x-grouptabs-panel li.x-grouptabs-strip-active .x-grouptabs-corner-bottom-right{ + bottom: -4px; right: -4px; +} +.x-grouptabs-panel li.x-grouptabs-strip-active .x-grouptabs-corner-top-left{ + top: -4px; left: -4px; +} +.x-grouptabs-panel li.x-grouptabs-strip-active .x-grouptabs-corner-top-right{ + top: -4px; right: -4px; +} + +.x-grouptabs-panel ul.x-grouptabs-sub li.x-tab-with-icon a.x-grouptabs-text { + background-repeat: no-repeat; + padding-left: 20px; +} + +/* General tab styling */ +.x-grouptabs-panel .x-grouptabs-expand { + background: transparent url('../images/elbow-plus-nl.gif') no-repeat; + width: 16px; + height: 16px; + position: absolute; + left: 7px; + top: 6px; +} + +.ext-ie6 .x-grouptabs-panel .x-grouptabs-expand, +.ext-border-box .x-grouptabs-panel .x-grouptabs-expand { + left: 0; +} + +.x-grouptabs-expanded .x-grouptabs-expand { + background-image: url('../images/elbow-minus-nl.gif'); +} + +/* GroupTabs sub group styling */ +.x-grouptabs-sub { + display: none; + margin-top: 4px; +} + +.x-grouptabs-expanded .x-grouptabs-sub { + display: block; +} + +.x-grouptabs-panel ul.x-grouptabs-sub li { + height: 18px; + margin: 0 0 2px; + padding: 0; +} + +.x-grouptabs-panel ul.x-grouptabs-sub .x-grouptabs-main-item { + display: none; +} + +.x-tab-with-icon{ + border-style:none !important; +} +.x-grid3-locked, .x-grid3-unlocked { + overflow: hidden; + position: absolute; +} + +.x-grid3-locked { + border-right: 1px solid #99BBE8; +} + +.x-grid3-locked .x-grid3-scroller { + overflow: hidden; +} + +.x-grid3-locked .x-grid3-row { + border-right: 0; +} + +.x-grid3-scroll-spacer { + height: 19px; +} + +.x-grid3-unlocked .x-grid3-header-offset { + padding-left: 0; +} + +.x-grid3-unlocked .x-grid3-row { + border-left: 0; +} +.ux-mselect{ + overflow:auto; + background:white; + position:relative; /* for calculating scroll offsets */ + zoom:1; + overflow:auto; +} +.ux-mselect-item{ + font:normal 12px tahoma, arial, helvetica, sans-serif; + padding:2px; + border:1px solid #fff; + white-space: nowrap; + cursor:pointer; +} +.ux-mselect-selected{ + border:1px dotted #a3bae9 !important; + background:#DFE8F6; + cursor:pointer; +} + +.x-view-drag-insert-above { + border-top:1px dotted #3366cc; +} +.x-view-drag-insert-below { + border-bottom:1px dotted #3366cc; +} +.x-panel-resize { + height:5px; + background:transparent url(../images/panel-handle.gif) no-repeat center bottom; + position:relative; + left:0; + top:2px; + cursor:n-resize; + cursor:row-resize; + /* for IE */ + font-size:1px; + line-height:1px; + overflow:hidden; +}.x-portal .x-panel-dd-spacer { + margin-bottom:10px; +} + +.x-portlet { + margin-bottom:10px; +} + +/* Clean up the look of the portlets */ +.x-portlet .x-panel-ml { + padding-left:2px; +} +.x-portlet .x-panel-mr { + padding-right:2px; +} +.x-portlet .x-panel-bl { + padding-left:2px; +} + +.x-portlet .x-panel-br { + padding-right:2px; +} +.x-portlet .x-panel-body { + background:white; +} +.x-portlet .x-panel-mc { + padding-top:2px; +} +.x-portlet .x-panel-bc .x-panel-footer { + padding-bottom:2px; +} +.x-portlet .x-panel-nofooter .x-panel-bc { + height:2px; +}.ext-ie .x-row-editor .x-form-text { + margin:0 !important; +} +.x-row-editor-header { + height:2px; + overflow:hidden; + background: transparent url(../images/row-editor-bg.gif) repeat-x 0 0; +} +.x-row-editor-footer { + height:2px; + overflow:hidden; + background: transparent url(../images/row-editor-bg.gif) repeat-x 0 -2px; +} +.ext-ie .x-row-editor-footer { + margin-top:-1px; +} + +.x-row-editor-body { + overflow:hidden; + zoom:1; + background: #ebf2fb; + padding-top:2px; +} +.x-row-editor .x-btns { + position:absolute; + top:28px; + left:20px; + padding-left:5px; + background: transparent url(../images/row-editor-btns.gif) no-repeat 0 0; +} +.x-row-editor .x-btns .x-plain-bwrap { + padding-right:5px; + background: transparent url(../images/row-editor-btns.gif) no-repeat right -31px; +} +.x-row-editor .x-btns .x-plain-body { + background: transparent url(../images/row-editor-btns.gif) repeat-x 0 -62px; + height:31px; +} +.x-row-editor .x-btns .x-table-layout-cell { + padding:3px; +} + +/* Fixes for IE6/7 trigger fields */ +.ext-ie6 .x-row-editor .x-form-field-wrap .x-form-trigger, .ext-ie7 .x-row-editor .x-form-field-wrap .x-form-trigger { + top: 1px; +} + +.ext-ie6 .x-row-editor .x-form-field-trigger-wrap, .ext-ie7 .x-row-editor .x-form-field-trigger-wrap { + margin-top: -1px; +} + +.errorTip .x-tip-body ul{ + list-style-type:disc; + margin-left:15px; +} +.x-form-spinner-proxy{ + /*background-color:#ff00cc;*/ +} +.x-form-field-wrap .x-form-spinner-trigger { + background:transparent url('../images/spinner.gif') no-repeat 0 0; +} + +.x-form-field-wrap .x-form-spinner-overup{ + background-position:-17px 0; +} +.x-form-field-wrap .x-form-spinner-clickup{ + background-position:-34px 0; +} +.x-form-field-wrap .x-form-spinner-overdown{ + background-position:-51px 0; +} +.x-form-field-wrap .x-form-spinner-clickdown{ + background-position:-68px 0; +} + + +.x-trigger-wrap-focus .x-form-spinner-trigger{ + background-position:-85px 0; +} +.x-trigger-wrap-focus .x-form-spinner-overup{ + background-position:-102px 0; +} +.x-trigger-wrap-focus .x-form-spinner-clickup{ + background-position:-119px 0; +} +.x-trigger-wrap-focus .x-form-spinner-overdown{ + background-position:-136px 0; +} +.x-trigger-wrap-focus .x-form-spinner-clickdown{ + background-position:-153px 0; +} +.x-trigger-wrap-focus .x-form-trigger{ + border-bottom: 1px solid #7eadd9; +} + +.x-form-field-wrap .x-form-spinner-splitter { + line-height:1px; + font-size:1px; + background:transparent url('../images/spinner-split.gif') no-repeat 0 0; + position:absolute; + cursor: n-resize; +} +.x-trigger-wrap-focus .x-form-spinner-splitter{ + background-position:-14px 0; +} +/* StatusBar - structure */ +.x-statusbar .x-status-text { + cursor: default; +/* + height: 21px; + line-height: 21px; + padding: 0 4px; +*/ +} +.x-statusbar .x-status-busy { + padding-left: 25px !important; + background: transparent no-repeat 3px 2px; +} + +.x-toolbar div.xtb-text + +.x-statusbar .x-status-text-panel { + border-top: 1px solid; + border-right: 1px solid; + border-bottom: 1px solid; + border-left: 1px solid; + padding: 2px 8px 2px 5px; +} + +/* StatusBar word processor example styles */ + +#word-status .x-status-text-panel .spacer { + width: 60px; + font-size:0; + line-height:0; +} +#word-status .x-status-busy { + padding-left: 25px !important; + background: transparent no-repeat 3px 2px; +} +#word-status .x-status-saved { + padding-left: 25px !important; + background: transparent no-repeat 3px 2px; +} + +/* StatusBar form validation example styles */ + +.x-statusbar .x-status-error { + cursor: pointer; + padding-left: 25px !important; + background: transparent no-repeat 3px 2px; +} +.x-statusbar .x-status-valid { + padding-left: 25px !important; + background: transparent no-repeat 3px 2px; +} +.x-status-error-list { + font: 11px tahoma,arial,verdana,sans-serif; + position: absolute; + z-index: 9999; + border-top: 1px solid; + border-right: 1px solid; + border-bottom: 1px solid; + border-left: 1px solid; + padding: 5px 10px; +} +.x-status-error-list li { + cursor: pointer; + list-style: disc; + margin-left: 10px; +} +.x-status-error-list li a { + text-decoration: none; +} +.x-status-error-list li a:hover { + text-decoration: underline; +} + + +/* *********************************************************** */ +/* *********************************************************** */ +/* *********************************************************** */ + + +/* StatusBar - visual */ + +.x-statusbar .x-status-busy { + background-image: url(../images/loading.gif); +} +.x-statusbar .x-status-text-panel { + border-color: #99bbe8 #fff #fff #99bbe8; +} + +/* StatusBar word processor example styles */ + +#word-status .x-status-text { + color: #777; +} +#word-status .x-status-busy { + background-image: url(../images/saving.gif); +} +#word-status .x-status-saved { + background-image: url(../images/saved.png); +} + +/* StatusBar form validation example styles */ + +.x-statusbar .x-status-error { + color: #C33; + background-image: url(../images/exclamation.gif); +} +.x-statusbar .x-status-valid { + background-image: url(../images/accept.png); +} +.x-status-error-list { + border-color: #C33; +} +.x-status-error-list li a { + color: #15428B; +}.x-treegrid-root-table { + border-right: 1px solid; +} + +.x-treegrid-root-node { + overflow: auto; +} + +.x-treegrid-hd-hidden { + visibility: hidden; + border: 0; + width: 0; +} + +.x-treegrid-col { + border-bottom: 1px solid; + height: 20px; + overflow: hidden; + vertical-align: top; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; +} + +.x-treegrid-text { + padding-left: 4px; + -moz-user-select: none; + -khtml-user-select: none; +} + +.x-treegrid-resizer { + border-left:1px solid; + border-right:1px solid; + position:absolute; + left:0; + top:0; +} + +.x-treegrid-header-inner { + overflow: hidden; +} + +.x-treegrid-root-table, +.x-treegrid-col { + border-color: #ededed; +} + +.x-treegrid-resizer { + border-left-color:#555; + border-right-color:#555; +}
\ No newline at end of file diff --git a/modules/organize/vendor/ext/images/default/box/tb-blue.gif b/modules/organize/vendor/ext/images/default/box/tb-blue.gif Binary files differnew file mode 100644 index 00000000..562fecca --- /dev/null +++ b/modules/organize/vendor/ext/images/default/box/tb-blue.gif diff --git a/modules/organize/vendor/ext/images/default/button/btn.gif b/modules/organize/vendor/ext/images/default/button/btn.gif Binary files differnew file mode 100644 index 00000000..06b404dd --- /dev/null +++ b/modules/organize/vendor/ext/images/default/button/btn.gif diff --git a/modules/organize/vendor/ext/images/default/dd/drop-no.gif b/modules/organize/vendor/ext/images/default/dd/drop-no.gif Binary files differnew file mode 100644 index 00000000..08d08335 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/dd/drop-no.gif diff --git a/modules/organize/vendor/ext/images/default/dd/drop-yes.gif b/modules/organize/vendor/ext/images/default/dd/drop-yes.gif Binary files differnew file mode 100644 index 00000000..8aacb307 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/dd/drop-yes.gif diff --git a/modules/organize/vendor/ext/images/default/form/text-bg.gif b/modules/organize/vendor/ext/images/default/form/text-bg.gif Binary files differnew file mode 100644 index 00000000..4179607c --- /dev/null +++ b/modules/organize/vendor/ext/images/default/form/text-bg.gif diff --git a/modules/organize/vendor/ext/images/default/form/trigger.gif b/modules/organize/vendor/ext/images/default/form/trigger.gif Binary files differnew file mode 100644 index 00000000..f6cba375 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/form/trigger.gif diff --git a/modules/organize/vendor/ext/images/default/grid/invalid_line.gif b/modules/organize/vendor/ext/images/default/grid/invalid_line.gif Binary files differnew file mode 100644 index 00000000..fb7e0f34 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/grid/invalid_line.gif diff --git a/modules/organize/vendor/ext/images/default/grid/loading.gif b/modules/organize/vendor/ext/images/default/grid/loading.gif Binary files differnew file mode 100644 index 00000000..e846e1d6 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/grid/loading.gif diff --git a/modules/organize/vendor/ext/images/default/panel/tool-sprites.gif b/modules/organize/vendor/ext/images/default/panel/tool-sprites.gif Binary files differnew file mode 100644 index 00000000..9a3c5b9a --- /dev/null +++ b/modules/organize/vendor/ext/images/default/panel/tool-sprites.gif diff --git a/modules/organize/vendor/ext/images/default/panel/white-top-bottom.gif b/modules/organize/vendor/ext/images/default/panel/white-top-bottom.gif Binary files differnew file mode 100644 index 00000000..fe7dd1c1 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/panel/white-top-bottom.gif diff --git a/modules/organize/vendor/ext/images/default/progress/progress-bg.gif b/modules/organize/vendor/ext/images/default/progress/progress-bg.gif Binary files differnew file mode 100644 index 00000000..1c1abeb4 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/progress/progress-bg.gif diff --git a/modules/organize/vendor/ext/images/default/qtip/bg.gif b/modules/organize/vendor/ext/images/default/qtip/bg.gif Binary files differnew file mode 100644 index 00000000..43488afd --- /dev/null +++ b/modules/organize/vendor/ext/images/default/qtip/bg.gif diff --git a/modules/organize/vendor/ext/images/default/s.gif b/modules/organize/vendor/ext/images/default/s.gif Binary files differnew file mode 100644 index 00000000..1d11fa9a --- /dev/null +++ b/modules/organize/vendor/ext/images/default/s.gif diff --git a/modules/organize/vendor/ext/images/default/shadow-c.png b/modules/organize/vendor/ext/images/default/shadow-c.png Binary files differnew file mode 100644 index 00000000..d435f80a --- /dev/null +++ b/modules/organize/vendor/ext/images/default/shadow-c.png diff --git a/modules/organize/vendor/ext/images/default/shadow-lr.png b/modules/organize/vendor/ext/images/default/shadow-lr.png Binary files differnew file mode 100644 index 00000000..bb88b6f2 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/shadow-lr.png diff --git a/modules/organize/vendor/ext/images/default/shadow.png b/modules/organize/vendor/ext/images/default/shadow.png Binary files differnew file mode 100644 index 00000000..75c0eba3 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/shadow.png diff --git a/modules/organize/vendor/ext/images/default/toolbar/bg.gif b/modules/organize/vendor/ext/images/default/toolbar/bg.gif Binary files differnew file mode 100644 index 00000000..0b085bf2 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/toolbar/bg.gif diff --git a/modules/organize/vendor/ext/images/default/tree/arrows.gif b/modules/organize/vendor/ext/images/default/tree/arrows.gif Binary files differnew file mode 100644 index 00000000..26834639 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/tree/arrows.gif diff --git a/modules/organize/vendor/ext/images/default/tree/drop-add.gif b/modules/organize/vendor/ext/images/default/tree/drop-add.gif Binary files differnew file mode 100644 index 00000000..b22cd144 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/tree/drop-add.gif diff --git a/modules/organize/vendor/ext/images/default/tree/drop-between.gif b/modules/organize/vendor/ext/images/default/tree/drop-between.gif Binary files differnew file mode 100644 index 00000000..5c6c09d9 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/tree/drop-between.gif diff --git a/modules/organize/vendor/ext/images/default/tree/drop-over.gif b/modules/organize/vendor/ext/images/default/tree/drop-over.gif Binary files differnew file mode 100644 index 00000000..30d1ca71 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/tree/drop-over.gif diff --git a/modules/organize/vendor/ext/images/default/tree/folder-open.gif b/modules/organize/vendor/ext/images/default/tree/folder-open.gif Binary files differnew file mode 100644 index 00000000..56ba737b --- /dev/null +++ b/modules/organize/vendor/ext/images/default/tree/folder-open.gif diff --git a/modules/organize/vendor/ext/images/default/tree/folder.gif b/modules/organize/vendor/ext/images/default/tree/folder.gif Binary files differnew file mode 100644 index 00000000..20412f7c --- /dev/null +++ b/modules/organize/vendor/ext/images/default/tree/folder.gif diff --git a/modules/organize/vendor/ext/images/default/tree/loading.gif b/modules/organize/vendor/ext/images/default/tree/loading.gif Binary files differnew file mode 100644 index 00000000..e846e1d6 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/tree/loading.gif diff --git a/modules/organize/vendor/ext/images/default/window/left-corners.png b/modules/organize/vendor/ext/images/default/window/left-corners.png Binary files differnew file mode 100644 index 00000000..1a518335 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/window/left-corners.png diff --git a/modules/organize/vendor/ext/images/default/window/left-right.png b/modules/organize/vendor/ext/images/default/window/left-right.png Binary files differnew file mode 100644 index 00000000..7586ff33 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/window/left-right.png diff --git a/modules/organize/vendor/ext/images/default/window/right-corners.png b/modules/organize/vendor/ext/images/default/window/right-corners.png Binary files differnew file mode 100644 index 00000000..e69a3ffc --- /dev/null +++ b/modules/organize/vendor/ext/images/default/window/right-corners.png diff --git a/modules/organize/vendor/ext/images/default/window/top-bottom.png b/modules/organize/vendor/ext/images/default/window/top-bottom.png Binary files differnew file mode 100644 index 00000000..33779e76 --- /dev/null +++ b/modules/organize/vendor/ext/images/default/window/top-bottom.png diff --git a/modules/organize/vendor/ext/images/fam/delete.gif b/modules/organize/vendor/ext/images/fam/delete.gif Binary files differnew file mode 100644 index 00000000..5e2a3b14 --- /dev/null +++ b/modules/organize/vendor/ext/images/fam/delete.gif diff --git a/modules/organize/vendor/ext/js/ext-organize-bundle.js b/modules/organize/vendor/ext/js/ext-organize-bundle.js new file mode 100644 index 00000000..bf483bde --- /dev/null +++ b/modules/organize/vendor/ext/js/ext-organize-bundle.js @@ -0,0 +1,2202 @@ + +window.undefined=window.undefined;Ext={version:'3.3.1',versionDetail:{major:3,minor:3,patch:1}};Ext.apply=function(o,c,defaults){if(defaults){Ext.apply(o,defaults);} +if(o&&c&&typeof c=='object'){for(var p in c){o[p]=c[p];}} +return o;};(function(){var idSeed=0,toString=Object.prototype.toString,ua=navigator.userAgent.toLowerCase(),check=function(r){return r.test(ua);},DOC=document,docMode=DOC.documentMode,isStrict=DOC.compatMode=="CSS1Compat",isOpera=check(/opera/),isChrome=check(/\bchrome\b/),isWebKit=check(/webkit/),isSafari=!isChrome&&check(/safari/),isSafari2=isSafari&&check(/applewebkit\/4/),isSafari3=isSafari&&check(/version\/3/),isSafari4=isSafari&&check(/version\/4/),isIE=!isOpera&&check(/msie/),isIE7=isIE&&(check(/msie 7/)||docMode==7),isIE8=isIE&&(check(/msie 8/)&&docMode!=7),isIE6=isIE&&!isIE7&&!isIE8,isGecko=!isWebKit&&check(/gecko/),isGecko2=isGecko&&check(/rv:1\.8/),isGecko3=isGecko&&check(/rv:1\.9/),isBorderBox=isIE&&!isStrict,isWindows=check(/windows|win32/),isMac=check(/macintosh|mac os x/),isAir=check(/adobeair/),isLinux=check(/linux/),isSecure=/^https/i.test(window.location.protocol);if(isIE6){try{DOC.execCommand("BackgroundImageCache",false,true);}catch(e){}} +Ext.apply(Ext,{SSL_SECURE_URL:isSecure&&isIE?'javascript:""':'about:blank',isStrict:isStrict,isSecure:isSecure,isReady:false,enableForcedBoxModel:false,enableGarbageCollector:true,enableListenerCollection:false,enableNestedListenerRemoval:false,USE_NATIVE_JSON:false,applyIf:function(o,c){if(o){for(var p in c){if(!Ext.isDefined(o[p])){o[p]=c[p];}}} +return o;},id:function(el,prefix){el=Ext.getDom(el,true)||{};if(!el.id){el.id=(prefix||"ext-gen")+(++idSeed);} +return el.id;},extend:function(){var io=function(o){for(var m in o){this[m]=o[m];}};var oc=Object.prototype.constructor;return function(sb,sp,overrides){if(typeof sp=='object'){overrides=sp;sp=sb;sb=overrides.constructor!=oc?overrides.constructor:function(){sp.apply(this,arguments);};} +var F=function(){},sbp,spp=sp.prototype;F.prototype=spp;sbp=sb.prototype=new F();sbp.constructor=sb;sb.superclass=spp;if(spp.constructor==oc){spp.constructor=sp;} +sb.override=function(o){Ext.override(sb,o);};sbp.superclass=sbp.supr=(function(){return spp;});sbp.override=io;Ext.override(sb,overrides);sb.extend=function(o){return Ext.extend(sb,o);};return sb;};}(),override:function(origclass,overrides){if(overrides){var p=origclass.prototype;Ext.apply(p,overrides);if(Ext.isIE&&overrides.hasOwnProperty('toString')){p.toString=overrides.toString;}}},namespace:function(){var o,d;Ext.each(arguments,function(v){d=v.split(".");o=window[d[0]]=window[d[0]]||{};Ext.each(d.slice(1),function(v2){o=o[v2]=o[v2]||{};});});return o;},urlEncode:function(o,pre){var empty,buf=[],e=encodeURIComponent;Ext.iterate(o,function(key,item){empty=Ext.isEmpty(item);Ext.each(empty?key:item,function(val){buf.push('&',e(key),'=',(!Ext.isEmpty(val)&&(val!=key||!empty))?(Ext.isDate(val)?Ext.encode(val).replace(/"/g,''):e(val)):'');});});if(!pre){buf.shift();pre='';} +return pre+buf.join('');},urlDecode:function(string,overwrite){if(Ext.isEmpty(string)){return{};} +var obj={},pairs=string.split('&'),d=decodeURIComponent,name,value;Ext.each(pairs,function(pair){pair=pair.split('=');name=d(pair[0]);value=d(pair[1]);obj[name]=overwrite||!obj[name]?value:[].concat(obj[name]).concat(value);});return obj;},urlAppend:function(url,s){if(!Ext.isEmpty(s)){return url+(url.indexOf('?')===-1?'?':'&')+s;} +return url;},toArray:function(){return isIE?function(a,i,j,res){res=[];for(var x=0,len=a.length;x<len;x++){res.push(a[x]);} +return res.slice(i||0,j||res.length);}:function(a,i,j){return Array.prototype.slice.call(a,i||0,j||a.length);};}(),isIterable:function(v){if(Ext.isArray(v)||v.callee){return true;} +if(/NodeList|HTMLCollection/.test(toString.call(v))){return true;} +return((typeof v.nextNode!='undefined'||v.item)&&Ext.isNumber(v.length));},each:function(array,fn,scope){if(Ext.isEmpty(array,true)){return;} +if(!Ext.isIterable(array)||Ext.isPrimitive(array)){array=[array];} +for(var i=0,len=array.length;i<len;i++){if(fn.call(scope||array[i],array[i],i,array)===false){return i;};}},iterate:function(obj,fn,scope){if(Ext.isEmpty(obj)){return;} +if(Ext.isIterable(obj)){Ext.each(obj,fn,scope);return;}else if(typeof obj=='object'){for(var prop in obj){if(obj.hasOwnProperty(prop)){if(fn.call(scope||obj,prop,obj[prop],obj)===false){return;};}}}},getDom:function(el,strict){if(!el||!DOC){return null;} +if(el.dom){return el.dom;}else{if(typeof el=='string'){var e=DOC.getElementById(el);if(e&&isIE&&strict){if(el==e.getAttribute('id')){return e;}else{return null;}} +return e;}else{return el;}}},getBody:function(){return Ext.get(DOC.body||DOC.documentElement);},getHead:function(){var head;return function(){if(head==undefined){head=Ext.get(DOC.getElementsByTagName("head")[0]);} +return head;};}(),removeNode:isIE&&!isIE8?function(){var d;return function(n){if(n&&n.tagName!='BODY'){(Ext.enableNestedListenerRemoval)?Ext.EventManager.purgeElement(n,true):Ext.EventManager.removeAll(n);d=d||DOC.createElement('div');d.appendChild(n);d.innerHTML='';delete Ext.elCache[n.id];}};}():function(n){if(n&&n.parentNode&&n.tagName!='BODY'){(Ext.enableNestedListenerRemoval)?Ext.EventManager.purgeElement(n,true):Ext.EventManager.removeAll(n);n.parentNode.removeChild(n);delete Ext.elCache[n.id];}},isEmpty:function(v,allowBlank){return v===null||v===undefined||((Ext.isArray(v)&&!v.length))||(!allowBlank?v==='':false);},isArray:function(v){return toString.apply(v)==='[object Array]';},isDate:function(v){return toString.apply(v)==='[object Date]';},isObject:function(v){return!!v&&Object.prototype.toString.call(v)==='[object Object]';},isPrimitive:function(v){return Ext.isString(v)||Ext.isNumber(v)||Ext.isBoolean(v);},isFunction:function(v){return toString.apply(v)==='[object Function]';},isNumber:function(v){return typeof v==='number'&&isFinite(v);},isString:function(v){return typeof v==='string';},isBoolean:function(v){return typeof v==='boolean';},isElement:function(v){return v?!!v.tagName:false;},isDefined:function(v){return typeof v!=='undefined';},isOpera:isOpera,isWebKit:isWebKit,isChrome:isChrome,isSafari:isSafari,isSafari3:isSafari3,isSafari4:isSafari4,isSafari2:isSafari2,isIE:isIE,isIE6:isIE6,isIE7:isIE7,isIE8:isIE8,isGecko:isGecko,isGecko2:isGecko2,isGecko3:isGecko3,isBorderBox:isBorderBox,isLinux:isLinux,isWindows:isWindows,isMac:isMac,isAir:isAir});Ext.ns=Ext.namespace;})();Ext.ns('Ext.util','Ext.lib','Ext.data','Ext.supports');Ext.elCache={};Ext.apply(Function.prototype,{createInterceptor:function(fcn,scope){var method=this;return!Ext.isFunction(fcn)?this:function(){var me=this,args=arguments;fcn.target=me;fcn.method=method;return(fcn.apply(scope||me||window,args)!==false)?method.apply(me||window,args):null;};},createCallback:function(){var args=arguments,method=this;return function(){return method.apply(window,args);};},createDelegate:function(obj,args,appendArgs){var method=this;return function(){var callArgs=args||arguments;if(appendArgs===true){callArgs=Array.prototype.slice.call(arguments,0);callArgs=callArgs.concat(args);}else if(Ext.isNumber(appendArgs)){callArgs=Array.prototype.slice.call(arguments,0);var applyArgs=[appendArgs,0].concat(args);Array.prototype.splice.apply(callArgs,applyArgs);} +return method.apply(obj||window,callArgs);};},defer:function(millis,obj,args,appendArgs){var fn=this.createDelegate(obj,args,appendArgs);if(millis>0){return setTimeout(fn,millis);} +fn();return 0;}});Ext.applyIf(String,{format:function(format){var args=Ext.toArray(arguments,1);return format.replace(/\{(\d+)\}/g,function(m,i){return args[i];});}});Ext.applyIf(Array.prototype,{indexOf:function(o,from){var len=this.length;from=from||0;from+=(from<0)?len:0;for(;from<len;++from){if(this[from]===o){return from;}} +return-1;},remove:function(o){var index=this.indexOf(o);if(index!=-1){this.splice(index,1);} +return this;}});Ext.util.TaskRunner=function(interval){interval=interval||10;var tasks=[],removeQueue=[],id=0,running=false,stopThread=function(){running=false;clearInterval(id);id=0;},startThread=function(){if(!running){running=true;id=setInterval(runTasks,interval);}},removeTask=function(t){removeQueue.push(t);if(t.onStop){t.onStop.apply(t.scope||t);}},runTasks=function(){var rqLen=removeQueue.length,now=new Date().getTime();if(rqLen>0){for(var i=0;i<rqLen;i++){tasks.remove(removeQueue[i]);} +removeQueue=[];if(tasks.length<1){stopThread();return;}} +for(var i=0,t,itime,rt,len=tasks.length;i<len;++i){t=tasks[i];itime=now-t.taskRunTime;if(t.interval<=itime){rt=t.run.apply(t.scope||t,t.args||[++t.taskRunCount]);t.taskRunTime=now;if(rt===false||t.taskRunCount===t.repeat){removeTask(t);return;}} +if(t.duration&&t.duration<=(now-t.taskStartTime)){removeTask(t);}}};this.start=function(task){tasks.push(task);task.taskStartTime=new Date().getTime();task.taskRunTime=0;task.taskRunCount=0;startThread();return task;};this.stop=function(task){removeTask(task);return task;};this.stopAll=function(){stopThread();for(var i=0,len=tasks.length;i<len;i++){if(tasks[i].onStop){tasks[i].onStop();}} +tasks=[];removeQueue=[];};};Ext.TaskMgr=new Ext.util.TaskRunner();(function(){var libFlyweight;function fly(el){if(!libFlyweight){libFlyweight=new Ext.Element.Flyweight();} +libFlyweight.dom=el;return libFlyweight;} +(function(){var doc=document,isCSS1=doc.compatMode=="CSS1Compat",MAX=Math.max,ROUND=Math.round,PARSEINT=parseInt;Ext.lib.Dom={isAncestor:function(p,c){var ret=false;p=Ext.getDom(p);c=Ext.getDom(c);if(p&&c){if(p.contains){return p.contains(c);}else if(p.compareDocumentPosition){return!!(p.compareDocumentPosition(c)&16);}else{while(c=c.parentNode){ret=c==p||ret;}}} +return ret;},getViewWidth:function(full){return full?this.getDocumentWidth():this.getViewportWidth();},getViewHeight:function(full){return full?this.getDocumentHeight():this.getViewportHeight();},getDocumentHeight:function(){return MAX(!isCSS1?doc.body.scrollHeight:doc.documentElement.scrollHeight,this.getViewportHeight());},getDocumentWidth:function(){return MAX(!isCSS1?doc.body.scrollWidth:doc.documentElement.scrollWidth,this.getViewportWidth());},getViewportHeight:function(){return Ext.isIE?(Ext.isStrict?doc.documentElement.clientHeight:doc.body.clientHeight):self.innerHeight;},getViewportWidth:function(){return!Ext.isStrict&&!Ext.isOpera?doc.body.clientWidth:Ext.isIE?doc.documentElement.clientWidth:self.innerWidth;},getY:function(el){return this.getXY(el)[1];},getX:function(el){return this.getXY(el)[0];},getXY:function(el){var p,pe,b,bt,bl,dbd,x=0,y=0,scroll,hasAbsolute,bd=(doc.body||doc.documentElement),ret=[0,0];el=Ext.getDom(el);if(el!=bd){if(el.getBoundingClientRect){b=el.getBoundingClientRect();scroll=fly(document).getScroll();ret=[ROUND(b.left+scroll.left),ROUND(b.top+scroll.top)];}else{p=el;hasAbsolute=fly(el).isStyle("position","absolute");while(p){pe=fly(p);x+=p.offsetLeft;y+=p.offsetTop;hasAbsolute=hasAbsolute||pe.isStyle("position","absolute");if(Ext.isGecko){y+=bt=PARSEINT(pe.getStyle("borderTopWidth"),10)||0;x+=bl=PARSEINT(pe.getStyle("borderLeftWidth"),10)||0;if(p!=el&&!pe.isStyle('overflow','visible')){x+=bl;y+=bt;}} +p=p.offsetParent;} +if(Ext.isSafari&&hasAbsolute){x-=bd.offsetLeft;y-=bd.offsetTop;} +if(Ext.isGecko&&!hasAbsolute){dbd=fly(bd);x+=PARSEINT(dbd.getStyle("borderLeftWidth"),10)||0;y+=PARSEINT(dbd.getStyle("borderTopWidth"),10)||0;} +p=el.parentNode;while(p&&p!=bd){if(!Ext.isOpera||(p.tagName!='TR'&&!fly(p).isStyle("display","inline"))){x-=p.scrollLeft;y-=p.scrollTop;} +p=p.parentNode;} +ret=[x,y];}} +return ret;},setXY:function(el,xy){(el=Ext.fly(el,'_setXY')).position();var pts=el.translatePoints(xy),style=el.dom.style,pos;for(pos in pts){if(!isNaN(pts[pos])){style[pos]=pts[pos]+"px";}}},setX:function(el,x){this.setXY(el,[x,false]);},setY:function(el,y){this.setXY(el,[false,y]);}};})();Ext.lib.Event=function(){var loadComplete=false,unloadListeners={},retryCount=0,onAvailStack=[],_interval,locked=false,win=window,doc=document,POLL_RETRYS=200,POLL_INTERVAL=20,TYPE=0,FN=1,OBJ=2,ADJ_SCOPE=3,SCROLLLEFT='scrollLeft',SCROLLTOP='scrollTop',UNLOAD='unload',MOUSEOVER='mouseover',MOUSEOUT='mouseout',doAdd=function(){var ret;if(win.addEventListener){ret=function(el,eventName,fn,capture){if(eventName=='mouseenter'){fn=fn.createInterceptor(checkRelatedTarget);el.addEventListener(MOUSEOVER,fn,(capture));}else if(eventName=='mouseleave'){fn=fn.createInterceptor(checkRelatedTarget);el.addEventListener(MOUSEOUT,fn,(capture));}else{el.addEventListener(eventName,fn,(capture));} +return fn;};}else if(win.attachEvent){ret=function(el,eventName,fn,capture){el.attachEvent("on"+eventName,fn);return fn;};}else{ret=function(){};} +return ret;}(),doRemove=function(){var ret;if(win.removeEventListener){ret=function(el,eventName,fn,capture){if(eventName=='mouseenter'){eventName=MOUSEOVER;}else if(eventName=='mouseleave'){eventName=MOUSEOUT;} +el.removeEventListener(eventName,fn,(capture));};}else if(win.detachEvent){ret=function(el,eventName,fn){el.detachEvent("on"+eventName,fn);};}else{ret=function(){};} +return ret;}();function checkRelatedTarget(e){return!elContains(e.currentTarget,pub.getRelatedTarget(e));} +function elContains(parent,child){if(parent&&parent.firstChild){while(child){if(child===parent){return true;} +child=child.parentNode;if(child&&(child.nodeType!=1)){child=null;}}} +return false;} +function _tryPreloadAttach(){var ret=false,notAvail=[],element,i,v,override,tryAgain=!loadComplete||(retryCount>0);if(!locked){locked=true;for(i=0;i<onAvailStack.length;++i){v=onAvailStack[i];if(v&&(element=doc.getElementById(v.id))){if(!v.checkReady||loadComplete||element.nextSibling||(doc&&doc.body)){override=v.override;element=override?(override===true?v.obj:override):element;v.fn.call(element,v.obj);onAvailStack.remove(v);--i;}else{notAvail.push(v);}}} +retryCount=(notAvail.length===0)?0:retryCount-1;if(tryAgain){startInterval();}else{clearInterval(_interval);_interval=null;} +ret=!(locked=false);} +return ret;} +function startInterval(){if(!_interval){var callback=function(){_tryPreloadAttach();};_interval=setInterval(callback,POLL_INTERVAL);}} +function getScroll(){var dd=doc.documentElement,db=doc.body;if(dd&&(dd[SCROLLTOP]||dd[SCROLLLEFT])){return[dd[SCROLLLEFT],dd[SCROLLTOP]];}else if(db){return[db[SCROLLLEFT],db[SCROLLTOP]];}else{return[0,0];}} +function getPageCoord(ev,xy){ev=ev.browserEvent||ev;var coord=ev['page'+xy];if(!coord&&coord!==0){coord=ev['client'+xy]||0;if(Ext.isIE){coord+=getScroll()[xy=="X"?0:1];}} +return coord;} +var pub={extAdapter:true,onAvailable:function(p_id,p_fn,p_obj,p_override){onAvailStack.push({id:p_id,fn:p_fn,obj:p_obj,override:p_override,checkReady:false});retryCount=POLL_RETRYS;startInterval();},addListener:function(el,eventName,fn){el=Ext.getDom(el);if(el&&fn){if(eventName==UNLOAD){if(unloadListeners[el.id]===undefined){unloadListeners[el.id]=[];} +unloadListeners[el.id].push([eventName,fn]);return fn;} +return doAdd(el,eventName,fn,false);} +return false;},removeListener:function(el,eventName,fn){el=Ext.getDom(el);var i,len,li,lis;if(el&&fn){if(eventName==UNLOAD){if((lis=unloadListeners[el.id])!==undefined){for(i=0,len=lis.length;i<len;i++){if((li=lis[i])&&li[TYPE]==eventName&&li[FN]==fn){unloadListeners[el.id].splice(i,1);}}} +return;} +doRemove(el,eventName,fn,false);}},getTarget:function(ev){ev=ev.browserEvent||ev;return this.resolveTextNode(ev.target||ev.srcElement);},resolveTextNode:Ext.isGecko?function(node){if(!node){return;} +var s=HTMLElement.prototype.toString.call(node);if(s=='[xpconnect wrapped native prototype]'||s=='[object XULElement]'){return;} +return node.nodeType==3?node.parentNode:node;}:function(node){return node&&node.nodeType==3?node.parentNode:node;},getRelatedTarget:function(ev){ev=ev.browserEvent||ev;return this.resolveTextNode(ev.relatedTarget||(/(mouseout|mouseleave)/.test(ev.type)?ev.toElement:/(mouseover|mouseenter)/.test(ev.type)?ev.fromElement:null));},getPageX:function(ev){return getPageCoord(ev,"X");},getPageY:function(ev){return getPageCoord(ev,"Y");},getXY:function(ev){return[this.getPageX(ev),this.getPageY(ev)];},stopEvent:function(ev){this.stopPropagation(ev);this.preventDefault(ev);},stopPropagation:function(ev){ev=ev.browserEvent||ev;if(ev.stopPropagation){ev.stopPropagation();}else{ev.cancelBubble=true;}},preventDefault:function(ev){ev=ev.browserEvent||ev;if(ev.preventDefault){ev.preventDefault();}else{ev.returnValue=false;}},getEvent:function(e){e=e||win.event;if(!e){var c=this.getEvent.caller;while(c){e=c.arguments[0];if(e&&Event==e.constructor){break;} +c=c.caller;}} +return e;},getCharCode:function(ev){ev=ev.browserEvent||ev;return ev.charCode||ev.keyCode||0;},getListeners:function(el,eventName){Ext.EventManager.getListeners(el,eventName);},purgeElement:function(el,recurse,eventName){Ext.EventManager.purgeElement(el,recurse,eventName);},_load:function(e){loadComplete=true;if(Ext.isIE&&e!==true){doRemove(win,"load",arguments.callee);}},_unload:function(e){var EU=Ext.lib.Event,i,v,ul,id,len,scope;for(id in unloadListeners){ul=unloadListeners[id];for(i=0,len=ul.length;i<len;i++){v=ul[i];if(v){try{scope=v[ADJ_SCOPE]?(v[ADJ_SCOPE]===true?v[OBJ]:v[ADJ_SCOPE]):win;v[FN].call(scope,EU.getEvent(e),v[OBJ]);}catch(ex){}}}};Ext.EventManager._unload();doRemove(win,UNLOAD,EU._unload);}};pub.on=pub.addListener;pub.un=pub.removeListener;if(doc&&doc.body){pub._load(true);}else{doAdd(win,"load",pub._load);} +doAdd(win,UNLOAD,pub._unload);_tryPreloadAttach();return pub;}();Ext.lib.Ajax=function(){var activeX=['Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.3.0','Msxml2.XMLHTTP'],CONTENTTYPE='Content-Type';function setHeader(o){var conn=o.conn,prop,headers={};function setTheHeaders(conn,headers){for(prop in headers){if(headers.hasOwnProperty(prop)){conn.setRequestHeader(prop,headers[prop]);}}} +Ext.apply(headers,pub.headers,pub.defaultHeaders);setTheHeaders(conn,headers);delete pub.headers;} +function createExceptionObject(tId,callbackArg,isAbort,isTimeout){return{tId:tId,status:isAbort?-1:0,statusText:isAbort?'transaction aborted':'communication failure',isAbort:isAbort,isTimeout:isTimeout,argument:callbackArg};} +function initHeader(label,value){(pub.headers=pub.headers||{})[label]=value;} +function createResponseObject(o,callbackArg){var headerObj={},headerStr,conn=o.conn,t,s,isBrokenStatus=conn.status==1223;try{headerStr=o.conn.getAllResponseHeaders();Ext.each(headerStr.replace(/\r\n/g,'\n').split('\n'),function(v){t=v.indexOf(':');if(t>=0){s=v.substr(0,t).toLowerCase();if(v.charAt(t+1)==' '){++t;} +headerObj[s]=v.substr(t+1);}});}catch(e){} +return{tId:o.tId,status:isBrokenStatus?204:conn.status,statusText:isBrokenStatus?'No Content':conn.statusText,getResponseHeader:function(header){return headerObj[header.toLowerCase()];},getAllResponseHeaders:function(){return headerStr;},responseText:conn.responseText,responseXML:conn.responseXML,argument:callbackArg};} +function releaseObject(o){if(o.tId){pub.conn[o.tId]=null;} +o.conn=null;o=null;} +function handleTransactionResponse(o,callback,isAbort,isTimeout){if(!callback){releaseObject(o);return;} +var httpStatus,responseObject;try{if(o.conn.status!==undefined&&o.conn.status!=0){httpStatus=o.conn.status;} +else{httpStatus=13030;}} +catch(e){httpStatus=13030;} +if((httpStatus>=200&&httpStatus<300)||(Ext.isIE&&httpStatus==1223)){responseObject=createResponseObject(o,callback.argument);if(callback.success){if(!callback.scope){callback.success(responseObject);} +else{callback.success.apply(callback.scope,[responseObject]);}}} +else{switch(httpStatus){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:responseObject=createExceptionObject(o.tId,callback.argument,(isAbort?isAbort:false),isTimeout);if(callback.failure){if(!callback.scope){callback.failure(responseObject);} +else{callback.failure.apply(callback.scope,[responseObject]);}} +break;default:responseObject=createResponseObject(o,callback.argument);if(callback.failure){if(!callback.scope){callback.failure(responseObject);} +else{callback.failure.apply(callback.scope,[responseObject]);}}}} +releaseObject(o);responseObject=null;} +function checkResponse(o,callback,conn,tId,poll,cbTimeout){if(conn&&conn.readyState==4){clearInterval(poll[tId]);poll[tId]=null;if(cbTimeout){clearTimeout(pub.timeout[tId]);pub.timeout[tId]=null;} +handleTransactionResponse(o,callback);}} +function checkTimeout(o,callback){pub.abort(o,callback,true);} +function handleReadyState(o,callback){callback=callback||{};var conn=o.conn,tId=o.tId,poll=pub.poll,cbTimeout=callback.timeout||null;if(cbTimeout){pub.conn[tId]=conn;pub.timeout[tId]=setTimeout(checkTimeout.createCallback(o,callback),cbTimeout);} +poll[tId]=setInterval(checkResponse.createCallback(o,callback,conn,tId,poll,cbTimeout),pub.pollInterval);} +function asyncRequest(method,uri,callback,postData){var o=getConnectionObject()||null;if(o){o.conn.open(method,uri,true);if(pub.useDefaultXhrHeader){initHeader('X-Requested-With',pub.defaultXhrHeader);} +if(postData&&pub.useDefaultHeader&&(!pub.headers||!pub.headers[CONTENTTYPE])){initHeader(CONTENTTYPE,pub.defaultPostHeader);} +if(pub.defaultHeaders||pub.headers){setHeader(o);} +handleReadyState(o,callback);o.conn.send(postData||null);} +return o;} +function getConnectionObject(){var o;try{if(o=createXhrObject(pub.transactionId)){pub.transactionId++;}}catch(e){}finally{return o;}} +function createXhrObject(transactionId){var http;try{http=new XMLHttpRequest();}catch(e){for(var i=0;i<activeX.length;++i){try{http=new ActiveXObject(activeX[i]);break;}catch(e){}}}finally{return{conn:http,tId:transactionId};}} +var pub={request:function(method,uri,cb,data,options){if(options){var me=this,xmlData=options.xmlData,jsonData=options.jsonData,hs;Ext.applyIf(me,options);if(xmlData||jsonData){hs=me.headers;if(!hs||!hs[CONTENTTYPE]){initHeader(CONTENTTYPE,xmlData?'text/xml':'application/json');} +data=xmlData||(!Ext.isPrimitive(jsonData)?Ext.encode(jsonData):jsonData);}} +return asyncRequest(method||options.method||"POST",uri,cb,data);},serializeForm:function(form){var fElements=form.elements||(document.forms[form]||Ext.getDom(form)).elements,hasSubmit=false,encoder=encodeURIComponent,name,data='',type,hasValue;Ext.each(fElements,function(element){name=element.name;type=element.type;if(!element.disabled&&name){if(/select-(one|multiple)/i.test(type)){Ext.each(element.options,function(opt){if(opt.selected){hasValue=opt.hasAttribute?opt.hasAttribute('value'):opt.getAttributeNode('value').specified;data+=String.format("{0}={1}&",encoder(name),encoder(hasValue?opt.value:opt.text));}});}else if(!(/file|undefined|reset|button/i.test(type))){if(!(/radio|checkbox/i.test(type)&&!element.checked)&&!(type=='submit'&&hasSubmit)){data+=encoder(name)+'='+encoder(element.value)+'&';hasSubmit=/submit/i.test(type);}}}});return data.substr(0,data.length-1);},useDefaultHeader:true,defaultPostHeader:'application/x-www-form-urlencoded; charset=UTF-8',useDefaultXhrHeader:true,defaultXhrHeader:'XMLHttpRequest',poll:{},timeout:{},conn:{},pollInterval:50,transactionId:0,abort:function(o,callback,isTimeout){var me=this,tId=o.tId,isAbort=false;if(me.isCallInProgress(o)){o.conn.abort();clearInterval(me.poll[tId]);me.poll[tId]=null;clearTimeout(pub.timeout[tId]);me.timeout[tId]=null;handleTransactionResponse(o,callback,(isAbort=true),isTimeout);} +return isAbort;},isCallInProgress:function(o){return o.conn&&!{0:true,4:true}[o.conn.readyState];}};return pub;}();(function(){var EXTLIB=Ext.lib,noNegatives=/width|height|opacity|padding/i,offsetAttribute=/^((width|height)|(top|left))$/,defaultUnit=/width|height|top$|bottom$|left$|right$/i,offsetUnit=/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i,isset=function(v){return typeof v!=='undefined';},now=function(){return new Date();};EXTLIB.Anim={motion:function(el,args,duration,easing,cb,scope){return this.run(el,args,duration,easing,cb,scope,Ext.lib.Motion);},run:function(el,args,duration,easing,cb,scope,type){type=type||Ext.lib.AnimBase;if(typeof easing=="string"){easing=Ext.lib.Easing[easing];} +var anim=new type(el,args,duration,easing);anim.animateX(function(){if(Ext.isFunction(cb)){cb.call(scope);}});return anim;}};EXTLIB.AnimBase=function(el,attributes,duration,method){if(el){this.init(el,attributes,duration,method);}};EXTLIB.AnimBase.prototype={doMethod:function(attr,start,end){var me=this;return me.method(me.curFrame,start,end-start,me.totalFrames);},setAttr:function(attr,val,unit){if(noNegatives.test(attr)&&val<0){val=0;} +Ext.fly(this.el,'_anim').setStyle(attr,val+unit);},getAttr:function(attr){var el=Ext.fly(this.el),val=el.getStyle(attr),a=offsetAttribute.exec(attr)||[];if(val!=='auto'&&!offsetUnit.test(val)){return parseFloat(val);} +return(!!(a[2])||(el.getStyle('position')=='absolute'&&!!(a[3])))?el.dom['offset'+a[0].charAt(0).toUpperCase()+a[0].substr(1)]:0;},getDefaultUnit:function(attr){return defaultUnit.test(attr)?'px':'';},animateX:function(callback,scope){var me=this,f=function(){me.onComplete.removeListener(f);if(Ext.isFunction(callback)){callback.call(scope||me,me);}};me.onComplete.addListener(f,me);me.animate();},setRunAttr:function(attr){var me=this,a=this.attributes[attr],to=a.to,by=a.by,from=a.from,unit=a.unit,ra=(this.runAttrs[attr]={}),end;if(!isset(to)&&!isset(by)){return false;} +var start=isset(from)?from:me.getAttr(attr);if(isset(to)){end=to;}else if(isset(by)){if(Ext.isArray(start)){end=[];for(var i=0,len=start.length;i<len;i++){end[i]=start[i]+by[i];}}else{end=start+by;}} +Ext.apply(ra,{start:start,end:end,unit:isset(unit)?unit:me.getDefaultUnit(attr)});},init:function(el,attributes,duration,method){var me=this,actualFrames=0,mgr=EXTLIB.AnimMgr;Ext.apply(me,{isAnimated:false,startTime:null,el:Ext.getDom(el),attributes:attributes||{},duration:duration||1,method:method||EXTLIB.Easing.easeNone,useSec:true,curFrame:0,totalFrames:mgr.fps,runAttrs:{},animate:function(){var me=this,d=me.duration;if(me.isAnimated){return false;} +me.curFrame=0;me.totalFrames=me.useSec?Math.ceil(mgr.fps*d):d;mgr.registerElement(me);},stop:function(finish){var me=this;if(finish){me.curFrame=me.totalFrames;me._onTween.fire();} +mgr.stop(me);}});var onStart=function(){var me=this,attr;me.onStart.fire();me.runAttrs={};for(attr in this.attributes){this.setRunAttr(attr);} +me.isAnimated=true;me.startTime=now();actualFrames=0;};var onTween=function(){var me=this;me.onTween.fire({duration:now()-me.startTime,curFrame:me.curFrame});var ra=me.runAttrs;for(var attr in ra){this.setAttr(attr,me.doMethod(attr,ra[attr].start,ra[attr].end),ra[attr].unit);} +++actualFrames;};var onComplete=function(){var me=this,actual=(now()-me.startTime)/1000,data={duration:actual,frames:actualFrames,fps:actualFrames/actual};me.isAnimated=false;actualFrames=0;me.onComplete.fire(data);};me.onStart=new Ext.util.Event(me);me.onTween=new Ext.util.Event(me);me.onComplete=new Ext.util.Event(me);(me._onStart=new Ext.util.Event(me)).addListener(onStart);(me._onTween=new Ext.util.Event(me)).addListener(onTween);(me._onComplete=new Ext.util.Event(me)).addListener(onComplete);}};Ext.lib.AnimMgr=new function(){var me=this,thread=null,queue=[],tweenCount=0;Ext.apply(me,{fps:1000,delay:1,registerElement:function(tween){queue.push(tween);++tweenCount;tween._onStart.fire();me.start();},unRegister:function(tween,index){tween._onComplete.fire();index=index||getIndex(tween);if(index!=-1){queue.splice(index,1);} +if(--tweenCount<=0){me.stop();}},start:function(){if(thread===null){thread=setInterval(me.run,me.delay);}},stop:function(tween){if(!tween){clearInterval(thread);for(var i=0,len=queue.length;i<len;++i){if(queue[0].isAnimated){me.unRegister(queue[0],0);}} +queue=[];thread=null;tweenCount=0;}else{me.unRegister(tween);}},run:function(){var tf,i,len,tween;for(i=0,len=queue.length;i<len;i++){tween=queue[i];if(tween&&tween.isAnimated){tf=tween.totalFrames;if(tween.curFrame<tf||tf===null){++tween.curFrame;if(tween.useSec){correctFrame(tween);} +tween._onTween.fire();}else{me.stop(tween);}}}}});var getIndex=function(anim){var i,len;for(i=0,len=queue.length;i<len;i++){if(queue[i]===anim){return i;}} +return-1;};var correctFrame=function(tween){var frames=tween.totalFrames,frame=tween.curFrame,duration=tween.duration,expected=(frame*duration*1000/frames),elapsed=(now()-tween.startTime),tweak=0;if(elapsed<duration*1000){tweak=Math.round((elapsed/expected-1)*frame);}else{tweak=frames-(frame+1);} +if(tweak>0&&isFinite(tweak)){if(tween.curFrame+tweak>=frames){tweak=frames-(frame+1);} +tween.curFrame+=tweak;}};};EXTLIB.Bezier=new function(){this.getPosition=function(points,t){var n=points.length,tmp=[],c=1-t,i,j;for(i=0;i<n;++i){tmp[i]=[points[i][0],points[i][1]];} +for(j=1;j<n;++j){for(i=0;i<n-j;++i){tmp[i][0]=c*tmp[i][0]+t*tmp[parseInt(i+1,10)][0];tmp[i][1]=c*tmp[i][1]+t*tmp[parseInt(i+1,10)][1];}} +return[tmp[0][0],tmp[0][1]];};};EXTLIB.Easing={easeNone:function(t,b,c,d){return c*t/d+b;},easeIn:function(t,b,c,d){return c*(t/=d)*t+b;},easeOut:function(t,b,c,d){return-c*(t/=d)*(t-2)+b;}};(function(){EXTLIB.Motion=function(el,attributes,duration,method){if(el){EXTLIB.Motion.superclass.constructor.call(this,el,attributes,duration,method);}};Ext.extend(EXTLIB.Motion,Ext.lib.AnimBase);var superclass=EXTLIB.Motion.superclass,pointsRe=/^points$/i;Ext.apply(EXTLIB.Motion.prototype,{setAttr:function(attr,val,unit){var me=this,setAttr=superclass.setAttr;if(pointsRe.test(attr)){unit=unit||'px';setAttr.call(me,'left',val[0],unit);setAttr.call(me,'top',val[1],unit);}else{setAttr.call(me,attr,val,unit);}},getAttr:function(attr){var me=this,getAttr=superclass.getAttr;return pointsRe.test(attr)?[getAttr.call(me,'left'),getAttr.call(me,'top')]:getAttr.call(me,attr);},doMethod:function(attr,start,end){var me=this;return pointsRe.test(attr)?EXTLIB.Bezier.getPosition(me.runAttrs[attr],me.method(me.curFrame,0,100,me.totalFrames)/100):superclass.doMethod.call(me,attr,start,end);},setRunAttr:function(attr){if(pointsRe.test(attr)){var me=this,el=this.el,points=this.attributes.points,control=points.control||[],from=points.from,to=points.to,by=points.by,DOM=EXTLIB.Dom,start,i,end,len,ra;if(control.length>0&&!Ext.isArray(control[0])){control=[control];}else{} +Ext.fly(el,'_anim').position();DOM.setXY(el,isset(from)?from:DOM.getXY(el));start=me.getAttr('points');if(isset(to)){end=translateValues.call(me,to,start);for(i=0,len=control.length;i<len;++i){control[i]=translateValues.call(me,control[i],start);}}else if(isset(by)){end=[start[0]+by[0],start[1]+by[1]];for(i=0,len=control.length;i<len;++i){control[i]=[start[0]+control[i][0],start[1]+control[i][1]];}} +ra=this.runAttrs[attr]=[start];if(control.length>0){ra=ra.concat(control);} +ra[ra.length]=end;}else{superclass.setRunAttr.call(this,attr);}}});var translateValues=function(val,start){var pageXY=EXTLIB.Dom.getXY(this.el);return[val[0]-pageXY[0]+start[0],val[1]-pageXY[1]+start[1]];};})();})();(function(){var abs=Math.abs,pi=Math.PI,asin=Math.asin,pow=Math.pow,sin=Math.sin,EXTLIB=Ext.lib;Ext.apply(EXTLIB.Easing,{easeBoth:function(t,b,c,d){return((t/=d/2)<1)?c/2*t*t+b:-c/2*((--t)*(t-2)-1)+b;},easeInStrong:function(t,b,c,d){return c*(t/=d)*t*t*t+b;},easeOutStrong:function(t,b,c,d){return-c*((t=t/d-1)*t*t*t-1)+b;},easeBothStrong:function(t,b,c,d){return((t/=d/2)<1)?c/2*t*t*t*t+b:-c/2*((t-=2)*t*t*t-2)+b;},elasticIn:function(t,b,c,d,a,p){if(t==0||(t/=d)==1){return t==0?b:b+c;} +p=p||(d*.3);var s;if(a>=abs(c)){s=p/(2*pi)*asin(c/a);}else{a=c;s=p/4;} +return-(a*pow(2,10*(t-=1))*sin((t*d-s)*(2*pi)/p))+b;},elasticOut:function(t,b,c,d,a,p){if(t==0||(t/=d)==1){return t==0?b:b+c;} +p=p||(d*.3);var s;if(a>=abs(c)){s=p/(2*pi)*asin(c/a);}else{a=c;s=p/4;} +return a*pow(2,-10*t)*sin((t*d-s)*(2*pi)/p)+c+b;},elasticBoth:function(t,b,c,d,a,p){if(t==0||(t/=d/2)==2){return t==0?b:b+c;} +p=p||(d*(.3*1.5));var s;if(a>=abs(c)){s=p/(2*pi)*asin(c/a);}else{a=c;s=p/4;} +return t<1?-.5*(a*pow(2,10*(t-=1))*sin((t*d-s)*(2*pi)/p))+b:a*pow(2,-10*(t-=1))*sin((t*d-s)*(2*pi)/p)*.5+c+b;},backIn:function(t,b,c,d,s){s=s||1.70158;return c*(t/=d)*t*((s+1)*t-s)+b;},backOut:function(t,b,c,d,s){if(!s){s=1.70158;} +return c*((t=t/d-1)*t*((s+1)*t+s)+1)+b;},backBoth:function(t,b,c,d,s){s=s||1.70158;return((t/=d/2)<1)?c/2*(t*t*(((s*=(1.525))+1)*t-s))+b:c/2*((t-=2)*t*(((s*=(1.525))+1)*t+s)+2)+b;},bounceIn:function(t,b,c,d){return c-EXTLIB.Easing.bounceOut(d-t,0,c,d)+b;},bounceOut:function(t,b,c,d){if((t/=d)<(1/2.75)){return c*(7.5625*t*t)+b;}else if(t<(2/2.75)){return c*(7.5625*(t-=(1.5/2.75))*t+.75)+b;}else if(t<(2.5/2.75)){return c*(7.5625*(t-=(2.25/2.75))*t+.9375)+b;} +return c*(7.5625*(t-=(2.625/2.75))*t+.984375)+b;},bounceBoth:function(t,b,c,d){return(t<d/2)?EXTLIB.Easing.bounceIn(t*2,0,c,d)*.5+b:EXTLIB.Easing.bounceOut(t*2-d,0,c,d)*.5+c*.5+b;}});})();(function(){var EXTLIB=Ext.lib;EXTLIB.Anim.color=function(el,args,duration,easing,cb,scope){return EXTLIB.Anim.run(el,args,duration,easing,cb,scope,EXTLIB.ColorAnim);};EXTLIB.ColorAnim=function(el,attributes,duration,method){EXTLIB.ColorAnim.superclass.constructor.call(this,el,attributes,duration,method);};Ext.extend(EXTLIB.ColorAnim,EXTLIB.AnimBase);var superclass=EXTLIB.ColorAnim.superclass,colorRE=/color$/i,transparentRE=/^transparent|rgba\(0, 0, 0, 0\)$/,rgbRE=/^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,hexRE=/^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,hex3RE=/^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i,isset=function(v){return typeof v!=='undefined';};function parseColor(s){var pi=parseInt,base,out=null,c;if(s.length==3){return s;} +Ext.each([hexRE,rgbRE,hex3RE],function(re,idx){base=(idx%2==0)?16:10;c=re.exec(s);if(c&&c.length==4){out=[pi(c[1],base),pi(c[2],base),pi(c[3],base)];return false;}});return out;} +Ext.apply(EXTLIB.ColorAnim.prototype,{getAttr:function(attr){var me=this,el=me.el,val;if(colorRE.test(attr)){while(el&&transparentRE.test(val=Ext.fly(el).getStyle(attr))){el=el.parentNode;val="fff";}}else{val=superclass.getAttr.call(me,attr);} +return val;},doMethod:function(attr,start,end){var me=this,val,floor=Math.floor,i,len,v;if(colorRE.test(attr)){val=[];end=end||[];for(i=0,len=start.length;i<len;i++){v=start[i];val[i]=superclass.doMethod.call(me,attr,v,end[i]);} +val='rgb('+floor(val[0])+','+floor(val[1])+','+floor(val[2])+')';}else{val=superclass.doMethod.call(me,attr,start,end);} +return val;},setRunAttr:function(attr){var me=this,a=me.attributes[attr],to=a.to,by=a.by,ra;superclass.setRunAttr.call(me,attr);ra=me.runAttrs[attr];if(colorRE.test(attr)){var start=parseColor(ra.start),end=parseColor(ra.end);if(!isset(to)&&isset(by)){end=parseColor(by);for(var i=0,len=start.length;i<len;i++){end[i]=start[i]+end[i];}} +ra.start=start;ra.end=end;}}});})();(function(){var EXTLIB=Ext.lib;EXTLIB.Anim.scroll=function(el,args,duration,easing,cb,scope){return EXTLIB.Anim.run(el,args,duration,easing,cb,scope,EXTLIB.Scroll);};EXTLIB.Scroll=function(el,attributes,duration,method){if(el){EXTLIB.Scroll.superclass.constructor.call(this,el,attributes,duration,method);}};Ext.extend(EXTLIB.Scroll,EXTLIB.ColorAnim);var superclass=EXTLIB.Scroll.superclass,SCROLL='scroll';Ext.apply(EXTLIB.Scroll.prototype,{doMethod:function(attr,start,end){var val,me=this,curFrame=me.curFrame,totalFrames=me.totalFrames;if(attr==SCROLL){val=[me.method(curFrame,start[0],end[0]-start[0],totalFrames),me.method(curFrame,start[1],end[1]-start[1],totalFrames)];}else{val=superclass.doMethod.call(me,attr,start,end);} +return val;},getAttr:function(attr){var me=this;if(attr==SCROLL){return[me.el.scrollLeft,me.el.scrollTop];}else{return superclass.getAttr.call(me,attr);}},setAttr:function(attr,val,unit){var me=this;if(attr==SCROLL){me.el.scrollLeft=val[0];me.el.scrollTop=val[1];}else{superclass.setAttr.call(me,attr,val,unit);}}});})();if(Ext.isIE){function fnCleanUp(){var p=Function.prototype;delete p.createSequence;delete p.defer;delete p.createDelegate;delete p.createCallback;delete p.createInterceptor;window.detachEvent("onunload",fnCleanUp);} +window.attachEvent("onunload",fnCleanUp);}})();(function(){var EXTUTIL=Ext.util,EACH=Ext.each,TRUE=true,FALSE=false;EXTUTIL.Observable=function(){var me=this,e=me.events;if(me.listeners){me.on(me.listeners);delete me.listeners;} +me.events=e||{};};EXTUTIL.Observable.prototype={filterOptRe:/^(?:scope|delay|buffer|single)$/,fireEvent:function(){var a=Array.prototype.slice.call(arguments,0),ename=a[0].toLowerCase(),me=this,ret=TRUE,ce=me.events[ename],cc,q,c;if(me.eventsSuspended===TRUE){if(q=me.eventQueue){q.push(a);}} +else if(typeof ce=='object'){if(ce.bubble){if(ce.fire.apply(ce,a.slice(1))===FALSE){return FALSE;} +c=me.getBubbleTarget&&me.getBubbleTarget();if(c&&c.enableBubble){cc=c.events[ename];if(!cc||typeof cc!='object'||!cc.bubble){c.enableBubble(ename);} +return c.fireEvent.apply(c,a);}} +else{a.shift();ret=ce.fire.apply(ce,a);}} +return ret;},addListener:function(eventName,fn,scope,o){var me=this,e,oe,ce;if(typeof eventName=='object'){o=eventName;for(e in o){oe=o[e];if(!me.filterOptRe.test(e)){me.addListener(e,oe.fn||oe,oe.scope||o.scope,oe.fn?oe:o);}}}else{eventName=eventName.toLowerCase();ce=me.events[eventName]||TRUE;if(typeof ce=='boolean'){me.events[eventName]=ce=new EXTUTIL.Event(me,eventName);} +ce.addListener(fn,scope,typeof o=='object'?o:{});}},removeListener:function(eventName,fn,scope){var ce=this.events[eventName.toLowerCase()];if(typeof ce=='object'){ce.removeListener(fn,scope);}},purgeListeners:function(){var events=this.events,evt,key;for(key in events){evt=events[key];if(typeof evt=='object'){evt.clearListeners();}}},addEvents:function(o){var me=this;me.events=me.events||{};if(typeof o=='string'){var a=arguments,i=a.length;while(i--){me.events[a[i]]=me.events[a[i]]||TRUE;}}else{Ext.applyIf(me.events,o);}},hasListener:function(eventName){var e=this.events[eventName.toLowerCase()];return typeof e=='object'&&e.listeners.length>0;},suspendEvents:function(queueSuspended){this.eventsSuspended=TRUE;if(queueSuspended&&!this.eventQueue){this.eventQueue=[];}},resumeEvents:function(){var me=this,queued=me.eventQueue||[];me.eventsSuspended=FALSE;delete me.eventQueue;EACH(queued,function(e){me.fireEvent.apply(me,e);});}};var OBSERVABLE=EXTUTIL.Observable.prototype;OBSERVABLE.on=OBSERVABLE.addListener;OBSERVABLE.un=OBSERVABLE.removeListener;EXTUTIL.Observable.releaseCapture=function(o){o.fireEvent=OBSERVABLE.fireEvent;};function createTargeted(h,o,scope){return function(){if(o.target==arguments[0]){h.apply(scope,Array.prototype.slice.call(arguments,0));}};};function createBuffered(h,o,l,scope){l.task=new EXTUTIL.DelayedTask();return function(){l.task.delay(o.buffer,h,scope,Array.prototype.slice.call(arguments,0));};};function createSingle(h,e,fn,scope){return function(){e.removeListener(fn,scope);return h.apply(scope,arguments);};};function createDelayed(h,o,l,scope){return function(){var task=new EXTUTIL.DelayedTask(),args=Array.prototype.slice.call(arguments,0);if(!l.tasks){l.tasks=[];} +l.tasks.push(task);task.delay(o.delay||10,function(){l.tasks.remove(task);h.apply(scope,args);},scope);};};EXTUTIL.Event=function(obj,name){this.name=name;this.obj=obj;this.listeners=[];};EXTUTIL.Event.prototype={addListener:function(fn,scope,options){var me=this,l;scope=scope||me.obj;if(!me.isListening(fn,scope)){l=me.createListener(fn,scope,options);if(me.firing){me.listeners=me.listeners.slice(0);} +me.listeners.push(l);}},createListener:function(fn,scope,o){o=o||{};scope=scope||this.obj;var l={fn:fn,scope:scope,options:o},h=fn;if(o.target){h=createTargeted(h,o,scope);} +if(o.delay){h=createDelayed(h,o,l,scope);} +if(o.single){h=createSingle(h,this,fn,scope);} +if(o.buffer){h=createBuffered(h,o,l,scope);} +l.fireFn=h;return l;},findListener:function(fn,scope){var list=this.listeners,i=list.length,l;scope=scope||this.obj;while(i--){l=list[i];if(l){if(l.fn==fn&&l.scope==scope){return i;}}} +return-1;},isListening:function(fn,scope){return this.findListener(fn,scope)!=-1;},removeListener:function(fn,scope){var index,l,k,me=this,ret=FALSE;if((index=me.findListener(fn,scope))!=-1){if(me.firing){me.listeners=me.listeners.slice(0);} +l=me.listeners[index];if(l.task){l.task.cancel();delete l.task;} +k=l.tasks&&l.tasks.length;if(k){while(k--){l.tasks[k].cancel();} +delete l.tasks;} +me.listeners.splice(index,1);ret=TRUE;} +return ret;},clearListeners:function(){var me=this,l=me.listeners,i=l.length;while(i--){me.removeListener(l[i].fn,l[i].scope);}},fire:function(){var me=this,listeners=me.listeners,len=listeners.length,i=0,l;if(len>0){me.firing=TRUE;var args=Array.prototype.slice.call(arguments,0);for(;i<len;i++){l=listeners[i];if(l&&l.fireFn.apply(l.scope||me.obj||window,args)===FALSE){return(me.firing=FALSE);}}} +me.firing=FALSE;return TRUE;}};})();Ext.DomHelper=function(){var tempTableEl=null,emptyTags=/^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i,tableRe=/^table|tbody|tr|td$/i,confRe=/tag|children|cn|html$/i,tableElRe=/td|tr|tbody/i,cssRe=/([a-z0-9-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi,endRe=/end/i,pub,afterbegin='afterbegin',afterend='afterend',beforebegin='beforebegin',beforeend='beforeend',ts='<table>',te='</table>',tbs=ts+'<tbody>',tbe='</tbody>'+te,trs=tbs+'<tr>',tre='</tr>'+tbe;function doInsert(el,o,returnElement,pos,sibling,append){var newNode=pub.insertHtml(pos,Ext.getDom(el),createHtml(o));return returnElement?Ext.get(newNode,true):newNode;} +function createHtml(o){var b='',attr,val,key,cn;if(typeof o=="string"){b=o;}else if(Ext.isArray(o)){for(var i=0;i<o.length;i++){if(o[i]){b+=createHtml(o[i]);}};}else{b+='<'+(o.tag=o.tag||'div');for(attr in o){val=o[attr];if(!confRe.test(attr)){if(typeof val=="object"){b+=' '+attr+'="';for(key in val){b+=key+':'+val[key]+';';};b+='"';}else{b+=' '+({cls:'class',htmlFor:'for'}[attr]||attr)+'="'+val+'"';}}};if(emptyTags.test(o.tag)){b+='/>';}else{b+='>';if((cn=o.children||o.cn)){b+=createHtml(cn);}else if(o.html){b+=o.html;} +b+='</'+o.tag+'>';}} +return b;} +function ieTable(depth,s,h,e){tempTableEl.innerHTML=[s,h,e].join('');var i=-1,el=tempTableEl,ns;while(++i<depth){el=el.firstChild;} +if(ns=el.nextSibling){var df=document.createDocumentFragment();while(el){ns=el.nextSibling;df.appendChild(el);el=ns;} +el=df;} +return el;} +function insertIntoTable(tag,where,el,html){var node,before;tempTableEl=tempTableEl||document.createElement('div');if(tag=='td'&&(where==afterbegin||where==beforeend)||!tableElRe.test(tag)&&(where==beforebegin||where==afterend)){return;} +before=where==beforebegin?el:where==afterend?el.nextSibling:where==afterbegin?el.firstChild:null;if(where==beforebegin||where==afterend){el=el.parentNode;} +if(tag=='td'||(tag=='tr'&&(where==beforeend||where==afterbegin))){node=ieTable(4,trs,html,tre);}else if((tag=='tbody'&&(where==beforeend||where==afterbegin))||(tag=='tr'&&(where==beforebegin||where==afterend))){node=ieTable(3,tbs,html,tbe);}else{node=ieTable(2,ts,html,te);} +el.insertBefore(node,before);return node;} +pub={markup:function(o){return createHtml(o);},applyStyles:function(el,styles){if(styles){var matches;el=Ext.fly(el);if(typeof styles=="function"){styles=styles.call();} +if(typeof styles=="string"){cssRe.lastIndex=0;while((matches=cssRe.exec(styles))){el.setStyle(matches[1],matches[2]);}}else if(typeof styles=="object"){el.setStyle(styles);}}},insertHtml:function(where,el,html){var hash={},hashVal,setStart,range,frag,rangeEl,rs;where=where.toLowerCase();hash[beforebegin]=['BeforeBegin','previousSibling'];hash[afterend]=['AfterEnd','nextSibling'];if(el.insertAdjacentHTML){if(tableRe.test(el.tagName)&&(rs=insertIntoTable(el.tagName.toLowerCase(),where,el,html))){return rs;} +hash[afterbegin]=['AfterBegin','firstChild'];hash[beforeend]=['BeforeEnd','lastChild'];if((hashVal=hash[where])){el.insertAdjacentHTML(hashVal[0],html);return el[hashVal[1]];}}else{range=el.ownerDocument.createRange();setStart='setStart'+(endRe.test(where)?'After':'Before');if(hash[where]){range[setStart](el);frag=range.createContextualFragment(html);el.parentNode.insertBefore(frag,where==beforebegin?el:el.nextSibling);return el[(where==beforebegin?'previous':'next')+'Sibling'];}else{rangeEl=(where==afterbegin?'first':'last')+'Child';if(el.firstChild){range[setStart](el[rangeEl]);frag=range.createContextualFragment(html);if(where==afterbegin){el.insertBefore(frag,el.firstChild);}else{el.appendChild(frag);}}else{el.innerHTML=html;} +return el[rangeEl];}} +throw'Illegal insertion point -> "'+where+'"';},insertBefore:function(el,o,returnElement){return doInsert(el,o,returnElement,beforebegin);},insertAfter:function(el,o,returnElement){return doInsert(el,o,returnElement,afterend,'nextSibling');},insertFirst:function(el,o,returnElement){return doInsert(el,o,returnElement,afterbegin,'firstChild');},append:function(el,o,returnElement){return doInsert(el,o,returnElement,beforeend,'',true);},overwrite:function(el,o,returnElement){el=Ext.getDom(el);el.innerHTML=createHtml(o);return returnElement?Ext.get(el.firstChild):el.firstChild;},createHtml:createHtml};return pub;}();Ext.Template=function(html){var me=this,a=arguments,buf=[],v;if(Ext.isArray(html)){html=html.join("");}else if(a.length>1){for(var i=0,len=a.length;i<len;i++){v=a[i];if(typeof v=='object'){Ext.apply(me,v);}else{buf.push(v);}};html=buf.join('');} +me.html=html;if(me.compiled){me.compile();}};Ext.Template.prototype={re:/\{([\w-]+)\}/g,applyTemplate:function(values){var me=this;return me.compiled?me.compiled(values):me.html.replace(me.re,function(m,name){return values[name]!==undefined?values[name]:"";});},set:function(html,compile){var me=this;me.html=html;me.compiled=null;return compile?me.compile():me;},compile:function(){var me=this,sep=Ext.isGecko?"+":",";function fn(m,name){name="values['"+name+"']";return"'"+sep+'('+name+" == undefined ? '' : "+name+')'+sep+"'";} +eval("this.compiled = function(values){ return "+(Ext.isGecko?"'":"['")+ +me.html.replace(/\\/g,'\\\\').replace(/(\r\n|\n)/g,'\\n').replace(/'/g,"\\'").replace(this.re,fn)+ +(Ext.isGecko?"';};":"'].join('');};"));return me;},insertFirst:function(el,values,returnElement){return this.doInsert('afterBegin',el,values,returnElement);},insertBefore:function(el,values,returnElement){return this.doInsert('beforeBegin',el,values,returnElement);},insertAfter:function(el,values,returnElement){return this.doInsert('afterEnd',el,values,returnElement);},append:function(el,values,returnElement){return this.doInsert('beforeEnd',el,values,returnElement);},doInsert:function(where,el,values,returnEl){el=Ext.getDom(el);var newNode=Ext.DomHelper.insertHtml(where,el,this.applyTemplate(values));return returnEl?Ext.get(newNode,true):newNode;},overwrite:function(el,values,returnElement){el=Ext.getDom(el);el.innerHTML=this.applyTemplate(values);return returnElement?Ext.get(el.firstChild,true):el.firstChild;}};Ext.Template.prototype.apply=Ext.Template.prototype.applyTemplate;Ext.Template.from=function(el,config){el=Ext.getDom(el);return new Ext.Template(el.value||el.innerHTML,config||'');};Ext.DomQuery=function(){var cache={},simpleCache={},valueCache={},nonSpace=/\S/,trimRe=/^\s+|\s+$/g,tplRe=/\{(\d+)\}/g,modeRe=/^(\s?[\/>+~]\s?|\s|$)/,tagTokenRe=/^(#)?([\w-\*]+)/,nthRe=/(\d*)n\+?(\d*)/,nthRe2=/\D/,isIE=window.ActiveXObject?true:false,key=30803;eval("var batch = 30803;");function child(parent,index){var i=0,n=parent.firstChild;while(n){if(n.nodeType==1){if(++i==index){return n;}} +n=n.nextSibling;} +return null;} +function next(n){while((n=n.nextSibling)&&n.nodeType!=1);return n;} +function prev(n){while((n=n.previousSibling)&&n.nodeType!=1);return n;} +function children(parent){var n=parent.firstChild,nodeIndex=-1,nextNode;while(n){nextNode=n.nextSibling;if(n.nodeType==3&&!nonSpace.test(n.nodeValue)){parent.removeChild(n);}else{n.nodeIndex=++nodeIndex;} +n=nextNode;} +return this;} +function byClassName(nodeSet,cls){if(!cls){return nodeSet;} +var result=[],ri=-1;for(var i=0,ci;ci=nodeSet[i];i++){if((' '+ci.className+' ').indexOf(cls)!=-1){result[++ri]=ci;}} +return result;};function attrValue(n,attr){if(!n.tagName&&typeof n.length!="undefined"){n=n[0];} +if(!n){return null;} +if(attr=="for"){return n.htmlFor;} +if(attr=="class"||attr=="className"){return n.className;} +return n.getAttribute(attr)||n[attr];};function getNodes(ns,mode,tagName){var result=[],ri=-1,cs;if(!ns){return result;} +tagName=tagName||"*";if(typeof ns.getElementsByTagName!="undefined"){ns=[ns];} +if(!mode){for(var i=0,ni;ni=ns[i];i++){cs=ni.getElementsByTagName(tagName);for(var j=0,ci;ci=cs[j];j++){result[++ri]=ci;}}}else if(mode=="/"||mode==">"){var utag=tagName.toUpperCase();for(var i=0,ni,cn;ni=ns[i];i++){cn=ni.childNodes;for(var j=0,cj;cj=cn[j];j++){if(cj.nodeName==utag||cj.nodeName==tagName||tagName=='*'){result[++ri]=cj;}}}}else if(mode=="+"){var utag=tagName.toUpperCase();for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)&&n.nodeType!=1);if(n&&(n.nodeName==utag||n.nodeName==tagName||tagName=='*')){result[++ri]=n;}}}else if(mode=="~"){var utag=tagName.toUpperCase();for(var i=0,n;n=ns[i];i++){while((n=n.nextSibling)){if(n.nodeName==utag||n.nodeName==tagName||tagName=='*'){result[++ri]=n;}}}} +return result;} +function concat(a,b){if(b.slice){return a.concat(b);} +for(var i=0,l=b.length;i<l;i++){a[a.length]=b[i];} +return a;} +function byTag(cs,tagName){if(cs.tagName||cs==document){cs=[cs];} +if(!tagName){return cs;} +var result=[],ri=-1;tagName=tagName.toLowerCase();for(var i=0,ci;ci=cs[i];i++){if(ci.nodeType==1&&ci.tagName.toLowerCase()==tagName){result[++ri]=ci;}} +return result;} +function byId(cs,id){if(cs.tagName||cs==document){cs=[cs];} +if(!id){return cs;} +var result=[],ri=-1;for(var i=0,ci;ci=cs[i];i++){if(ci&&ci.id==id){result[++ri]=ci;return result;}} +return result;} +function byAttribute(cs,attr,value,op,custom){var result=[],ri=-1,useGetStyle=custom=="{",fn=Ext.DomQuery.operators[op],a,xml,hasXml;for(var i=0,ci;ci=cs[i];i++){if(ci.nodeType!=1){continue;} +if(!hasXml){xml=Ext.DomQuery.isXml(ci);hasXml=true;} +if(!xml){if(useGetStyle){a=Ext.DomQuery.getStyle(ci,attr);}else if(attr=="class"||attr=="className"){a=ci.className;}else if(attr=="for"){a=ci.htmlFor;}else if(attr=="href"){a=ci.getAttribute("href",2);}else{a=ci.getAttribute(attr);}}else{a=ci.getAttribute(attr);} +if((fn&&fn(a,value))||(!fn&&a)){result[++ri]=ci;}} +return result;} +function byPseudo(cs,name,value){return Ext.DomQuery.pseudos[name](cs,value);} +function nodupIEXml(cs){var d=++key,r;cs[0].setAttribute("_nodup",d);r=[cs[0]];for(var i=1,len=cs.length;i<len;i++){var c=cs[i];if(!c.getAttribute("_nodup")!=d){c.setAttribute("_nodup",d);r[r.length]=c;}} +for(var i=0,len=cs.length;i<len;i++){cs[i].removeAttribute("_nodup");} +return r;} +function nodup(cs){if(!cs){return[];} +var len=cs.length,c,i,r=cs,cj,ri=-1;if(!len||typeof cs.nodeType!="undefined"||len==1){return cs;} +if(isIE&&typeof cs[0].selectSingleNode!="undefined"){return nodupIEXml(cs);} +var d=++key;cs[0]._nodup=d;for(i=1;c=cs[i];i++){if(c._nodup!=d){c._nodup=d;}else{r=[];for(var j=0;j<i;j++){r[++ri]=cs[j];} +for(j=i+1;cj=cs[j];j++){if(cj._nodup!=d){cj._nodup=d;r[++ri]=cj;}} +return r;}} +return r;} +function quickDiffIEXml(c1,c2){var d=++key,r=[];for(var i=0,len=c1.length;i<len;i++){c1[i].setAttribute("_qdiff",d);} +for(var i=0,len=c2.length;i<len;i++){if(c2[i].getAttribute("_qdiff")!=d){r[r.length]=c2[i];}} +for(var i=0,len=c1.length;i<len;i++){c1[i].removeAttribute("_qdiff");} +return r;} +function quickDiff(c1,c2){var len1=c1.length,d=++key,r=[];if(!len1){return c2;} +if(isIE&&typeof c1[0].selectSingleNode!="undefined"){return quickDiffIEXml(c1,c2);} +for(var i=0;i<len1;i++){c1[i]._qdiff=d;} +for(var i=0,len=c2.length;i<len;i++){if(c2[i]._qdiff!=d){r[r.length]=c2[i];}} +return r;} +function quickId(ns,mode,root,id){if(ns==root){var d=root.ownerDocument||root;return d.getElementById(id);} +ns=getNodes(ns,mode,"*");return byId(ns,id);} +return{getStyle:function(el,name){return Ext.fly(el).getStyle(name);},compile:function(path,type){type=type||"select";var fn=["var f = function(root){\n var mode; ++batch; var n = root || document;\n"],mode,lastPath,matchers=Ext.DomQuery.matchers,matchersLn=matchers.length,modeMatch,lmode=path.match(modeRe);if(lmode&&lmode[1]){fn[fn.length]='mode="'+lmode[1].replace(trimRe,"")+'";';path=path.replace(lmode[1],"");} +while(path.substr(0,1)=="/"){path=path.substr(1);} +while(path&&lastPath!=path){lastPath=path;var tokenMatch=path.match(tagTokenRe);if(type=="select"){if(tokenMatch){if(tokenMatch[1]=="#"){fn[fn.length]='n = quickId(n, mode, root, "'+tokenMatch[2]+'");';}else{fn[fn.length]='n = getNodes(n, mode, "'+tokenMatch[2]+'");';} +path=path.replace(tokenMatch[0],"");}else if(path.substr(0,1)!='@'){fn[fn.length]='n = getNodes(n, mode, "*");';}}else{if(tokenMatch){if(tokenMatch[1]=="#"){fn[fn.length]='n = byId(n, "'+tokenMatch[2]+'");';}else{fn[fn.length]='n = byTag(n, "'+tokenMatch[2]+'");';} +path=path.replace(tokenMatch[0],"");}} +while(!(modeMatch=path.match(modeRe))){var matched=false;for(var j=0;j<matchersLn;j++){var t=matchers[j];var m=path.match(t.re);if(m){fn[fn.length]=t.select.replace(tplRe,function(x,i){return m[i];});path=path.replace(m[0],"");matched=true;break;}} +if(!matched){throw'Error parsing selector, parsing failed at "'+path+'"';}} +if(modeMatch[1]){fn[fn.length]='mode="'+modeMatch[1].replace(trimRe,"")+'";';path=path.replace(modeMatch[1],"");}} +fn[fn.length]="return nodup(n);\n}";eval(fn.join(""));return f;},jsSelect:function(path,root,type){root=root||document;if(typeof root=="string"){root=document.getElementById(root);} +var paths=path.split(","),results=[];for(var i=0,len=paths.length;i<len;i++){var subPath=paths[i].replace(trimRe,"");if(!cache[subPath]){cache[subPath]=Ext.DomQuery.compile(subPath);if(!cache[subPath]){throw subPath+" is not a valid selector";}} +var result=cache[subPath](root);if(result&&result!=document){results=results.concat(result);}} +if(paths.length>1){return nodup(results);} +return results;},isXml:function(el){var docEl=(el?el.ownerDocument||el:0).documentElement;return docEl?docEl.nodeName!=="HTML":false;},select:document.querySelectorAll?function(path,root,type){root=root||document;if(!Ext.DomQuery.isXml(root)){try{var cs=root.querySelectorAll(path);return Ext.toArray(cs);} +catch(ex){}} +return Ext.DomQuery.jsSelect.call(this,path,root,type);}:function(path,root,type){return Ext.DomQuery.jsSelect.call(this,path,root,type);},selectNode:function(path,root){return Ext.DomQuery.select(path,root)[0];},selectValue:function(path,root,defaultValue){path=path.replace(trimRe,"");if(!valueCache[path]){valueCache[path]=Ext.DomQuery.compile(path,"select");} +var n=valueCache[path](root),v;n=n[0]?n[0]:n;if(typeof n.normalize=='function')n.normalize();v=(n&&n.firstChild?n.firstChild.nodeValue:null);return((v===null||v===undefined||v==='')?defaultValue:v);},selectNumber:function(path,root,defaultValue){var v=Ext.DomQuery.selectValue(path,root,defaultValue||0);return parseFloat(v);},is:function(el,ss){if(typeof el=="string"){el=document.getElementById(el);} +var isArray=Ext.isArray(el),result=Ext.DomQuery.filter(isArray?el:[el],ss);return isArray?(result.length==el.length):(result.length>0);},filter:function(els,ss,nonMatches){ss=ss.replace(trimRe,"");if(!simpleCache[ss]){simpleCache[ss]=Ext.DomQuery.compile(ss,"simple");} +var result=simpleCache[ss](els);return nonMatches?quickDiff(result,els):result;},matchers:[{re:/^\.([\w-]+)/,select:'n = byClassName(n, " {1} ");'},{re:/^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,select:'n = byPseudo(n, "{1}", "{2}");'},{re:/^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,select:'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");'},{re:/^#([\w-]+)/,select:'n = byId(n, "{1}");'},{re:/^@([\w-]+)/,select:'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'}],operators:{"=":function(a,v){return a==v;},"!=":function(a,v){return a!=v;},"^=":function(a,v){return a&&a.substr(0,v.length)==v;},"$=":function(a,v){return a&&a.substr(a.length-v.length)==v;},"*=":function(a,v){return a&&a.indexOf(v)!==-1;},"%=":function(a,v){return(a%v)==0;},"|=":function(a,v){return a&&(a==v||a.substr(0,v.length+1)==v+'-');},"~=":function(a,v){return a&&(' '+a+' ').indexOf(' '+v+' ')!=-1;}},pseudos:{"first-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.previousSibling)&&n.nodeType!=1);if(!n){r[++ri]=ci;}} +return r;},"last-child":function(c){var r=[],ri=-1,n;for(var i=0,ci;ci=n=c[i];i++){while((n=n.nextSibling)&&n.nodeType!=1);if(!n){r[++ri]=ci;}} +return r;},"nth-child":function(c,a){var r=[],ri=-1,m=nthRe.exec(a=="even"&&"2n"||a=="odd"&&"2n+1"||!nthRe2.test(a)&&"n+"+a||a),f=(m[1]||1)-0,l=m[2]-0;for(var i=0,n;n=c[i];i++){var pn=n.parentNode;if(batch!=pn._batch){var j=0;for(var cn=pn.firstChild;cn;cn=cn.nextSibling){if(cn.nodeType==1){cn.nodeIndex=++j;}} +pn._batch=batch;} +if(f==1){if(l==0||n.nodeIndex==l){r[++ri]=n;}}else if((n.nodeIndex+l)%f==0){r[++ri]=n;}} +return r;},"only-child":function(c){var r=[],ri=-1;;for(var i=0,ci;ci=c[i];i++){if(!prev(ci)&&!next(ci)){r[++ri]=ci;}} +return r;},"empty":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var cns=ci.childNodes,j=0,cn,empty=true;while(cn=cns[j]){++j;if(cn.nodeType==1||cn.nodeType==3){empty=false;break;}} +if(empty){r[++ri]=ci;}} +return r;},"contains":function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if((ci.textContent||ci.innerText||'').indexOf(v)!=-1){r[++ri]=ci;}} +return r;},"nodeValue":function(c,v){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.firstChild&&ci.firstChild.nodeValue==v){r[++ri]=ci;}} +return r;},"checked":function(c){var r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(ci.checked==true){r[++ri]=ci;}} +return r;},"not":function(c,ss){return Ext.DomQuery.filter(c,ss,true);},"any":function(c,selectors){var ss=selectors.split('|'),r=[],ri=-1,s;for(var i=0,ci;ci=c[i];i++){for(var j=0;s=ss[j];j++){if(Ext.DomQuery.is(ci,s)){r[++ri]=ci;break;}}} +return r;},"odd":function(c){return this["nth-child"](c,"odd");},"even":function(c){return this["nth-child"](c,"even");},"nth":function(c,a){return c[a-1]||[];},"first":function(c){return c[0]||[];},"last":function(c){return c[c.length-1]||[];},"has":function(c,ss){var s=Ext.DomQuery.select,r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){if(s(ss,ci).length>0){r[++ri]=ci;}} +return r;},"next":function(c,ss){var is=Ext.DomQuery.is,r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=next(ci);if(n&&is(n,ss)){r[++ri]=ci;}} +return r;},"prev":function(c,ss){var is=Ext.DomQuery.is,r=[],ri=-1;for(var i=0,ci;ci=c[i];i++){var n=prev(ci);if(n&&is(n,ss)){r[++ri]=ci;}} +return r;}}};}();Ext.query=Ext.DomQuery.select;Ext.util.DelayedTask=function(fn,scope,args){var me=this,id,call=function(){clearInterval(id);id=null;fn.apply(scope,args||[]);};me.delay=function(delay,newFn,newScope,newArgs){me.cancel();fn=newFn||fn;scope=newScope||scope;args=newArgs||args;id=setInterval(call,delay);};me.cancel=function(){if(id){clearInterval(id);id=null;}};};(function(){var DOC=document;Ext.Element=function(element,forceNew){var dom=typeof element=="string"?DOC.getElementById(element):element,id;if(!dom)return null;id=dom.id;if(!forceNew&&id&&Ext.elCache[id]){return Ext.elCache[id].el;} +this.dom=dom;this.id=id||Ext.id(dom);};var DH=Ext.DomHelper,El=Ext.Element,EC=Ext.elCache;El.prototype={set:function(o,useSet){var el=this.dom,attr,val,useSet=(useSet!==false)&&!!el.setAttribute;for(attr in o){if(o.hasOwnProperty(attr)){val=o[attr];if(attr=='style'){DH.applyStyles(el,val);}else if(attr=='cls'){el.className=val;}else if(useSet){el.setAttribute(attr,val);}else{el[attr]=val;}}} +return this;},defaultUnit:"px",is:function(simpleSelector){return Ext.DomQuery.is(this.dom,simpleSelector);},focus:function(defer,dom){var me=this,dom=dom||me.dom;try{if(Number(defer)){me.focus.defer(defer,null,[null,dom]);}else{dom.focus();}}catch(e){} +return me;},blur:function(){try{this.dom.blur();}catch(e){} +return this;},getValue:function(asNumber){var val=this.dom.value;return asNumber?parseInt(val,10):val;},addListener:function(eventName,fn,scope,options){Ext.EventManager.on(this.dom,eventName,fn,scope||this,options);return this;},removeListener:function(eventName,fn,scope){Ext.EventManager.removeListener(this.dom,eventName,fn,scope||this);return this;},removeAllListeners:function(){Ext.EventManager.removeAll(this.dom);return this;},purgeAllListeners:function(){Ext.EventManager.purgeElement(this,true);return this;},addUnits:function(size){if(size===""||size=="auto"||size===undefined){size=size||'';}else if(!isNaN(size)||!unitPattern.test(size)){size=size+(this.defaultUnit||'px');} +return size;},load:function(url,params,cb){Ext.Ajax.request(Ext.apply({params:params,url:url.url||url,callback:cb,el:this.dom,indicatorText:url.indicatorText||''},Ext.isObject(url)?url:{}));return this;},isBorderBox:function(){return Ext.isBorderBox||Ext.isForcedBorderBox||noBoxAdjust[(this.dom.tagName||"").toLowerCase()];},remove:function(){var me=this,dom=me.dom;if(dom){delete me.dom;Ext.removeNode(dom);}},hover:function(overFn,outFn,scope,options){var me=this;me.on('mouseenter',overFn,scope||me.dom,options);me.on('mouseleave',outFn,scope||me.dom,options);return me;},contains:function(el){return!el?false:Ext.lib.Dom.isAncestor(this.dom,el.dom?el.dom:el);},getAttributeNS:function(ns,name){return this.getAttribute(name,ns);},getAttribute:Ext.isIE?function(name,ns){var d=this.dom,type=typeof d[ns+":"+name];if(['undefined','unknown'].indexOf(type)==-1){return d[ns+":"+name];} +return d[name];}:function(name,ns){var d=this.dom;return d.getAttributeNS(ns,name)||d.getAttribute(ns+":"+name)||d.getAttribute(name)||d[name];},update:function(html){if(this.dom){this.dom.innerHTML=html;} +return this;}};var ep=El.prototype;El.addMethods=function(o){Ext.apply(ep,o);};ep.on=ep.addListener;ep.un=ep.removeListener;ep.autoBoxAdjust=true;var unitPattern=/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,docEl;El.get=function(el){var ex,elm,id;if(!el){return null;} +if(typeof el=="string"){if(!(elm=DOC.getElementById(el))){return null;} +if(EC[el]&&EC[el].el){ex=EC[el].el;ex.dom=elm;}else{ex=El.addToCache(new El(elm));} +return ex;}else if(el.tagName){if(!(id=el.id)){id=Ext.id(el);} +if(EC[id]&&EC[id].el){ex=EC[id].el;ex.dom=el;}else{ex=El.addToCache(new El(el));} +return ex;}else if(el instanceof El){if(el!=docEl){if(Ext.isIE&&(el.id==undefined||el.id=='')){el.dom=el.dom;}else{el.dom=DOC.getElementById(el.id)||el.dom;}} +return el;}else if(el.isComposite){return el;}else if(Ext.isArray(el)){return El.select(el);}else if(el==DOC){if(!docEl){var f=function(){};f.prototype=El.prototype;docEl=new f();docEl.dom=DOC;} +return docEl;} +return null;};El.addToCache=function(el,id){id=id||el.id;EC[id]={el:el,data:{},events:{}};return el;};El.data=function(el,key,value){el=El.get(el);if(!el){return null;} +var c=EC[el.id].data;if(arguments.length==2){return c[key];}else{return(c[key]=value);}};function garbageCollect(){if(!Ext.enableGarbageCollector){clearInterval(El.collectorThreadId);}else{var eid,el,d,o;for(eid in EC){o=EC[eid];if(o.skipGC){continue;} +el=o.el;d=el.dom;if(!d||!d.parentNode||(!d.offsetParent&&!DOC.getElementById(eid))){if(Ext.enableListenerCollection){Ext.EventManager.removeAll(d);} +delete EC[eid];}} +if(Ext.isIE){var t={};for(eid in EC){t[eid]=EC[eid];} +EC=Ext.elCache=t;}}} +El.collectorThreadId=setInterval(garbageCollect,30000);var flyFn=function(){};flyFn.prototype=El.prototype;El.Flyweight=function(dom){this.dom=dom;};El.Flyweight.prototype=new flyFn();El.Flyweight.prototype.isFlyweight=true;El._flyweights={};El.fly=function(el,named){var ret=null;named=named||'_global';if(el=Ext.getDom(el)){(El._flyweights[named]=El._flyweights[named]||new El.Flyweight()).dom=el;ret=El._flyweights[named];} +return ret;};Ext.get=El.get;Ext.fly=El.fly;var noBoxAdjust=Ext.isStrict?{select:1}:{input:1,select:1,textarea:1};if(Ext.isIE||Ext.isGecko){noBoxAdjust['button']=1;}})();Ext.Element.addMethods(function(){var PARENTNODE='parentNode',NEXTSIBLING='nextSibling',PREVIOUSSIBLING='previousSibling',DQ=Ext.DomQuery,GET=Ext.get;return{findParent:function(simpleSelector,maxDepth,returnEl){var p=this.dom,b=document.body,depth=0,stopEl;if(Ext.isGecko&&Object.prototype.toString.call(p)=='[object XULElement]'){return null;} +maxDepth=maxDepth||50;if(isNaN(maxDepth)){stopEl=Ext.getDom(maxDepth);maxDepth=Number.MAX_VALUE;} +while(p&&p.nodeType==1&&depth<maxDepth&&p!=b&&p!=stopEl){if(DQ.is(p,simpleSelector)){return returnEl?GET(p):p;} +depth++;p=p.parentNode;} +return null;},findParentNode:function(simpleSelector,maxDepth,returnEl){var p=Ext.fly(this.dom.parentNode,'_internal');return p?p.findParent(simpleSelector,maxDepth,returnEl):null;},up:function(simpleSelector,maxDepth){return this.findParentNode(simpleSelector,maxDepth,true);},select:function(selector){return Ext.Element.select(selector,this.dom);},query:function(selector){return DQ.select(selector,this.dom);},child:function(selector,returnDom){var n=DQ.selectNode(selector,this.dom);return returnDom?n:GET(n);},down:function(selector,returnDom){var n=DQ.selectNode(" > "+selector,this.dom);return returnDom?n:GET(n);},parent:function(selector,returnDom){return this.matchNode(PARENTNODE,PARENTNODE,selector,returnDom);},next:function(selector,returnDom){return this.matchNode(NEXTSIBLING,NEXTSIBLING,selector,returnDom);},prev:function(selector,returnDom){return this.matchNode(PREVIOUSSIBLING,PREVIOUSSIBLING,selector,returnDom);},first:function(selector,returnDom){return this.matchNode(NEXTSIBLING,'firstChild',selector,returnDom);},last:function(selector,returnDom){return this.matchNode(PREVIOUSSIBLING,'lastChild',selector,returnDom);},matchNode:function(dir,start,selector,returnDom){var n=this.dom[start];while(n){if(n.nodeType==1&&(!selector||DQ.is(n,selector))){return!returnDom?GET(n):n;} +n=n[dir];} +return null;}};}());Ext.Element.addMethods(function(){var GETDOM=Ext.getDom,GET=Ext.get,DH=Ext.DomHelper;return{appendChild:function(el){return GET(el).appendTo(this);},appendTo:function(el){GETDOM(el).appendChild(this.dom);return this;},insertBefore:function(el){(el=GETDOM(el)).parentNode.insertBefore(this.dom,el);return this;},insertAfter:function(el){(el=GETDOM(el)).parentNode.insertBefore(this.dom,el.nextSibling);return this;},insertFirst:function(el,returnDom){el=el||{};if(el.nodeType||el.dom||typeof el=='string'){el=GETDOM(el);this.dom.insertBefore(el,this.dom.firstChild);return!returnDom?GET(el):el;}else{return this.createChild(el,this.dom.firstChild,returnDom);}},replace:function(el){el=GET(el);this.insertBefore(el);el.remove();return this;},replaceWith:function(el){var me=this;if(el.nodeType||el.dom||typeof el=='string'){el=GETDOM(el);me.dom.parentNode.insertBefore(el,me.dom);}else{el=DH.insertBefore(me.dom,el);} +delete Ext.elCache[me.id];Ext.removeNode(me.dom);me.id=Ext.id(me.dom=el);Ext.Element.addToCache(me.isFlyweight?new Ext.Element(me.dom):me);return me;},createChild:function(config,insertBefore,returnDom){config=config||{tag:'div'};return insertBefore?DH.insertBefore(insertBefore,config,returnDom!==true):DH[!this.dom.firstChild?'overwrite':'append'](this.dom,config,returnDom!==true);},wrap:function(config,returnDom){var newEl=DH.insertBefore(this.dom,config||{tag:"div"},!returnDom);newEl.dom?newEl.dom.appendChild(this.dom):newEl.appendChild(this.dom);return newEl;},insertHtml:function(where,html,returnEl){var el=DH.insertHtml(where,this.dom,html);return returnEl?Ext.get(el):el;}};}());Ext.Element.addMethods(function(){var supports=Ext.supports,propCache={},camelRe=/(-[a-z])/gi,view=document.defaultView,opacityRe=/alpha\(opacity=(.*)\)/i,trimRe=/^\s+|\s+$/g,EL=Ext.Element,spacesRe=/\s+/,wordsRe=/\w/g,PADDING="padding",MARGIN="margin",BORDER="border",LEFT="-left",RIGHT="-right",TOP="-top",BOTTOM="-bottom",WIDTH="-width",MATH=Math,HIDDEN='hidden',ISCLIPPED='isClipped',OVERFLOW='overflow',OVERFLOWX='overflow-x',OVERFLOWY='overflow-y',ORIGINALCLIP='originalClip',borders={l:BORDER+LEFT+WIDTH,r:BORDER+RIGHT+WIDTH,t:BORDER+TOP+WIDTH,b:BORDER+BOTTOM+WIDTH},paddings={l:PADDING+LEFT,r:PADDING+RIGHT,t:PADDING+TOP,b:PADDING+BOTTOM},margins={l:MARGIN+LEFT,r:MARGIN+RIGHT,t:MARGIN+TOP,b:MARGIN+BOTTOM},data=Ext.Element.data;function camelFn(m,a){return a.charAt(1).toUpperCase();} +function chkCache(prop){return propCache[prop]||(propCache[prop]=prop=='float'?(supports.cssFloat?'cssFloat':'styleFloat'):prop.replace(camelRe,camelFn));} +return{adjustWidth:function(width){var me=this;var isNum=(typeof width=="number");if(isNum&&me.autoBoxAdjust&&!me.isBorderBox()){width-=(me.getBorderWidth("lr")+me.getPadding("lr"));} +return(isNum&&width<0)?0:width;},adjustHeight:function(height){var me=this;var isNum=(typeof height=="number");if(isNum&&me.autoBoxAdjust&&!me.isBorderBox()){height-=(me.getBorderWidth("tb")+me.getPadding("tb"));} +return(isNum&&height<0)?0:height;},addClass:function(className){var me=this,i,len,v,cls=[];if(!Ext.isArray(className)){if(typeof className=='string'&&!this.hasClass(className)){me.dom.className+=" "+className;}} +else{for(i=0,len=className.length;i<len;i++){v=className[i];if(typeof v=='string'&&(' '+me.dom.className+' ').indexOf(' '+v+' ')==-1){cls.push(v);}} +if(cls.length){me.dom.className+=" "+cls.join(" ");}} +return me;},removeClass:function(className){var me=this,i,idx,len,cls,elClasses;if(!Ext.isArray(className)){className=[className];} +if(me.dom&&me.dom.className){elClasses=me.dom.className.replace(trimRe,'').split(spacesRe);for(i=0,len=className.length;i<len;i++){cls=className[i];if(typeof cls=='string'){cls=cls.replace(trimRe,'');idx=elClasses.indexOf(cls);if(idx!=-1){elClasses.splice(idx,1);}}} +me.dom.className=elClasses.join(" ");} +return me;},radioClass:function(className){var cn=this.dom.parentNode.childNodes,v,i,len;className=Ext.isArray(className)?className:[className];for(i=0,len=cn.length;i<len;i++){v=cn[i];if(v&&v.nodeType==1){Ext.fly(v,'_internal').removeClass(className);}};return this.addClass(className);},toggleClass:function(className){return this.hasClass(className)?this.removeClass(className):this.addClass(className);},hasClass:function(className){return className&&(' '+this.dom.className+' ').indexOf(' '+className+' ')!=-1;},replaceClass:function(oldClassName,newClassName){return this.removeClass(oldClassName).addClass(newClassName);},isStyle:function(style,val){return this.getStyle(style)==val;},getStyle:function(){return view&&view.getComputedStyle?function(prop){var el=this.dom,v,cs,out,display;if(el==document){return null;} +prop=chkCache(prop);out=(v=el.style[prop])?v:(cs=view.getComputedStyle(el,""))?cs[prop]:null;if(prop=='marginRight'&&out!='0px'&&!supports.correctRightMargin){display=el.style.display;el.style.display='inline-block';out=view.getComputedStyle(el,'').marginRight;el.style.display=display;} +if(prop=='backgroundColor'&&out=='rgba(0, 0, 0, 0)'&&!supports.correctTransparentColor){out='transparent';} +return out;}:function(prop){var el=this.dom,m,cs;if(el==document)return null;if(prop=='opacity'){if(el.style.filter.match){if(m=el.style.filter.match(opacityRe)){var fv=parseFloat(m[1]);if(!isNaN(fv)){return fv?fv/100:0;}}} +return 1;} +prop=chkCache(prop);return el.style[prop]||((cs=el.currentStyle)?cs[prop]:null);};}(),getColor:function(attr,defaultValue,prefix){var v=this.getStyle(attr),color=(typeof prefix!='undefined')?prefix:'#',h;if(!v||(/transparent|inherit/.test(v))){return defaultValue;} +if(/^r/.test(v)){Ext.each(v.slice(4,v.length-1).split(','),function(s){h=parseInt(s,10);color+=(h<16?'0':'')+h.toString(16);});}else{v=v.replace('#','');color+=v.length==3?v.replace(/^(\w)(\w)(\w)$/,'$1$1$2$2$3$3'):v;} +return(color.length>5?color.toLowerCase():defaultValue);},setStyle:function(prop,value){var tmp,style;if(typeof prop!='object'){tmp={};tmp[prop]=value;prop=tmp;} +for(style in prop){value=prop[style];style=='opacity'?this.setOpacity(value):this.dom.style[chkCache(style)]=value;} +return this;},setOpacity:function(opacity,animate){var me=this,s=me.dom.style;if(!animate||!me.anim){if(Ext.isIE){var opac=opacity<1?'alpha(opacity='+opacity*100+')':'',val=s.filter.replace(opacityRe,'').replace(trimRe,'');s.zoom=1;s.filter=val+(val.length>0?' ':'')+opac;}else{s.opacity=opacity;}}else{me.anim({opacity:{to:opacity}},me.preanim(arguments,1),null,.35,'easeIn');} +return me;},clearOpacity:function(){var style=this.dom.style;if(Ext.isIE){if(!Ext.isEmpty(style.filter)){style.filter=style.filter.replace(opacityRe,'').replace(trimRe,'');}}else{style.opacity=style['-moz-opacity']=style['-khtml-opacity']='';} +return this;},getHeight:function(contentHeight){var me=this,dom=me.dom,hidden=Ext.isIE&&me.isStyle('display','none'),h=MATH.max(dom.offsetHeight,hidden?0:dom.clientHeight)||0;h=!contentHeight?h:h-me.getBorderWidth("tb")-me.getPadding("tb");return h<0?0:h;},getWidth:function(contentWidth){var me=this,dom=me.dom,hidden=Ext.isIE&&me.isStyle('display','none'),w=MATH.max(dom.offsetWidth,hidden?0:dom.clientWidth)||0;w=!contentWidth?w:w-me.getBorderWidth("lr")-me.getPadding("lr");return w<0?0:w;},setWidth:function(width,animate){var me=this;width=me.adjustWidth(width);!animate||!me.anim?me.dom.style.width=me.addUnits(width):me.anim({width:{to:width}},me.preanim(arguments,1));return me;},setHeight:function(height,animate){var me=this;height=me.adjustHeight(height);!animate||!me.anim?me.dom.style.height=me.addUnits(height):me.anim({height:{to:height}},me.preanim(arguments,1));return me;},getBorderWidth:function(side){return this.addStyles(side,borders);},getPadding:function(side){return this.addStyles(side,paddings);},clip:function(){var me=this,dom=me.dom;if(!data(dom,ISCLIPPED)){data(dom,ISCLIPPED,true);data(dom,ORIGINALCLIP,{o:me.getStyle(OVERFLOW),x:me.getStyle(OVERFLOWX),y:me.getStyle(OVERFLOWY)});me.setStyle(OVERFLOW,HIDDEN);me.setStyle(OVERFLOWX,HIDDEN);me.setStyle(OVERFLOWY,HIDDEN);} +return me;},unclip:function(){var me=this,dom=me.dom;if(data(dom,ISCLIPPED)){data(dom,ISCLIPPED,false);var o=data(dom,ORIGINALCLIP);if(o.o){me.setStyle(OVERFLOW,o.o);} +if(o.x){me.setStyle(OVERFLOWX,o.x);} +if(o.y){me.setStyle(OVERFLOWY,o.y);}} +return me;},addStyles:function(sides,styles){var ttlSize=0,sidesArr=sides.match(wordsRe),side,size,i,len=sidesArr.length;for(i=0;i<len;i++){side=sidesArr[i];size=side&&parseInt(this.getStyle(styles[side]),10);if(size){ttlSize+=MATH.abs(size);}} +return ttlSize;},margins:margins};}());(function(){var D=Ext.lib.Dom,LEFT="left",RIGHT="right",TOP="top",BOTTOM="bottom",POSITION="position",STATIC="static",RELATIVE="relative",AUTO="auto",ZINDEX="z-index";Ext.Element.addMethods({getX:function(){return D.getX(this.dom);},getY:function(){return D.getY(this.dom);},getXY:function(){return D.getXY(this.dom);},getOffsetsTo:function(el){var o=this.getXY(),e=Ext.fly(el,'_internal').getXY();return[o[0]-e[0],o[1]-e[1]];},setX:function(x,animate){return this.setXY([x,this.getY()],this.animTest(arguments,animate,1));},setY:function(y,animate){return this.setXY([this.getX(),y],this.animTest(arguments,animate,1));},setLeft:function(left){this.setStyle(LEFT,this.addUnits(left));return this;},setTop:function(top){this.setStyle(TOP,this.addUnits(top));return this;},setRight:function(right){this.setStyle(RIGHT,this.addUnits(right));return this;},setBottom:function(bottom){this.setStyle(BOTTOM,this.addUnits(bottom));return this;},setXY:function(pos,animate){var me=this;if(!animate||!me.anim){D.setXY(me.dom,pos);}else{me.anim({points:{to:pos}},me.preanim(arguments,1),'motion');} +return me;},setLocation:function(x,y,animate){return this.setXY([x,y],this.animTest(arguments,animate,2));},moveTo:function(x,y,animate){return this.setXY([x,y],this.animTest(arguments,animate,2));},getLeft:function(local){return!local?this.getX():parseInt(this.getStyle(LEFT),10)||0;},getRight:function(local){var me=this;return!local?me.getX()+me.getWidth():(me.getLeft(true)+me.getWidth())||0;},getTop:function(local){return!local?this.getY():parseInt(this.getStyle(TOP),10)||0;},getBottom:function(local){var me=this;return!local?me.getY()+me.getHeight():(me.getTop(true)+me.getHeight())||0;},position:function(pos,zIndex,x,y){var me=this;if(!pos&&me.isStyle(POSITION,STATIC)){me.setStyle(POSITION,RELATIVE);}else if(pos){me.setStyle(POSITION,pos);} +if(zIndex){me.setStyle(ZINDEX,zIndex);} +if(x||y)me.setXY([x||false,y||false]);},clearPositioning:function(value){value=value||'';this.setStyle({left:value,right:value,top:value,bottom:value,"z-index":"",position:STATIC});return this;},getPositioning:function(){var l=this.getStyle(LEFT);var t=this.getStyle(TOP);return{"position":this.getStyle(POSITION),"left":l,"right":l?"":this.getStyle(RIGHT),"top":t,"bottom":t?"":this.getStyle(BOTTOM),"z-index":this.getStyle(ZINDEX)};},setPositioning:function(pc){var me=this,style=me.dom.style;me.setStyle(pc);if(pc.right==AUTO){style.right="";} +if(pc.bottom==AUTO){style.bottom="";} +return me;},translatePoints:function(x,y){y=isNaN(x[1])?y:x[1];x=isNaN(x[0])?x:x[0];var me=this,relative=me.isStyle(POSITION,RELATIVE),o=me.getXY(),l=parseInt(me.getStyle(LEFT),10),t=parseInt(me.getStyle(TOP),10);l=!isNaN(l)?l:(relative?0:me.dom.offsetLeft);t=!isNaN(t)?t:(relative?0:me.dom.offsetTop);return{left:(x-o[0]+l),top:(y-o[1]+t)};},animTest:function(args,animate,i){return!!animate&&this.preanim?this.preanim(args,i):false;}});})();Ext.Element.addMethods({isScrollable:function(){var dom=this.dom;return dom.scrollHeight>dom.clientHeight||dom.scrollWidth>dom.clientWidth;},scrollTo:function(side,value){this.dom["scroll"+(/top/i.test(side)?"Top":"Left")]=value;return this;},getScroll:function(){var d=this.dom,doc=document,body=doc.body,docElement=doc.documentElement,l,t,ret;if(d==doc||d==body){if(Ext.isIE&&Ext.isStrict){l=docElement.scrollLeft;t=docElement.scrollTop;}else{l=window.pageXOffset;t=window.pageYOffset;} +ret={left:l||(body?body.scrollLeft:0),top:t||(body?body.scrollTop:0)};}else{ret={left:d.scrollLeft,top:d.scrollTop};} +return ret;}});Ext.Element.VISIBILITY=1;Ext.Element.DISPLAY=2;Ext.Element.OFFSETS=3;Ext.Element.ASCLASS=4;Ext.Element.visibilityCls='x-hide-nosize';Ext.Element.addMethods(function(){var El=Ext.Element,OPACITY="opacity",VISIBILITY="visibility",DISPLAY="display",HIDDEN="hidden",OFFSETS="offsets",ASCLASS="asclass",NONE="none",NOSIZE='nosize',ORIGINALDISPLAY='originalDisplay',VISMODE='visibilityMode',ISVISIBLE='isVisible',data=El.data,getDisplay=function(dom){var d=data(dom,ORIGINALDISPLAY);if(d===undefined){data(dom,ORIGINALDISPLAY,d='');} +return d;},getVisMode=function(dom){var m=data(dom,VISMODE);if(m===undefined){data(dom,VISMODE,m=1);} +return m;};return{originalDisplay:"",visibilityMode:1,setVisibilityMode:function(visMode){data(this.dom,VISMODE,visMode);return this;},animate:function(args,duration,onComplete,easing,animType){this.anim(args,{duration:duration,callback:onComplete,easing:easing},animType);return this;},anim:function(args,opt,animType,defaultDur,defaultEase,cb){animType=animType||'run';opt=opt||{};var me=this,anim=Ext.lib.Anim[animType](me.dom,args,(opt.duration||defaultDur)||.35,(opt.easing||defaultEase)||'easeOut',function(){if(cb)cb.call(me);if(opt.callback)opt.callback.call(opt.scope||me,me,opt);},me);opt.anim=anim;return anim;},preanim:function(a,i){return!a[i]?false:(typeof a[i]=='object'?a[i]:{duration:a[i+1],callback:a[i+2],easing:a[i+3]});},isVisible:function(){var me=this,dom=me.dom,visible=data(dom,ISVISIBLE);if(typeof visible=='boolean'){return visible;} +visible=!me.isStyle(VISIBILITY,HIDDEN)&&!me.isStyle(DISPLAY,NONE)&&!((getVisMode(dom)==El.ASCLASS)&&me.hasClass(me.visibilityCls||El.visibilityCls));data(dom,ISVISIBLE,visible);return visible;},setVisible:function(visible,animate){var me=this,isDisplay,isVisibility,isOffsets,isNosize,dom=me.dom,visMode=getVisMode(dom);if(typeof animate=='string'){switch(animate){case DISPLAY:visMode=El.DISPLAY;break;case VISIBILITY:visMode=El.VISIBILITY;break;case OFFSETS:visMode=El.OFFSETS;break;case NOSIZE:case ASCLASS:visMode=El.ASCLASS;break;} +me.setVisibilityMode(visMode);animate=false;} +if(!animate||!me.anim){if(visMode==El.ASCLASS){me[visible?'removeClass':'addClass'](me.visibilityCls||El.visibilityCls);}else if(visMode==El.DISPLAY){return me.setDisplayed(visible);}else if(visMode==El.OFFSETS){if(!visible){me.hideModeStyles={position:me.getStyle('position'),top:me.getStyle('top'),left:me.getStyle('left')};me.applyStyles({position:'absolute',top:'-10000px',left:'-10000px'});}else{me.applyStyles(me.hideModeStyles||{position:'',top:'',left:''});delete me.hideModeStyles;}}else{me.fixDisplay();dom.style.visibility=visible?"visible":HIDDEN;}}else{if(visible){me.setOpacity(.01);me.setVisible(true);} +me.anim({opacity:{to:(visible?1:0)}},me.preanim(arguments,1),null,.35,'easeIn',function(){visible||me.setVisible(false).setOpacity(1);});} +data(dom,ISVISIBLE,visible);return me;},hasMetrics:function(){var dom=this.dom;return this.isVisible()||(getVisMode(dom)==El.VISIBILITY);},toggle:function(animate){var me=this;me.setVisible(!me.isVisible(),me.preanim(arguments,0));return me;},setDisplayed:function(value){if(typeof value=="boolean"){value=value?getDisplay(this.dom):NONE;} +this.setStyle(DISPLAY,value);return this;},fixDisplay:function(){var me=this;if(me.isStyle(DISPLAY,NONE)){me.setStyle(VISIBILITY,HIDDEN);me.setStyle(DISPLAY,getDisplay(this.dom));if(me.isStyle(DISPLAY,NONE)){me.setStyle(DISPLAY,"block");}}},hide:function(animate){if(typeof animate=='string'){this.setVisible(false,animate);return this;} +this.setVisible(false,this.preanim(arguments,0));return this;},show:function(animate){if(typeof animate=='string'){this.setVisible(true,animate);return this;} +this.setVisible(true,this.preanim(arguments,0));return this;}};}());(function(){var NULL=null,UNDEFINED=undefined,TRUE=true,FALSE=false,SETX="setX",SETY="setY",SETXY="setXY",LEFT="left",BOTTOM="bottom",TOP="top",RIGHT="right",HEIGHT="height",WIDTH="width",POINTS="points",HIDDEN="hidden",ABSOLUTE="absolute",VISIBLE="visible",MOTION="motion",POSITION="position",EASEOUT="easeOut",flyEl=new Ext.Element.Flyweight(),queues={},getObject=function(o){return o||{};},fly=function(dom){flyEl.dom=dom;flyEl.id=Ext.id(dom);return flyEl;},getQueue=function(id){if(!queues[id]){queues[id]=[];} +return queues[id];},setQueue=function(id,value){queues[id]=value;};Ext.enableFx=TRUE;Ext.Fx={switchStatements:function(key,fn,argHash){return fn.apply(this,argHash[key]);},slideIn:function(anchor,o){o=getObject(o);var me=this,dom=me.dom,st=dom.style,xy,r,b,wrap,after,st,args,pt,bw,bh;anchor=anchor||"t";me.queueFx(o,function(){xy=fly(dom).getXY();fly(dom).fixDisplay();r=fly(dom).getFxRestore();b={x:xy[0],y:xy[1],0:xy[0],1:xy[1],width:dom.offsetWidth,height:dom.offsetHeight};b.right=b.x+b.width;b.bottom=b.y+b.height;fly(dom).setWidth(b.width).setHeight(b.height);wrap=fly(dom).fxWrap(r.pos,o,HIDDEN);st.visibility=VISIBLE;st.position=ABSOLUTE;function after(){fly(dom).fxUnwrap(wrap,r.pos,o);st.width=r.width;st.height=r.height;fly(dom).afterFx(o);} +pt={to:[b.x,b.y]};bw={to:b.width};bh={to:b.height};function argCalc(wrap,style,ww,wh,sXY,sXYval,s1,s2,w,h,p){var ret={};fly(wrap).setWidth(ww).setHeight(wh);if(fly(wrap)[sXY]){fly(wrap)[sXY](sXYval);} +style[s1]=style[s2]="0";if(w){ret.width=w;} +if(h){ret.height=h;} +if(p){ret.points=p;} +return ret;};args=fly(dom).switchStatements(anchor.toLowerCase(),argCalc,{t:[wrap,st,b.width,0,NULL,NULL,LEFT,BOTTOM,NULL,bh,NULL],l:[wrap,st,0,b.height,NULL,NULL,RIGHT,TOP,bw,NULL,NULL],r:[wrap,st,b.width,b.height,SETX,b.right,LEFT,TOP,NULL,NULL,pt],b:[wrap,st,b.width,b.height,SETY,b.bottom,LEFT,TOP,NULL,bh,pt],tl:[wrap,st,0,0,NULL,NULL,RIGHT,BOTTOM,bw,bh,pt],bl:[wrap,st,0,0,SETY,b.y+b.height,RIGHT,TOP,bw,bh,pt],br:[wrap,st,0,0,SETXY,[b.right,b.bottom],LEFT,TOP,bw,bh,pt],tr:[wrap,st,0,0,SETX,b.x+b.width,LEFT,BOTTOM,bw,bh,pt]});st.visibility=VISIBLE;fly(wrap).show();arguments.callee.anim=fly(wrap).fxanim(args,o,MOTION,.5,EASEOUT,after);});return me;},slideOut:function(anchor,o){o=getObject(o);var me=this,dom=me.dom,st=dom.style,xy=me.getXY(),wrap,r,b,a,zero={to:0};anchor=anchor||"t";me.queueFx(o,function(){r=fly(dom).getFxRestore();b={x:xy[0],y:xy[1],0:xy[0],1:xy[1],width:dom.offsetWidth,height:dom.offsetHeight};b.right=b.x+b.width;b.bottom=b.y+b.height;fly(dom).setWidth(b.width).setHeight(b.height);wrap=fly(dom).fxWrap(r.pos,o,VISIBLE);st.visibility=VISIBLE;st.position=ABSOLUTE;fly(wrap).setWidth(b.width).setHeight(b.height);function after(){o.useDisplay?fly(dom).setDisplayed(FALSE):fly(dom).hide();fly(dom).fxUnwrap(wrap,r.pos,o);st.width=r.width;st.height=r.height;fly(dom).afterFx(o);} +function argCalc(style,s1,s2,p1,v1,p2,v2,p3,v3){var ret={};style[s1]=style[s2]="0";ret[p1]=v1;if(p2){ret[p2]=v2;} +if(p3){ret[p3]=v3;} +return ret;};a=fly(dom).switchStatements(anchor.toLowerCase(),argCalc,{t:[st,LEFT,BOTTOM,HEIGHT,zero],l:[st,RIGHT,TOP,WIDTH,zero],r:[st,LEFT,TOP,WIDTH,zero,POINTS,{to:[b.right,b.y]}],b:[st,LEFT,TOP,HEIGHT,zero,POINTS,{to:[b.x,b.bottom]}],tl:[st,RIGHT,BOTTOM,WIDTH,zero,HEIGHT,zero],bl:[st,RIGHT,TOP,WIDTH,zero,HEIGHT,zero,POINTS,{to:[b.x,b.bottom]}],br:[st,LEFT,TOP,WIDTH,zero,HEIGHT,zero,POINTS,{to:[b.x+b.width,b.bottom]}],tr:[st,LEFT,BOTTOM,WIDTH,zero,HEIGHT,zero,POINTS,{to:[b.right,b.y]}]});arguments.callee.anim=fly(wrap).fxanim(a,o,MOTION,.5,EASEOUT,after);});return me;},puff:function(o){o=getObject(o);var me=this,dom=me.dom,st=dom.style,width,height,r;me.queueFx(o,function(){width=fly(dom).getWidth();height=fly(dom).getHeight();fly(dom).clearOpacity();fly(dom).show();r=fly(dom).getFxRestore();function after(){o.useDisplay?fly(dom).setDisplayed(FALSE):fly(dom).hide();fly(dom).clearOpacity();fly(dom).setPositioning(r.pos);st.width=r.width;st.height=r.height;st.fontSize='';fly(dom).afterFx(o);} +arguments.callee.anim=fly(dom).fxanim({width:{to:fly(dom).adjustWidth(width*2)},height:{to:fly(dom).adjustHeight(height*2)},points:{by:[-width*.5,-height*.5]},opacity:{to:0},fontSize:{to:200,unit:"%"}},o,MOTION,.5,EASEOUT,after);});return me;},switchOff:function(o){o=getObject(o);var me=this,dom=me.dom,st=dom.style,r;me.queueFx(o,function(){fly(dom).clearOpacity();fly(dom).clip();r=fly(dom).getFxRestore();function after(){o.useDisplay?fly(dom).setDisplayed(FALSE):fly(dom).hide();fly(dom).clearOpacity();fly(dom).setPositioning(r.pos);st.width=r.width;st.height=r.height;fly(dom).afterFx(o);};fly(dom).fxanim({opacity:{to:0.3}},NULL,NULL,.1,NULL,function(){fly(dom).clearOpacity();(function(){fly(dom).fxanim({height:{to:1},points:{by:[0,fly(dom).getHeight()*.5]}},o,MOTION,0.3,'easeIn',after);}).defer(100);});});return me;},highlight:function(color,o){o=getObject(o);var me=this,dom=me.dom,attr=o.attr||"backgroundColor",a={},restore;me.queueFx(o,function(){fly(dom).clearOpacity();fly(dom).show();function after(){dom.style[attr]=restore;fly(dom).afterFx(o);} +restore=dom.style[attr];a[attr]={from:color||"ffff9c",to:o.endColor||fly(dom).getColor(attr)||"ffffff"};arguments.callee.anim=fly(dom).fxanim(a,o,'color',1,'easeIn',after);});return me;},frame:function(color,count,o){o=getObject(o);var me=this,dom=me.dom,proxy,active;me.queueFx(o,function(){color=color||'#C3DAF9';if(color.length==6){color='#'+color;} +count=count||1;fly(dom).show();var xy=fly(dom).getXY(),b={x:xy[0],y:xy[1],0:xy[0],1:xy[1],width:dom.offsetWidth,height:dom.offsetHeight},queue=function(){proxy=fly(document.body||document.documentElement).createChild({style:{position:ABSOLUTE,'z-index':35000,border:'0px solid '+color}});return proxy.queueFx({},animFn);};arguments.callee.anim={isAnimated:true,stop:function(){count=0;proxy.stopFx();}};function animFn(){var scale=Ext.isBorderBox?2:1;active=proxy.anim({top:{from:b.y,to:b.y-20},left:{from:b.x,to:b.x-20},borderWidth:{from:0,to:10},opacity:{from:1,to:0},height:{from:b.height,to:b.height+20*scale},width:{from:b.width,to:b.width+20*scale}},{duration:o.duration||1,callback:function(){proxy.remove();--count>0?queue():fly(dom).afterFx(o);}});arguments.callee.anim={isAnimated:true,stop:function(){active.stop();}};};queue();});return me;},pause:function(seconds){var dom=this.dom,t;this.queueFx({},function(){t=setTimeout(function(){fly(dom).afterFx({});},seconds*1000);arguments.callee.anim={isAnimated:true,stop:function(){clearTimeout(t);fly(dom).afterFx({});}};});return this;},fadeIn:function(o){o=getObject(o);var me=this,dom=me.dom,to=o.endOpacity||1;me.queueFx(o,function(){fly(dom).setOpacity(0);fly(dom).fixDisplay();dom.style.visibility=VISIBLE;arguments.callee.anim=fly(dom).fxanim({opacity:{to:to}},o,NULL,.5,EASEOUT,function(){if(to==1){fly(dom).clearOpacity();} +fly(dom).afterFx(o);});});return me;},fadeOut:function(o){o=getObject(o);var me=this,dom=me.dom,style=dom.style,to=o.endOpacity||0;me.queueFx(o,function(){arguments.callee.anim=fly(dom).fxanim({opacity:{to:to}},o,NULL,.5,EASEOUT,function(){if(to==0){Ext.Element.data(dom,'visibilityMode')==Ext.Element.DISPLAY||o.useDisplay?style.display="none":style.visibility=HIDDEN;fly(dom).clearOpacity();} +fly(dom).afterFx(o);});});return me;},scale:function(w,h,o){this.shift(Ext.apply({},o,{width:w,height:h}));return this;},shift:function(o){o=getObject(o);var dom=this.dom,a={};this.queueFx(o,function(){for(var prop in o){if(o[prop]!=UNDEFINED){a[prop]={to:o[prop]};}} +a.width?a.width.to=fly(dom).adjustWidth(o.width):a;a.height?a.height.to=fly(dom).adjustWidth(o.height):a;if(a.x||a.y||a.xy){a.points=a.xy||{to:[a.x?a.x.to:fly(dom).getX(),a.y?a.y.to:fly(dom).getY()]};} +arguments.callee.anim=fly(dom).fxanim(a,o,MOTION,.35,EASEOUT,function(){fly(dom).afterFx(o);});});return this;},ghost:function(anchor,o){o=getObject(o);var me=this,dom=me.dom,st=dom.style,a={opacity:{to:0},points:{}},pt=a.points,r,w,h;anchor=anchor||"b";me.queueFx(o,function(){r=fly(dom).getFxRestore();w=fly(dom).getWidth();h=fly(dom).getHeight();function after(){o.useDisplay?fly(dom).setDisplayed(FALSE):fly(dom).hide();fly(dom).clearOpacity();fly(dom).setPositioning(r.pos);st.width=r.width;st.height=r.height;fly(dom).afterFx(o);} +pt.by=fly(dom).switchStatements(anchor.toLowerCase(),function(v1,v2){return[v1,v2];},{t:[0,-h],l:[-w,0],r:[w,0],b:[0,h],tl:[-w,-h],bl:[-w,h],br:[w,h],tr:[w,-h]});arguments.callee.anim=fly(dom).fxanim(a,o,MOTION,.5,EASEOUT,after);});return me;},syncFx:function(){var me=this;me.fxDefaults=Ext.apply(me.fxDefaults||{},{block:FALSE,concurrent:TRUE,stopFx:FALSE});return me;},sequenceFx:function(){var me=this;me.fxDefaults=Ext.apply(me.fxDefaults||{},{block:FALSE,concurrent:FALSE,stopFx:FALSE});return me;},nextFx:function(){var ef=getQueue(this.dom.id)[0];if(ef){ef.call(this);}},hasActiveFx:function(){return getQueue(this.dom.id)[0];},stopFx:function(finish){var me=this,id=me.dom.id;if(me.hasActiveFx()){var cur=getQueue(id)[0];if(cur&&cur.anim){if(cur.anim.isAnimated){setQueue(id,[cur]);cur.anim.stop(finish!==undefined?finish:TRUE);}else{setQueue(id,[]);}}} +return me;},beforeFx:function(o){if(this.hasActiveFx()&&!o.concurrent){if(o.stopFx){this.stopFx();return TRUE;} +return FALSE;} +return TRUE;},hasFxBlock:function(){var q=getQueue(this.dom.id);return q&&q[0]&&q[0].block;},queueFx:function(o,fn){var me=fly(this.dom);if(!me.hasFxBlock()){Ext.applyIf(o,me.fxDefaults);if(!o.concurrent){var run=me.beforeFx(o);fn.block=o.block;getQueue(me.dom.id).push(fn);if(run){me.nextFx();}}else{fn.call(me);}} +return me;},fxWrap:function(pos,o,vis){var dom=this.dom,wrap,wrapXY;if(!o.wrap||!(wrap=Ext.getDom(o.wrap))){if(o.fixPosition){wrapXY=fly(dom).getXY();} +var div=document.createElement("div");div.style.visibility=vis;wrap=dom.parentNode.insertBefore(div,dom);fly(wrap).setPositioning(pos);if(fly(wrap).isStyle(POSITION,"static")){fly(wrap).position("relative");} +fly(dom).clearPositioning('auto');fly(wrap).clip();wrap.appendChild(dom);if(wrapXY){fly(wrap).setXY(wrapXY);}} +return wrap;},fxUnwrap:function(wrap,pos,o){var dom=this.dom;fly(dom).clearPositioning();fly(dom).setPositioning(pos);if(!o.wrap){var pn=fly(wrap).dom.parentNode;pn.insertBefore(dom,wrap);fly(wrap).remove();}},getFxRestore:function(){var st=this.dom.style;return{pos:this.getPositioning(),width:st.width,height:st.height};},afterFx:function(o){var dom=this.dom,id=dom.id;if(o.afterStyle){fly(dom).setStyle(o.afterStyle);} +if(o.afterCls){fly(dom).addClass(o.afterCls);} +if(o.remove==TRUE){fly(dom).remove();} +if(o.callback){o.callback.call(o.scope,fly(dom));} +if(!o.concurrent){getQueue(id).shift();fly(dom).nextFx();}},fxanim:function(args,opt,animType,defaultDur,defaultEase,cb){animType=animType||'run';opt=opt||{};var anim=Ext.lib.Anim[animType](this.dom,args,(opt.duration||defaultDur)||.35,(opt.easing||defaultEase)||EASEOUT,cb,this);opt.anim=anim;return anim;}};Ext.Fx.resize=Ext.Fx.scale;Ext.Element.addMethods(Ext.Fx);})();Ext.CompositeElementLite=function(els,root){this.elements=[];this.add(els,root);this.el=new Ext.Element.Flyweight();};Ext.CompositeElementLite.prototype={isComposite:true,getElement:function(el){var e=this.el;e.dom=el;e.id=el.id;return e;},transformElement:function(el){return Ext.getDom(el);},getCount:function(){return this.elements.length;},add:function(els,root){var me=this,elements=me.elements;if(!els){return this;} +if(typeof els=="string"){els=Ext.Element.selectorFunction(els,root);}else if(els.isComposite){els=els.elements;}else if(!Ext.isIterable(els)){els=[els];} +for(var i=0,len=els.length;i<len;++i){elements.push(me.transformElement(els[i]));} +return me;},invoke:function(fn,args){var me=this,els=me.elements,len=els.length,e,i;for(i=0;i<len;i++){e=els[i];if(e){Ext.Element.prototype[fn].apply(me.getElement(e),args);}} +return me;},item:function(index){var me=this,el=me.elements[index],out=null;if(el){out=me.getElement(el);} +return out;},addListener:function(eventName,handler,scope,opt){var els=this.elements,len=els.length,i,e;for(i=0;i<len;i++){e=els[i];if(e){Ext.EventManager.on(e,eventName,handler,scope||e,opt);}} +return this;},each:function(fn,scope){var me=this,els=me.elements,len=els.length,i,e;for(i=0;i<len;i++){e=els[i];if(e){e=this.getElement(e);if(fn.call(scope||e,e,me,i)===false){break;}}} +return me;},fill:function(els){var me=this;me.elements=[];me.add(els);return me;},filter:function(selector){var els=[],me=this,fn=Ext.isFunction(selector)?selector:function(el){return el.is(selector);};me.each(function(el,self,i){if(fn(el,i)!==false){els[els.length]=me.transformElement(el);}});me.elements=els;return me;},indexOf:function(el){return this.elements.indexOf(this.transformElement(el));},replaceElement:function(el,replacement,domReplace){var index=!isNaN(el)?el:this.indexOf(el),d;if(index>-1){replacement=Ext.getDom(replacement);if(domReplace){d=this.elements[index];d.parentNode.insertBefore(replacement,d);Ext.removeNode(d);} +this.elements.splice(index,1,replacement);} +return this;},clear:function(){this.elements=[];}};Ext.CompositeElementLite.prototype.on=Ext.CompositeElementLite.prototype.addListener;Ext.CompositeElementLite.importElementMethods=function(){var fnName,ElProto=Ext.Element.prototype,CelProto=Ext.CompositeElementLite.prototype;for(fnName in ElProto){if(typeof ElProto[fnName]=='function'){(function(fnName){CelProto[fnName]=CelProto[fnName]||function(){return this.invoke(fnName,arguments);};}).call(CelProto,fnName);}}};Ext.CompositeElementLite.importElementMethods();if(Ext.DomQuery){Ext.Element.selectorFunction=Ext.DomQuery.select;} +Ext.Element.select=function(selector,root){var els;if(typeof selector=="string"){els=Ext.Element.selectorFunction(selector,root);}else if(selector.length!==undefined){els=selector;}else{throw"Invalid selector";} +return new Ext.CompositeElementLite(els);};Ext.select=Ext.Element.select;(function(){var BEFOREREQUEST="beforerequest",REQUESTCOMPLETE="requestcomplete",REQUESTEXCEPTION="requestexception",UNDEFINED=undefined,LOAD='load',POST='POST',GET='GET',WINDOW=window;Ext.data.Connection=function(config){Ext.apply(this,config);this.addEvents(BEFOREREQUEST,REQUESTCOMPLETE,REQUESTEXCEPTION);Ext.data.Connection.superclass.constructor.call(this);};Ext.extend(Ext.data.Connection,Ext.util.Observable,{timeout:30000,autoAbort:false,disableCaching:true,disableCachingParam:'_dc',request:function(o){var me=this;if(me.fireEvent(BEFOREREQUEST,me,o)){if(o.el){if(!Ext.isEmpty(o.indicatorText)){me.indicatorText='<div class="loading-indicator">'+o.indicatorText+"</div>";} +if(me.indicatorText){Ext.getDom(o.el).innerHTML=me.indicatorText;} +o.success=(Ext.isFunction(o.success)?o.success:function(){}).createInterceptor(function(response){Ext.getDom(o.el).innerHTML=response.responseText;});} +var p=o.params,url=o.url||me.url,method,cb={success:me.handleResponse,failure:me.handleFailure,scope:me,argument:{options:o},timeout:Ext.num(o.timeout,me.timeout)},form,serForm;if(Ext.isFunction(p)){p=p.call(o.scope||WINDOW,o);} +p=Ext.urlEncode(me.extraParams,Ext.isObject(p)?Ext.urlEncode(p):p);if(Ext.isFunction(url)){url=url.call(o.scope||WINDOW,o);} +if((form=Ext.getDom(o.form))){url=url||form.action;if(o.isUpload||(/multipart\/form-data/i.test(form.getAttribute("enctype")))){return me.doFormUpload.call(me,o,p,url);} +serForm=Ext.lib.Ajax.serializeForm(form);p=p?(p+'&'+serForm):serForm;} +method=o.method||me.method||((p||o.xmlData||o.jsonData)?POST:GET);if(method===GET&&(me.disableCaching&&o.disableCaching!==false)||o.disableCaching===true){var dcp=o.disableCachingParam||me.disableCachingParam;url=Ext.urlAppend(url,dcp+'='+(new Date().getTime()));} +o.headers=Ext.apply(o.headers||{},me.defaultHeaders||{});if(o.autoAbort===true||me.autoAbort){me.abort();} +if((method==GET||o.xmlData||o.jsonData)&&p){url=Ext.urlAppend(url,p);p='';} +return(me.transId=Ext.lib.Ajax.request(method,url,cb,p,o));}else{return o.callback?o.callback.apply(o.scope,[o,UNDEFINED,UNDEFINED]):null;}},isLoading:function(transId){return transId?Ext.lib.Ajax.isCallInProgress(transId):!!this.transId;},abort:function(transId){if(transId||this.isLoading()){Ext.lib.Ajax.abort(transId||this.transId);}},handleResponse:function(response){this.transId=false;var options=response.argument.options;response.argument=options?options.argument:null;this.fireEvent(REQUESTCOMPLETE,this,response,options);if(options.success){options.success.call(options.scope,response,options);} +if(options.callback){options.callback.call(options.scope,options,true,response);}},handleFailure:function(response,e){this.transId=false;var options=response.argument.options;response.argument=options?options.argument:null;this.fireEvent(REQUESTEXCEPTION,this,response,options,e);if(options.failure){options.failure.call(options.scope,response,options);} +if(options.callback){options.callback.call(options.scope,options,false,response);}},doFormUpload:function(o,ps,url){var id=Ext.id(),doc=document,frame=doc.createElement('iframe'),form=Ext.getDom(o.form),hiddens=[],hd,encoding='multipart/form-data',buf={target:form.target,method:form.method,encoding:form.encoding,enctype:form.enctype,action:form.action};Ext.fly(frame).set({id:id,name:id,cls:'x-hidden',src:Ext.SSL_SECURE_URL});doc.body.appendChild(frame);if(Ext.isIE){document.frames[id].name=id;} +Ext.fly(form).set({target:id,method:POST,enctype:encoding,encoding:encoding,action:url||buf.action});Ext.iterate(Ext.urlDecode(ps,false),function(k,v){hd=doc.createElement('input');Ext.fly(hd).set({type:'hidden',value:v,name:k});form.appendChild(hd);hiddens.push(hd);});function cb(){var me=this,r={responseText:'',responseXML:null,argument:o.argument},doc,firstChild;try{doc=frame.contentWindow.document||frame.contentDocument||WINDOW.frames[id].document;if(doc){if(doc.body){if(/textarea/i.test((firstChild=doc.body.firstChild||{}).tagName)){r.responseText=firstChild.value;}else{r.responseText=doc.body.innerHTML;}} +r.responseXML=doc.XMLDocument||doc;}} +catch(e){} +Ext.EventManager.removeListener(frame,LOAD,cb,me);me.fireEvent(REQUESTCOMPLETE,me,r,o);function runCallback(fn,scope,args){if(Ext.isFunction(fn)){fn.apply(scope,args);}} +runCallback(o.success,o.scope,[r,o]);runCallback(o.callback,o.scope,[o,true,r]);if(!me.debugUploads){setTimeout(function(){Ext.removeNode(frame);},100);}} +Ext.EventManager.on(frame,LOAD,cb,this);form.submit();Ext.fly(form).set(buf);Ext.each(hiddens,function(h){Ext.removeNode(h);});}});})();Ext.Ajax=new Ext.data.Connection({autoAbort:false,serializeForm:function(form){return Ext.lib.Ajax.serializeForm(form);}});Ext.util.JSON=new(function(){var useHasOwn=!!{}.hasOwnProperty,isNative=function(){var useNative=null;return function(){if(useNative===null){useNative=Ext.USE_NATIVE_JSON&&window.JSON&&JSON.toString()=='[object JSON]';} +return useNative;};}(),pad=function(n){return n<10?"0"+n:n;},doDecode=function(json){return eval("("+json+")");},doEncode=function(o){if(!Ext.isDefined(o)||o===null){return"null";}else if(Ext.isArray(o)){return encodeArray(o);}else if(Ext.isDate(o)){return Ext.util.JSON.encodeDate(o);}else if(Ext.isString(o)){return encodeString(o);}else if(typeof o=="number"){return isFinite(o)?String(o):"null";}else if(Ext.isBoolean(o)){return String(o);}else{var a=["{"],b,i,v;for(i in o){if(!o.getElementsByTagName){if(!useHasOwn||o.hasOwnProperty(i)){v=o[i];switch(typeof v){case"undefined":case"function":case"unknown":break;default:if(b){a.push(',');} +a.push(doEncode(i),":",v===null?"null":doEncode(v));b=true;}}}} +a.push("}");return a.join("");}},m={"\b":'\\b',"\t":'\\t',"\n":'\\n',"\f":'\\f',"\r":'\\r','"':'\\"',"\\":'\\\\'},encodeString=function(s){if(/["\\\x00-\x1f]/.test(s)){return'"'+s.replace(/([\x00-\x1f\\"])/g,function(a,b){var c=m[b];if(c){return c;} +c=b.charCodeAt();return"\\u00"+ +Math.floor(c/16).toString(16)+ +(c%16).toString(16);})+'"';} +return'"'+s+'"';},encodeArray=function(o){var a=["["],b,i,l=o.length,v;for(i=0;i<l;i+=1){v=o[i];switch(typeof v){case"undefined":case"function":case"unknown":break;default:if(b){a.push(',');} +a.push(v===null?"null":Ext.util.JSON.encode(v));b=true;}} +a.push("]");return a.join("");};this.encodeDate=function(o){return'"'+o.getFullYear()+"-"+ +pad(o.getMonth()+1)+"-"+ +pad(o.getDate())+"T"+ +pad(o.getHours())+":"+ +pad(o.getMinutes())+":"+ +pad(o.getSeconds())+'"';};this.encode=function(){var ec;return function(o){if(!ec){ec=isNative()?JSON.stringify:doEncode;} +return ec(o);};}();this.decode=function(){var dc;return function(json){if(!dc){dc=isNative()?JSON.parse:doDecode;} +return dc(json);};}();})();Ext.encode=Ext.util.JSON.encode;Ext.decode=Ext.util.JSON.decode;Ext.EventManager=function(){var docReadyEvent,docReadyProcId,docReadyState=false,DETECT_NATIVE=Ext.isGecko||Ext.isWebKit||Ext.isSafari,E=Ext.lib.Event,D=Ext.lib.Dom,DOC=document,WINDOW=window,DOMCONTENTLOADED="DOMContentLoaded",COMPLETE='complete',propRe=/^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/,specialElCache=[];function getId(el){var id=false,i=0,len=specialElCache.length,skip=false,o;if(el){if(el.getElementById||el.navigator){for(;i<len;++i){o=specialElCache[i];if(o.el===el){id=o.id;break;}} +if(!id){id=Ext.id(el);specialElCache.push({id:id,el:el});skip=true;}}else{id=Ext.id(el);} +if(!Ext.elCache[id]){Ext.Element.addToCache(new Ext.Element(el),id);if(skip){Ext.elCache[id].skipGC=true;}}} +return id;} +function addListener(el,ename,fn,task,wrap,scope){el=Ext.getDom(el);var id=getId(el),es=Ext.elCache[id].events,wfn;wfn=E.on(el,ename,wrap);es[ename]=es[ename]||[];es[ename].push([fn,wrap,scope,wfn,task]);if(el.addEventListener&&ename=="mousewheel"){var args=["DOMMouseScroll",wrap,false];el.addEventListener.apply(el,args);Ext.EventManager.addListener(WINDOW,'unload',function(){el.removeEventListener.apply(el,args);});} +if(el==DOC&&ename=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.addListener(wrap);}} +function doScrollChk(){if(window!=top){return false;} +try{DOC.documentElement.doScroll('left');}catch(e){return false;} +fireDocReady();return true;} +function checkReadyState(e){if(Ext.isIE&&doScrollChk()){return true;} +if(DOC.readyState==COMPLETE){fireDocReady();return true;} +docReadyState||(docReadyProcId=setTimeout(arguments.callee,2));return false;} +var styles;function checkStyleSheets(e){styles||(styles=Ext.query('style, link[rel=stylesheet]'));if(styles.length==DOC.styleSheets.length){fireDocReady();return true;} +docReadyState||(docReadyProcId=setTimeout(arguments.callee,2));return false;} +function OperaDOMContentLoaded(e){DOC.removeEventListener(DOMCONTENTLOADED,arguments.callee,false);checkStyleSheets();} +function fireDocReady(e){if(!docReadyState){docReadyState=true;if(docReadyProcId){clearTimeout(docReadyProcId);} +if(DETECT_NATIVE){DOC.removeEventListener(DOMCONTENTLOADED,fireDocReady,false);} +if(Ext.isIE&&checkReadyState.bindIE){DOC.detachEvent('onreadystatechange',checkReadyState);} +E.un(WINDOW,"load",arguments.callee);} +if(docReadyEvent&&!Ext.isReady){Ext.isReady=true;docReadyEvent.fire();docReadyEvent.listeners=[];}} +function initDocReady(){docReadyEvent||(docReadyEvent=new Ext.util.Event());if(DETECT_NATIVE){DOC.addEventListener(DOMCONTENTLOADED,fireDocReady,false);} +if(Ext.isIE){if(!checkReadyState()){checkReadyState.bindIE=true;DOC.attachEvent('onreadystatechange',checkReadyState);}}else if(Ext.isOpera){(DOC.readyState==COMPLETE&&checkStyleSheets())||DOC.addEventListener(DOMCONTENTLOADED,OperaDOMContentLoaded,false);}else if(Ext.isWebKit){checkReadyState();} +E.on(WINDOW,"load",fireDocReady);} +function createTargeted(h,o){return function(){var args=Ext.toArray(arguments);if(o.target==Ext.EventObject.setEvent(args[0]).target){h.apply(this,args);}};} +function createBuffered(h,o,task){return function(e){task.delay(o.buffer,h,null,[new Ext.EventObjectImpl(e)]);};} +function createSingle(h,el,ename,fn,scope){return function(e){Ext.EventManager.removeListener(el,ename,fn,scope);h(e);};} +function createDelayed(h,o,fn){return function(e){var task=new Ext.util.DelayedTask(h);if(!fn.tasks){fn.tasks=[];} +fn.tasks.push(task);task.delay(o.delay||10,h,null,[new Ext.EventObjectImpl(e)]);};} +function listen(element,ename,opt,fn,scope){var o=(!opt||typeof opt=="boolean")?{}:opt,el=Ext.getDom(element),task;fn=fn||o.fn;scope=scope||o.scope;if(!el){throw"Error listening for \""+ename+'\". Element "'+element+'" doesn\'t exist.';} +function h(e){if(!Ext){return;} +e=Ext.EventObject.setEvent(e);var t;if(o.delegate){if(!(t=e.getTarget(o.delegate,el))){return;}}else{t=e.target;} +if(o.stopEvent){e.stopEvent();} +if(o.preventDefault){e.preventDefault();} +if(o.stopPropagation){e.stopPropagation();} +if(o.normalized===false){e=e.browserEvent;} +fn.call(scope||el,e,t,o);} +if(o.target){h=createTargeted(h,o);} +if(o.delay){h=createDelayed(h,o,fn);} +if(o.single){h=createSingle(h,el,ename,fn,scope);} +if(o.buffer){task=new Ext.util.DelayedTask(h);h=createBuffered(h,o,task);} +addListener(el,ename,fn,task,h,scope);return h;} +var pub={addListener:function(element,eventName,fn,scope,options){if(typeof eventName=='object'){var o=eventName,e,val;for(e in o){val=o[e];if(!propRe.test(e)){if(Ext.isFunction(val)){listen(element,e,o,val,o.scope);}else{listen(element,e,val);}}}}else{listen(element,eventName,options,fn,scope);}},removeListener:function(el,eventName,fn,scope){el=Ext.getDom(el);var id=getId(el),f=el&&(Ext.elCache[id].events)[eventName]||[],wrap,i,l,k,len,fnc;for(i=0,len=f.length;i<len;i++){if(Ext.isArray(fnc=f[i])&&fnc[0]==fn&&(!scope||fnc[2]==scope)){if(fnc[4]){fnc[4].cancel();} +k=fn.tasks&&fn.tasks.length;if(k){while(k--){fn.tasks[k].cancel();} +delete fn.tasks;} +wrap=fnc[1];E.un(el,eventName,E.extAdapter?fnc[3]:wrap);if(wrap&&el.addEventListener&&eventName=="mousewheel"){el.removeEventListener("DOMMouseScroll",wrap,false);} +if(wrap&&el==DOC&&eventName=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.removeListener(wrap);} +f.splice(i,1);if(f.length===0){delete Ext.elCache[id].events[eventName];} +for(k in Ext.elCache[id].events){return false;} +Ext.elCache[id].events={};return false;}}},removeAll:function(el){el=Ext.getDom(el);var id=getId(el),ec=Ext.elCache[id]||{},es=ec.events||{},f,i,len,ename,fn,k,wrap;for(ename in es){if(es.hasOwnProperty(ename)){f=es[ename];for(i=0,len=f.length;i<len;i++){fn=f[i];if(fn[4]){fn[4].cancel();} +if(fn[0].tasks&&(k=fn[0].tasks.length)){while(k--){fn[0].tasks[k].cancel();} +delete fn.tasks;} +wrap=fn[1];E.un(el,ename,E.extAdapter?fn[3]:wrap);if(el.addEventListener&&wrap&&ename=="mousewheel"){el.removeEventListener("DOMMouseScroll",wrap,false);} +if(wrap&&el==DOC&&ename=="mousedown"){Ext.EventManager.stoppedMouseDownEvent.removeListener(wrap);}}}} +if(Ext.elCache[id]){Ext.elCache[id].events={};}},getListeners:function(el,eventName){el=Ext.getDom(el);var id=getId(el),ec=Ext.elCache[id]||{},es=ec.events||{},results=[];if(es&&es[eventName]){return es[eventName];}else{return null;}},purgeElement:function(el,recurse,eventName){el=Ext.getDom(el);var id=getId(el),ec=Ext.elCache[id]||{},es=ec.events||{},i,f,len;if(eventName){if(es&&es.hasOwnProperty(eventName)){f=es[eventName];for(i=0,len=f.length;i<len;i++){Ext.EventManager.removeListener(el,eventName,f[i][0]);}}}else{Ext.EventManager.removeAll(el);} +if(recurse&&el&&el.childNodes){for(i=0,len=el.childNodes.length;i<len;i++){Ext.EventManager.purgeElement(el.childNodes[i],recurse,eventName);}}},_unload:function(){var el;for(el in Ext.elCache){Ext.EventManager.removeAll(el);} +delete Ext.elCache;delete Ext.Element._flyweights;var c,conn,tid,ajax=Ext.lib.Ajax;(typeof ajax.conn=='object')?conn=ajax.conn:conn={};for(tid in conn){c=conn[tid];if(c){ajax.abort({conn:c,tId:tid});}}},onDocumentReady:function(fn,scope,options){if(Ext.isReady){docReadyEvent||(docReadyEvent=new Ext.util.Event());docReadyEvent.addListener(fn,scope,options);docReadyEvent.fire();docReadyEvent.listeners=[];}else{if(!docReadyEvent){initDocReady();} +options=options||{};options.delay=options.delay||1;docReadyEvent.addListener(fn,scope,options);}},fireDocReady:fireDocReady};pub.on=pub.addListener;pub.un=pub.removeListener;pub.stoppedMouseDownEvent=new Ext.util.Event();return pub;}();Ext.onReady=Ext.EventManager.onDocumentReady;(function(){var initExtCss=function(){var bd=document.body||document.getElementsByTagName('body')[0];if(!bd){return false;} +var cls=[' ',Ext.isIE?"ext-ie "+(Ext.isIE6?'ext-ie6':(Ext.isIE7?'ext-ie7':'ext-ie8')):Ext.isGecko?"ext-gecko "+(Ext.isGecko2?'ext-gecko2':'ext-gecko3'):Ext.isOpera?"ext-opera":Ext.isWebKit?"ext-webkit":""];if(Ext.isSafari){cls.push("ext-safari "+(Ext.isSafari2?'ext-safari2':(Ext.isSafari3?'ext-safari3':'ext-safari4')));}else if(Ext.isChrome){cls.push("ext-chrome");} +if(Ext.isMac){cls.push("ext-mac");} +if(Ext.isLinux){cls.push("ext-linux");} +if(Ext.isStrict||Ext.isBorderBox){var p=bd.parentNode;if(p){Ext.fly(p,'_internal').addClass(((Ext.isStrict&&Ext.isIE)||(!Ext.enableForcedBoxModel&&!Ext.isIE))?' ext-strict':' ext-border-box');}} +if(Ext.enableForcedBoxModel&&!Ext.isIE){Ext.isForcedBorderBox=true;cls.push("ext-forced-border-box");} +Ext.fly(bd,'_internal').addClass(cls);return true;};if(!initExtCss()){Ext.onReady(initExtCss);}})();(function(){var supports=Ext.apply(Ext.supports,{correctRightMargin:true,correctTransparentColor:true,cssFloat:true});var supportTests=function(){var div=document.createElement('div'),doc=document,view,last;div.innerHTML='<div style="height:30px;width:50px;"><div style="height:20px;width:20px;"></div></div><div style="float:left;background-color:transparent;">';doc.body.appendChild(div);last=div.lastChild;if((view=doc.defaultView)){if(view.getComputedStyle(div.firstChild.firstChild,null).marginRight!='0px'){supports.correctRightMargin=false;} +if(view.getComputedStyle(last,null).backgroundColor!='transparent'){supports.correctTransparentColor=false;}} +supports.cssFloat=!!last.style.cssFloat;doc.body.removeChild(div);};if(Ext.isReady){supportTests();}else{Ext.onReady(supportTests);}})();Ext.EventObject=function(){var E=Ext.lib.Event,clickRe=/(dbl)?click/,safariKeys={3:13,63234:37,63235:39,63232:38,63233:40,63276:33,63277:34,63272:46,63273:36,63275:35},btnMap=Ext.isIE?{1:0,4:1,2:2}:{0:0,1:1,2:2};Ext.EventObjectImpl=function(e){if(e){this.setEvent(e.browserEvent||e);}};Ext.EventObjectImpl.prototype={setEvent:function(e){var me=this;if(e==me||(e&&e.browserEvent)){return e;} +me.browserEvent=e;if(e){me.button=e.button?btnMap[e.button]:(e.which?e.which-1:-1);if(clickRe.test(e.type)&&me.button==-1){me.button=0;} +me.type=e.type;me.shiftKey=e.shiftKey;me.ctrlKey=e.ctrlKey||e.metaKey||false;me.altKey=e.altKey;me.keyCode=e.keyCode;me.charCode=e.charCode;me.target=E.getTarget(e);me.xy=E.getXY(e);}else{me.button=-1;me.shiftKey=false;me.ctrlKey=false;me.altKey=false;me.keyCode=0;me.charCode=0;me.target=null;me.xy=[0,0];} +return me;},stopEvent:function(){var me=this;if(me.browserEvent){if(me.browserEvent.type=='mousedown'){Ext.EventManager.stoppedMouseDownEvent.fire(me);} +E.stopEvent(me.browserEvent);}},preventDefault:function(){if(this.browserEvent){E.preventDefault(this.browserEvent);}},stopPropagation:function(){var me=this;if(me.browserEvent){if(me.browserEvent.type=='mousedown'){Ext.EventManager.stoppedMouseDownEvent.fire(me);} +E.stopPropagation(me.browserEvent);}},getCharCode:function(){return this.charCode||this.keyCode;},getKey:function(){return this.normalizeKey(this.keyCode||this.charCode);},normalizeKey:function(k){return Ext.isSafari?(safariKeys[k]||k):k;},getPageX:function(){return this.xy[0];},getPageY:function(){return this.xy[1];},getXY:function(){return this.xy;},getTarget:function(selector,maxDepth,returnEl){return selector?Ext.fly(this.target).findParent(selector,maxDepth,returnEl):(returnEl?Ext.get(this.target):this.target);},getRelatedTarget:function(){return this.browserEvent?E.getRelatedTarget(this.browserEvent):null;},getWheelDelta:function(){var e=this.browserEvent;var delta=0;if(e.wheelDelta){delta=e.wheelDelta/120;}else if(e.detail){delta=-e.detail/3;} +return delta;},within:function(el,related,allowEl){if(el){var t=this[related?"getRelatedTarget":"getTarget"]();return t&&((allowEl?(t==Ext.getDom(el)):false)||Ext.fly(el).contains(t));} +return false;}};return new Ext.EventObjectImpl();}();Ext.Loader=Ext.apply({},{load:function(fileList,callback,scope,preserveOrder){var scope=scope||this,head=document.getElementsByTagName("head")[0],fragment=document.createDocumentFragment(),numFiles=fileList.length,loadedFiles=0,me=this;var loadFileIndex=function(index){head.appendChild(me.buildScriptTag(fileList[index],onFileLoaded));};var onFileLoaded=function(){loadedFiles++;if(numFiles==loadedFiles&&typeof callback=='function'){callback.call(scope);}else{if(preserveOrder===true){loadFileIndex(loadedFiles);}}};if(preserveOrder===true){loadFileIndex.call(this,0);}else{Ext.each(fileList,function(file,index){fragment.appendChild(this.buildScriptTag(file,onFileLoaded));},this);head.appendChild(fragment);}},buildScriptTag:function(filename,callback){var script=document.createElement('script');script.type="text/javascript";script.src=filename;if(script.readyState){script.onreadystatechange=function(){if(script.readyState=="loaded"||script.readyState=="complete"){script.onreadystatechange=null;callback();}};}else{script.onload=callback;} +return script;}});Ext.ns("Ext.grid","Ext.list","Ext.dd","Ext.tree","Ext.form","Ext.menu","Ext.state","Ext.layout","Ext.app","Ext.ux","Ext.chart","Ext.direct");Ext.apply(Ext,function(){var E=Ext,idSeed=0,scrollWidth=null;return{emptyFn:function(){},BLANK_IMAGE_URL:Ext.isIE6||Ext.isIE7||Ext.isAir?'http:/'+'/www.extjs.com/s.gif':'data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==',extendX:function(supr,fn){return Ext.extend(supr,fn(supr.prototype));},getDoc:function(){return Ext.get(document);},num:function(v,defaultValue){v=Number(Ext.isEmpty(v)||Ext.isArray(v)||typeof v=='boolean'||(typeof v=='string'&&v.trim().length==0)?NaN:v);return isNaN(v)?defaultValue:v;},value:function(v,defaultValue,allowBlank){return Ext.isEmpty(v,allowBlank)?defaultValue:v;},escapeRe:function(s){return s.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");},sequence:function(o,name,fn,scope){o[name]=o[name].createSequence(fn,scope);},addBehaviors:function(o){if(!Ext.isReady){Ext.onReady(function(){Ext.addBehaviors(o);});}else{var cache={},parts,b,s;for(b in o){if((parts=b.split('@'))[1]){s=parts[0];if(!cache[s]){cache[s]=Ext.select(s);} +cache[s].on(parts[1],o[b]);}} +cache=null;}},getScrollBarWidth:function(force){if(!Ext.isReady){return 0;} +if(force===true||scrollWidth===null){var div=Ext.getBody().createChild('<div class="x-hide-offsets" style="width:100px;height:50px;overflow:hidden;"><div style="height:200px;"></div></div>'),child=div.child('div',true);var w1=child.offsetWidth;div.setStyle('overflow',(Ext.isWebKit||Ext.isGecko)?'auto':'scroll');var w2=child.offsetWidth;div.remove();scrollWidth=w1-w2+2;} +return scrollWidth;},combine:function(){var as=arguments,l=as.length,r=[];for(var i=0;i<l;i++){var a=as[i];if(Ext.isArray(a)){r=r.concat(a);}else if(a.length!==undefined&&!a.substr){r=r.concat(Array.prototype.slice.call(a,0));}else{r.push(a);}} +return r;},copyTo:function(dest,source,names){if(typeof names=='string'){names=names.split(/[,;\s]/);} +Ext.each(names,function(name){if(source.hasOwnProperty(name)){dest[name]=source[name];}},this);return dest;},destroy:function(){Ext.each(arguments,function(arg){if(arg){if(Ext.isArray(arg)){this.destroy.apply(this,arg);}else if(typeof arg.destroy=='function'){arg.destroy();}else if(arg.dom){arg.remove();}}},this);},destroyMembers:function(o,arg1,arg2,etc){for(var i=1,a=arguments,len=a.length;i<len;i++){Ext.destroy(o[a[i]]);delete o[a[i]];}},clean:function(arr){var ret=[];Ext.each(arr,function(v){if(!!v){ret.push(v);}});return ret;},unique:function(arr){var ret=[],collect={};Ext.each(arr,function(v){if(!collect[v]){ret.push(v);} +collect[v]=true;});return ret;},flatten:function(arr){var worker=[];function rFlatten(a){Ext.each(a,function(v){if(Ext.isArray(v)){rFlatten(v);}else{worker.push(v);}});return worker;} +return rFlatten(arr);},min:function(arr,comp){var ret=arr[0];comp=comp||function(a,b){return a<b?-1:1;};Ext.each(arr,function(v){ret=comp(ret,v)==-1?ret:v;});return ret;},max:function(arr,comp){var ret=arr[0];comp=comp||function(a,b){return a>b?1:-1;};Ext.each(arr,function(v){ret=comp(ret,v)==1?ret:v;});return ret;},mean:function(arr){return arr.length>0?Ext.sum(arr)/arr.length:undefined;},sum:function(arr){var ret=0;Ext.each(arr,function(v){ret+=v;});return ret;},partition:function(arr,truth){var ret=[[],[]];Ext.each(arr,function(v,i,a){ret[(truth&&truth(v,i,a))||(!truth&&v)?0:1].push(v);});return ret;},invoke:function(arr,methodName){var ret=[],args=Array.prototype.slice.call(arguments,2);Ext.each(arr,function(v,i){if(v&&typeof v[methodName]=='function'){ret.push(v[methodName].apply(v,args));}else{ret.push(undefined);}});return ret;},pluck:function(arr,prop){var ret=[];Ext.each(arr,function(v){ret.push(v[prop]);});return ret;},zip:function(){var parts=Ext.partition(arguments,function(val){return typeof val!='function';}),arrs=parts[0],fn=parts[1][0],len=Ext.max(Ext.pluck(arrs,"length")),ret=[];for(var i=0;i<len;i++){ret[i]=[];if(fn){ret[i]=fn.apply(fn,Ext.pluck(arrs,i));}else{for(var j=0,aLen=arrs.length;j<aLen;j++){ret[i].push(arrs[j][i]);}}} +return ret;},getCmp:function(id){return Ext.ComponentMgr.get(id);},useShims:E.isIE6||(E.isMac&&E.isGecko2),type:function(o){if(o===undefined||o===null){return false;} +if(o.htmlElement){return'element';} +var t=typeof o;if(t=='object'&&o.nodeName){switch(o.nodeType){case 1:return'element';case 3:return(/\S/).test(o.nodeValue)?'textnode':'whitespace';}} +if(t=='object'||t=='function'){switch(o.constructor){case Array:return'array';case RegExp:return'regexp';case Date:return'date';} +if(typeof o.length=='number'&&typeof o.item=='function'){return'nodelist';}} +return t;},intercept:function(o,name,fn,scope){o[name]=o[name].createInterceptor(fn,scope);},callback:function(cb,scope,args,delay){if(typeof cb=='function'){if(delay){cb.defer(delay,scope,args||[]);}else{cb.apply(scope,args||[]);}}}};}());Ext.apply(Function.prototype,{createSequence:function(fcn,scope){var method=this;return(typeof fcn!='function')?this:function(){var retval=method.apply(this||window,arguments);fcn.apply(scope||this||window,arguments);return retval;};}});Ext.applyIf(String,{escape:function(string){return string.replace(/('|\\)/g,"\\$1");},leftPad:function(val,size,ch){var result=String(val);if(!ch){ch=" ";} +while(result.length<size){result=ch+result;} +return result;}});String.prototype.toggle=function(value,other){return this==value?other:value;};String.prototype.trim=function(){var re=/^\s+|\s+$/g;return function(){return this.replace(re,"");};}();Date.prototype.getElapsed=function(date){return Math.abs((date||new Date()).getTime()-this.getTime());};Ext.applyIf(Number.prototype,{constrain:function(min,max){return Math.min(Math.max(this,min),max);}});Ext.lib.Dom.getRegion=function(el){return Ext.lib.Region.getRegion(el);};Ext.lib.Region=function(t,r,b,l){var me=this;me.top=t;me[1]=t;me.right=r;me.bottom=b;me.left=l;me[0]=l;};Ext.lib.Region.prototype={contains:function(region){var me=this;return(region.left>=me.left&®ion.right<=me.right&®ion.top>=me.top&®ion.bottom<=me.bottom);},getArea:function(){var me=this;return((me.bottom-me.top)*(me.right-me.left));},intersect:function(region){var me=this,t=Math.max(me.top,region.top),r=Math.min(me.right,region.right),b=Math.min(me.bottom,region.bottom),l=Math.max(me.left,region.left);if(b>=t&&r>=l){return new Ext.lib.Region(t,r,b,l);}},union:function(region){var me=this,t=Math.min(me.top,region.top),r=Math.max(me.right,region.right),b=Math.max(me.bottom,region.bottom),l=Math.min(me.left,region.left);return new Ext.lib.Region(t,r,b,l);},constrainTo:function(r){var me=this;me.top=me.top.constrain(r.top,r.bottom);me.bottom=me.bottom.constrain(r.top,r.bottom);me.left=me.left.constrain(r.left,r.right);me.right=me.right.constrain(r.left,r.right);return me;},adjust:function(t,l,b,r){var me=this;me.top+=t;me.left+=l;me.right+=r;me.bottom+=b;return me;}};Ext.lib.Region.getRegion=function(el){var p=Ext.lib.Dom.getXY(el),t=p[1],r=p[0]+el.offsetWidth,b=p[1]+el.offsetHeight,l=p[0];return new Ext.lib.Region(t,r,b,l);};Ext.lib.Point=function(x,y){if(Ext.isArray(x)){y=x[1];x=x[0];} +var me=this;me.x=me.right=me.left=me[0]=x;me.y=me.top=me.bottom=me[1]=y;};Ext.lib.Point.prototype=new Ext.lib.Region();Ext.apply(Ext.DomHelper,function(){var pub,afterbegin='afterbegin',afterend='afterend',beforebegin='beforebegin',beforeend='beforeend',confRe=/tag|children|cn|html$/i;function doInsert(el,o,returnElement,pos,sibling,append){el=Ext.getDom(el);var newNode;if(pub.useDom){newNode=createDom(o,null);if(append){el.appendChild(newNode);}else{(sibling=='firstChild'?el:el.parentNode).insertBefore(newNode,el[sibling]||el);}}else{newNode=Ext.DomHelper.insertHtml(pos,el,Ext.DomHelper.createHtml(o));} +return returnElement?Ext.get(newNode,true):newNode;} +function createDom(o,parentNode){var el,doc=document,useSet,attr,val,cn;if(Ext.isArray(o)){el=doc.createDocumentFragment();for(var i=0,l=o.length;i<l;i++){createDom(o[i],el);}}else if(typeof o=='string'){el=doc.createTextNode(o);}else{el=doc.createElement(o.tag||'div');useSet=!!el.setAttribute;for(var attr in o){if(!confRe.test(attr)){val=o[attr];if(attr=='cls'){el.className=val;}else{if(useSet){el.setAttribute(attr,val);}else{el[attr]=val;}}}} +Ext.DomHelper.applyStyles(el,o.style);if((cn=o.children||o.cn)){createDom(cn,el);}else if(o.html){el.innerHTML=o.html;}} +if(parentNode){parentNode.appendChild(el);} +return el;} +pub={createTemplate:function(o){var html=Ext.DomHelper.createHtml(o);return new Ext.Template(html);},useDom:false,insertBefore:function(el,o,returnElement){return doInsert(el,o,returnElement,beforebegin);},insertAfter:function(el,o,returnElement){return doInsert(el,o,returnElement,afterend,'nextSibling');},insertFirst:function(el,o,returnElement){return doInsert(el,o,returnElement,afterbegin,'firstChild');},append:function(el,o,returnElement){return doInsert(el,o,returnElement,beforeend,'',true);},createDom:createDom};return pub;}());Ext.apply(Ext.Template.prototype,{disableFormats:false,re:/\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,argsRe:/^\s*['"](.*)["']\s*$/,compileARe:/\\/g,compileBRe:/(\r\n|\n)/g,compileCRe:/'/g,applyTemplate:function(values){var me=this,useF=me.disableFormats!==true,fm=Ext.util.Format,tpl=me;if(me.compiled){return me.compiled(values);} +function fn(m,name,format,args){if(format&&useF){if(format.substr(0,5)=="this."){return tpl.call(format.substr(5),values[name],values);}else{if(args){var re=me.argsRe;args=args.split(',');for(var i=0,len=args.length;i<len;i++){args[i]=args[i].replace(re,"$1");} +args=[values[name]].concat(args);}else{args=[values[name]];} +return fm[format].apply(fm,args);}}else{return values[name]!==undefined?values[name]:"";}} +return me.html.replace(me.re,fn);},compile:function(){var me=this,fm=Ext.util.Format,useF=me.disableFormats!==true,sep=Ext.isGecko?"+":",",body;function fn(m,name,format,args){if(format&&useF){args=args?','+args:"";if(format.substr(0,5)!="this."){format="fm."+format+'(';}else{format='this.call("'+format.substr(5)+'", ';args=", values";}}else{args='';format="(values['"+name+"'] == undefined ? '' : ";} +return"'"+sep+format+"values['"+name+"']"+args+")"+sep+"'";} +if(Ext.isGecko){body="this.compiled = function(values){ return '"+ +me.html.replace(me.compileARe,'\\\\').replace(me.compileBRe,'\\n').replace(me.compileCRe,"\\'").replace(me.re,fn)+"';};";}else{body=["this.compiled = function(values){ return ['"];body.push(me.html.replace(me.compileARe,'\\\\').replace(me.compileBRe,'\\n').replace(me.compileCRe,"\\'").replace(me.re,fn));body.push("'].join('');};");body=body.join('');} +eval(body);return me;},call:function(fnName,value,allValues){return this[fnName](value,allValues);}});Ext.Template.prototype.apply=Ext.Template.prototype.applyTemplate;Ext.util.Functions={createInterceptor:function(origFn,newFn,scope){var method=origFn;if(!Ext.isFunction(newFn)){return origFn;} +else{return function(){var me=this,args=arguments;newFn.target=me;newFn.method=origFn;return(newFn.apply(scope||me||window,args)!==false)?origFn.apply(me||window,args):null;};}},createDelegate:function(fn,obj,args,appendArgs){if(!Ext.isFunction(fn)){return fn;} +return function(){var callArgs=args||arguments;if(appendArgs===true){callArgs=Array.prototype.slice.call(arguments,0);callArgs=callArgs.concat(args);} +else if(Ext.isNumber(appendArgs)){callArgs=Array.prototype.slice.call(arguments,0);var applyArgs=[appendArgs,0].concat(args);Array.prototype.splice.apply(callArgs,applyArgs);} +return fn.apply(obj||window,callArgs);};},defer:function(fn,millis,obj,args,appendArgs){fn=Ext.util.Functions.createDelegate(fn,obj,args,appendArgs);if(millis>0){return setTimeout(fn,millis);} +fn();return 0;},createSequence:function(origFn,newFn,scope){if(!Ext.isFunction(newFn)){return origFn;} +else{return function(){var retval=origFn.apply(this||window,arguments);newFn.apply(scope||this||window,arguments);return retval;};}}};Ext.defer=Ext.util.Functions.defer;Ext.createInterceptor=Ext.util.Functions.createInterceptor;Ext.createSequence=Ext.util.Functions.createSequence;Ext.createDelegate=Ext.util.Functions.createDelegate;Ext.apply(Ext.util.Observable.prototype,function(){function getMethodEvent(method){var e=(this.methodEvents=this.methodEvents||{})[method],returnValue,v,cancel,obj=this;if(!e){this.methodEvents[method]=e={};e.originalFn=this[method];e.methodName=method;e.before=[];e.after=[];var makeCall=function(fn,scope,args){if((v=fn.apply(scope||obj,args))!==undefined){if(typeof v=='object'){if(v.returnValue!==undefined){returnValue=v.returnValue;}else{returnValue=v;} +cancel=!!v.cancel;} +else +if(v===false){cancel=true;} +else{returnValue=v;}}};this[method]=function(){var args=Array.prototype.slice.call(arguments,0),b;returnValue=v=undefined;cancel=false;for(var i=0,len=e.before.length;i<len;i++){b=e.before[i];makeCall(b.fn,b.scope,args);if(cancel){return returnValue;}} +if((v=e.originalFn.apply(obj,args))!==undefined){returnValue=v;} +for(var i=0,len=e.after.length;i<len;i++){b=e.after[i];makeCall(b.fn,b.scope,args);if(cancel){return returnValue;}} +return returnValue;};} +return e;} +return{beforeMethod:function(method,fn,scope){getMethodEvent.call(this,method).before.push({fn:fn,scope:scope});},afterMethod:function(method,fn,scope){getMethodEvent.call(this,method).after.push({fn:fn,scope:scope});},removeMethodListener:function(method,fn,scope){var e=this.getMethodEvent(method);for(var i=0,len=e.before.length;i<len;i++){if(e.before[i].fn==fn&&e.before[i].scope==scope){e.before.splice(i,1);return;}} +for(var i=0,len=e.after.length;i<len;i++){if(e.after[i].fn==fn&&e.after[i].scope==scope){e.after.splice(i,1);return;}}},relayEvents:function(o,events){var me=this;function createHandler(ename){return function(){return me.fireEvent.apply(me,[ename].concat(Array.prototype.slice.call(arguments,0)));};} +for(var i=0,len=events.length;i<len;i++){var ename=events[i];me.events[ename]=me.events[ename]||true;o.on(ename,createHandler(ename),me);}},enableBubble:function(events){var me=this;if(!Ext.isEmpty(events)){events=Ext.isArray(events)?events:Array.prototype.slice.call(arguments,0);for(var i=0,len=events.length;i<len;i++){var ename=events[i];ename=ename.toLowerCase();var ce=me.events[ename]||true;if(typeof ce=='boolean'){ce=new Ext.util.Event(me,ename);me.events[ename]=ce;} +ce.bubble=true;}}}};}());Ext.util.Observable.capture=function(o,fn,scope){o.fireEvent=o.fireEvent.createInterceptor(fn,scope);};Ext.util.Observable.observeClass=function(c,listeners){if(c){if(!c.fireEvent){Ext.apply(c,new Ext.util.Observable());Ext.util.Observable.capture(c.prototype,c.fireEvent,c);} +if(typeof listeners=='object'){c.on(listeners);} +return c;}};Ext.apply(Ext.EventManager,function(){var resizeEvent,resizeTask,textEvent,textSize,D=Ext.lib.Dom,propRe=/^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/,curWidth=0,curHeight=0,useKeydown=Ext.isWebKit?Ext.num(navigator.userAgent.match(/AppleWebKit\/(\d+)/)[1])>=525:!((Ext.isGecko&&!Ext.isWindows)||Ext.isOpera);return{doResizeEvent:function(){var h=D.getViewHeight(),w=D.getViewWidth();if(curHeight!=h||curWidth!=w){resizeEvent.fire(curWidth=w,curHeight=h);}},onWindowResize:function(fn,scope,options){if(!resizeEvent){resizeEvent=new Ext.util.Event();resizeTask=new Ext.util.DelayedTask(this.doResizeEvent);Ext.EventManager.on(window,"resize",this.fireWindowResize,this);} +resizeEvent.addListener(fn,scope,options);},fireWindowResize:function(){if(resizeEvent){resizeTask.delay(100);}},onTextResize:function(fn,scope,options){if(!textEvent){textEvent=new Ext.util.Event();var textEl=new Ext.Element(document.createElement('div'));textEl.dom.className='x-text-resize';textEl.dom.innerHTML='X';textEl.appendTo(document.body);textSize=textEl.dom.offsetHeight;setInterval(function(){if(textEl.dom.offsetHeight!=textSize){textEvent.fire(textSize,textSize=textEl.dom.offsetHeight);}},this.textResizeInterval);} +textEvent.addListener(fn,scope,options);},removeResizeListener:function(fn,scope){if(resizeEvent){resizeEvent.removeListener(fn,scope);}},fireResize:function(){if(resizeEvent){resizeEvent.fire(D.getViewWidth(),D.getViewHeight());}},textResizeInterval:50,ieDeferSrc:false,getKeyEvent:function(){return useKeydown?'keydown':'keypress';},useKeydown:useKeydown};}());Ext.EventManager.on=Ext.EventManager.addListener;Ext.apply(Ext.EventObjectImpl.prototype,{BACKSPACE:8,TAB:9,NUM_CENTER:12,ENTER:13,RETURN:13,SHIFT:16,CTRL:17,CONTROL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGEUP:33,PAGE_DOWN:34,PAGEDOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:44,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,CONTEXT_MENU:93,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,isNavKeyPress:function(){var me=this,k=this.normalizeKey(me.keyCode);return(k>=33&&k<=40)||k==me.RETURN||k==me.TAB||k==me.ESC;},isSpecialKey:function(){var k=this.normalizeKey(this.keyCode);return(this.type=='keypress'&&this.ctrlKey)||this.isNavKeyPress()||(k==this.BACKSPACE)||(k>=16&&k<=20)||(k>=44&&k<=46);},getPoint:function(){return new Ext.lib.Point(this.xy[0],this.xy[1]);},hasModifier:function(){return((this.ctrlKey||this.altKey)||this.shiftKey);}});Ext.Element.addMethods({swallowEvent:function(eventName,preventDefault){var me=this;function fn(e){e.stopPropagation();if(preventDefault){e.preventDefault();}} +if(Ext.isArray(eventName)){Ext.each(eventName,function(e){me.on(e,fn);});return me;} +me.on(eventName,fn);return me;},relayEvent:function(eventName,observable){this.on(eventName,function(e){observable.fireEvent(eventName,e);});},clean:function(forceReclean){var me=this,dom=me.dom,n=dom.firstChild,ni=-1;if(Ext.Element.data(dom,'isCleaned')&&forceReclean!==true){return me;} +while(n){var nx=n.nextSibling;if(n.nodeType==3&&!(/\S/.test(n.nodeValue))){dom.removeChild(n);}else{n.nodeIndex=++ni;} +n=nx;} +Ext.Element.data(dom,'isCleaned',true);return me;},load:function(){var updateManager=this.getUpdater();updateManager.update.apply(updateManager,arguments);return this;},getUpdater:function(){return this.updateManager||(this.updateManager=new Ext.Updater(this));},update:function(html,loadScripts,callback){if(!this.dom){return this;} +html=html||"";if(loadScripts!==true){this.dom.innerHTML=html;if(typeof callback=='function'){callback();} +return this;} +var id=Ext.id(),dom=this.dom;html+='<span id="'+id+'"></span>';Ext.lib.Event.onAvailable(id,function(){var DOC=document,hd=DOC.getElementsByTagName("head")[0],re=/(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig,srcRe=/\ssrc=([\'\"])(.*?)\1/i,typeRe=/\stype=([\'\"])(.*?)\1/i,match,attrs,srcMatch,typeMatch,el,s;while((match=re.exec(html))){attrs=match[1];srcMatch=attrs?attrs.match(srcRe):false;if(srcMatch&&srcMatch[2]){s=DOC.createElement("script");s.src=srcMatch[2];typeMatch=attrs.match(typeRe);if(typeMatch&&typeMatch[2]){s.type=typeMatch[2];} +hd.appendChild(s);}else if(match[2]&&match[2].length>0){if(window.execScript){window.execScript(match[2]);}else{window.eval(match[2]);}}} +el=DOC.getElementById(id);if(el){Ext.removeNode(el);} +if(typeof callback=='function'){callback();}});dom.innerHTML=html.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,"");return this;},removeAllListeners:function(){this.removeAnchor();Ext.EventManager.removeAll(this.dom);return this;},createProxy:function(config,renderTo,matchBox){config=(typeof config=='object')?config:{tag:"div",cls:config};var me=this,proxy=renderTo?Ext.DomHelper.append(renderTo,config,true):Ext.DomHelper.insertBefore(me.dom,config,true);if(matchBox&&me.setBox&&me.getBox){proxy.setBox(me.getBox());} +return proxy;}});Ext.Element.prototype.getUpdateManager=Ext.Element.prototype.getUpdater;Ext.Element.addMethods({getAnchorXY:function(anchor,local,s){anchor=(anchor||"tl").toLowerCase();s=s||{};var me=this,vp=me.dom==document.body||me.dom==document,w=s.width||vp?Ext.lib.Dom.getViewWidth():me.getWidth(),h=s.height||vp?Ext.lib.Dom.getViewHeight():me.getHeight(),xy,r=Math.round,o=me.getXY(),scroll=me.getScroll(),extraX=vp?scroll.left:!local?o[0]:0,extraY=vp?scroll.top:!local?o[1]:0,hash={c:[r(w*0.5),r(h*0.5)],t:[r(w*0.5),0],l:[0,r(h*0.5)],r:[w,r(h*0.5)],b:[r(w*0.5),h],tl:[0,0],bl:[0,h],br:[w,h],tr:[w,0]};xy=hash[anchor];return[xy[0]+extraX,xy[1]+extraY];},anchorTo:function(el,alignment,offsets,animate,monitorScroll,callback){var me=this,dom=me.dom,scroll=!Ext.isEmpty(monitorScroll),action=function(){Ext.fly(dom).alignTo(el,alignment,offsets,animate);Ext.callback(callback,Ext.fly(dom));},anchor=this.getAnchor();this.removeAnchor();Ext.apply(anchor,{fn:action,scroll:scroll});Ext.EventManager.onWindowResize(action,null);if(scroll){Ext.EventManager.on(window,'scroll',action,null,{buffer:!isNaN(monitorScroll)?monitorScroll:50});} +action.call(me);return me;},removeAnchor:function(){var me=this,anchor=this.getAnchor();if(anchor&&anchor.fn){Ext.EventManager.removeResizeListener(anchor.fn);if(anchor.scroll){Ext.EventManager.un(window,'scroll',anchor.fn);} +delete anchor.fn;} +return me;},getAnchor:function(){var data=Ext.Element.data,dom=this.dom;if(!dom){return;} +var anchor=data(dom,'_anchor');if(!anchor){anchor=data(dom,'_anchor',{});} +return anchor;},getAlignToXY:function(el,p,o){el=Ext.get(el);if(!el||!el.dom){throw"Element.alignToXY with an element that doesn't exist";} +o=o||[0,0];p=(!p||p=="?"?"tl-bl?":(!(/-/).test(p)&&p!==""?"tl-"+p:p||"tl-bl")).toLowerCase();var me=this,d=me.dom,a1,a2,x,y,w,h,r,dw=Ext.lib.Dom.getViewWidth()-10,dh=Ext.lib.Dom.getViewHeight()-10,p1y,p1x,p2y,p2x,swapY,swapX,doc=document,docElement=doc.documentElement,docBody=doc.body,scrollX=(docElement.scrollLeft||docBody.scrollLeft||0)+5,scrollY=(docElement.scrollTop||docBody.scrollTop||0)+5,c=false,p1="",p2="",m=p.match(/^([a-z]+)-([a-z]+)(\?)?$/);if(!m){throw"Element.alignTo with an invalid alignment "+p;} +p1=m[1];p2=m[2];c=!!m[3];a1=me.getAnchorXY(p1,true);a2=el.getAnchorXY(p2,false);x=a2[0]-a1[0]+o[0];y=a2[1]-a1[1]+o[1];if(c){w=me.getWidth();h=me.getHeight();r=el.getRegion();p1y=p1.charAt(0);p1x=p1.charAt(p1.length-1);p2y=p2.charAt(0);p2x=p2.charAt(p2.length-1);swapY=((p1y=="t"&&p2y=="b")||(p1y=="b"&&p2y=="t"));swapX=((p1x=="r"&&p2x=="l")||(p1x=="l"&&p2x=="r"));if(x+w>dw+scrollX){x=swapX?r.left-w:dw+scrollX-w;} +if(x<scrollX){x=swapX?r.right:scrollX;} +if(y+h>dh+scrollY){y=swapY?r.top-h:dh+scrollY-h;} +if(y<scrollY){y=swapY?r.bottom:scrollY;}} +return[x,y];},alignTo:function(element,position,offsets,animate){var me=this;return me.setXY(me.getAlignToXY(element,position,offsets),me.preanim&&!!animate?me.preanim(arguments,3):false);},adjustForConstraints:function(xy,parent,offsets){return this.getConstrainToXY(parent||document,false,offsets,xy)||xy;},getConstrainToXY:function(el,local,offsets,proposedXY){var os={top:0,left:0,bottom:0,right:0};return function(el,local,offsets,proposedXY){el=Ext.get(el);offsets=offsets?Ext.applyIf(offsets,os):os;var vw,vh,vx=0,vy=0;if(el.dom==document.body||el.dom==document){vw=Ext.lib.Dom.getViewWidth();vh=Ext.lib.Dom.getViewHeight();}else{vw=el.dom.clientWidth;vh=el.dom.clientHeight;if(!local){var vxy=el.getXY();vx=vxy[0];vy=vxy[1];}} +var s=el.getScroll();vx+=offsets.left+s.left;vy+=offsets.top+s.top;vw-=offsets.right;vh-=offsets.bottom;var vr=vx+vw,vb=vy+vh,xy=proposedXY||(!local?this.getXY():[this.getLeft(true),this.getTop(true)]),x=xy[0],y=xy[1],offset=this.getConstrainOffset(),w=this.dom.offsetWidth+offset,h=this.dom.offsetHeight+offset;var moved=false;if((x+w)>vr){x=vr-w;moved=true;} +if((y+h)>vb){y=vb-h;moved=true;} +if(x<vx){x=vx;moved=true;} +if(y<vy){y=vy;moved=true;} +return moved?[x,y]:false;};}(),getConstrainOffset:function(){return 0;},getCenterXY:function(){return this.getAlignToXY(document,'c-c');},center:function(centerIn){return this.alignTo(centerIn||document,'c-c');}});Ext.Element.addMethods({select:function(selector,unique){return Ext.Element.select(selector,unique,this.dom);}});Ext.apply(Ext.Element.prototype,function(){var GETDOM=Ext.getDom,GET=Ext.get,DH=Ext.DomHelper;return{insertSibling:function(el,where,returnDom){var me=this,rt,isAfter=(where||'before').toLowerCase()=='after',insertEl;if(Ext.isArray(el)){insertEl=me;Ext.each(el,function(e){rt=Ext.fly(insertEl,'_internal').insertSibling(e,where,returnDom);if(isAfter){insertEl=rt;}});return rt;} +el=el||{};if(el.nodeType||el.dom){rt=me.dom.parentNode.insertBefore(GETDOM(el),isAfter?me.dom.nextSibling:me.dom);if(!returnDom){rt=GET(rt);}}else{if(isAfter&&!me.dom.nextSibling){rt=DH.append(me.dom.parentNode,el,!returnDom);}else{rt=DH[isAfter?'insertAfter':'insertBefore'](me.dom,el,!returnDom);}} +return rt;}};}());Ext.Element.boxMarkup='<div class="{0}-tl"><div class="{0}-tr"><div class="{0}-tc"></div></div></div><div class="{0}-ml"><div class="{0}-mr"><div class="{0}-mc"></div></div></div><div class="{0}-bl"><div class="{0}-br"><div class="{0}-bc"></div></div></div>';Ext.Element.addMethods(function(){var INTERNAL="_internal",pxMatch=/(\d+\.?\d+)px/;return{applyStyles:function(style){Ext.DomHelper.applyStyles(this.dom,style);return this;},getStyles:function(){var ret={};Ext.each(arguments,function(v){ret[v]=this.getStyle(v);},this);return ret;},setOverflow:function(v){var dom=this.dom;if(v=='auto'&&Ext.isMac&&Ext.isGecko2){dom.style.overflow='hidden';(function(){dom.style.overflow='auto';}).defer(1);}else{dom.style.overflow=v;}},boxWrap:function(cls){cls=cls||'x-box';var el=Ext.get(this.insertHtml("beforeBegin","<div class='"+cls+"'>"+String.format(Ext.Element.boxMarkup,cls)+"</div>"));Ext.DomQuery.selectNode('.'+cls+'-mc',el.dom).appendChild(this.dom);return el;},setSize:function(width,height,animate){var me=this;if(typeof width=='object'){height=width.height;width=width.width;} +width=me.adjustWidth(width);height=me.adjustHeight(height);if(!animate||!me.anim){me.dom.style.width=me.addUnits(width);me.dom.style.height=me.addUnits(height);}else{me.anim({width:{to:width},height:{to:height}},me.preanim(arguments,2));} +return me;},getComputedHeight:function(){var me=this,h=Math.max(me.dom.offsetHeight,me.dom.clientHeight);if(!h){h=parseFloat(me.getStyle('height'))||0;if(!me.isBorderBox()){h+=me.getFrameWidth('tb');}} +return h;},getComputedWidth:function(){var w=Math.max(this.dom.offsetWidth,this.dom.clientWidth);if(!w){w=parseFloat(this.getStyle('width'))||0;if(!this.isBorderBox()){w+=this.getFrameWidth('lr');}} +return w;},getFrameWidth:function(sides,onlyContentBox){return onlyContentBox&&this.isBorderBox()?0:(this.getPadding(sides)+this.getBorderWidth(sides));},addClassOnOver:function(className){this.hover(function(){Ext.fly(this,INTERNAL).addClass(className);},function(){Ext.fly(this,INTERNAL).removeClass(className);});return this;},addClassOnFocus:function(className){this.on("focus",function(){Ext.fly(this,INTERNAL).addClass(className);},this.dom);this.on("blur",function(){Ext.fly(this,INTERNAL).removeClass(className);},this.dom);return this;},addClassOnClick:function(className){var dom=this.dom;this.on("mousedown",function(){Ext.fly(dom,INTERNAL).addClass(className);var d=Ext.getDoc(),fn=function(){Ext.fly(dom,INTERNAL).removeClass(className);d.removeListener("mouseup",fn);};d.on("mouseup",fn);});return this;},getViewSize:function(){var doc=document,d=this.dom,isDoc=(d==doc||d==doc.body);if(isDoc){var extdom=Ext.lib.Dom;return{width:extdom.getViewWidth(),height:extdom.getViewHeight()};}else{return{width:d.clientWidth,height:d.clientHeight};}},getStyleSize:function(){var me=this,w,h,doc=document,d=this.dom,isDoc=(d==doc||d==doc.body),s=d.style;if(isDoc){var extdom=Ext.lib.Dom;return{width:extdom.getViewWidth(),height:extdom.getViewHeight()};} +if(s.width&&s.width!='auto'){w=parseFloat(s.width);if(me.isBorderBox()){w-=me.getFrameWidth('lr');}} +if(s.height&&s.height!='auto'){h=parseFloat(s.height);if(me.isBorderBox()){h-=me.getFrameWidth('tb');}} +return{width:w||me.getWidth(true),height:h||me.getHeight(true)};},getSize:function(contentSize){return{width:this.getWidth(contentSize),height:this.getHeight(contentSize)};},repaint:function(){var dom=this.dom;this.addClass("x-repaint");setTimeout(function(){Ext.fly(dom).removeClass("x-repaint");},1);return this;},unselectable:function(){this.dom.unselectable="on";return this.swallowEvent("selectstart",true).applyStyles("-moz-user-select:none;-khtml-user-select:none;").addClass("x-unselectable");},getMargins:function(side){var me=this,key,hash={t:"top",l:"left",r:"right",b:"bottom"},o={};if(!side){for(key in me.margins){o[hash[key]]=parseFloat(me.getStyle(me.margins[key]))||0;} +return o;}else{return me.addStyles.call(me,side,me.margins);}}};}());Ext.Element.addMethods({setBox:function(box,adjust,animate){var me=this,w=box.width,h=box.height;if((adjust&&!me.autoBoxAdjust)&&!me.isBorderBox()){w-=(me.getBorderWidth("lr")+me.getPadding("lr"));h-=(me.getBorderWidth("tb")+me.getPadding("tb"));} +me.setBounds(box.x,box.y,w,h,me.animTest.call(me,arguments,animate,2));return me;},getBox:function(contentBox,local){var me=this,xy,left,top,getBorderWidth=me.getBorderWidth,getPadding=me.getPadding,l,r,t,b;if(!local){xy=me.getXY();}else{left=parseInt(me.getStyle("left"),10)||0;top=parseInt(me.getStyle("top"),10)||0;xy=[left,top];} +var el=me.dom,w=el.offsetWidth,h=el.offsetHeight,bx;if(!contentBox){bx={x:xy[0],y:xy[1],0:xy[0],1:xy[1],width:w,height:h};}else{l=getBorderWidth.call(me,"l")+getPadding.call(me,"l");r=getBorderWidth.call(me,"r")+getPadding.call(me,"r");t=getBorderWidth.call(me,"t")+getPadding.call(me,"t");b=getBorderWidth.call(me,"b")+getPadding.call(me,"b");bx={x:xy[0]+l,y:xy[1]+t,0:xy[0]+l,1:xy[1]+t,width:w-(l+r),height:h-(t+b)};} +bx.right=bx.x+bx.width;bx.bottom=bx.y+bx.height;return bx;},move:function(direction,distance,animate){var me=this,xy=me.getXY(),x=xy[0],y=xy[1],left=[x-distance,y],right=[x+distance,y],top=[x,y-distance],bottom=[x,y+distance],hash={l:left,left:left,r:right,right:right,t:top,top:top,up:top,b:bottom,bottom:bottom,down:bottom};direction=direction.toLowerCase();me.moveTo(hash[direction][0],hash[direction][1],me.animTest.call(me,arguments,animate,2));},setLeftTop:function(left,top){var me=this,style=me.dom.style;style.left=me.addUnits(left);style.top=me.addUnits(top);return me;},getRegion:function(){return Ext.lib.Dom.getRegion(this.dom);},setBounds:function(x,y,width,height,animate){var me=this;if(!animate||!me.anim){me.setSize(width,height);me.setLocation(x,y);}else{me.anim({points:{to:[x,y]},width:{to:me.adjustWidth(width)},height:{to:me.adjustHeight(height)}},me.preanim(arguments,4),'motion');} +return me;},setRegion:function(region,animate){return this.setBounds(region.left,region.top,region.right-region.left,region.bottom-region.top,this.animTest.call(this,arguments,animate,1));}});Ext.Element.addMethods({scrollTo:function(side,value,animate){var top=/top/i.test(side),me=this,dom=me.dom,prop;if(!animate||!me.anim){prop='scroll'+(top?'Top':'Left');dom[prop]=value;} +else{prop='scroll'+(top?'Left':'Top');me.anim({scroll:{to:top?[dom[prop],value]:[value,dom[prop]]}},me.preanim(arguments,2),'scroll');} +return me;},scrollIntoView:function(container,hscroll){var c=Ext.getDom(container)||Ext.getBody().dom,el=this.dom,o=this.getOffsetsTo(c),l=o[0]+c.scrollLeft,t=o[1]+c.scrollTop,b=t+el.offsetHeight,r=l+el.offsetWidth,ch=c.clientHeight,ct=parseInt(c.scrollTop,10),cl=parseInt(c.scrollLeft,10),cb=ct+ch,cr=cl+c.clientWidth;if(el.offsetHeight>ch||t<ct){c.scrollTop=t;} +else if(b>cb){c.scrollTop=b-ch;} +c.scrollTop=c.scrollTop;if(hscroll!==false){if(el.offsetWidth>c.clientWidth||l<cl){c.scrollLeft=l;} +else if(r>cr){c.scrollLeft=r-c.clientWidth;} +c.scrollLeft=c.scrollLeft;} +return this;},scrollChildIntoView:function(child,hscroll){Ext.fly(child,'_scrollChildIntoView').scrollIntoView(this,hscroll);},scroll:function(direction,distance,animate){if(!this.isScrollable()){return false;} +var el=this.dom,l=el.scrollLeft,t=el.scrollTop,w=el.scrollWidth,h=el.scrollHeight,cw=el.clientWidth,ch=el.clientHeight,scrolled=false,v,hash={l:Math.min(l+distance,w-cw),r:v=Math.max(l-distance,0),t:Math.max(t-distance,0),b:Math.min(t+distance,h-ch)};hash.d=hash.b;hash.u=hash.t;direction=direction.substr(0,1);if((v=hash[direction])>-1){scrolled=true;this.scrollTo(direction=='l'||direction=='r'?'left':'top',v,this.preanim(arguments,2));} +return scrolled;}});Ext.Element.addMethods(function(){var VISIBILITY="visibility",DISPLAY="display",HIDDEN="hidden",NONE="none",XMASKED="x-masked",XMASKEDRELATIVE="x-masked-relative",data=Ext.Element.data;return{isVisible:function(deep){var vis=!this.isStyle(VISIBILITY,HIDDEN)&&!this.isStyle(DISPLAY,NONE),p=this.dom.parentNode;if(deep!==true||!vis){return vis;} +while(p&&!(/^body/i.test(p.tagName))){if(!Ext.fly(p,'_isVisible').isVisible()){return false;} +p=p.parentNode;} +return true;},isDisplayed:function(){return!this.isStyle(DISPLAY,NONE);},enableDisplayMode:function(display){this.setVisibilityMode(Ext.Element.DISPLAY);if(!Ext.isEmpty(display)){data(this.dom,'originalDisplay',display);} +return this;},mask:function(msg,msgCls){var me=this,dom=me.dom,dh=Ext.DomHelper,EXTELMASKMSG="ext-el-mask-msg",el,mask;if(!(/^body/i.test(dom.tagName)&&me.getStyle('position')=='static')){me.addClass(XMASKEDRELATIVE);} +if(el=data(dom,'maskMsg')){el.remove();} +if(el=data(dom,'mask')){el.remove();} +mask=dh.append(dom,{cls:"ext-el-mask"},true);data(dom,'mask',mask);me.addClass(XMASKED);mask.setDisplayed(true);if(typeof msg=='string'){var mm=dh.append(dom,{cls:EXTELMASKMSG,cn:{tag:'div'}},true);data(dom,'maskMsg',mm);mm.dom.className=msgCls?EXTELMASKMSG+" "+msgCls:EXTELMASKMSG;mm.dom.firstChild.innerHTML=msg;mm.setDisplayed(true);mm.center(me);} +if(Ext.isIE&&!(Ext.isIE7&&Ext.isStrict)&&me.getStyle('height')=='auto'){mask.setSize(undefined,me.getHeight());} +return mask;},unmask:function(){var me=this,dom=me.dom,mask=data(dom,'mask'),maskMsg=data(dom,'maskMsg');if(mask){if(maskMsg){maskMsg.remove();data(dom,'maskMsg',undefined);} +mask.remove();data(dom,'mask',undefined);me.removeClass([XMASKED,XMASKEDRELATIVE]);}},isMasked:function(){var m=data(this.dom,'mask');return m&&m.isVisible();},createShim:function(){var el=document.createElement('iframe'),shim;el.frameBorder='0';el.className='ext-shim';el.src=Ext.SSL_SECURE_URL;shim=Ext.get(this.dom.parentNode.insertBefore(el,this.dom));shim.autoBoxAdjust=false;return shim;}};}());Ext.Element.addMethods({addKeyListener:function(key,fn,scope){var config;if(typeof key!='object'||Ext.isArray(key)){config={key:key,fn:fn,scope:scope};}else{config={key:key.key,shift:key.shift,ctrl:key.ctrl,alt:key.alt,fn:fn,scope:scope};} +return new Ext.KeyMap(this,config);},addKeyMap:function(config){return new Ext.KeyMap(this,config);}});Ext.CompositeElementLite.importElementMethods();Ext.apply(Ext.CompositeElementLite.prototype,{addElements:function(els,root){if(!els){return this;} +if(typeof els=="string"){els=Ext.Element.selectorFunction(els,root);} +var yels=this.elements;Ext.each(els,function(e){yels.push(Ext.get(e));});return this;},first:function(){return this.item(0);},last:function(){return this.item(this.getCount()-1);},contains:function(el){return this.indexOf(el)!=-1;},removeElement:function(keys,removeDom){var me=this,els=this.elements,el;Ext.each(keys,function(val){if((el=(els[val]||els[val=me.indexOf(val)]))){if(removeDom){if(el.dom){el.remove();}else{Ext.removeNode(el);}} +els.splice(val,1);}});return this;}});Ext.CompositeElement=Ext.extend(Ext.CompositeElementLite,{constructor:function(els,root){this.elements=[];this.add(els,root);},getElement:function(el){return el;},transformElement:function(el){return Ext.get(el);}});Ext.Element.select=function(selector,unique,root){var els;if(typeof selector=="string"){els=Ext.Element.selectorFunction(selector,root);}else if(selector.length!==undefined){els=selector;}else{throw"Invalid selector";} +return(unique===true)?new Ext.CompositeElement(els):new Ext.CompositeElementLite(els);};Ext.select=Ext.Element.select;Ext.UpdateManager=Ext.Updater=Ext.extend(Ext.util.Observable,function(){var BEFOREUPDATE="beforeupdate",UPDATE="update",FAILURE="failure";function processSuccess(response){var me=this;me.transaction=null;if(response.argument.form&&response.argument.reset){try{response.argument.form.reset();}catch(e){}} +if(me.loadScripts){me.renderer.render(me.el,response,me,updateComplete.createDelegate(me,[response]));}else{me.renderer.render(me.el,response,me);updateComplete.call(me,response);}} +function updateComplete(response,type,success){this.fireEvent(type||UPDATE,this.el,response);if(Ext.isFunction(response.argument.callback)){response.argument.callback.call(response.argument.scope,this.el,Ext.isEmpty(success)?true:false,response,response.argument.options);}} +function processFailure(response){updateComplete.call(this,response,FAILURE,!!(this.transaction=null));} +return{constructor:function(el,forceNew){var me=this;el=Ext.get(el);if(!forceNew&&el.updateManager){return el.updateManager;} +me.el=el;me.defaultUrl=null;me.addEvents(BEFOREUPDATE,UPDATE,FAILURE);Ext.apply(me,Ext.Updater.defaults);me.transaction=null;me.refreshDelegate=me.refresh.createDelegate(me);me.updateDelegate=me.update.createDelegate(me);me.formUpdateDelegate=(me.formUpdate||function(){}).createDelegate(me);me.renderer=me.renderer||me.getDefaultRenderer();Ext.Updater.superclass.constructor.call(me);},setRenderer:function(renderer){this.renderer=renderer;},getRenderer:function(){return this.renderer;},getDefaultRenderer:function(){return new Ext.Updater.BasicRenderer();},setDefaultUrl:function(defaultUrl){this.defaultUrl=defaultUrl;},getEl:function(){return this.el;},update:function(url,params,callback,discardUrl){var me=this,cfg,callerScope;if(me.fireEvent(BEFOREUPDATE,me.el,url,params)!==false){if(Ext.isObject(url)){cfg=url;url=cfg.url;params=params||cfg.params;callback=callback||cfg.callback;discardUrl=discardUrl||cfg.discardUrl;callerScope=cfg.scope;if(!Ext.isEmpty(cfg.nocache)){me.disableCaching=cfg.nocache;};if(!Ext.isEmpty(cfg.text)){me.indicatorText='<div class="loading-indicator">'+cfg.text+"</div>";};if(!Ext.isEmpty(cfg.scripts)){me.loadScripts=cfg.scripts;};if(!Ext.isEmpty(cfg.timeout)){me.timeout=cfg.timeout;};} +me.showLoading();if(!discardUrl){me.defaultUrl=url;} +if(Ext.isFunction(url)){url=url.call(me);} +var o=Ext.apply({},{url:url,params:(Ext.isFunction(params)&&callerScope)?params.createDelegate(callerScope):params,success:processSuccess,failure:processFailure,scope:me,callback:undefined,timeout:(me.timeout*1000),disableCaching:me.disableCaching,argument:{"options":cfg,"url":url,"form":null,"callback":callback,"scope":callerScope||window,"params":params}},cfg);me.transaction=Ext.Ajax.request(o);}},formUpdate:function(form,url,reset,callback){var me=this;if(me.fireEvent(BEFOREUPDATE,me.el,form,url)!==false){if(Ext.isFunction(url)){url=url.call(me);} +form=Ext.getDom(form);me.transaction=Ext.Ajax.request({form:form,url:url,success:processSuccess,failure:processFailure,scope:me,timeout:(me.timeout*1000),argument:{"url":url,"form":form,"callback":callback,"reset":reset}});me.showLoading.defer(1,me);}},startAutoRefresh:function(interval,url,params,callback,refreshNow){var me=this;if(refreshNow){me.update(url||me.defaultUrl,params,callback,true);} +if(me.autoRefreshProcId){clearInterval(me.autoRefreshProcId);} +me.autoRefreshProcId=setInterval(me.update.createDelegate(me,[url||me.defaultUrl,params,callback,true]),interval*1000);},stopAutoRefresh:function(){if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId);delete this.autoRefreshProcId;}},isAutoRefreshing:function(){return!!this.autoRefreshProcId;},showLoading:function(){if(this.showLoadIndicator){this.el.dom.innerHTML=this.indicatorText;}},abort:function(){if(this.transaction){Ext.Ajax.abort(this.transaction);}},isUpdating:function(){return this.transaction?Ext.Ajax.isLoading(this.transaction):false;},refresh:function(callback){if(this.defaultUrl){this.update(this.defaultUrl,null,callback,true);}}};}());Ext.Updater.defaults={timeout:30,disableCaching:false,showLoadIndicator:true,indicatorText:'<div class="loading-indicator">Loading...</div>',loadScripts:false,sslBlankUrl:Ext.SSL_SECURE_URL};Ext.Updater.updateElement=function(el,url,params,options){var um=Ext.get(el).getUpdater();Ext.apply(um,options);um.update(url,params,options?options.callback:null);};Ext.Updater.BasicRenderer=function(){};Ext.Updater.BasicRenderer.prototype={render:function(el,response,updateManager,callback){el.update(response.responseText,updateManager.loadScripts,callback);}};(function(){Date.useStrict=false;function xf(format){var args=Array.prototype.slice.call(arguments,1);return format.replace(/\{(\d+)\}/g,function(m,i){return args[i];});} +Date.formatCodeToRegex=function(character,currentGroup){var p=Date.parseCodes[character];if(p){p=typeof p=='function'?p():p;Date.parseCodes[character]=p;} +return p?Ext.applyIf({c:p.c?xf(p.c,currentGroup||"{0}"):p.c},p):{g:0,c:null,s:Ext.escapeRe(character)};};var $f=Date.formatCodeToRegex;Ext.apply(Date,{parseFunctions:{"M$":function(input,strict){var re=new RegExp('\\/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\/');var r=(input||'').match(re);return r?new Date(((r[1]||'')+r[2])*1):null;}},parseRegexes:[],formatFunctions:{"M$":function(){return'\\/Date('+this.getTime()+')\\/';}},y2kYear:50,MILLI:"ms",SECOND:"s",MINUTE:"mi",HOUR:"h",DAY:"d",MONTH:"mo",YEAR:"y",defaults:{},dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNumbers:{Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,Aug:7,Sep:8,Oct:9,Nov:10,Dec:11},getShortMonthName:function(month){return Date.monthNames[month].substring(0,3);},getShortDayName:function(day){return Date.dayNames[day].substring(0,3);},getMonthNumber:function(name){return Date.monthNumbers[name.substring(0,1).toUpperCase()+name.substring(1,3).toLowerCase()];},formatCodes:{d:"String.leftPad(this.getDate(), 2, '0')",D:"Date.getShortDayName(this.getDay())",j:"this.getDate()",l:"Date.dayNames[this.getDay()]",N:"(this.getDay() ? this.getDay() : 7)",S:"this.getSuffix()",w:"this.getDay()",z:"this.getDayOfYear()",W:"String.leftPad(this.getWeekOfYear(), 2, '0')",F:"Date.monthNames[this.getMonth()]",m:"String.leftPad(this.getMonth() + 1, 2, '0')",M:"Date.getShortMonthName(this.getMonth())",n:"(this.getMonth() + 1)",t:"this.getDaysInMonth()",L:"(this.isLeapYear() ? 1 : 0)",o:"(this.getFullYear() + (this.getWeekOfYear() == 1 && this.getMonth() > 0 ? +1 : (this.getWeekOfYear() >= 52 && this.getMonth() < 11 ? -1 : 0)))",Y:"String.leftPad(this.getFullYear(), 4, '0')",y:"('' + this.getFullYear()).substring(2, 4)",a:"(this.getHours() < 12 ? 'am' : 'pm')",A:"(this.getHours() < 12 ? 'AM' : 'PM')",g:"((this.getHours() % 12) ? this.getHours() % 12 : 12)",G:"this.getHours()",h:"String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",H:"String.leftPad(this.getHours(), 2, '0')",i:"String.leftPad(this.getMinutes(), 2, '0')",s:"String.leftPad(this.getSeconds(), 2, '0')",u:"String.leftPad(this.getMilliseconds(), 3, '0')",O:"this.getGMTOffset()",P:"this.getGMTOffset(true)",T:"this.getTimezone()",Z:"(this.getTimezoneOffset() * -60)",c:function(){for(var c="Y-m-dTH:i:sP",code=[],i=0,l=c.length;i<l;++i){var e=c.charAt(i);code.push(e=="T"?"'T'":Date.getFormatCode(e));} +return code.join(" + ");},U:"Math.round(this.getTime() / 1000)"},isValid:function(y,m,d,h,i,s,ms){h=h||0;i=i||0;s=s||0;ms=ms||0;var dt=new Date(y<100?100:y,m-1,d,h,i,s,ms).add(Date.YEAR,y<100?y-100:0);return y==dt.getFullYear()&&m==dt.getMonth()+1&&d==dt.getDate()&&h==dt.getHours()&&i==dt.getMinutes()&&s==dt.getSeconds()&&ms==dt.getMilliseconds();},parseDate:function(input,format,strict){var p=Date.parseFunctions;if(p[format]==null){Date.createParser(format);} +return p[format](input,Ext.isDefined(strict)?strict:Date.useStrict);},getFormatCode:function(character){var f=Date.formatCodes[character];if(f){f=typeof f=='function'?f():f;Date.formatCodes[character]=f;} +return f||("'"+String.escape(character)+"'");},createFormat:function(format){var code=[],special=false,ch='';for(var i=0;i<format.length;++i){ch=format.charAt(i);if(!special&&ch=="\\"){special=true;}else if(special){special=false;code.push("'"+String.escape(ch)+"'");}else{code.push(Date.getFormatCode(ch));}} +Date.formatFunctions[format]=new Function("return "+code.join('+'));},createParser:function(){var code=["var dt, y, m, d, h, i, s, ms, o, z, zz, u, v,","def = Date.defaults,","results = String(input).match(Date.parseRegexes[{0}]);","if(results){","{1}","if(u != null){","v = new Date(u * 1000);","}else{","dt = (new Date()).clearTime();","y = Ext.num(y, Ext.num(def.y, dt.getFullYear()));","m = Ext.num(m, Ext.num(def.m - 1, dt.getMonth()));","d = Ext.num(d, Ext.num(def.d, dt.getDate()));","h = Ext.num(h, Ext.num(def.h, dt.getHours()));","i = Ext.num(i, Ext.num(def.i, dt.getMinutes()));","s = Ext.num(s, Ext.num(def.s, dt.getSeconds()));","ms = Ext.num(ms, Ext.num(def.ms, dt.getMilliseconds()));","if(z >= 0 && y >= 0){","v = new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0);","v = !strict? v : (strict === true && (z <= 364 || (v.isLeapYear() && z <= 365))? v.add(Date.DAY, z) : null);","}else if(strict === true && !Date.isValid(y, m + 1, d, h, i, s, ms)){","v = null;","}else{","v = new Date(y < 100 ? 100 : y, m, d, h, i, s, ms).add(Date.YEAR, y < 100 ? y - 100 : 0);","}","}","}","if(v){","if(zz != null){","v = v.add(Date.SECOND, -v.getTimezoneOffset() * 60 - zz);","}else if(o){","v = v.add(Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));","}","}","return v;"].join('\n');return function(format){var regexNum=Date.parseRegexes.length,currentGroup=1,calc=[],regex=[],special=false,ch="",i=0,obj,last;for(;i<format.length;++i){ch=format.charAt(i);if(!special&&ch=="\\"){special=true;}else if(special){special=false;regex.push(String.escape(ch));}else{obj=$f(ch,currentGroup);currentGroup+=obj.g;regex.push(obj.s);if(obj.g&&obj.c){if(obj.calcLast){last=obj.c;}else{calc.push(obj.c);}}}} +if(last){calc.push(last);} +Date.parseRegexes[regexNum]=new RegExp("^"+regex.join('')+"$",'i');Date.parseFunctions[format]=new Function("input","strict",xf(code,regexNum,calc.join('')));};}(),parseCodes:{d:{g:1,c:"d = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},j:{g:1,c:"d = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},D:function(){for(var a=[],i=0;i<7;a.push(Date.getShortDayName(i)),++i);return{g:0,c:null,s:"(?:"+a.join("|")+")"};},l:function(){return{g:0,c:null,s:"(?:"+Date.dayNames.join("|")+")"};},N:{g:0,c:null,s:"[1-7]"},S:{g:0,c:null,s:"(?:st|nd|rd|th)"},w:{g:0,c:null,s:"[0-6]"},z:{g:1,c:"z = parseInt(results[{0}], 10);\n",s:"(\\d{1,3})"},W:{g:0,c:null,s:"(?:\\d{2})"},F:function(){return{g:1,c:"m = parseInt(Date.getMonthNumber(results[{0}]), 10);\n",s:"("+Date.monthNames.join("|")+")"};},M:function(){for(var a=[],i=0;i<12;a.push(Date.getShortMonthName(i)),++i);return Ext.applyIf({s:"("+a.join("|")+")"},$f("F"));},m:{g:1,c:"m = parseInt(results[{0}], 10) - 1;\n",s:"(\\d{2})"},n:{g:1,c:"m = parseInt(results[{0}], 10) - 1;\n",s:"(\\d{1,2})"},t:{g:0,c:null,s:"(?:\\d{2})"},L:{g:0,c:null,s:"(?:1|0)"},o:function(){return $f("Y");},Y:{g:1,c:"y = parseInt(results[{0}], 10);\n",s:"(\\d{4})"},y:{g:1,c:"var ty = parseInt(results[{0}], 10);\n" ++"y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"},a:function(){return $f("A");},A:{calcLast:true,g:1,c:"if (/(am)/i.test(results[{0}])) {\n" ++"if (!h || h == 12) { h = 0; }\n" ++"} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(AM|PM|am|pm)"},g:function(){return $f("G");},G:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},h:function(){return $f("H");},H:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},i:{g:1,c:"i = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},s:{g:1,c:"s = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},u:{g:1,c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",s:"(\\d+)"},O:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),","mn = o.substring(3,5) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+\-]\\d{4})"},P:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),","mn = o.substring(4,6) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + String.leftPad(hr, 2, '0') + String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+\-]\\d{2}:\\d{2})"},T:{g:0,c:null,s:"[A-Z]{1,4}"},Z:{g:1,c:"zz = results[{0}] * 1;\n" ++"zz = (-43200 <= zz && zz <= 50400)? zz : null;\n",s:"([+\-]?\\d{1,5})"},c:function(){var calc=[],arr=[$f("Y",1),$f("m",2),$f("d",3),$f("h",4),$f("i",5),$f("s",6),{c:"ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"},{c:["if(results[8]) {","if(results[8] == 'Z'){","zz = 0;","}else if (results[8].indexOf(':') > -1){",$f("P",8).c,"}else{",$f("O",8).c,"}","}"].join('\n')}];for(var i=0,l=arr.length;i<l;++i){calc.push(arr[i].c);} +return{g:1,c:calc.join(""),s:[arr[0].s,"(?:","-",arr[1].s,"(?:","-",arr[2].s,"(?:","(?:T| )?",arr[3].s,":",arr[4].s,"(?::",arr[5].s,")?","(?:(?:\\.|,)(\\d+))?","(Z|(?:[-+]\\d{2}(?::)?\\d{2}))?",")?",")?",")?"].join("")};},U:{g:1,c:"u = parseInt(results[{0}], 10);\n",s:"(-?\\d+)"}}});}());Ext.apply(Date.prototype,{dateFormat:function(format){if(Date.formatFunctions[format]==null){Date.createFormat(format);} +return Date.formatFunctions[format].call(this);},getTimezone:function(){return this.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,4})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/,"$1$2").replace(/[^A-Z]/g,"");},getGMTOffset:function(colon){return(this.getTimezoneOffset()>0?"-":"+") ++String.leftPad(Math.floor(Math.abs(this.getTimezoneOffset())/60),2,"0") ++(colon?":":"") ++String.leftPad(Math.abs(this.getTimezoneOffset()%60),2,"0");},getDayOfYear:function(){var num=0,d=this.clone(),m=this.getMonth(),i;for(i=0,d.setDate(1),d.setMonth(0);i<m;d.setMonth(++i)){num+=d.getDaysInMonth();} +return num+this.getDate()-1;},getWeekOfYear:function(){var ms1d=864e5,ms7d=7*ms1d;return function(){var DC3=Date.UTC(this.getFullYear(),this.getMonth(),this.getDate()+3)/ms1d,AWN=Math.floor(DC3/7),Wyr=new Date(AWN*ms7d).getUTCFullYear();return AWN-Math.floor(Date.UTC(Wyr,0,7)/ms7d)+1;};}(),isLeapYear:function(){var year=this.getFullYear();return!!((year&3)==0&&(year%100||(year%400==0&&year)));},getFirstDayOfMonth:function(){var day=(this.getDay()-(this.getDate()-1))%7;return(day<0)?(day+7):day;},getLastDayOfMonth:function(){return this.getLastDateOfMonth().getDay();},getFirstDateOfMonth:function(){return new Date(this.getFullYear(),this.getMonth(),1);},getLastDateOfMonth:function(){return new Date(this.getFullYear(),this.getMonth(),this.getDaysInMonth());},getDaysInMonth:function(){var daysInMonth=[31,28,31,30,31,30,31,31,30,31,30,31];return function(){var m=this.getMonth();return m==1&&this.isLeapYear()?29:daysInMonth[m];};}(),getSuffix:function(){switch(this.getDate()){case 1:case 21:case 31:return"st";case 2:case 22:return"nd";case 3:case 23:return"rd";default:return"th";}},clone:function(){return new Date(this.getTime());},isDST:function(){return new Date(this.getFullYear(),0,1).getTimezoneOffset()!=this.getTimezoneOffset();},clearTime:function(clone){if(clone){return this.clone().clearTime();} +var d=this.getDate();this.setHours(0);this.setMinutes(0);this.setSeconds(0);this.setMilliseconds(0);if(this.getDate()!=d){for(var hr=1,c=this.add(Date.HOUR,hr);c.getDate()!=d;hr++,c=this.add(Date.HOUR,hr));this.setDate(d);this.setHours(c.getHours());} +return this;},add:function(interval,value){var d=this.clone();if(!interval||value===0)return d;switch(interval.toLowerCase()){case Date.MILLI:d.setMilliseconds(this.getMilliseconds()+value);break;case Date.SECOND:d.setSeconds(this.getSeconds()+value);break;case Date.MINUTE:d.setMinutes(this.getMinutes()+value);break;case Date.HOUR:d.setHours(this.getHours()+value);break;case Date.DAY:d.setDate(this.getDate()+value);break;case Date.MONTH:var day=this.getDate();if(day>28){day=Math.min(day,this.getFirstDateOfMonth().add('mo',value).getLastDateOfMonth().getDate());} +d.setDate(day);d.setMonth(this.getMonth()+value);break;case Date.YEAR:d.setFullYear(this.getFullYear()+value);break;} +return d;},between:function(start,end){var t=this.getTime();return start.getTime()<=t&&t<=end.getTime();}});Date.prototype.format=Date.prototype.dateFormat;if(Ext.isSafari&&(navigator.userAgent.match(/WebKit\/(\d+)/)[1]||NaN)<420){Ext.apply(Date.prototype,{_xMonth:Date.prototype.setMonth,_xDate:Date.prototype.setDate,setMonth:function(num){if(num<=-1){var n=Math.ceil(-num),back_year=Math.ceil(n/12),month=(n%12)?12-n%12:0;this.setFullYear(this.getFullYear()-back_year);return this._xMonth(month);}else{return this._xMonth(num);}},setDate:function(d){return this.setTime(this.getTime()-(this.getDate()-d)*864e5);}});} +Ext.util.MixedCollection=function(allowFunctions,keyFn){this.items=[];this.map={};this.keys=[];this.length=0;this.addEvents('clear','add','replace','remove','sort');this.allowFunctions=allowFunctions===true;if(keyFn){this.getKey=keyFn;} +Ext.util.MixedCollection.superclass.constructor.call(this);};Ext.extend(Ext.util.MixedCollection,Ext.util.Observable,{allowFunctions:false,add:function(key,o){if(arguments.length==1){o=arguments[0];key=this.getKey(o);} +if(typeof key!='undefined'&&key!==null){var old=this.map[key];if(typeof old!='undefined'){return this.replace(key,o);} +this.map[key]=o;} +this.length++;this.items.push(o);this.keys.push(key);this.fireEvent('add',this.length-1,o,key);return o;},getKey:function(o){return o.id;},replace:function(key,o){if(arguments.length==1){o=arguments[0];key=this.getKey(o);} +var old=this.map[key];if(typeof key=='undefined'||key===null||typeof old=='undefined'){return this.add(key,o);} +var index=this.indexOfKey(key);this.items[index]=o;this.map[key]=o;this.fireEvent('replace',key,old,o);return o;},addAll:function(objs){if(arguments.length>1||Ext.isArray(objs)){var args=arguments.length>1?arguments:objs;for(var i=0,len=args.length;i<len;i++){this.add(args[i]);}}else{for(var key in objs){if(this.allowFunctions||typeof objs[key]!='function'){this.add(key,objs[key]);}}}},each:function(fn,scope){var items=[].concat(this.items);for(var i=0,len=items.length;i<len;i++){if(fn.call(scope||items[i],items[i],i,len)===false){break;}}},eachKey:function(fn,scope){for(var i=0,len=this.keys.length;i<len;i++){fn.call(scope||window,this.keys[i],this.items[i],i,len);}},find:function(fn,scope){for(var i=0,len=this.items.length;i<len;i++){if(fn.call(scope||window,this.items[i],this.keys[i])){return this.items[i];}} +return null;},insert:function(index,key,o){if(arguments.length==2){o=arguments[1];key=this.getKey(o);} +if(this.containsKey(key)){this.suspendEvents();this.removeKey(key);this.resumeEvents();} +if(index>=this.length){return this.add(key,o);} +this.length++;this.items.splice(index,0,o);if(typeof key!='undefined'&&key!==null){this.map[key]=o;} +this.keys.splice(index,0,key);this.fireEvent('add',index,o,key);return o;},remove:function(o){return this.removeAt(this.indexOf(o));},removeAt:function(index){if(index<this.length&&index>=0){this.length--;var o=this.items[index];this.items.splice(index,1);var key=this.keys[index];if(typeof key!='undefined'){delete this.map[key];} +this.keys.splice(index,1);this.fireEvent('remove',o,key);return o;} +return false;},removeKey:function(key){return this.removeAt(this.indexOfKey(key));},getCount:function(){return this.length;},indexOf:function(o){return this.items.indexOf(o);},indexOfKey:function(key){return this.keys.indexOf(key);},item:function(key){var mk=this.map[key],item=mk!==undefined?mk:(typeof key=='number')?this.items[key]:undefined;return typeof item!='function'||this.allowFunctions?item:null;},itemAt:function(index){return this.items[index];},key:function(key){return this.map[key];},contains:function(o){return this.indexOf(o)!=-1;},containsKey:function(key){return typeof this.map[key]!='undefined';},clear:function(){this.length=0;this.items=[];this.keys=[];this.map={};this.fireEvent('clear');},first:function(){return this.items[0];},last:function(){return this.items[this.length-1];},_sort:function(property,dir,fn){var i,len,dsc=String(dir).toUpperCase()=='DESC'?-1:1,c=[],keys=this.keys,items=this.items;fn=fn||function(a,b){return a-b;};for(i=0,len=items.length;i<len;i++){c[c.length]={key:keys[i],value:items[i],index:i};} +c.sort(function(a,b){var v=fn(a[property],b[property])*dsc;if(v===0){v=(a.index<b.index?-1:1);} +return v;});for(i=0,len=c.length;i<len;i++){items[i]=c[i].value;keys[i]=c[i].key;} +this.fireEvent('sort',this);},sort:function(dir,fn){this._sort('value',dir,fn);},reorder:function(mapping){this.suspendEvents();var items=this.items,index=0,length=items.length,order=[],remaining=[],oldIndex;for(oldIndex in mapping){order[mapping[oldIndex]]=items[oldIndex];} +for(index=0;index<length;index++){if(mapping[index]==undefined){remaining.push(items[index]);}} +for(index=0;index<length;index++){if(order[index]==undefined){order[index]=remaining.shift();}} +this.clear();this.addAll(order);this.resumeEvents();this.fireEvent('sort',this);},keySort:function(dir,fn){this._sort('key',dir,fn||function(a,b){var v1=String(a).toUpperCase(),v2=String(b).toUpperCase();return v1>v2?1:(v1<v2?-1:0);});},getRange:function(start,end){var items=this.items;if(items.length<1){return[];} +start=start||0;end=Math.min(typeof end=='undefined'?this.length-1:end,this.length-1);var i,r=[];if(start<=end){for(i=start;i<=end;i++){r[r.length]=items[i];}}else{for(i=start;i>=end;i--){r[r.length]=items[i];}} +return r;},filter:function(property,value,anyMatch,caseSensitive){if(Ext.isEmpty(value,false)){return this.clone();} +value=this.createValueMatcher(value,anyMatch,caseSensitive);return this.filterBy(function(o){return o&&value.test(o[property]);});},filterBy:function(fn,scope){var r=new Ext.util.MixedCollection();r.getKey=this.getKey;var k=this.keys,it=this.items;for(var i=0,len=it.length;i<len;i++){if(fn.call(scope||this,it[i],k[i])){r.add(k[i],it[i]);}} +return r;},findIndex:function(property,value,start,anyMatch,caseSensitive){if(Ext.isEmpty(value,false)){return-1;} +value=this.createValueMatcher(value,anyMatch,caseSensitive);return this.findIndexBy(function(o){return o&&value.test(o[property]);},null,start);},findIndexBy:function(fn,scope,start){var k=this.keys,it=this.items;for(var i=(start||0),len=it.length;i<len;i++){if(fn.call(scope||this,it[i],k[i])){return i;}} +return-1;},createValueMatcher:function(value,anyMatch,caseSensitive,exactMatch){if(!value.exec){var er=Ext.escapeRe;value=String(value);if(anyMatch===true){value=er(value);}else{value='^'+er(value);if(exactMatch===true){value+='$';}} +value=new RegExp(value,caseSensitive?'':'i');} +return value;},clone:function(){var r=new Ext.util.MixedCollection();var k=this.keys,it=this.items;for(var i=0,len=it.length;i<len;i++){r.add(k[i],it[i]);} +r.getKey=this.getKey;return r;}});Ext.util.MixedCollection.prototype.get=Ext.util.MixedCollection.prototype.item;Ext.AbstractManager=Ext.extend(Object,{typeName:'type',constructor:function(config){Ext.apply(this,config||{});this.all=new Ext.util.MixedCollection();this.types={};},get:function(id){return this.all.get(id);},register:function(item){this.all.add(item);},unregister:function(item){this.all.remove(item);},registerType:function(type,cls){this.types[type]=cls;cls[this.typeName]=type;},isRegistered:function(type){return this.types[type]!==undefined;},create:function(config,defaultType){var type=config[this.typeName]||config.type||defaultType,Constructor=this.types[type];if(Constructor==undefined){throw new Error(String.format("The '{0}' type has not been registered with this manager",type));} +return new Constructor(config);},onAvailable:function(id,fn,scope){var all=this.all;all.on("add",function(index,o){if(o.id==id){fn.call(scope||o,o);all.un("add",fn,scope);}});}});Ext.util.Format=function(){var trimRe=/^\s+|\s+$/g,stripTagsRE=/<\/?[^>]+>/gi,stripScriptsRe=/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig,nl2brRe=/\r?\n/g;return{ellipsis:function(value,len,word){if(value&&value.length>len){if(word){var vs=value.substr(0,len-2),index=Math.max(vs.lastIndexOf(' '),vs.lastIndexOf('.'),vs.lastIndexOf('!'),vs.lastIndexOf('?'));if(index==-1||index<(len-15)){return value.substr(0,len-3)+"...";}else{return vs.substr(0,index)+"...";}}else{return value.substr(0,len-3)+"...";}} +return value;},undef:function(value){return value!==undefined?value:"";},defaultValue:function(value,defaultValue){return value!==undefined&&value!==''?value:defaultValue;},htmlEncode:function(value){return!value?value:String(value).replace(/&/g,"&").replace(/>/g,">").replace(/</g,"<").replace(/"/g,""");},htmlDecode:function(value){return!value?value:String(value).replace(/>/g,">").replace(/</g,"<").replace(/"/g,'"').replace(/&/g,"&");},trim:function(value){return String(value).replace(trimRe,"");},substr:function(value,start,length){return String(value).substr(start,length);},lowercase:function(value){return String(value).toLowerCase();},uppercase:function(value){return String(value).toUpperCase();},capitalize:function(value){return!value?value:value.charAt(0).toUpperCase()+value.substr(1).toLowerCase();},call:function(value,fn){if(arguments.length>2){var args=Array.prototype.slice.call(arguments,2);args.unshift(value);return eval(fn).apply(window,args);}else{return eval(fn).call(window,value);}},usMoney:function(v){v=(Math.round((v-0)*100))/100;v=(v==Math.floor(v))?v+".00":((v*10==Math.floor(v*10))?v+"0":v);v=String(v);var ps=v.split('.'),whole=ps[0],sub=ps[1]?'.'+ps[1]:'.00',r=/(\d+)(\d{3})/;while(r.test(whole)){whole=whole.replace(r,'$1'+','+'$2');} +v=whole+sub;if(v.charAt(0)=='-'){return'-$'+v.substr(1);} +return"$"+v;},date:function(v,format){if(!v){return"";} +if(!Ext.isDate(v)){v=new Date(Date.parse(v));} +return v.dateFormat(format||"m/d/Y");},dateRenderer:function(format){return function(v){return Ext.util.Format.date(v,format);};},stripTags:function(v){return!v?v:String(v).replace(stripTagsRE,"");},stripScripts:function(v){return!v?v:String(v).replace(stripScriptsRe,"");},fileSize:function(size){if(size<1024){return size+" bytes";}else if(size<1048576){return(Math.round(((size*10)/1024))/10)+" KB";}else{return(Math.round(((size*10)/1048576))/10)+" MB";}},math:function(){var fns={};return function(v,a){if(!fns[a]){fns[a]=new Function('v','return v '+a+';');} +return fns[a](v);};}(),round:function(value,precision){var result=Number(value);if(typeof precision=='number'){precision=Math.pow(10,precision);result=Math.round(value*precision)/precision;} +return result;},number:function(v,format){if(!format){return v;} +v=Ext.num(v,NaN);if(isNaN(v)){return'';} +var comma=',',dec='.',i18n=false,neg=v<0;v=Math.abs(v);if(format.substr(format.length-2)=='/i'){format=format.substr(0,format.length-2);i18n=true;comma='.';dec=',';} +var hasComma=format.indexOf(comma)!=-1,psplit=(i18n?format.replace(/[^\d\,]/g,''):format.replace(/[^\d\.]/g,'')).split(dec);if(1<psplit.length){v=v.toFixed(psplit[1].length);}else if(2<psplit.length){throw('NumberFormatException: invalid format, formats should have no more than 1 period: '+format);}else{v=v.toFixed(0);} +var fnum=v.toString();psplit=fnum.split('.');if(hasComma){var cnum=psplit[0],parr=[],j=cnum.length,m=Math.floor(j/3),n=cnum.length%3||3,i;for(i=0;i<j;i+=n){if(i!=0){n=3;} +parr[parr.length]=cnum.substr(i,n);m-=1;} +fnum=parr.join(comma);if(psplit[1]){fnum+=dec+psplit[1];}}else{if(psplit[1]){fnum=psplit[0]+dec+psplit[1];}} +return(neg?'-':'')+format.replace(/[\d,?\.?]+/,fnum);},numberRenderer:function(format){return function(v){return Ext.util.Format.number(v,format);};},plural:function(v,s,p){return v+' '+(v==1?s:(p?p:s+'s'));},nl2br:function(v){return Ext.isEmpty(v)?'':v.replace(nl2brRe,'<br/>');}};}();Ext.XTemplate=function(){Ext.XTemplate.superclass.constructor.apply(this,arguments);var me=this,s=me.html,re=/<tpl\b[^>]*>((?:(?=([^<]+))\2|<(?!tpl\b[^>]*>))*?)<\/tpl>/,nameRe=/^<tpl\b[^>]*?for="(.*?)"/,ifRe=/^<tpl\b[^>]*?if="(.*?)"/,execRe=/^<tpl\b[^>]*?exec="(.*?)"/,m,id=0,tpls=[],VALUES='values',PARENT='parent',XINDEX='xindex',XCOUNT='xcount',RETURN='return ',WITHVALUES='with(values){ ';s=['<tpl>',s,'</tpl>'].join('');while((m=s.match(re))){var m2=m[0].match(nameRe),m3=m[0].match(ifRe),m4=m[0].match(execRe),exp=null,fn=null,exec=null,name=m2&&m2[1]?m2[1]:'';if(m3){exp=m3&&m3[1]?m3[1]:null;if(exp){fn=new Function(VALUES,PARENT,XINDEX,XCOUNT,WITHVALUES+RETURN+(Ext.util.Format.htmlDecode(exp))+'; }');}} +if(m4){exp=m4&&m4[1]?m4[1]:null;if(exp){exec=new Function(VALUES,PARENT,XINDEX,XCOUNT,WITHVALUES+(Ext.util.Format.htmlDecode(exp))+'; }');}} +if(name){switch(name){case'.':name=new Function(VALUES,PARENT,WITHVALUES+RETURN+VALUES+'; }');break;case'..':name=new Function(VALUES,PARENT,WITHVALUES+RETURN+PARENT+'; }');break;default:name=new Function(VALUES,PARENT,WITHVALUES+RETURN+name+'; }');}} +tpls.push({id:id,target:name,exec:exec,test:fn,body:m[1]||''});s=s.replace(m[0],'{xtpl'+id+'}');++id;} +for(var i=tpls.length-1;i>=0;--i){me.compileTpl(tpls[i]);} +me.master=tpls[tpls.length-1];me.tpls=tpls;};Ext.extend(Ext.XTemplate,Ext.Template,{re:/\{([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\\]\s?[\d\.\+\-\*\\\(\)]+)?\}/g,codeRe:/\{\[((?:\\\]|.|\n)*?)\]\}/g,applySubTemplate:function(id,values,parent,xindex,xcount){var me=this,len,t=me.tpls[id],vs,buf=[];if((t.test&&!t.test.call(me,values,parent,xindex,xcount))||(t.exec&&t.exec.call(me,values,parent,xindex,xcount))){return'';} +vs=t.target?t.target.call(me,values,parent):values;len=vs.length;parent=t.target?values:parent;if(t.target&&Ext.isArray(vs)){for(var i=0,len=vs.length;i<len;i++){buf[buf.length]=t.compiled.call(me,vs[i],parent,i+1,len);} +return buf.join('');} +return t.compiled.call(me,vs,parent,xindex,xcount);},compileTpl:function(tpl){var fm=Ext.util.Format,useF=this.disableFormats!==true,sep=Ext.isGecko?"+":",",body;function fn(m,name,format,args,math){if(name.substr(0,4)=='xtpl'){return"'"+sep+'this.applySubTemplate('+name.substr(4)+', values, parent, xindex, xcount)'+sep+"'";} +var v;if(name==='.'){v='values';}else if(name==='#'){v='xindex';}else if(name.indexOf('.')!=-1){v=name;}else{v="values['"+name+"']";} +if(math){v='('+v+math+')';} +if(format&&useF){args=args?','+args:"";if(format.substr(0,5)!="this."){format="fm."+format+'(';}else{format='this.call("'+format.substr(5)+'", ';args=", values";}}else{args='';format="("+v+" === undefined ? '' : ";} +return"'"+sep+format+v+args+")"+sep+"'";} +function codeFn(m,code){return"'"+sep+'('+code.replace(/\\'/g,"'")+')'+sep+"'";} +if(Ext.isGecko){body="tpl.compiled = function(values, parent, xindex, xcount){ return '"+ +tpl.body.replace(/(\r\n|\n)/g,'\\n').replace(/'/g,"\\'").replace(this.re,fn).replace(this.codeRe,codeFn)+"';};";}else{body=["tpl.compiled = function(values, parent, xindex, xcount){ return ['"];body.push(tpl.body.replace(/(\r\n|\n)/g,'\\n').replace(/'/g,"\\'").replace(this.re,fn).replace(this.codeRe,codeFn));body.push("'].join('');};");body=body.join('');} +eval(body);return this;},applyTemplate:function(values){return this.master.compiled.call(this,values,{},1,1);},compile:function(){return this;}});Ext.XTemplate.prototype.apply=Ext.XTemplate.prototype.applyTemplate;Ext.XTemplate.from=function(el){el=Ext.getDom(el);return new Ext.XTemplate(el.value||el.innerHTML);};Ext.util.CSS=function(){var rules=null;var doc=document;var camelRe=/(-[a-z])/gi;var camelFn=function(m,a){return a.charAt(1).toUpperCase();};return{createStyleSheet:function(cssText,id){var ss;var head=doc.getElementsByTagName("head")[0];var rules=doc.createElement("style");rules.setAttribute("type","text/css");if(id){rules.setAttribute("id",id);} +if(Ext.isIE){head.appendChild(rules);ss=rules.styleSheet;ss.cssText=cssText;}else{try{rules.appendChild(doc.createTextNode(cssText));}catch(e){rules.cssText=cssText;} +head.appendChild(rules);ss=rules.styleSheet?rules.styleSheet:(rules.sheet||doc.styleSheets[doc.styleSheets.length-1]);} +this.cacheStyleSheet(ss);return ss;},removeStyleSheet:function(id){var existing=doc.getElementById(id);if(existing){existing.parentNode.removeChild(existing);}},swapStyleSheet:function(id,url){this.removeStyleSheet(id);var ss=doc.createElement("link");ss.setAttribute("rel","stylesheet");ss.setAttribute("type","text/css");ss.setAttribute("id",id);ss.setAttribute("href",url);doc.getElementsByTagName("head")[0].appendChild(ss);},refreshCache:function(){return this.getRules(true);},cacheStyleSheet:function(ss){if(!rules){rules={};} +try{var ssRules=ss.cssRules||ss.rules;for(var j=ssRules.length-1;j>=0;--j){rules[ssRules[j].selectorText.toLowerCase()]=ssRules[j];}}catch(e){}},getRules:function(refreshCache){if(rules===null||refreshCache){rules={};var ds=doc.styleSheets;for(var i=0,len=ds.length;i<len;i++){try{this.cacheStyleSheet(ds[i]);}catch(e){}}} +return rules;},getRule:function(selector,refreshCache){var rs=this.getRules(refreshCache);if(!Ext.isArray(selector)){return rs[selector.toLowerCase()];} +for(var i=0;i<selector.length;i++){if(rs[selector[i]]){return rs[selector[i].toLowerCase()];}} +return null;},updateRule:function(selector,property,value){if(!Ext.isArray(selector)){var rule=this.getRule(selector);if(rule){rule.style[property.replace(camelRe,camelFn)]=value;return true;}}else{for(var i=0;i<selector.length;i++){if(this.updateRule(selector[i],property,value)){return true;}}} +return false;}};}();Ext.util.ClickRepeater=Ext.extend(Ext.util.Observable,{constructor:function(el,config){this.el=Ext.get(el);this.el.unselectable();Ext.apply(this,config);this.addEvents("mousedown","click","mouseup");if(!this.disabled){this.disabled=true;this.enable();} +if(this.handler){this.on("click",this.handler,this.scope||this);} +Ext.util.ClickRepeater.superclass.constructor.call(this);},interval:20,delay:250,preventDefault:true,stopDefault:false,timer:0,enable:function(){if(this.disabled){this.el.on('mousedown',this.handleMouseDown,this);if(Ext.isIE){this.el.on('dblclick',this.handleDblClick,this);} +if(this.preventDefault||this.stopDefault){this.el.on('click',this.eventOptions,this);}} +this.disabled=false;},disable:function(force){if(force||!this.disabled){clearTimeout(this.timer);if(this.pressClass){this.el.removeClass(this.pressClass);} +Ext.getDoc().un('mouseup',this.handleMouseUp,this);this.el.removeAllListeners();} +this.disabled=true;},setDisabled:function(disabled){this[disabled?'disable':'enable']();},eventOptions:function(e){if(this.preventDefault){e.preventDefault();} +if(this.stopDefault){e.stopEvent();}},destroy:function(){this.disable(true);Ext.destroy(this.el);this.purgeListeners();},handleDblClick:function(e){clearTimeout(this.timer);this.el.blur();this.fireEvent("mousedown",this,e);this.fireEvent("click",this,e);},handleMouseDown:function(e){clearTimeout(this.timer);this.el.blur();if(this.pressClass){this.el.addClass(this.pressClass);} +this.mousedownTime=new Date();Ext.getDoc().on("mouseup",this.handleMouseUp,this);this.el.on("mouseout",this.handleMouseOut,this);this.fireEvent("mousedown",this,e);this.fireEvent("click",this,e);if(this.accelerate){this.delay=400;} +this.timer=this.click.defer(this.delay||this.interval,this,[e]);},click:function(e){this.fireEvent("click",this,e);this.timer=this.click.defer(this.accelerate?this.easeOutExpo(this.mousedownTime.getElapsed(),400,-390,12000):this.interval,this,[e]);},easeOutExpo:function(t,b,c,d){return(t==d)?b+c:c*(-Math.pow(2,-10*t/d)+1)+b;},handleMouseOut:function(){clearTimeout(this.timer);if(this.pressClass){this.el.removeClass(this.pressClass);} +this.el.on("mouseover",this.handleMouseReturn,this);},handleMouseReturn:function(){this.el.un("mouseover",this.handleMouseReturn,this);if(this.pressClass){this.el.addClass(this.pressClass);} +this.click();},handleMouseUp:function(e){clearTimeout(this.timer);this.el.un("mouseover",this.handleMouseReturn,this);this.el.un("mouseout",this.handleMouseOut,this);Ext.getDoc().un("mouseup",this.handleMouseUp,this);this.el.removeClass(this.pressClass);this.fireEvent("mouseup",this,e);}});Ext.KeyNav=function(el,config){this.el=Ext.get(el);Ext.apply(this,config);if(!this.disabled){this.disabled=true;this.enable();}};Ext.KeyNav.prototype={disabled:false,defaultEventAction:"stopEvent",forceKeyDown:false,relay:function(e){var k=e.getKey(),h=this.keyToHandler[k];if(h&&this[h]){if(this.doRelay(e,this[h],h)!==true){e[this.defaultEventAction]();}}},doRelay:function(e,h,hname){return h.call(this.scope||this,e,hname);},enter:false,left:false,right:false,up:false,down:false,tab:false,esc:false,pageUp:false,pageDown:false,del:false,home:false,end:false,keyToHandler:{37:"left",39:"right",38:"up",40:"down",33:"pageUp",34:"pageDown",46:"del",36:"home",35:"end",13:"enter",27:"esc",9:"tab"},stopKeyUp:function(e){var k=e.getKey();if(k>=37&&k<=40){e.stopEvent();}},destroy:function(){this.disable();},enable:function(){if(this.disabled){if(Ext.isSafari2){this.el.on('keyup',this.stopKeyUp,this);} +this.el.on(this.isKeydown()?'keydown':'keypress',this.relay,this);this.disabled=false;}},disable:function(){if(!this.disabled){if(Ext.isSafari2){this.el.un('keyup',this.stopKeyUp,this);} +this.el.un(this.isKeydown()?'keydown':'keypress',this.relay,this);this.disabled=true;}},setDisabled:function(disabled){this[disabled?"disable":"enable"]();},isKeydown:function(){return this.forceKeyDown||Ext.EventManager.useKeydown;}};Ext.KeyMap=function(el,config,eventName){this.el=Ext.get(el);this.eventName=eventName||"keydown";this.bindings=[];if(config){this.addBinding(config);} +this.enable();};Ext.KeyMap.prototype={stopEvent:false,addBinding:function(config){if(Ext.isArray(config)){Ext.each(config,function(c){this.addBinding(c);},this);return;} +var keyCode=config.key,fn=config.fn||config.handler,scope=config.scope;if(config.stopEvent){this.stopEvent=config.stopEvent;} +if(typeof keyCode=="string"){var ks=[];var keyString=keyCode.toUpperCase();for(var j=0,len=keyString.length;j<len;j++){ks.push(keyString.charCodeAt(j));} +keyCode=ks;} +var keyArray=Ext.isArray(keyCode);var handler=function(e){if(this.checkModifiers(config,e)){var k=e.getKey();if(keyArray){for(var i=0,len=keyCode.length;i<len;i++){if(keyCode[i]==k){if(this.stopEvent){e.stopEvent();} +fn.call(scope||window,k,e);return;}}}else{if(k==keyCode){if(this.stopEvent){e.stopEvent();} +fn.call(scope||window,k,e);}}}};this.bindings.push(handler);},checkModifiers:function(config,e){var val,key,keys=['shift','ctrl','alt'];for(var i=0,len=keys.length;i<len;++i){key=keys[i];val=config[key];if(!(val===undefined||(val===e[key+'Key']))){return false;}} +return true;},on:function(key,fn,scope){var keyCode,shift,ctrl,alt;if(typeof key=="object"&&!Ext.isArray(key)){keyCode=key.key;shift=key.shift;ctrl=key.ctrl;alt=key.alt;}else{keyCode=key;} +this.addBinding({key:keyCode,shift:shift,ctrl:ctrl,alt:alt,fn:fn,scope:scope});},handleKeyDown:function(e){if(this.enabled){var b=this.bindings;for(var i=0,len=b.length;i<len;i++){b[i].call(this,e);}}},isEnabled:function(){return this.enabled;},enable:function(){if(!this.enabled){this.el.on(this.eventName,this.handleKeyDown,this);this.enabled=true;}},disable:function(){if(this.enabled){this.el.removeListener(this.eventName,this.handleKeyDown,this);this.enabled=false;}},setDisabled:function(disabled){this[disabled?"disable":"enable"]();}};Ext.util.TextMetrics=function(){var shared;return{measure:function(el,text,fixedWidth){if(!shared){shared=Ext.util.TextMetrics.Instance(el,fixedWidth);} +shared.bind(el);shared.setFixedWidth(fixedWidth||'auto');return shared.getSize(text);},createInstance:function(el,fixedWidth){return Ext.util.TextMetrics.Instance(el,fixedWidth);}};}();Ext.util.TextMetrics.Instance=function(bindTo,fixedWidth){var ml=new Ext.Element(document.createElement('div'));document.body.appendChild(ml.dom);ml.position('absolute');ml.setLeftTop(-1000,-1000);ml.hide();if(fixedWidth){ml.setWidth(fixedWidth);} +var instance={getSize:function(text){ml.update(text);var s=ml.getSize();ml.update('');return s;},bind:function(el){ml.setStyle(Ext.fly(el).getStyles('font-size','font-style','font-weight','font-family','line-height','text-transform','letter-spacing'));},setFixedWidth:function(width){ml.setWidth(width);},getWidth:function(text){ml.dom.style.width='auto';return this.getSize(text).width;},getHeight:function(text){return this.getSize(text).height;}};instance.bind(bindTo);return instance;};Ext.Element.addMethods({getTextWidth:function(text,min,max){return(Ext.util.TextMetrics.measure(this.dom,Ext.value(text,this.dom.innerHTML,true)).width).constrain(min||0,max||1000000);}});Ext.util.Cookies={set:function(name,value){var argv=arguments;var argc=arguments.length;var expires=(argc>2)?argv[2]:null;var path=(argc>3)?argv[3]:'/';var domain=(argc>4)?argv[4]:null;var secure=(argc>5)?argv[5]:false;document.cookie=name+"="+escape(value)+((expires===null)?"":("; expires="+expires.toGMTString()))+((path===null)?"":("; path="+path))+((domain===null)?"":("; domain="+domain))+((secure===true)?"; secure":"");},get:function(name){var arg=name+"=";var alen=arg.length;var clen=document.cookie.length;var i=0;var j=0;while(i<clen){j=i+alen;if(document.cookie.substring(i,j)==arg){return Ext.util.Cookies.getCookieVal(j);} +i=document.cookie.indexOf(" ",i)+1;if(i===0){break;}} +return null;},clear:function(name){if(Ext.util.Cookies.get(name)){document.cookie=name+"="+"; expires=Thu, 01-Jan-70 00:00:01 GMT";}},getCookieVal:function(offset){var endstr=document.cookie.indexOf(";",offset);if(endstr==-1){endstr=document.cookie.length;} +return unescape(document.cookie.substring(offset,endstr));}};Ext.handleError=function(e){throw e;};Ext.Error=function(message){this.message=(this.lang[message])?this.lang[message]:message;};Ext.Error.prototype=new Error();Ext.apply(Ext.Error.prototype,{lang:{},name:'Ext.Error',getName:function(){return this.name;},getMessage:function(){return this.message;},toJson:function(){return Ext.encode(this);}});Ext.ComponentMgr=function(){var all=new Ext.util.MixedCollection();var types={};var ptypes={};return{register:function(c){all.add(c);},unregister:function(c){all.remove(c);},get:function(id){return all.get(id);},onAvailable:function(id,fn,scope){all.on("add",function(index,o){if(o.id==id){fn.call(scope||o,o);all.un("add",fn,scope);}});},all:all,types:types,ptypes:ptypes,isRegistered:function(xtype){return types[xtype]!==undefined;},isPluginRegistered:function(ptype){return ptypes[ptype]!==undefined;},registerType:function(xtype,cls){types[xtype]=cls;cls.xtype=xtype;},create:function(config,defaultType){return config.render?config:new types[config.xtype||defaultType](config);},registerPlugin:function(ptype,cls){ptypes[ptype]=cls;cls.ptype=ptype;},createPlugin:function(config,defaultType){var PluginCls=ptypes[config.ptype||defaultType];if(PluginCls.init){return PluginCls;}else{return new PluginCls(config);}}};}();Ext.reg=Ext.ComponentMgr.registerType;Ext.preg=Ext.ComponentMgr.registerPlugin;Ext.create=Ext.ComponentMgr.create;Ext.Component=function(config){config=config||{};if(config.initialConfig){if(config.isAction){this.baseAction=config;} +config=config.initialConfig;}else if(config.tagName||config.dom||Ext.isString(config)){config={applyTo:config,id:config.id||config};} +this.initialConfig=config;Ext.apply(this,config);this.addEvents('added','disable','enable','beforeshow','show','beforehide','hide','removed','beforerender','render','afterrender','beforedestroy','destroy','beforestaterestore','staterestore','beforestatesave','statesave');this.getId();Ext.ComponentMgr.register(this);Ext.Component.superclass.constructor.call(this);if(this.baseAction){this.baseAction.addComponent(this);} +this.initComponent();if(this.plugins){if(Ext.isArray(this.plugins)){for(var i=0,len=this.plugins.length;i<len;i++){this.plugins[i]=this.initPlugin(this.plugins[i]);}}else{this.plugins=this.initPlugin(this.plugins);}} +if(this.stateful!==false){this.initState();} +if(this.applyTo){this.applyToMarkup(this.applyTo);delete this.applyTo;}else if(this.renderTo){this.render(this.renderTo);delete this.renderTo;}};Ext.Component.AUTO_ID=1000;Ext.extend(Ext.Component,Ext.util.Observable,{disabled:false,hidden:false,autoEl:'div',disabledClass:'x-item-disabled',allowDomMove:true,autoShow:false,hideMode:'display',hideParent:false,rendered:false,tplWriteMode:'overwrite',bubbleEvents:[],ctype:'Ext.Component',actionMode:'el',getActionEl:function(){return this[this.actionMode];},initPlugin:function(p){if(p.ptype&&!Ext.isFunction(p.init)){p=Ext.ComponentMgr.createPlugin(p);}else if(Ext.isString(p)){p=Ext.ComponentMgr.createPlugin({ptype:p});} +p.init(this);return p;},initComponent:function(){if(this.listeners){this.on(this.listeners);delete this.listeners;} +this.enableBubble(this.bubbleEvents);},render:function(container,position){if(!this.rendered&&this.fireEvent('beforerender',this)!==false){if(!container&&this.el){this.el=Ext.get(this.el);container=this.el.dom.parentNode;this.allowDomMove=false;} +this.container=Ext.get(container);if(this.ctCls){this.container.addClass(this.ctCls);} +this.rendered=true;if(position!==undefined){if(Ext.isNumber(position)){position=this.container.dom.childNodes[position];}else{position=Ext.getDom(position);}} +this.onRender(this.container,position||null);if(this.autoShow){this.el.removeClass(['x-hidden','x-hide-'+this.hideMode]);} +if(this.cls){this.el.addClass(this.cls);delete this.cls;} +if(this.style){this.el.applyStyles(this.style);delete this.style;} +if(this.overCls){this.el.addClassOnOver(this.overCls);} +this.fireEvent('render',this);var contentTarget=this.getContentTarget();if(this.html){contentTarget.update(Ext.DomHelper.markup(this.html));delete this.html;} +if(this.contentEl){var ce=Ext.getDom(this.contentEl);Ext.fly(ce).removeClass(['x-hidden','x-hide-display']);contentTarget.appendChild(ce);} +if(this.tpl){if(!this.tpl.compile){this.tpl=new Ext.XTemplate(this.tpl);} +if(this.data){this.tpl[this.tplWriteMode](contentTarget,this.data);delete this.data;}} +this.afterRender(this.container);if(this.hidden){this.doHide();} +if(this.disabled){this.disable(true);} +if(this.stateful!==false){this.initStateEvents();} +this.fireEvent('afterrender',this);} +return this;},update:function(htmlOrData,loadScripts,cb){var contentTarget=this.getContentTarget();if(this.tpl&&typeof htmlOrData!=="string"){this.tpl[this.tplWriteMode](contentTarget,htmlOrData||{});}else{var html=Ext.isObject(htmlOrData)?Ext.DomHelper.markup(htmlOrData):htmlOrData;contentTarget.update(html,loadScripts,cb);}},onAdded:function(container,pos){this.ownerCt=container;this.initRef();this.fireEvent('added',this,container,pos);},onRemoved:function(){this.removeRef();this.fireEvent('removed',this,this.ownerCt);delete this.ownerCt;},initRef:function(){if(this.ref&&!this.refOwner){var levels=this.ref.split('/'),last=levels.length,i=0,t=this;while(t&&i<last){t=t.ownerCt;++i;} +if(t){t[this.refName=levels[--i]]=this;this.refOwner=t;}}},removeRef:function(){if(this.refOwner&&this.refName){delete this.refOwner[this.refName];delete this.refOwner;}},initState:function(){if(Ext.state.Manager){var id=this.getStateId();if(id){var state=Ext.state.Manager.get(id);if(state){if(this.fireEvent('beforestaterestore',this,state)!==false){this.applyState(Ext.apply({},state));this.fireEvent('staterestore',this,state);}}}}},getStateId:function(){return this.stateId||((/^(ext-comp-|ext-gen)/).test(String(this.id))?null:this.id);},initStateEvents:function(){if(this.stateEvents){for(var i=0,e;e=this.stateEvents[i];i++){this.on(e,this.saveState,this,{delay:100});}}},applyState:function(state){if(state){Ext.apply(this,state);}},getState:function(){return null;},saveState:function(){if(Ext.state.Manager&&this.stateful!==false){var id=this.getStateId();if(id){var state=this.getState();if(this.fireEvent('beforestatesave',this,state)!==false){Ext.state.Manager.set(id,state);this.fireEvent('statesave',this,state);}}}},applyToMarkup:function(el){this.allowDomMove=false;this.el=Ext.get(el);this.render(this.el.dom.parentNode);},addClass:function(cls){if(this.el){this.el.addClass(cls);}else{this.cls=this.cls?this.cls+' '+cls:cls;} +return this;},removeClass:function(cls){if(this.el){this.el.removeClass(cls);}else if(this.cls){this.cls=this.cls.split(' ').remove(cls).join(' ');} +return this;},onRender:function(ct,position){if(!this.el&&this.autoEl){if(Ext.isString(this.autoEl)){this.el=document.createElement(this.autoEl);}else{var div=document.createElement('div');Ext.DomHelper.overwrite(div,this.autoEl);this.el=div.firstChild;} +if(!this.el.id){this.el.id=this.getId();}} +if(this.el){this.el=Ext.get(this.el);if(this.allowDomMove!==false){ct.dom.insertBefore(this.el.dom,position);if(div){Ext.removeNode(div);div=null;}}}},getAutoCreate:function(){var cfg=Ext.isObject(this.autoCreate)?this.autoCreate:Ext.apply({},this.defaultAutoCreate);if(this.id&&!cfg.id){cfg.id=this.id;} +return cfg;},afterRender:Ext.emptyFn,destroy:function(){if(!this.isDestroyed){if(this.fireEvent('beforedestroy',this)!==false){this.destroying=true;this.beforeDestroy();if(this.ownerCt&&this.ownerCt.remove){this.ownerCt.remove(this,false);} +if(this.rendered){this.el.remove();if(this.actionMode=='container'||this.removeMode=='container'){this.container.remove();}} +if(this.focusTask&&this.focusTask.cancel){this.focusTask.cancel();} +this.onDestroy();Ext.ComponentMgr.unregister(this);this.fireEvent('destroy',this);this.purgeListeners();this.destroying=false;this.isDestroyed=true;}}},deleteMembers:function(){var args=arguments;for(var i=0,len=args.length;i<len;++i){delete this[args[i]];}},beforeDestroy:Ext.emptyFn,onDestroy:Ext.emptyFn,getEl:function(){return this.el;},getContentTarget:function(){return this.el;},getId:function(){return this.id||(this.id='ext-comp-'+(++Ext.Component.AUTO_ID));},getItemId:function(){return this.itemId||this.getId();},focus:function(selectText,delay){if(delay){this.focusTask=new Ext.util.DelayedTask(this.focus,this,[selectText,false]);this.focusTask.delay(Ext.isNumber(delay)?delay:10);return this;} +if(this.rendered&&!this.isDestroyed){this.el.focus();if(selectText===true){this.el.dom.select();}} +return this;},blur:function(){if(this.rendered){this.el.blur();} +return this;},disable:function(silent){if(this.rendered){this.onDisable();} +this.disabled=true;if(silent!==true){this.fireEvent('disable',this);} +return this;},onDisable:function(){this.getActionEl().addClass(this.disabledClass);this.el.dom.disabled=true;},enable:function(){if(this.rendered){this.onEnable();} +this.disabled=false;this.fireEvent('enable',this);return this;},onEnable:function(){this.getActionEl().removeClass(this.disabledClass);this.el.dom.disabled=false;},setDisabled:function(disabled){return this[disabled?'disable':'enable']();},show:function(){if(this.fireEvent('beforeshow',this)!==false){this.hidden=false;if(this.autoRender){this.render(Ext.isBoolean(this.autoRender)?Ext.getBody():this.autoRender);} +if(this.rendered){this.onShow();} +this.fireEvent('show',this);} +return this;},onShow:function(){this.getVisibilityEl().removeClass('x-hide-'+this.hideMode);},hide:function(){if(this.fireEvent('beforehide',this)!==false){this.doHide();this.fireEvent('hide',this);} +return this;},doHide:function(){this.hidden=true;if(this.rendered){this.onHide();}},onHide:function(){this.getVisibilityEl().addClass('x-hide-'+this.hideMode);},getVisibilityEl:function(){return this.hideParent?this.container:this.getActionEl();},setVisible:function(visible){return this[visible?'show':'hide']();},isVisible:function(){return this.rendered&&this.getVisibilityEl().isVisible();},cloneConfig:function(overrides){overrides=overrides||{};var id=overrides.id||Ext.id();var cfg=Ext.applyIf(overrides,this.initialConfig);cfg.id=id;return new this.constructor(cfg);},getXType:function(){return this.constructor.xtype;},isXType:function(xtype,shallow){if(Ext.isFunction(xtype)){xtype=xtype.xtype;}else if(Ext.isObject(xtype)){xtype=xtype.constructor.xtype;} +return!shallow?('/'+this.getXTypes()+'/').indexOf('/'+xtype+'/')!=-1:this.constructor.xtype==xtype;},getXTypes:function(){var tc=this.constructor;if(!tc.xtypes){var c=[],sc=this;while(sc&&sc.constructor.xtype){c.unshift(sc.constructor.xtype);sc=sc.constructor.superclass;} +tc.xtypeChain=c;tc.xtypes=c.join('/');} +return tc.xtypes;},findParentBy:function(fn){for(var p=this.ownerCt;(p!=null)&&!fn(p,this);p=p.ownerCt);return p||null;},findParentByType:function(xtype,shallow){return this.findParentBy(function(c){return c.isXType(xtype,shallow);});},bubble:function(fn,scope,args){var p=this;while(p){if(fn.apply(scope||p,args||[p])===false){break;} +p=p.ownerCt;} +return this;},getPositionEl:function(){return this.positionEl||this.el;},purgeListeners:function(){Ext.Component.superclass.purgeListeners.call(this);if(this.mons){this.on('beforedestroy',this.clearMons,this,{single:true});}},clearMons:function(){Ext.each(this.mons,function(m){m.item.un(m.ename,m.fn,m.scope);},this);this.mons=[];},createMons:function(){if(!this.mons){this.mons=[];this.on('beforedestroy',this.clearMons,this,{single:true});}},mon:function(item,ename,fn,scope,opt){this.createMons();if(Ext.isObject(ename)){var propRe=/^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/;var o=ename;for(var e in o){if(propRe.test(e)){continue;} +if(Ext.isFunction(o[e])){this.mons.push({item:item,ename:e,fn:o[e],scope:o.scope});item.on(e,o[e],o.scope,o);}else{this.mons.push({item:item,ename:e,fn:o[e],scope:o.scope});item.on(e,o[e]);}} +return;} +this.mons.push({item:item,ename:ename,fn:fn,scope:scope});item.on(ename,fn,scope,opt);},mun:function(item,ename,fn,scope){var found,mon;this.createMons();for(var i=0,len=this.mons.length;i<len;++i){mon=this.mons[i];if(item===mon.item&&ename==mon.ename&&fn===mon.fn&&scope===mon.scope){this.mons.splice(i,1);item.un(ename,fn,scope);found=true;break;}} +return found;},nextSibling:function(){if(this.ownerCt){var index=this.ownerCt.items.indexOf(this);if(index!=-1&&index+1<this.ownerCt.items.getCount()){return this.ownerCt.items.itemAt(index+1);}} +return null;},previousSibling:function(){if(this.ownerCt){var index=this.ownerCt.items.indexOf(this);if(index>0){return this.ownerCt.items.itemAt(index-1);}} +return null;},getBubbleTarget:function(){return this.ownerCt;}});Ext.reg('component',Ext.Component);Ext.Action=Ext.extend(Object,{constructor:function(config){this.initialConfig=config;this.itemId=config.itemId=(config.itemId||config.id||Ext.id());this.items=[];},isAction:true,setText:function(text){this.initialConfig.text=text;this.callEach('setText',[text]);},getText:function(){return this.initialConfig.text;},setIconClass:function(cls){this.initialConfig.iconCls=cls;this.callEach('setIconClass',[cls]);},getIconClass:function(){return this.initialConfig.iconCls;},setDisabled:function(v){this.initialConfig.disabled=v;this.callEach('setDisabled',[v]);},enable:function(){this.setDisabled(false);},disable:function(){this.setDisabled(true);},isDisabled:function(){return this.initialConfig.disabled;},setHidden:function(v){this.initialConfig.hidden=v;this.callEach('setVisible',[!v]);},show:function(){this.setHidden(false);},hide:function(){this.setHidden(true);},isHidden:function(){return this.initialConfig.hidden;},setHandler:function(fn,scope){this.initialConfig.handler=fn;this.initialConfig.scope=scope;this.callEach('setHandler',[fn,scope]);},each:function(fn,scope){Ext.each(this.items,fn,scope);},callEach:function(fnName,args){var cs=this.items;for(var i=0,len=cs.length;i<len;i++){cs[i][fnName].apply(cs[i],args);}},addComponent:function(comp){this.items.push(comp);comp.on('destroy',this.removeComponent,this);},removeComponent:function(comp){this.items.remove(comp);},execute:function(){this.initialConfig.handler.apply(this.initialConfig.scope||window,arguments);}});(function(){Ext.Layer=function(config,existingEl){config=config||{};var dh=Ext.DomHelper,cp=config.parentEl,pel=cp?Ext.getDom(cp):document.body;if(existingEl){this.dom=Ext.getDom(existingEl);} +if(!this.dom){var o=config.dh||{tag:'div',cls:'x-layer'};this.dom=dh.append(pel,o);} +if(config.cls){this.addClass(config.cls);} +this.constrain=config.constrain!==false;this.setVisibilityMode(Ext.Element.VISIBILITY);if(config.id){this.id=this.dom.id=config.id;}else{this.id=Ext.id(this.dom);} +this.zindex=config.zindex||this.getZIndex();this.position('absolute',this.zindex);if(config.shadow){this.shadowOffset=config.shadowOffset||4;this.shadow=new Ext.Shadow({offset:this.shadowOffset,mode:config.shadow});}else{this.shadowOffset=0;} +this.useShim=config.shim!==false&&Ext.useShims;this.useDisplay=config.useDisplay;this.hide();};var supr=Ext.Element.prototype;var shims=[];Ext.extend(Ext.Layer,Ext.Element,{getZIndex:function(){return this.zindex||parseInt((this.getShim()||this).getStyle('z-index'),10)||11000;},getShim:function(){if(!this.useShim){return null;} +if(this.shim){return this.shim;} +var shim=shims.shift();if(!shim){shim=this.createShim();shim.enableDisplayMode('block');shim.dom.style.display='none';shim.dom.style.visibility='visible';} +var pn=this.dom.parentNode;if(shim.dom.parentNode!=pn){pn.insertBefore(shim.dom,this.dom);} +shim.setStyle('z-index',this.getZIndex()-2);this.shim=shim;return shim;},hideShim:function(){if(this.shim){this.shim.setDisplayed(false);shims.push(this.shim);delete this.shim;}},disableShadow:function(){if(this.shadow){this.shadowDisabled=true;this.shadow.hide();this.lastShadowOffset=this.shadowOffset;this.shadowOffset=0;}},enableShadow:function(show){if(this.shadow){this.shadowDisabled=false;this.shadowOffset=this.lastShadowOffset;delete this.lastShadowOffset;if(show){this.sync(true);}}},sync:function(doShow){var shadow=this.shadow;if(!this.updating&&this.isVisible()&&(shadow||this.useShim)){var shim=this.getShim(),w=this.getWidth(),h=this.getHeight(),l=this.getLeft(true),t=this.getTop(true);if(shadow&&!this.shadowDisabled){if(doShow&&!shadow.isVisible()){shadow.show(this);}else{shadow.realign(l,t,w,h);} +if(shim){if(doShow){shim.show();} +var shadowAdj=shadow.el.getXY(),shimStyle=shim.dom.style,shadowSize=shadow.el.getSize();shimStyle.left=(shadowAdj[0])+'px';shimStyle.top=(shadowAdj[1])+'px';shimStyle.width=(shadowSize.width)+'px';shimStyle.height=(shadowSize.height)+'px';}}else if(shim){if(doShow){shim.show();} +shim.setSize(w,h);shim.setLeftTop(l,t);}}},destroy:function(){this.hideShim();if(this.shadow){this.shadow.hide();} +this.removeAllListeners();Ext.removeNode(this.dom);delete this.dom;},remove:function(){this.destroy();},beginUpdate:function(){this.updating=true;},endUpdate:function(){this.updating=false;this.sync(true);},hideUnders:function(negOffset){if(this.shadow){this.shadow.hide();} +this.hideShim();},constrainXY:function(){if(this.constrain){var vw=Ext.lib.Dom.getViewWidth(),vh=Ext.lib.Dom.getViewHeight();var s=Ext.getDoc().getScroll();var xy=this.getXY();var x=xy[0],y=xy[1];var so=this.shadowOffset;var w=this.dom.offsetWidth+so,h=this.dom.offsetHeight+so;var moved=false;if((x+w)>vw+s.left){x=vw-w-so;moved=true;} +if((y+h)>vh+s.top){y=vh-h-so;moved=true;} +if(x<s.left){x=s.left;moved=true;} +if(y<s.top){y=s.top;moved=true;} +if(moved){if(this.avoidY){var ay=this.avoidY;if(y<=ay&&(y+h)>=ay){y=ay-h-5;}} +xy=[x,y];this.storeXY(xy);supr.setXY.call(this,xy);this.sync();}} +return this;},getConstrainOffset:function(){return this.shadowOffset;},isVisible:function(){return this.visible;},showAction:function(){this.visible=true;if(this.useDisplay===true){this.setDisplayed('');}else if(this.lastXY){supr.setXY.call(this,this.lastXY);}else if(this.lastLT){supr.setLeftTop.call(this,this.lastLT[0],this.lastLT[1]);}},hideAction:function(){this.visible=false;if(this.useDisplay===true){this.setDisplayed(false);}else{this.setLeftTop(-10000,-10000);}},setVisible:function(v,a,d,c,e){if(v){this.showAction();} +if(a&&v){var cb=function(){this.sync(true);if(c){c();}}.createDelegate(this);supr.setVisible.call(this,true,true,d,cb,e);}else{if(!v){this.hideUnders(true);} +var cb=c;if(a){cb=function(){this.hideAction();if(c){c();}}.createDelegate(this);} +supr.setVisible.call(this,v,a,d,cb,e);if(v){this.sync(true);}else if(!a){this.hideAction();}} +return this;},storeXY:function(xy){delete this.lastLT;this.lastXY=xy;},storeLeftTop:function(left,top){delete this.lastXY;this.lastLT=[left,top];},beforeFx:function(){this.beforeAction();return Ext.Layer.superclass.beforeFx.apply(this,arguments);},afterFx:function(){Ext.Layer.superclass.afterFx.apply(this,arguments);this.sync(this.isVisible());},beforeAction:function(){if(!this.updating&&this.shadow){this.shadow.hide();}},setLeft:function(left){this.storeLeftTop(left,this.getTop(true));supr.setLeft.apply(this,arguments);this.sync();return this;},setTop:function(top){this.storeLeftTop(this.getLeft(true),top);supr.setTop.apply(this,arguments);this.sync();return this;},setLeftTop:function(left,top){this.storeLeftTop(left,top);supr.setLeftTop.apply(this,arguments);this.sync();return this;},setXY:function(xy,a,d,c,e){this.fixDisplay();this.beforeAction();this.storeXY(xy);var cb=this.createCB(c);supr.setXY.call(this,xy,a,d,cb,e);if(!a){cb();} +return this;},createCB:function(c){var el=this;return function(){el.constrainXY();el.sync(true);if(c){c();}};},setX:function(x,a,d,c,e){this.setXY([x,this.getY()],a,d,c,e);return this;},setY:function(y,a,d,c,e){this.setXY([this.getX(),y],a,d,c,e);return this;},setSize:function(w,h,a,d,c,e){this.beforeAction();var cb=this.createCB(c);supr.setSize.call(this,w,h,a,d,cb,e);if(!a){cb();} +return this;},setWidth:function(w,a,d,c,e){this.beforeAction();var cb=this.createCB(c);supr.setWidth.call(this,w,a,d,cb,e);if(!a){cb();} +return this;},setHeight:function(h,a,d,c,e){this.beforeAction();var cb=this.createCB(c);supr.setHeight.call(this,h,a,d,cb,e);if(!a){cb();} +return this;},setBounds:function(x,y,w,h,a,d,c,e){this.beforeAction();var cb=this.createCB(c);if(!a){this.storeXY([x,y]);supr.setXY.call(this,[x,y]);supr.setSize.call(this,w,h,a,d,cb,e);cb();}else{supr.setBounds.call(this,x,y,w,h,a,d,cb,e);} +return this;},setZIndex:function(zindex){this.zindex=zindex;this.setStyle('z-index',zindex+2);if(this.shadow){this.shadow.setZIndex(zindex+1);} +if(this.shim){this.shim.setStyle('z-index',zindex);} +return this;}});})();Ext.Shadow=function(config){Ext.apply(this,config);if(typeof this.mode!="string"){this.mode=this.defaultMode;} +var o=this.offset,a={h:0},rad=Math.floor(this.offset/2);switch(this.mode.toLowerCase()){case"drop":a.w=0;a.l=a.t=o;a.t-=1;if(Ext.isIE){a.l-=this.offset+rad;a.t-=this.offset+rad;a.w-=rad;a.h-=rad;a.t+=1;} +break;case"sides":a.w=(o*2);a.l=-o;a.t=o-1;if(Ext.isIE){a.l-=(this.offset-rad);a.t-=this.offset+rad;a.l+=1;a.w-=(this.offset-rad)*2;a.w-=rad+1;a.h-=1;} +break;case"frame":a.w=a.h=(o*2);a.l=a.t=-o;a.t+=1;a.h-=2;if(Ext.isIE){a.l-=(this.offset-rad);a.t-=(this.offset-rad);a.l+=1;a.w-=(this.offset+rad+1);a.h-=(this.offset+rad);a.h+=1;} +break;};this.adjusts=a;};Ext.Shadow.prototype={offset:4,defaultMode:"drop",show:function(target){target=Ext.get(target);if(!this.el){this.el=Ext.Shadow.Pool.pull();if(this.el.dom.nextSibling!=target.dom){this.el.insertBefore(target);}} +this.el.setStyle("z-index",this.zIndex||parseInt(target.getStyle("z-index"),10)-1);if(Ext.isIE){this.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="+(this.offset)+")";} +this.realign(target.getLeft(true),target.getTop(true),target.getWidth(),target.getHeight());this.el.dom.style.display="block";},isVisible:function(){return this.el?true:false;},realign:function(l,t,w,h){if(!this.el){return;} +var a=this.adjusts,d=this.el.dom,s=d.style,iea=0,sw=(w+a.w),sh=(h+a.h),sws=sw+"px",shs=sh+"px",cn,sww;s.left=(l+a.l)+"px";s.top=(t+a.t)+"px";if(s.width!=sws||s.height!=shs){s.width=sws;s.height=shs;if(!Ext.isIE){cn=d.childNodes;sww=Math.max(0,(sw-12))+"px";cn[0].childNodes[1].style.width=sww;cn[1].childNodes[1].style.width=sww;cn[2].childNodes[1].style.width=sww;cn[1].style.height=Math.max(0,(sh-12))+"px";}}},hide:function(){if(this.el){this.el.dom.style.display="none";Ext.Shadow.Pool.push(this.el);delete this.el;}},setZIndex:function(z){this.zIndex=z;if(this.el){this.el.setStyle("z-index",z);}}};Ext.Shadow.Pool=function(){var p=[],markup=Ext.isIE?'<div class="x-ie-shadow"></div>':'<div class="x-shadow"><div class="xst"><div class="xstl"></div><div class="xstc"></div><div class="xstr"></div></div><div class="xsc"><div class="xsml"></div><div class="xsmc"></div><div class="xsmr"></div></div><div class="xsb"><div class="xsbl"></div><div class="xsbc"></div><div class="xsbr"></div></div></div>';return{pull:function(){var sh=p.shift();if(!sh){sh=Ext.get(Ext.DomHelper.insertHtml("beforeBegin",document.body.firstChild,markup));sh.autoBoxAdjust=false;} +return sh;},push:function(sh){p.push(sh);}};}();Ext.BoxComponent=Ext.extend(Ext.Component,{initComponent:function(){Ext.BoxComponent.superclass.initComponent.call(this);this.addEvents('resize','move');},boxReady:false,deferHeight:false,setSize:function(w,h){if(typeof w=='object'){h=w.height;w=w.width;} +if(Ext.isDefined(w)&&Ext.isDefined(this.boxMinWidth)&&(w<this.boxMinWidth)){w=this.boxMinWidth;} +if(Ext.isDefined(h)&&Ext.isDefined(this.boxMinHeight)&&(h<this.boxMinHeight)){h=this.boxMinHeight;} +if(Ext.isDefined(w)&&Ext.isDefined(this.boxMaxWidth)&&(w>this.boxMaxWidth)){w=this.boxMaxWidth;} +if(Ext.isDefined(h)&&Ext.isDefined(this.boxMaxHeight)&&(h>this.boxMaxHeight)){h=this.boxMaxHeight;} +if(!this.boxReady){this.width=w;this.height=h;return this;} +if(this.cacheSizes!==false&&this.lastSize&&this.lastSize.width==w&&this.lastSize.height==h){return this;} +this.lastSize={width:w,height:h};var adj=this.adjustSize(w,h),aw=adj.width,ah=adj.height,rz;if(aw!==undefined||ah!==undefined){rz=this.getResizeEl();if(!this.deferHeight&&aw!==undefined&&ah!==undefined){rz.setSize(aw,ah);}else if(!this.deferHeight&&ah!==undefined){rz.setHeight(ah);}else if(aw!==undefined){rz.setWidth(aw);} +this.onResize(aw,ah,w,h);this.fireEvent('resize',this,aw,ah,w,h);} +return this;},setWidth:function(width){return this.setSize(width);},setHeight:function(height){return this.setSize(undefined,height);},getSize:function(){return this.getResizeEl().getSize();},getWidth:function(){return this.getResizeEl().getWidth();},getHeight:function(){return this.getResizeEl().getHeight();},getOuterSize:function(){var el=this.getResizeEl();return{width:el.getWidth()+el.getMargins('lr'),height:el.getHeight()+el.getMargins('tb')};},getPosition:function(local){var el=this.getPositionEl();if(local===true){return[el.getLeft(true),el.getTop(true)];} +return this.xy||el.getXY();},getBox:function(local){var pos=this.getPosition(local);var s=this.getSize();s.x=pos[0];s.y=pos[1];return s;},updateBox:function(box){this.setSize(box.width,box.height);this.setPagePosition(box.x,box.y);return this;},getResizeEl:function(){return this.resizeEl||this.el;},setAutoScroll:function(scroll){if(this.rendered){this.getContentTarget().setOverflow(scroll?'auto':'');} +this.autoScroll=scroll;return this;},setPosition:function(x,y){if(x&&typeof x[1]=='number'){y=x[1];x=x[0];} +this.x=x;this.y=y;if(!this.boxReady){return this;} +var adj=this.adjustPosition(x,y);var ax=adj.x,ay=adj.y;var el=this.getPositionEl();if(ax!==undefined||ay!==undefined){if(ax!==undefined&&ay!==undefined){el.setLeftTop(ax,ay);}else if(ax!==undefined){el.setLeft(ax);}else if(ay!==undefined){el.setTop(ay);} +this.onPosition(ax,ay);this.fireEvent('move',this,ax,ay);} +return this;},setPagePosition:function(x,y){if(x&&typeof x[1]=='number'){y=x[1];x=x[0];} +this.pageX=x;this.pageY=y;if(!this.boxReady){return;} +if(x===undefined||y===undefined){return;} +var p=this.getPositionEl().translatePoints(x,y);this.setPosition(p.left,p.top);return this;},afterRender:function(){Ext.BoxComponent.superclass.afterRender.call(this);if(this.resizeEl){this.resizeEl=Ext.get(this.resizeEl);} +if(this.positionEl){this.positionEl=Ext.get(this.positionEl);} +this.boxReady=true;Ext.isDefined(this.autoScroll)&&this.setAutoScroll(this.autoScroll);this.setSize(this.width,this.height);if(this.x||this.y){this.setPosition(this.x,this.y);}else if(this.pageX||this.pageY){this.setPagePosition(this.pageX,this.pageY);}},syncSize:function(){delete this.lastSize;this.setSize(this.autoWidth?undefined:this.getResizeEl().getWidth(),this.autoHeight?undefined:this.getResizeEl().getHeight());return this;},onResize:function(adjWidth,adjHeight,rawWidth,rawHeight){},onPosition:function(x,y){},adjustSize:function(w,h){if(this.autoWidth){w='auto';} +if(this.autoHeight){h='auto';} +return{width:w,height:h};},adjustPosition:function(x,y){return{x:x,y:y};}});Ext.reg('box',Ext.BoxComponent);Ext.Spacer=Ext.extend(Ext.BoxComponent,{autoEl:'div'});Ext.reg('spacer',Ext.Spacer);Ext.SplitBar=function(dragElement,resizingElement,orientation,placement,existingProxy){this.el=Ext.get(dragElement,true);this.el.dom.unselectable="on";this.resizingEl=Ext.get(resizingElement,true);this.orientation=orientation||Ext.SplitBar.HORIZONTAL;this.minSize=0;this.maxSize=2000;this.animate=false;this.useShim=false;this.shim=null;if(!existingProxy){this.proxy=Ext.SplitBar.createProxy(this.orientation);}else{this.proxy=Ext.get(existingProxy).dom;} +this.dd=new Ext.dd.DDProxy(this.el.dom.id,"XSplitBars",{dragElId:this.proxy.id});this.dd.b4StartDrag=this.onStartProxyDrag.createDelegate(this);this.dd.endDrag=this.onEndProxyDrag.createDelegate(this);this.dragSpecs={};this.adapter=new Ext.SplitBar.BasicLayoutAdapter();this.adapter.init(this);if(this.orientation==Ext.SplitBar.HORIZONTAL){this.placement=placement||(this.el.getX()>this.resizingEl.getX()?Ext.SplitBar.LEFT:Ext.SplitBar.RIGHT);this.el.addClass("x-splitbar-h");}else{this.placement=placement||(this.el.getY()>this.resizingEl.getY()?Ext.SplitBar.TOP:Ext.SplitBar.BOTTOM);this.el.addClass("x-splitbar-v");} +this.addEvents("resize","moved","beforeresize","beforeapply");Ext.SplitBar.superclass.constructor.call(this);};Ext.extend(Ext.SplitBar,Ext.util.Observable,{onStartProxyDrag:function(x,y){this.fireEvent("beforeresize",this);this.overlay=Ext.DomHelper.append(document.body,{cls:"x-drag-overlay",html:" "},true);this.overlay.unselectable();this.overlay.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true));this.overlay.show();Ext.get(this.proxy).setDisplayed("block");var size=this.adapter.getElementSize(this);this.activeMinSize=this.getMinimumSize();this.activeMaxSize=this.getMaximumSize();var c1=size-this.activeMinSize;var c2=Math.max(this.activeMaxSize-size,0);if(this.orientation==Ext.SplitBar.HORIZONTAL){this.dd.resetConstraints();this.dd.setXConstraint(this.placement==Ext.SplitBar.LEFT?c1:c2,this.placement==Ext.SplitBar.LEFT?c2:c1,this.tickSize);this.dd.setYConstraint(0,0);}else{this.dd.resetConstraints();this.dd.setXConstraint(0,0);this.dd.setYConstraint(this.placement==Ext.SplitBar.TOP?c1:c2,this.placement==Ext.SplitBar.TOP?c2:c1,this.tickSize);} +this.dragSpecs.startSize=size;this.dragSpecs.startPoint=[x,y];Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd,x,y);},onEndProxyDrag:function(e){Ext.get(this.proxy).setDisplayed(false);var endPoint=Ext.lib.Event.getXY(e);if(this.overlay){Ext.destroy(this.overlay);delete this.overlay;} +var newSize;if(this.orientation==Ext.SplitBar.HORIZONTAL){newSize=this.dragSpecs.startSize+ +(this.placement==Ext.SplitBar.LEFT?endPoint[0]-this.dragSpecs.startPoint[0]:this.dragSpecs.startPoint[0]-endPoint[0]);}else{newSize=this.dragSpecs.startSize+ +(this.placement==Ext.SplitBar.TOP?endPoint[1]-this.dragSpecs.startPoint[1]:this.dragSpecs.startPoint[1]-endPoint[1]);} +newSize=Math.min(Math.max(newSize,this.activeMinSize),this.activeMaxSize);if(newSize!=this.dragSpecs.startSize){if(this.fireEvent('beforeapply',this,newSize)!==false){this.adapter.setElementSize(this,newSize);this.fireEvent("moved",this,newSize);this.fireEvent("resize",this,newSize);}}},getAdapter:function(){return this.adapter;},setAdapter:function(adapter){this.adapter=adapter;this.adapter.init(this);},getMinimumSize:function(){return this.minSize;},setMinimumSize:function(minSize){this.minSize=minSize;},getMaximumSize:function(){return this.maxSize;},setMaximumSize:function(maxSize){this.maxSize=maxSize;},setCurrentSize:function(size){var oldAnimate=this.animate;this.animate=false;this.adapter.setElementSize(this,size);this.animate=oldAnimate;},destroy:function(removeEl){Ext.destroy(this.shim,Ext.get(this.proxy));this.dd.unreg();if(removeEl){this.el.remove();} +this.purgeListeners();}});Ext.SplitBar.createProxy=function(dir){var proxy=new Ext.Element(document.createElement("div"));document.body.appendChild(proxy.dom);proxy.unselectable();var cls='x-splitbar-proxy';proxy.addClass(cls+' '+(dir==Ext.SplitBar.HORIZONTAL?cls+'-h':cls+'-v'));return proxy.dom;};Ext.SplitBar.BasicLayoutAdapter=function(){};Ext.SplitBar.BasicLayoutAdapter.prototype={init:function(s){},getElementSize:function(s){if(s.orientation==Ext.SplitBar.HORIZONTAL){return s.resizingEl.getWidth();}else{return s.resizingEl.getHeight();}},setElementSize:function(s,newSize,onComplete){if(s.orientation==Ext.SplitBar.HORIZONTAL){if(!s.animate){s.resizingEl.setWidth(newSize);if(onComplete){onComplete(s,newSize);}}else{s.resizingEl.setWidth(newSize,true,.1,onComplete,'easeOut');}}else{if(!s.animate){s.resizingEl.setHeight(newSize);if(onComplete){onComplete(s,newSize);}}else{s.resizingEl.setHeight(newSize,true,.1,onComplete,'easeOut');}}}};Ext.SplitBar.AbsoluteLayoutAdapter=function(container){this.basic=new Ext.SplitBar.BasicLayoutAdapter();this.container=Ext.get(container);};Ext.SplitBar.AbsoluteLayoutAdapter.prototype={init:function(s){this.basic.init(s);},getElementSize:function(s){return this.basic.getElementSize(s);},setElementSize:function(s,newSize,onComplete){this.basic.setElementSize(s,newSize,this.moveSplitter.createDelegate(this,[s]));},moveSplitter:function(s){var yes=Ext.SplitBar;switch(s.placement){case yes.LEFT:s.el.setX(s.resizingEl.getRight());break;case yes.RIGHT:s.el.setStyle("right",(this.container.getWidth()-s.resizingEl.getLeft())+"px");break;case yes.TOP:s.el.setY(s.resizingEl.getBottom());break;case yes.BOTTOM:s.el.setY(s.resizingEl.getTop()-s.el.getHeight());break;}}};Ext.SplitBar.VERTICAL=1;Ext.SplitBar.HORIZONTAL=2;Ext.SplitBar.LEFT=1;Ext.SplitBar.RIGHT=2;Ext.SplitBar.TOP=3;Ext.SplitBar.BOTTOM=4;Ext.Container=Ext.extend(Ext.BoxComponent,{bufferResize:50,autoDestroy:true,forceLayout:false,defaultType:'panel',resizeEvent:'resize',bubbleEvents:['add','remove'],initComponent:function(){Ext.Container.superclass.initComponent.call(this);this.addEvents('afterlayout','beforeadd','beforeremove','add','remove');var items=this.items;if(items){delete this.items;this.add(items);}},initItems:function(){if(!this.items){this.items=new Ext.util.MixedCollection(false,this.getComponentId);this.getLayout();}},setLayout:function(layout){if(this.layout&&this.layout!=layout){this.layout.setContainer(null);} +this.layout=layout;this.initItems();layout.setContainer(this);},afterRender:function(){Ext.Container.superclass.afterRender.call(this);if(!this.layout){this.layout='auto';} +if(Ext.isObject(this.layout)&&!this.layout.layout){this.layoutConfig=this.layout;this.layout=this.layoutConfig.type;} +if(Ext.isString(this.layout)){this.layout=new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig);} +this.setLayout(this.layout);if(this.activeItem!==undefined&&this.layout.setActiveItem){var item=this.activeItem;delete this.activeItem;this.layout.setActiveItem(item);} +if(!this.ownerCt){this.doLayout(false,true);} +if(this.monitorResize===true){Ext.EventManager.onWindowResize(this.doLayout,this,[false]);}},getLayoutTarget:function(){return this.el;},getComponentId:function(comp){return comp.getItemId();},add:function(comp){this.initItems();var args=arguments.length>1;if(args||Ext.isArray(comp)){var result=[];Ext.each(args?arguments:comp,function(c){result.push(this.add(c));},this);return result;} +var c=this.lookupComponent(this.applyDefaults(comp));var index=this.items.length;if(this.fireEvent('beforeadd',this,c,index)!==false&&this.onBeforeAdd(c)!==false){this.items.add(c);c.onAdded(this,index);this.onAdd(c);this.fireEvent('add',this,c,index);} +return c;},onAdd:function(c){},onAdded:function(container,pos){this.ownerCt=container;this.initRef();this.cascade(function(c){c.initRef();});this.fireEvent('added',this,container,pos);},insert:function(index,comp){var args=arguments,length=args.length,result=[],i,c;this.initItems();if(length>2){for(i=length-1;i>=1;--i){result.push(this.insert(index,args[i]));} +return result;} +c=this.lookupComponent(this.applyDefaults(comp));index=Math.min(index,this.items.length);if(this.fireEvent('beforeadd',this,c,index)!==false&&this.onBeforeAdd(c)!==false){if(c.ownerCt==this){this.items.remove(c);} +this.items.insert(index,c);c.onAdded(this,index);this.onAdd(c);this.fireEvent('add',this,c,index);} +return c;},applyDefaults:function(c){var d=this.defaults;if(d){if(Ext.isFunction(d)){d=d.call(this,c);} +if(Ext.isString(c)){c=Ext.ComponentMgr.get(c);Ext.apply(c,d);}else if(!c.events){Ext.applyIf(c.isAction?c.initialConfig:c,d);}else{Ext.apply(c,d);}} +return c;},onBeforeAdd:function(item){if(item.ownerCt){item.ownerCt.remove(item,false);} +if(this.hideBorders===true){item.border=(item.border===true);}},remove:function(comp,autoDestroy){this.initItems();var c=this.getComponent(comp);if(c&&this.fireEvent('beforeremove',this,c)!==false){this.doRemove(c,autoDestroy);this.fireEvent('remove',this,c);} +return c;},onRemove:function(c){},doRemove:function(c,autoDestroy){var l=this.layout,hasLayout=l&&this.rendered;if(hasLayout){l.onRemove(c);} +this.items.remove(c);c.onRemoved();this.onRemove(c);if(autoDestroy===true||(autoDestroy!==false&&this.autoDestroy)){c.destroy();} +if(hasLayout){l.afterRemove(c);}},removeAll:function(autoDestroy){this.initItems();var item,rem=[],items=[];this.items.each(function(i){rem.push(i);});for(var i=0,len=rem.length;i<len;++i){item=rem[i];this.remove(item,autoDestroy);if(item.ownerCt!==this){items.push(item);}} +return items;},getComponent:function(comp){if(Ext.isObject(comp)){comp=comp.getItemId();} +return this.items.get(comp);},lookupComponent:function(comp){if(Ext.isString(comp)){return Ext.ComponentMgr.get(comp);}else if(!comp.events){return this.createComponent(comp);} +return comp;},createComponent:function(config,defaultType){if(config.render){return config;} +var c=Ext.create(Ext.apply({ownerCt:this},config),defaultType||this.defaultType);delete c.initialConfig.ownerCt;delete c.ownerCt;return c;},canLayout:function(){var el=this.getVisibilityEl();return el&&el.dom&&!el.isStyle("display","none");},doLayout:function(shallow,force){var rendered=this.rendered,forceLayout=force||this.forceLayout;if(this.collapsed||!this.canLayout()){this.deferLayout=this.deferLayout||!shallow;if(!forceLayout){return;} +shallow=shallow&&!this.deferLayout;}else{delete this.deferLayout;} +if(rendered&&this.layout){this.layout.layout();} +if(shallow!==true&&this.items){var cs=this.items.items;for(var i=0,len=cs.length;i<len;i++){var c=cs[i];if(c.doLayout){c.doLayout(false,forceLayout);}}} +if(rendered){this.onLayout(shallow,forceLayout);} +this.hasLayout=true;delete this.forceLayout;},onLayout:Ext.emptyFn,shouldBufferLayout:function(){var hl=this.hasLayout;if(this.ownerCt){return hl?!this.hasLayoutPending():false;} +return hl;},hasLayoutPending:function(){var pending=false;this.ownerCt.bubble(function(c){if(c.layoutPending){pending=true;return false;}});return pending;},onShow:function(){Ext.Container.superclass.onShow.call(this);if(Ext.isDefined(this.deferLayout)){delete this.deferLayout;this.doLayout(true);}},getLayout:function(){if(!this.layout){var layout=new Ext.layout.AutoLayout(this.layoutConfig);this.setLayout(layout);} +return this.layout;},beforeDestroy:function(){var c;if(this.items){while(c=this.items.first()){this.doRemove(c,true);}} +if(this.monitorResize){Ext.EventManager.removeResizeListener(this.doLayout,this);} +Ext.destroy(this.layout);Ext.Container.superclass.beforeDestroy.call(this);},cascade:function(fn,scope,args){if(fn.apply(scope||this,args||[this])!==false){if(this.items){var cs=this.items.items;for(var i=0,len=cs.length;i<len;i++){if(cs[i].cascade){cs[i].cascade(fn,scope,args);}else{fn.apply(scope||cs[i],args||[cs[i]]);}}}} +return this;},findById:function(id){var m=null,ct=this;this.cascade(function(c){if(ct!=c&&c.id===id){m=c;return false;}});return m;},findByType:function(xtype,shallow){return this.findBy(function(c){return c.isXType(xtype,shallow);});},find:function(prop,value){return this.findBy(function(c){return c[prop]===value;});},findBy:function(fn,scope){var m=[],ct=this;this.cascade(function(c){if(ct!=c&&fn.call(scope||c,c,ct)===true){m.push(c);}});return m;},get:function(key){return this.getComponent(key);}});Ext.Container.LAYOUTS={};Ext.reg('container',Ext.Container);Ext.layout.ContainerLayout=Ext.extend(Object,{monitorResize:false,activeItem:null,constructor:function(config){this.id=Ext.id(null,'ext-layout-');Ext.apply(this,config);},type:'container',IEMeasureHack:function(target,viewFlag){var tChildren=target.dom.childNodes,tLen=tChildren.length,c,d=[],e,i,ret;for(i=0;i<tLen;i++){c=tChildren[i];e=Ext.get(c);if(e){d[i]=e.getStyle('display');e.setStyle({display:'none'});}} +ret=target?target.getViewSize(viewFlag):{};for(i=0;i<tLen;i++){c=tChildren[i];e=Ext.get(c);if(e){e.setStyle({display:d[i]});}} +return ret;},getLayoutTargetSize:Ext.EmptyFn,layout:function(){var ct=this.container,target=ct.getLayoutTarget();if(!(this.hasLayout||Ext.isEmpty(this.targetCls))){target.addClass(this.targetCls);} +this.onLayout(ct,target);ct.fireEvent('afterlayout',ct,this);},onLayout:function(ct,target){this.renderAll(ct,target);},isValidParent:function(c,target){return target&&c.getPositionEl().dom.parentNode==(target.dom||target);},renderAll:function(ct,target){var items=ct.items.items,i,c,len=items.length;for(i=0;i<len;i++){c=items[i];if(c&&(!c.rendered||!this.isValidParent(c,target))){this.renderItem(c,i,target);}}},renderItem:function(c,position,target){if(c){if(!c.rendered){c.render(target,position);this.configureItem(c);}else if(!this.isValidParent(c,target)){if(Ext.isNumber(position)){position=target.dom.childNodes[position];} +target.dom.insertBefore(c.getPositionEl().dom,position||null);c.container=target;this.configureItem(c);}}},getRenderedItems:function(ct){var t=ct.getLayoutTarget(),cti=ct.items.items,len=cti.length,i,c,items=[];for(i=0;i<len;i++){if((c=cti[i]).rendered&&this.isValidParent(c,t)&&c.shouldLayout!==false){items.push(c);}};return items;},configureItem:function(c){if(this.extraCls){var t=c.getPositionEl?c.getPositionEl():c;t.addClass(this.extraCls);} +if(c.doLayout&&this.forceLayout){c.doLayout();} +if(this.renderHidden&&c!=this.activeItem){c.hide();}},onRemove:function(c){if(this.activeItem==c){delete this.activeItem;} +if(c.rendered&&this.extraCls){var t=c.getPositionEl?c.getPositionEl():c;t.removeClass(this.extraCls);}},afterRemove:function(c){if(c.removeRestore){c.removeMode='container';delete c.removeRestore;}},onResize:function(){var ct=this.container,b;if(ct.collapsed){return;} +if(b=ct.bufferResize&&ct.shouldBufferLayout()){if(!this.resizeTask){this.resizeTask=new Ext.util.DelayedTask(this.runLayout,this);this.resizeBuffer=Ext.isNumber(b)?b:50;} +ct.layoutPending=true;this.resizeTask.delay(this.resizeBuffer);}else{this.runLayout();}},runLayout:function(){var ct=this.container;this.layout();ct.onLayout();delete ct.layoutPending;},setContainer:function(ct){if(this.monitorResize&&ct!=this.container){var old=this.container;if(old){old.un(old.resizeEvent,this.onResize,this);} +if(ct){ct.on(ct.resizeEvent,this.onResize,this);}} +this.container=ct;},parseMargins:function(v){if(Ext.isNumber(v)){v=v.toString();} +var ms=v.split(' '),len=ms.length;if(len==1){ms[1]=ms[2]=ms[3]=ms[0];}else if(len==2){ms[2]=ms[0];ms[3]=ms[1];}else if(len==3){ms[3]=ms[1];} +return{top:parseInt(ms[0],10)||0,right:parseInt(ms[1],10)||0,bottom:parseInt(ms[2],10)||0,left:parseInt(ms[3],10)||0};},fieldTpl:(function(){var t=new Ext.Template('<div class="x-form-item {itemCls}" tabIndex="-1">','<label for="{id}" style="{labelStyle}" class="x-form-item-label">{label}{labelSeparator}</label>','<div class="x-form-element" id="x-form-el-{id}" style="{elementStyle}">','</div><div class="{clearCls}"></div>','</div>');t.disableFormats=true;return t.compile();})(),destroy:function(){if(this.resizeTask&&this.resizeTask.cancel){this.resizeTask.cancel();} +if(this.container){this.container.un(this.container.resizeEvent,this.onResize,this);} +if(!Ext.isEmpty(this.targetCls)){var target=this.container.getLayoutTarget();if(target){target.removeClass(this.targetCls);}}}});Ext.layout.AutoLayout=Ext.extend(Ext.layout.ContainerLayout,{type:'auto',monitorResize:true,onLayout:function(ct,target){Ext.layout.AutoLayout.superclass.onLayout.call(this,ct,target);var cs=this.getRenderedItems(ct),len=cs.length,i,c;for(i=0;i<len;i++){c=cs[i];if(c.doLayout){c.doLayout(true);}}}});Ext.Container.LAYOUTS['auto']=Ext.layout.AutoLayout;Ext.layout.FitLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,type:'fit',getLayoutTargetSize:function(){var target=this.container.getLayoutTarget();if(!target){return{};} +return target.getStyleSize();},onLayout:function(ct,target){Ext.layout.FitLayout.superclass.onLayout.call(this,ct,target);if(!ct.collapsed){this.setItemSize(this.activeItem||ct.items.itemAt(0),this.getLayoutTargetSize());}},setItemSize:function(item,size){if(item&&size.height>0){item.setSize(size);}}});Ext.Container.LAYOUTS['fit']=Ext.layout.FitLayout;Ext.layout.CardLayout=Ext.extend(Ext.layout.FitLayout,{deferredRender:false,layoutOnCardChange:false,renderHidden:true,type:'card',setActiveItem:function(item){var ai=this.activeItem,ct=this.container;item=ct.getComponent(item);if(item&&ai!=item){if(ai){ai.hide();if(ai.hidden!==true){return false;} +ai.fireEvent('deactivate',ai);} +var layout=item.doLayout&&(this.layoutOnCardChange||!item.rendered);this.activeItem=item;delete item.deferLayout;item.show();this.layout();if(layout){item.doLayout();} +item.fireEvent('activate',item);}},renderAll:function(ct,target){if(this.deferredRender){this.renderItem(this.activeItem,undefined,target);}else{Ext.layout.CardLayout.superclass.renderAll.call(this,ct,target);}}});Ext.Container.LAYOUTS['card']=Ext.layout.CardLayout;Ext.layout.AnchorLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,type:'anchor',defaultAnchor:'100%',parseAnchorRE:/^(r|right|b|bottom)$/i,getLayoutTargetSize:function(){var target=this.container.getLayoutTarget(),ret={};if(target){ret=target.getViewSize();if(Ext.isIE&&Ext.isStrict&&ret.width==0){ret=target.getStyleSize();} +ret.width-=target.getPadding('lr');ret.height-=target.getPadding('tb');} +return ret;},onLayout:function(container,target){Ext.layout.AnchorLayout.superclass.onLayout.call(this,container,target);var size=this.getLayoutTargetSize(),containerWidth=size.width,containerHeight=size.height,overflow=target.getStyle('overflow'),components=this.getRenderedItems(container),len=components.length,boxes=[],box,anchorWidth,anchorHeight,component,anchorSpec,calcWidth,calcHeight,anchorsArray,totalHeight=0,i,el;if(containerWidth<20&&containerHeight<20){return;} +if(container.anchorSize){if(typeof container.anchorSize=='number'){anchorWidth=container.anchorSize;}else{anchorWidth=container.anchorSize.width;anchorHeight=container.anchorSize.height;}}else{anchorWidth=container.initialConfig.width;anchorHeight=container.initialConfig.height;} +for(i=0;i<len;i++){component=components[i];el=component.getPositionEl();if(!component.anchor&&component.items&&!Ext.isNumber(component.width)&&!(Ext.isIE6&&Ext.isStrict)){component.anchor=this.defaultAnchor;} +if(component.anchor){anchorSpec=component.anchorSpec;if(!anchorSpec){anchorsArray=component.anchor.split(' ');component.anchorSpec=anchorSpec={right:this.parseAnchor(anchorsArray[0],component.initialConfig.width,anchorWidth),bottom:this.parseAnchor(anchorsArray[1],component.initialConfig.height,anchorHeight)};} +calcWidth=anchorSpec.right?this.adjustWidthAnchor(anchorSpec.right(containerWidth)-el.getMargins('lr'),component):undefined;calcHeight=anchorSpec.bottom?this.adjustHeightAnchor(anchorSpec.bottom(containerHeight)-el.getMargins('tb'),component):undefined;if(calcWidth||calcHeight){boxes.push({component:component,width:calcWidth||undefined,height:calcHeight||undefined});}}} +for(i=0,len=boxes.length;i<len;i++){box=boxes[i];box.component.setSize(box.width,box.height);} +if(overflow&&overflow!='hidden'&&!this.adjustmentPass){var newTargetSize=this.getLayoutTargetSize();if(newTargetSize.width!=size.width||newTargetSize.height!=size.height){this.adjustmentPass=true;this.onLayout(container,target);}} +delete this.adjustmentPass;},parseAnchor:function(a,start,cstart){if(a&&a!='none'){var last;if(this.parseAnchorRE.test(a)){var diff=cstart-start;return function(v){if(v!==last){last=v;return v-diff;}};}else if(a.indexOf('%')!=-1){var ratio=parseFloat(a.replace('%',''))*.01;return function(v){if(v!==last){last=v;return Math.floor(v*ratio);}};}else{a=parseInt(a,10);if(!isNaN(a)){return function(v){if(v!==last){last=v;return v+a;}};}}} +return false;},adjustWidthAnchor:function(value,comp){return value;},adjustHeightAnchor:function(value,comp){return value;}});Ext.Container.LAYOUTS['anchor']=Ext.layout.AnchorLayout;Ext.layout.ColumnLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,type:'column',extraCls:'x-column',scrollOffset:0,targetCls:'x-column-layout-ct',isValidParent:function(c,target){return this.innerCt&&c.getPositionEl().dom.parentNode==this.innerCt.dom;},getLayoutTargetSize:function(){var target=this.container.getLayoutTarget(),ret;if(target){ret=target.getViewSize();if(Ext.isIE&&Ext.isStrict&&ret.width==0){ret=target.getStyleSize();} +ret.width-=target.getPadding('lr');ret.height-=target.getPadding('tb');} +return ret;},renderAll:function(ct,target){if(!this.innerCt){this.innerCt=target.createChild({cls:'x-column-inner'});this.innerCt.createChild({cls:'x-clear'});} +Ext.layout.ColumnLayout.superclass.renderAll.call(this,ct,this.innerCt);},onLayout:function(ct,target){var cs=ct.items.items,len=cs.length,c,i,m,margins=[];this.renderAll(ct,target);var size=this.getLayoutTargetSize();if(size.width<1&&size.height<1){return;} +var w=size.width-this.scrollOffset,h=size.height,pw=w;this.innerCt.setWidth(w);for(i=0;i<len;i++){c=cs[i];m=c.getPositionEl().getMargins('lr');margins[i]=m;if(!c.columnWidth){pw-=(c.getWidth()+m);}} +pw=pw<0?0:pw;for(i=0;i<len;i++){c=cs[i];m=margins[i];if(c.columnWidth){c.setSize(Math.floor(c.columnWidth*pw)-m);}} +if(Ext.isIE){if(i=target.getStyle('overflow')&&i!='hidden'&&!this.adjustmentPass){var ts=this.getLayoutTargetSize();if(ts.width!=size.width){this.adjustmentPass=true;this.onLayout(ct,target);}}} +delete this.adjustmentPass;}});Ext.Container.LAYOUTS['column']=Ext.layout.ColumnLayout;Ext.layout.BorderLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,rendered:false,type:'border',targetCls:'x-border-layout-ct',getLayoutTargetSize:function(){var target=this.container.getLayoutTarget();return target?target.getViewSize():{};},onLayout:function(ct,target){var collapsed,i,c,pos,items=ct.items.items,len=items.length;if(!this.rendered){collapsed=[];for(i=0;i<len;i++){c=items[i];pos=c.region;if(c.collapsed){collapsed.push(c);} +c.collapsed=false;if(!c.rendered){c.render(target,i);c.getPositionEl().addClass('x-border-panel');} +this[pos]=pos!='center'&&c.split?new Ext.layout.BorderLayout.SplitRegion(this,c.initialConfig,pos):new Ext.layout.BorderLayout.Region(this,c.initialConfig,pos);this[pos].render(target,c);} +this.rendered=true;} +var size=this.getLayoutTargetSize();if(size.width<20||size.height<20){if(collapsed){this.restoreCollapsed=collapsed;} +return;}else if(this.restoreCollapsed){collapsed=this.restoreCollapsed;delete this.restoreCollapsed;} +var w=size.width,h=size.height,centerW=w,centerH=h,centerY=0,centerX=0,n=this.north,s=this.south,west=this.west,e=this.east,c=this.center,b,m,totalWidth,totalHeight;if(!c&&Ext.layout.BorderLayout.WARN!==false){throw'No center region defined in BorderLayout '+ct.id;} +if(n&&n.isVisible()){b=n.getSize();m=n.getMargins();b.width=w-(m.left+m.right);b.x=m.left;b.y=m.top;centerY=b.height+b.y+m.bottom;centerH-=centerY;n.applyLayout(b);} +if(s&&s.isVisible()){b=s.getSize();m=s.getMargins();b.width=w-(m.left+m.right);b.x=m.left;totalHeight=(b.height+m.top+m.bottom);b.y=h-totalHeight+m.top;centerH-=totalHeight;s.applyLayout(b);} +if(west&&west.isVisible()){b=west.getSize();m=west.getMargins();b.height=centerH-(m.top+m.bottom);b.x=m.left;b.y=centerY+m.top;totalWidth=(b.width+m.left+m.right);centerX+=totalWidth;centerW-=totalWidth;west.applyLayout(b);} +if(e&&e.isVisible()){b=e.getSize();m=e.getMargins();b.height=centerH-(m.top+m.bottom);totalWidth=(b.width+m.left+m.right);b.x=w-totalWidth+m.left;b.y=centerY+m.top;centerW-=totalWidth;e.applyLayout(b);} +if(c){m=c.getMargins();var centerBox={x:centerX+m.left,y:centerY+m.top,width:centerW-(m.left+m.right),height:centerH-(m.top+m.bottom)};c.applyLayout(centerBox);} +if(collapsed){for(i=0,len=collapsed.length;i<len;i++){collapsed[i].collapse(false);}} +if(Ext.isIE&&Ext.isStrict){target.repaint();} +if(i=target.getStyle('overflow')&&i!='hidden'&&!this.adjustmentPass){var ts=this.getLayoutTargetSize();if(ts.width!=size.width||ts.height!=size.height){this.adjustmentPass=true;this.onLayout(ct,target);}} +delete this.adjustmentPass;},destroy:function(){var r=['north','south','east','west'],i,region;for(i=0;i<r.length;i++){region=this[r[i]];if(region){if(region.destroy){region.destroy();}else if(region.split){region.split.destroy(true);}}} +Ext.layout.BorderLayout.superclass.destroy.call(this);}});Ext.layout.BorderLayout.Region=function(layout,config,pos){Ext.apply(this,config);this.layout=layout;this.position=pos;this.state={};if(typeof this.margins=='string'){this.margins=this.layout.parseMargins(this.margins);} +this.margins=Ext.applyIf(this.margins||{},this.defaultMargins);if(this.collapsible){if(typeof this.cmargins=='string'){this.cmargins=this.layout.parseMargins(this.cmargins);} +if(this.collapseMode=='mini'&&!this.cmargins){this.cmargins={left:0,top:0,right:0,bottom:0};}else{this.cmargins=Ext.applyIf(this.cmargins||{},pos=='north'||pos=='south'?this.defaultNSCMargins:this.defaultEWCMargins);}}};Ext.layout.BorderLayout.Region.prototype={collapsible:false,split:false,floatable:true,minWidth:50,minHeight:50,defaultMargins:{left:0,top:0,right:0,bottom:0},defaultNSCMargins:{left:5,top:5,right:5,bottom:5},defaultEWCMargins:{left:5,top:0,right:5,bottom:0},floatingZIndex:100,isCollapsed:false,render:function(ct,p){this.panel=p;p.el.enableDisplayMode();this.targetEl=ct;this.el=p.el;var gs=p.getState,ps=this.position;p.getState=function(){return Ext.apply(gs.call(p)||{},this.state);}.createDelegate(this);if(ps!='center'){p.allowQueuedExpand=false;p.on({beforecollapse:this.beforeCollapse,collapse:this.onCollapse,beforeexpand:this.beforeExpand,expand:this.onExpand,hide:this.onHide,show:this.onShow,scope:this});if(this.collapsible||this.floatable){p.collapseEl='el';p.slideAnchor=this.getSlideAnchor();} +if(p.tools&&p.tools.toggle){p.tools.toggle.addClass('x-tool-collapse-'+ps);p.tools.toggle.addClassOnOver('x-tool-collapse-'+ps+'-over');}}},getCollapsedEl:function(){if(!this.collapsedEl){if(!this.toolTemplate){var tt=new Ext.Template('<div class="x-tool x-tool-{id}"> </div>');tt.disableFormats=true;tt.compile();Ext.layout.BorderLayout.Region.prototype.toolTemplate=tt;} +this.collapsedEl=this.targetEl.createChild({cls:"x-layout-collapsed x-layout-collapsed-"+this.position,id:this.panel.id+'-xcollapsed'});this.collapsedEl.enableDisplayMode('block');if(this.collapseMode=='mini'){this.collapsedEl.addClass('x-layout-cmini-'+this.position);this.miniCollapsedEl=this.collapsedEl.createChild({cls:"x-layout-mini x-layout-mini-"+this.position,html:" "});this.miniCollapsedEl.addClassOnOver('x-layout-mini-over');this.collapsedEl.addClassOnOver("x-layout-collapsed-over");this.collapsedEl.on('click',this.onExpandClick,this,{stopEvent:true});}else{if(this.collapsible!==false&&!this.hideCollapseTool){var t=this.expandToolEl=this.toolTemplate.append(this.collapsedEl.dom,{id:'expand-'+this.position},true);t.addClassOnOver('x-tool-expand-'+this.position+'-over');t.on('click',this.onExpandClick,this,{stopEvent:true});} +if(this.floatable!==false||this.titleCollapse){this.collapsedEl.addClassOnOver("x-layout-collapsed-over");this.collapsedEl.on("click",this[this.floatable?'collapseClick':'onExpandClick'],this);}}} +return this.collapsedEl;},onExpandClick:function(e){if(this.isSlid){this.panel.expand(false);}else{this.panel.expand();}},onCollapseClick:function(e){this.panel.collapse();},beforeCollapse:function(p,animate){this.lastAnim=animate;if(this.splitEl){this.splitEl.hide();} +this.getCollapsedEl().show();var el=this.panel.getEl();this.originalZIndex=el.getStyle('z-index');el.setStyle('z-index',100);this.isCollapsed=true;this.layout.layout();},onCollapse:function(animate){this.panel.el.setStyle('z-index',1);if(this.lastAnim===false||this.panel.animCollapse===false){this.getCollapsedEl().dom.style.visibility='visible';}else{this.getCollapsedEl().slideIn(this.panel.slideAnchor,{duration:.2});} +this.state.collapsed=true;this.panel.saveState();},beforeExpand:function(animate){if(this.isSlid){this.afterSlideIn();} +var c=this.getCollapsedEl();this.el.show();if(this.position=='east'||this.position=='west'){this.panel.setSize(undefined,c.getHeight());}else{this.panel.setSize(c.getWidth(),undefined);} +c.hide();c.dom.style.visibility='hidden';this.panel.el.setStyle('z-index',this.floatingZIndex);},onExpand:function(){this.isCollapsed=false;if(this.splitEl){this.splitEl.show();} +this.layout.layout();this.panel.el.setStyle('z-index',this.originalZIndex);this.state.collapsed=false;this.panel.saveState();},collapseClick:function(e){if(this.isSlid){e.stopPropagation();this.slideIn();}else{e.stopPropagation();this.slideOut();}},onHide:function(){if(this.isCollapsed){this.getCollapsedEl().hide();}else if(this.splitEl){this.splitEl.hide();}},onShow:function(){if(this.isCollapsed){this.getCollapsedEl().show();}else if(this.splitEl){this.splitEl.show();}},isVisible:function(){return!this.panel.hidden;},getMargins:function(){return this.isCollapsed&&this.cmargins?this.cmargins:this.margins;},getSize:function(){return this.isCollapsed?this.getCollapsedEl().getSize():this.panel.getSize();},setPanel:function(panel){this.panel=panel;},getMinWidth:function(){return this.minWidth;},getMinHeight:function(){return this.minHeight;},applyLayoutCollapsed:function(box){var ce=this.getCollapsedEl();ce.setLeftTop(box.x,box.y);ce.setSize(box.width,box.height);},applyLayout:function(box){if(this.isCollapsed){this.applyLayoutCollapsed(box);}else{this.panel.setPosition(box.x,box.y);this.panel.setSize(box.width,box.height);}},beforeSlide:function(){this.panel.beforeEffect();},afterSlide:function(){this.panel.afterEffect();},initAutoHide:function(){if(this.autoHide!==false){if(!this.autoHideHd){this.autoHideSlideTask=new Ext.util.DelayedTask(this.slideIn,this);this.autoHideHd={"mouseout":function(e){if(!e.within(this.el,true)){this.autoHideSlideTask.delay(500);}},"mouseover":function(e){this.autoHideSlideTask.cancel();},scope:this};} +this.el.on(this.autoHideHd);this.collapsedEl.on(this.autoHideHd);}},clearAutoHide:function(){if(this.autoHide!==false){this.el.un("mouseout",this.autoHideHd.mouseout);this.el.un("mouseover",this.autoHideHd.mouseover);this.collapsedEl.un("mouseout",this.autoHideHd.mouseout);this.collapsedEl.un("mouseover",this.autoHideHd.mouseover);}},clearMonitor:function(){Ext.getDoc().un("click",this.slideInIf,this);},slideOut:function(){if(this.isSlid||this.el.hasActiveFx()){return;} +this.isSlid=true;var ts=this.panel.tools,dh,pc;if(ts&&ts.toggle){ts.toggle.hide();} +this.el.show();pc=this.panel.collapsed;this.panel.collapsed=false;if(this.position=='east'||this.position=='west'){dh=this.panel.deferHeight;this.panel.deferHeight=false;this.panel.setSize(undefined,this.collapsedEl.getHeight());this.panel.deferHeight=dh;}else{this.panel.setSize(this.collapsedEl.getWidth(),undefined);} +this.panel.collapsed=pc;this.restoreLT=[this.el.dom.style.left,this.el.dom.style.top];this.el.alignTo(this.collapsedEl,this.getCollapseAnchor());this.el.setStyle("z-index",this.floatingZIndex+2);this.panel.el.replaceClass('x-panel-collapsed','x-panel-floating');if(this.animFloat!==false){this.beforeSlide();this.el.slideIn(this.getSlideAnchor(),{callback:function(){this.afterSlide();this.initAutoHide();Ext.getDoc().on("click",this.slideInIf,this);},scope:this,block:true});}else{this.initAutoHide();Ext.getDoc().on("click",this.slideInIf,this);}},afterSlideIn:function(){this.clearAutoHide();this.isSlid=false;this.clearMonitor();this.el.setStyle("z-index","");this.panel.el.replaceClass('x-panel-floating','x-panel-collapsed');this.el.dom.style.left=this.restoreLT[0];this.el.dom.style.top=this.restoreLT[1];var ts=this.panel.tools;if(ts&&ts.toggle){ts.toggle.show();}},slideIn:function(cb){if(!this.isSlid||this.el.hasActiveFx()){Ext.callback(cb);return;} +this.isSlid=false;if(this.animFloat!==false){this.beforeSlide();this.el.slideOut(this.getSlideAnchor(),{callback:function(){this.el.hide();this.afterSlide();this.afterSlideIn();Ext.callback(cb);},scope:this,block:true});}else{this.el.hide();this.afterSlideIn();}},slideInIf:function(e){if(!e.within(this.el)){this.slideIn();}},anchors:{"west":"left","east":"right","north":"top","south":"bottom"},sanchors:{"west":"l","east":"r","north":"t","south":"b"},canchors:{"west":"tl-tr","east":"tr-tl","north":"tl-bl","south":"bl-tl"},getAnchor:function(){return this.anchors[this.position];},getCollapseAnchor:function(){return this.canchors[this.position];},getSlideAnchor:function(){return this.sanchors[this.position];},getAlignAdj:function(){var cm=this.cmargins;switch(this.position){case"west":return[0,0];break;case"east":return[0,0];break;case"north":return[0,0];break;case"south":return[0,0];break;}},getExpandAdj:function(){var c=this.collapsedEl,cm=this.cmargins;switch(this.position){case"west":return[-(cm.right+c.getWidth()+cm.left),0];break;case"east":return[cm.right+c.getWidth()+cm.left,0];break;case"north":return[0,-(cm.top+cm.bottom+c.getHeight())];break;case"south":return[0,cm.top+cm.bottom+c.getHeight()];break;}},destroy:function(){if(this.autoHideSlideTask&&this.autoHideSlideTask.cancel){this.autoHideSlideTask.cancel();} +Ext.destroyMembers(this,'miniCollapsedEl','collapsedEl','expandToolEl');}};Ext.layout.BorderLayout.SplitRegion=function(layout,config,pos){Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this,layout,config,pos);this.applyLayout=this.applyFns[pos];};Ext.extend(Ext.layout.BorderLayout.SplitRegion,Ext.layout.BorderLayout.Region,{splitTip:"Drag to resize.",collapsibleSplitTip:"Drag to resize. Double click to hide.",useSplitTips:false,splitSettings:{north:{orientation:Ext.SplitBar.VERTICAL,placement:Ext.SplitBar.TOP,maxFn:'getVMaxSize',minProp:'minHeight',maxProp:'maxHeight'},south:{orientation:Ext.SplitBar.VERTICAL,placement:Ext.SplitBar.BOTTOM,maxFn:'getVMaxSize',minProp:'minHeight',maxProp:'maxHeight'},east:{orientation:Ext.SplitBar.HORIZONTAL,placement:Ext.SplitBar.RIGHT,maxFn:'getHMaxSize',minProp:'minWidth',maxProp:'maxWidth'},west:{orientation:Ext.SplitBar.HORIZONTAL,placement:Ext.SplitBar.LEFT,maxFn:'getHMaxSize',minProp:'minWidth',maxProp:'maxWidth'}},applyFns:{west:function(box){if(this.isCollapsed){return this.applyLayoutCollapsed(box);} +var sd=this.splitEl.dom,s=sd.style;this.panel.setPosition(box.x,box.y);var sw=sd.offsetWidth;s.left=(box.x+box.width-sw)+'px';s.top=(box.y)+'px';s.height=Math.max(0,box.height)+'px';this.panel.setSize(box.width-sw,box.height);},east:function(box){if(this.isCollapsed){return this.applyLayoutCollapsed(box);} +var sd=this.splitEl.dom,s=sd.style;var sw=sd.offsetWidth;this.panel.setPosition(box.x+sw,box.y);s.left=(box.x)+'px';s.top=(box.y)+'px';s.height=Math.max(0,box.height)+'px';this.panel.setSize(box.width-sw,box.height);},north:function(box){if(this.isCollapsed){return this.applyLayoutCollapsed(box);} +var sd=this.splitEl.dom,s=sd.style;var sh=sd.offsetHeight;this.panel.setPosition(box.x,box.y);s.left=(box.x)+'px';s.top=(box.y+box.height-sh)+'px';s.width=Math.max(0,box.width)+'px';this.panel.setSize(box.width,box.height-sh);},south:function(box){if(this.isCollapsed){return this.applyLayoutCollapsed(box);} +var sd=this.splitEl.dom,s=sd.style;var sh=sd.offsetHeight;this.panel.setPosition(box.x,box.y+sh);s.left=(box.x)+'px';s.top=(box.y)+'px';s.width=Math.max(0,box.width)+'px';this.panel.setSize(box.width,box.height-sh);}},render:function(ct,p){Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this,ct,p);var ps=this.position;this.splitEl=ct.createChild({cls:"x-layout-split x-layout-split-"+ps,html:" ",id:this.panel.id+'-xsplit'});if(this.collapseMode=='mini'){this.miniSplitEl=this.splitEl.createChild({cls:"x-layout-mini x-layout-mini-"+ps,html:" "});this.miniSplitEl.addClassOnOver('x-layout-mini-over');this.miniSplitEl.on('click',this.onCollapseClick,this,{stopEvent:true});} +var s=this.splitSettings[ps];this.split=new Ext.SplitBar(this.splitEl.dom,p.el,s.orientation);this.split.tickSize=this.tickSize;this.split.placement=s.placement;this.split.getMaximumSize=this[s.maxFn].createDelegate(this);this.split.minSize=this.minSize||this[s.minProp];this.split.on("beforeapply",this.onSplitMove,this);this.split.useShim=this.useShim===true;this.maxSize=this.maxSize||this[s.maxProp];if(p.hidden){this.splitEl.hide();} +if(this.useSplitTips){this.splitEl.dom.title=this.collapsible?this.collapsibleSplitTip:this.splitTip;} +if(this.collapsible){this.splitEl.on("dblclick",this.onCollapseClick,this);}},getSize:function(){if(this.isCollapsed){return this.collapsedEl.getSize();} +var s=this.panel.getSize();if(this.position=='north'||this.position=='south'){s.height+=this.splitEl.dom.offsetHeight;}else{s.width+=this.splitEl.dom.offsetWidth;} +return s;},getHMaxSize:function(){var cmax=this.maxSize||10000;var center=this.layout.center;return Math.min(cmax,(this.el.getWidth()+center.el.getWidth())-center.getMinWidth());},getVMaxSize:function(){var cmax=this.maxSize||10000;var center=this.layout.center;return Math.min(cmax,(this.el.getHeight()+center.el.getHeight())-center.getMinHeight());},onSplitMove:function(split,newSize){var s=this.panel.getSize();this.lastSplitSize=newSize;if(this.position=='north'||this.position=='south'){this.panel.setSize(s.width,newSize);this.state.height=newSize;}else{this.panel.setSize(newSize,s.height);this.state.width=newSize;} +this.layout.layout();this.panel.saveState();return false;},getSplitBar:function(){return this.split;},destroy:function(){Ext.destroy(this.miniSplitEl,this.split,this.splitEl);Ext.layout.BorderLayout.SplitRegion.superclass.destroy.call(this);}});Ext.Container.LAYOUTS['border']=Ext.layout.BorderLayout;Ext.layout.FormLayout=Ext.extend(Ext.layout.AnchorLayout,{labelSeparator:':',trackLabels:true,type:'form',onRemove:function(c){Ext.layout.FormLayout.superclass.onRemove.call(this,c);if(this.trackLabels){c.un('show',this.onFieldShow,this);c.un('hide',this.onFieldHide,this);} +var el=c.getPositionEl(),ct=c.getItemCt&&c.getItemCt();if(c.rendered&&ct){if(el&&el.dom){el.insertAfter(ct);} +Ext.destroy(ct);Ext.destroyMembers(c,'label','itemCt');if(c.customItemCt){Ext.destroyMembers(c,'getItemCt','customItemCt');}}},setContainer:function(ct){Ext.layout.FormLayout.superclass.setContainer.call(this,ct);if(ct.labelAlign){ct.addClass('x-form-label-'+ct.labelAlign);} +if(ct.hideLabels){Ext.apply(this,{labelStyle:'display:none',elementStyle:'padding-left:0;',labelAdjust:0});}else{this.labelSeparator=Ext.isDefined(ct.labelSeparator)?ct.labelSeparator:this.labelSeparator;ct.labelWidth=ct.labelWidth||100;if(Ext.isNumber(ct.labelWidth)){var pad=Ext.isNumber(ct.labelPad)?ct.labelPad:5;Ext.apply(this,{labelAdjust:ct.labelWidth+pad,labelStyle:'width:'+ct.labelWidth+'px;',elementStyle:'padding-left:'+(ct.labelWidth+pad)+'px'});} +if(ct.labelAlign=='top'){Ext.apply(this,{labelStyle:'width:auto;',labelAdjust:0,elementStyle:'padding-left:0;'});}}},isHide:function(c){return c.hideLabel||this.container.hideLabels;},onFieldShow:function(c){c.getItemCt().removeClass('x-hide-'+c.hideMode);if(c.isComposite){c.doLayout();}},onFieldHide:function(c){c.getItemCt().addClass('x-hide-'+c.hideMode);},getLabelStyle:function(s){var ls='',items=[this.labelStyle,s];for(var i=0,len=items.length;i<len;++i){if(items[i]){ls+=items[i];if(ls.substr(-1,1)!=';'){ls+=';';}}} +return ls;},renderItem:function(c,position,target){if(c&&(c.isFormField||c.fieldLabel)&&c.inputType!='hidden'){var args=this.getTemplateArgs(c);if(Ext.isNumber(position)){position=target.dom.childNodes[position]||null;} +if(position){c.itemCt=this.fieldTpl.insertBefore(position,args,true);}else{c.itemCt=this.fieldTpl.append(target,args,true);} +if(!c.getItemCt){Ext.apply(c,{getItemCt:function(){return c.itemCt;},customItemCt:true});} +c.label=c.getItemCt().child('label.x-form-item-label');if(!c.rendered){c.render('x-form-el-'+c.id);}else if(!this.isValidParent(c,target)){Ext.fly('x-form-el-'+c.id).appendChild(c.getPositionEl());} +if(this.trackLabels){if(c.hidden){this.onFieldHide(c);} +c.on({scope:this,show:this.onFieldShow,hide:this.onFieldHide});} +this.configureItem(c);}else{Ext.layout.FormLayout.superclass.renderItem.apply(this,arguments);}},getTemplateArgs:function(field){var noLabelSep=!field.fieldLabel||field.hideLabel;return{id:field.id,label:field.fieldLabel,itemCls:(field.itemCls||this.container.itemCls||'')+(field.hideLabel?' x-hide-label':''),clearCls:field.clearCls||'x-form-clear-left',labelStyle:this.getLabelStyle(field.labelStyle),elementStyle:this.elementStyle||'',labelSeparator:noLabelSep?'':(Ext.isDefined(field.labelSeparator)?field.labelSeparator:this.labelSeparator)};},adjustWidthAnchor:function(value,c){if(c.label&&!this.isHide(c)&&(this.container.labelAlign!='top')){var adjust=Ext.isIE6||(Ext.isIE&&!Ext.isStrict);return value-this.labelAdjust+(adjust?-3:0);} +return value;},adjustHeightAnchor:function(value,c){if(c.label&&!this.isHide(c)&&(this.container.labelAlign=='top')){return value-c.label.getHeight();} +return value;},isValidParent:function(c,target){return target&&this.container.getEl().contains(c.getPositionEl());}});Ext.Container.LAYOUTS['form']=Ext.layout.FormLayout;Ext.layout.AccordionLayout=Ext.extend(Ext.layout.FitLayout,{fill:true,autoWidth:true,titleCollapse:true,hideCollapseTool:false,collapseFirst:false,animate:false,sequence:false,activeOnTop:false,type:'accordion',renderItem:function(c){if(this.animate===false){c.animCollapse=false;} +c.collapsible=true;if(this.autoWidth){c.autoWidth=true;} +if(this.titleCollapse){c.titleCollapse=true;} +if(this.hideCollapseTool){c.hideCollapseTool=true;} +if(this.collapseFirst!==undefined){c.collapseFirst=this.collapseFirst;} +if(!this.activeItem&&!c.collapsed){this.setActiveItem(c,true);}else if(this.activeItem&&this.activeItem!=c){c.collapsed=true;} +Ext.layout.AccordionLayout.superclass.renderItem.apply(this,arguments);c.header.addClass('x-accordion-hd');c.on('beforeexpand',this.beforeExpand,this);},onRemove:function(c){Ext.layout.AccordionLayout.superclass.onRemove.call(this,c);if(c.rendered){c.header.removeClass('x-accordion-hd');} +c.un('beforeexpand',this.beforeExpand,this);},beforeExpand:function(p,anim){var ai=this.activeItem;if(ai){if(this.sequence){delete this.activeItem;if(!ai.collapsed){ai.collapse({callback:function(){p.expand(anim||true);},scope:this});return false;}}else{ai.collapse(this.animate);}} +this.setActive(p);if(this.activeOnTop){p.el.dom.parentNode.insertBefore(p.el.dom,p.el.dom.parentNode.firstChild);} +this.layout();},setItemSize:function(item,size){if(this.fill&&item){var hh=0,i,ct=this.getRenderedItems(this.container),len=ct.length,p;for(i=0;i<len;i++){if((p=ct[i])!=item&&!p.hidden){hh+=p.header.getHeight();}};size.height-=hh;item.setSize(size);}},setActiveItem:function(item){this.setActive(item,true);},setActive:function(item,expand){var ai=this.activeItem;item=this.container.getComponent(item);if(ai!=item){if(item.rendered&&item.collapsed&&expand){item.expand();}else{if(ai){ai.fireEvent('deactivate',ai);} +this.activeItem=item;item.fireEvent('activate',item);}}}});Ext.Container.LAYOUTS.accordion=Ext.layout.AccordionLayout;Ext.layout.Accordion=Ext.layout.AccordionLayout;Ext.layout.TableLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:false,type:'table',targetCls:'x-table-layout-ct',tableAttrs:null,setContainer:function(ct){Ext.layout.TableLayout.superclass.setContainer.call(this,ct);this.currentRow=0;this.currentColumn=0;this.cells=[];},onLayout:function(ct,target){var cs=ct.items.items,len=cs.length,c,i;if(!this.table){target.addClass('x-table-layout-ct');this.table=target.createChild(Ext.apply({tag:'table',cls:'x-table-layout',cellspacing:0,cn:{tag:'tbody'}},this.tableAttrs),null,true);} +this.renderAll(ct,target);},getRow:function(index){var row=this.table.tBodies[0].childNodes[index];if(!row){row=document.createElement('tr');this.table.tBodies[0].appendChild(row);} +return row;},getNextCell:function(c){var cell=this.getNextNonSpan(this.currentColumn,this.currentRow);var curCol=this.currentColumn=cell[0],curRow=this.currentRow=cell[1];for(var rowIndex=curRow;rowIndex<curRow+(c.rowspan||1);rowIndex++){if(!this.cells[rowIndex]){this.cells[rowIndex]=[];} +for(var colIndex=curCol;colIndex<curCol+(c.colspan||1);colIndex++){this.cells[rowIndex][colIndex]=true;}} +var td=document.createElement('td');if(c.cellId){td.id=c.cellId;} +var cls='x-table-layout-cell';if(c.cellCls){cls+=' '+c.cellCls;} +td.className=cls;if(c.colspan){td.colSpan=c.colspan;} +if(c.rowspan){td.rowSpan=c.rowspan;} +this.getRow(curRow).appendChild(td);return td;},getNextNonSpan:function(colIndex,rowIndex){var cols=this.columns;while((cols&&colIndex>=cols)||(this.cells[rowIndex]&&this.cells[rowIndex][colIndex])){if(cols&&colIndex>=cols){rowIndex++;colIndex=0;}else{colIndex++;}} +return[colIndex,rowIndex];},renderItem:function(c,position,target){if(!this.table){this.table=target.createChild(Ext.apply({tag:'table',cls:'x-table-layout',cellspacing:0,cn:{tag:'tbody'}},this.tableAttrs),null,true);} +if(c&&!c.rendered){c.render(this.getNextCell(c));this.configureItem(c);}else if(c&&!this.isValidParent(c,target)){var container=this.getNextCell(c);container.insertBefore(c.getPositionEl().dom,null);c.container=Ext.get(container);this.configureItem(c);}},isValidParent:function(c,target){return c.getPositionEl().up('table',5).dom.parentNode===(target.dom||target);},destroy:function(){delete this.table;Ext.layout.TableLayout.superclass.destroy.call(this);}});Ext.Container.LAYOUTS['table']=Ext.layout.TableLayout;Ext.layout.AbsoluteLayout=Ext.extend(Ext.layout.AnchorLayout,{extraCls:'x-abs-layout-item',type:'absolute',onLayout:function(ct,target){target.position();this.paddingLeft=target.getPadding('l');this.paddingTop=target.getPadding('t');Ext.layout.AbsoluteLayout.superclass.onLayout.call(this,ct,target);},adjustWidthAnchor:function(value,comp){return value?value-comp.getPosition(true)[0]+this.paddingLeft:value;},adjustHeightAnchor:function(value,comp){return value?value-comp.getPosition(true)[1]+this.paddingTop:value;}});Ext.Container.LAYOUTS['absolute']=Ext.layout.AbsoluteLayout;Ext.layout.BoxLayout=Ext.extend(Ext.layout.ContainerLayout,{defaultMargins:{left:0,top:0,right:0,bottom:0},padding:'0',pack:'start',monitorResize:true,type:'box',scrollOffset:0,extraCls:'x-box-item',targetCls:'x-box-layout-ct',innerCls:'x-box-inner',constructor:function(config){Ext.layout.BoxLayout.superclass.constructor.call(this,config);if(Ext.isString(this.defaultMargins)){this.defaultMargins=this.parseMargins(this.defaultMargins);} +var handler=this.overflowHandler;if(typeof handler=='string'){handler={type:handler};} +var handlerType='none';if(handler&&handler.type!=undefined){handlerType=handler.type;} +var constructor=Ext.layout.boxOverflow[handlerType];if(constructor[this.type]){constructor=constructor[this.type];} +this.overflowHandler=new constructor(this,handler);},onLayout:function(container,target){Ext.layout.BoxLayout.superclass.onLayout.call(this,container,target);var tSize=this.getLayoutTargetSize(),items=this.getVisibleItems(container),calcs=this.calculateChildBoxes(items,tSize),boxes=calcs.boxes,meta=calcs.meta;if(tSize.width>0){var handler=this.overflowHandler,method=meta.tooNarrow?'handleOverflow':'clearOverflow';var results=handler[method](calcs,tSize);if(results){if(results.targetSize){tSize=results.targetSize;} +if(results.recalculate){items=this.getVisibleItems(container);calcs=this.calculateChildBoxes(items,tSize);boxes=calcs.boxes;}}} +this.layoutTargetLastSize=tSize;this.childBoxCache=calcs;this.updateInnerCtSize(tSize,calcs);this.updateChildBoxes(boxes);this.handleTargetOverflow(tSize,container,target);},updateChildBoxes:function(boxes){for(var i=0,length=boxes.length;i<length;i++){var box=boxes[i],comp=box.component;if(box.dirtySize){comp.setSize(box.width,box.height);} +if(isNaN(box.left)||isNaN(box.top)){continue;} +comp.setPosition(box.left,box.top);}},updateInnerCtSize:function(tSize,calcs){var align=this.align,padding=this.padding,width=tSize.width,height=tSize.height;if(this.type=='hbox'){var innerCtWidth=width,innerCtHeight=calcs.meta.maxHeight+padding.top+padding.bottom;if(align=='stretch'){innerCtHeight=height;}else if(align=='middle'){innerCtHeight=Math.max(height,innerCtHeight);}}else{var innerCtHeight=height,innerCtWidth=calcs.meta.maxWidth+padding.left+padding.right;if(align=='stretch'){innerCtWidth=width;}else if(align=='center'){innerCtWidth=Math.max(width,innerCtWidth);}} +this.innerCt.setSize(innerCtWidth||undefined,innerCtHeight||undefined);},handleTargetOverflow:function(previousTargetSize,container,target){var overflow=target.getStyle('overflow');if(overflow&&overflow!='hidden'&&!this.adjustmentPass){var newTargetSize=this.getLayoutTargetSize();if(newTargetSize.width!=previousTargetSize.width||newTargetSize.height!=previousTargetSize.height){this.adjustmentPass=true;this.onLayout(container,target);}} +delete this.adjustmentPass;},isValidParent:function(c,target){return this.innerCt&&c.getPositionEl().dom.parentNode==this.innerCt.dom;},getVisibleItems:function(ct){var ct=ct||this.container,t=ct.getLayoutTarget(),cti=ct.items.items,len=cti.length,i,c,items=[];for(i=0;i<len;i++){if((c=cti[i]).rendered&&this.isValidParent(c,t)&&c.hidden!==true&&c.collapsed!==true&&c.shouldLayout!==false){items.push(c);}} +return items;},renderAll:function(ct,target){if(!this.innerCt){this.innerCt=target.createChild({cls:this.innerCls});this.padding=this.parseMargins(this.padding);} +Ext.layout.BoxLayout.superclass.renderAll.call(this,ct,this.innerCt);},getLayoutTargetSize:function(){var target=this.container.getLayoutTarget(),ret;if(target){ret=target.getViewSize();if(Ext.isIE&&Ext.isStrict&&ret.width==0){ret=target.getStyleSize();} +ret.width-=target.getPadding('lr');ret.height-=target.getPadding('tb');} +return ret;},renderItem:function(c){if(Ext.isString(c.margins)){c.margins=this.parseMargins(c.margins);}else if(!c.margins){c.margins=this.defaultMargins;} +Ext.layout.BoxLayout.superclass.renderItem.apply(this,arguments);},destroy:function(){Ext.destroy(this.overflowHandler);Ext.layout.BoxLayout.superclass.destroy.apply(this,arguments);}});Ext.ns('Ext.layout.boxOverflow');Ext.layout.boxOverflow.None=Ext.extend(Object,{constructor:function(layout,config){this.layout=layout;Ext.apply(this,config||{});},handleOverflow:Ext.emptyFn,clearOverflow:Ext.emptyFn});Ext.layout.boxOverflow.none=Ext.layout.boxOverflow.None;Ext.layout.boxOverflow.Menu=Ext.extend(Ext.layout.boxOverflow.None,{afterCls:'x-strip-right',noItemsMenuText:'<div class="x-toolbar-no-items">(None)</div>',constructor:function(layout){Ext.layout.boxOverflow.Menu.superclass.constructor.apply(this,arguments);this.menuItems=[];},createInnerElements:function(){if(!this.afterCt){this.afterCt=this.layout.innerCt.insertSibling({cls:this.afterCls},'before');}},clearOverflow:function(calculations,targetSize){var newWidth=targetSize.width+(this.afterCt?this.afterCt.getWidth():0),items=this.menuItems;this.hideTrigger();for(var index=0,length=items.length;index<length;index++){items.pop().component.show();} +return{targetSize:{height:targetSize.height,width:newWidth}};},showTrigger:function(){this.createMenu();this.menuTrigger.show();},hideTrigger:function(){if(this.menuTrigger!=undefined){this.menuTrigger.hide();}},beforeMenuShow:function(menu){var items=this.menuItems,len=items.length,item,prev;var needsSep=function(group,item){return group.isXType('buttongroup')&&!(item instanceof Ext.Toolbar.Separator);};this.clearMenu();menu.removeAll();for(var i=0;i<len;i++){item=items[i].component;if(prev&&(needsSep(item,prev)||needsSep(prev,item))){menu.add('-');} +this.addComponentToMenu(menu,item);prev=item;} +if(menu.items.length<1){menu.add(this.noItemsMenuText);}},createMenuConfig:function(component,hideOnClick){var config=Ext.apply({},component.initialConfig),group=component.toggleGroup;Ext.copyTo(config,component,['iconCls','icon','itemId','disabled','handler','scope','menu']);Ext.apply(config,{text:component.overflowText||component.text,hideOnClick:hideOnClick});if(group||component.enableToggle){Ext.apply(config,{group:group,checked:component.pressed,listeners:{checkchange:function(item,checked){component.toggle(checked);}}});} +delete config.ownerCt;delete config.xtype;delete config.id;return config;},addComponentToMenu:function(menu,component){if(component instanceof Ext.Toolbar.Separator){menu.add('-');}else if(Ext.isFunction(component.isXType)){if(component.isXType('splitbutton')){menu.add(this.createMenuConfig(component,true));}else if(component.isXType('button')){menu.add(this.createMenuConfig(component,!component.menu));}else if(component.isXType('buttongroup')){component.items.each(function(item){this.addComponentToMenu(menu,item);},this);}}},clearMenu:function(){var menu=this.moreMenu;if(menu&&menu.items){menu.items.each(function(item){delete item.menu;});}},createMenu:function(){if(!this.menuTrigger){this.createInnerElements();this.menu=new Ext.menu.Menu({ownerCt:this.layout.container,listeners:{scope:this,beforeshow:this.beforeMenuShow}});this.menuTrigger=new Ext.Button({iconCls:'x-toolbar-more-icon',cls:'x-toolbar-more',menu:this.menu,renderTo:this.afterCt});}},destroy:function(){Ext.destroy(this.menu,this.menuTrigger);}});Ext.layout.boxOverflow.menu=Ext.layout.boxOverflow.Menu;Ext.layout.boxOverflow.HorizontalMenu=Ext.extend(Ext.layout.boxOverflow.Menu,{constructor:function(){Ext.layout.boxOverflow.HorizontalMenu.superclass.constructor.apply(this,arguments);var me=this,layout=me.layout,origFunction=layout.calculateChildBoxes;layout.calculateChildBoxes=function(visibleItems,targetSize){var calcs=origFunction.apply(layout,arguments),meta=calcs.meta,items=me.menuItems;var hiddenWidth=0;for(var index=0,length=items.length;index<length;index++){hiddenWidth+=items[index].width;} +meta.minimumWidth+=hiddenWidth;meta.tooNarrow=meta.minimumWidth>targetSize.width;return calcs;};},handleOverflow:function(calculations,targetSize){this.showTrigger();var newWidth=targetSize.width-this.afterCt.getWidth(),boxes=calculations.boxes,usedWidth=0,recalculate=false;for(var index=0,length=boxes.length;index<length;index++){usedWidth+=boxes[index].width;} +var spareWidth=newWidth-usedWidth,showCount=0;for(var index=0,length=this.menuItems.length;index<length;index++){var hidden=this.menuItems[index],comp=hidden.component,width=hidden.width;if(width<spareWidth){comp.show();spareWidth-=width;showCount++;recalculate=true;}else{break;}} +if(recalculate){this.menuItems=this.menuItems.slice(showCount);}else{for(var i=boxes.length-1;i>=0;i--){var item=boxes[i].component,right=boxes[i].left+boxes[i].width;if(right>=newWidth){this.menuItems.unshift({component:item,width:boxes[i].width});item.hide();}else{break;}}} +if(this.menuItems.length==0){this.hideTrigger();} +return{targetSize:{height:targetSize.height,width:newWidth},recalculate:recalculate};}});Ext.layout.boxOverflow.menu.hbox=Ext.layout.boxOverflow.HorizontalMenu;Ext.layout.boxOverflow.Scroller=Ext.extend(Ext.layout.boxOverflow.None,{animateScroll:true,scrollIncrement:100,wheelIncrement:3,scrollRepeatInterval:400,scrollDuration:0.4,beforeCls:'x-strip-left',afterCls:'x-strip-right',scrollerCls:'x-strip-scroller',beforeScrollerCls:'x-strip-scroller-left',afterScrollerCls:'x-strip-scroller-right',createWheelListener:function(){this.layout.innerCt.on({scope:this,mousewheel:function(e){e.stopEvent();this.scrollBy(e.getWheelDelta()*this.wheelIncrement*-1,false);}});},handleOverflow:function(calculations,targetSize){this.createInnerElements();this.showScrollers();},clearOverflow:function(){this.hideScrollers();},showScrollers:function(){this.createScrollers();this.beforeScroller.show();this.afterScroller.show();this.updateScrollButtons();},hideScrollers:function(){if(this.beforeScroller!=undefined){this.beforeScroller.hide();this.afterScroller.hide();}},createScrollers:function(){if(!this.beforeScroller&&!this.afterScroller){var before=this.beforeCt.createChild({cls:String.format("{0} {1} ",this.scrollerCls,this.beforeScrollerCls)});var after=this.afterCt.createChild({cls:String.format("{0} {1}",this.scrollerCls,this.afterScrollerCls)});before.addClassOnOver(this.beforeScrollerCls+'-hover');after.addClassOnOver(this.afterScrollerCls+'-hover');before.setVisibilityMode(Ext.Element.DISPLAY);after.setVisibilityMode(Ext.Element.DISPLAY);this.beforeRepeater=new Ext.util.ClickRepeater(before,{interval:this.scrollRepeatInterval,handler:this.scrollLeft,scope:this});this.afterRepeater=new Ext.util.ClickRepeater(after,{interval:this.scrollRepeatInterval,handler:this.scrollRight,scope:this});this.beforeScroller=before;this.afterScroller=after;}},destroy:function(){Ext.destroy(this.beforeScroller,this.afterScroller,this.beforeRepeater,this.afterRepeater,this.beforeCt,this.afterCt);},scrollBy:function(delta,animate){this.scrollTo(this.getScrollPosition()+delta,animate);},getItem:function(item){if(Ext.isString(item)){item=Ext.getCmp(item);}else if(Ext.isNumber(item)){item=this.items[item];} +return item;},getScrollAnim:function(){return{duration:this.scrollDuration,callback:this.updateScrollButtons,scope:this};},updateScrollButtons:function(){if(this.beforeScroller==undefined||this.afterScroller==undefined){return;} +var beforeMeth=this.atExtremeBefore()?'addClass':'removeClass',afterMeth=this.atExtremeAfter()?'addClass':'removeClass',beforeCls=this.beforeScrollerCls+'-disabled',afterCls=this.afterScrollerCls+'-disabled';this.beforeScroller[beforeMeth](beforeCls);this.afterScroller[afterMeth](afterCls);this.scrolling=false;},atExtremeBefore:function(){return this.getScrollPosition()===0;},scrollLeft:function(animate){this.scrollBy(-this.scrollIncrement,animate);},scrollRight:function(animate){this.scrollBy(this.scrollIncrement,animate);},scrollToItem:function(item,animate){item=this.getItem(item);if(item!=undefined){var visibility=this.getItemVisibility(item);if(!visibility.fullyVisible){var box=item.getBox(true,true),newX=box.x;if(visibility.hiddenRight){newX-=(this.layout.innerCt.getWidth()-box.width);} +this.scrollTo(newX,animate);}}},getItemVisibility:function(item){var box=this.getItem(item).getBox(true,true),itemLeft=box.x,itemRight=box.x+box.width,scrollLeft=this.getScrollPosition(),scrollRight=this.layout.innerCt.getWidth()+scrollLeft;return{hiddenLeft:itemLeft<scrollLeft,hiddenRight:itemRight>scrollRight,fullyVisible:itemLeft>scrollLeft&&itemRight<scrollRight};}});Ext.layout.boxOverflow.scroller=Ext.layout.boxOverflow.Scroller;Ext.layout.boxOverflow.VerticalScroller=Ext.extend(Ext.layout.boxOverflow.Scroller,{scrollIncrement:75,wheelIncrement:2,handleOverflow:function(calculations,targetSize){Ext.layout.boxOverflow.VerticalScroller.superclass.handleOverflow.apply(this,arguments);return{targetSize:{height:targetSize.height-(this.beforeCt.getHeight()+this.afterCt.getHeight()),width:targetSize.width}};},createInnerElements:function(){var target=this.layout.innerCt;if(!this.beforeCt){this.beforeCt=target.insertSibling({cls:this.beforeCls},'before');this.afterCt=target.insertSibling({cls:this.afterCls},'after');this.createWheelListener();}},scrollTo:function(position,animate){var oldPosition=this.getScrollPosition(),newPosition=position.constrain(0,this.getMaxScrollBottom());if(newPosition!=oldPosition&&!this.scrolling){if(animate==undefined){animate=this.animateScroll;} +this.layout.innerCt.scrollTo('top',newPosition,animate?this.getScrollAnim():false);if(animate){this.scrolling=true;}else{this.scrolling=false;this.updateScrollButtons();}}},getScrollPosition:function(){return parseInt(this.layout.innerCt.dom.scrollTop,10)||0;},getMaxScrollBottom:function(){return this.layout.innerCt.dom.scrollHeight-this.layout.innerCt.getHeight();},atExtremeAfter:function(){return this.getScrollPosition()>=this.getMaxScrollBottom();}});Ext.layout.boxOverflow.scroller.vbox=Ext.layout.boxOverflow.VerticalScroller;Ext.layout.boxOverflow.HorizontalScroller=Ext.extend(Ext.layout.boxOverflow.Scroller,{handleOverflow:function(calculations,targetSize){Ext.layout.boxOverflow.HorizontalScroller.superclass.handleOverflow.apply(this,arguments);return{targetSize:{height:targetSize.height,width:targetSize.width-(this.beforeCt.getWidth()+this.afterCt.getWidth())}};},createInnerElements:function(){var target=this.layout.innerCt;if(!this.beforeCt){this.afterCt=target.insertSibling({cls:this.afterCls},'before');this.beforeCt=target.insertSibling({cls:this.beforeCls},'before');this.createWheelListener();}},scrollTo:function(position,animate){var oldPosition=this.getScrollPosition(),newPosition=position.constrain(0,this.getMaxScrollRight());if(newPosition!=oldPosition&&!this.scrolling){if(animate==undefined){animate=this.animateScroll;} +this.layout.innerCt.scrollTo('left',newPosition,animate?this.getScrollAnim():false);if(animate){this.scrolling=true;}else{this.scrolling=false;this.updateScrollButtons();}}},getScrollPosition:function(){return parseInt(this.layout.innerCt.dom.scrollLeft,10)||0;},getMaxScrollRight:function(){return this.layout.innerCt.dom.scrollWidth-this.layout.innerCt.getWidth();},atExtremeAfter:function(){return this.getScrollPosition()>=this.getMaxScrollRight();}});Ext.layout.boxOverflow.scroller.hbox=Ext.layout.boxOverflow.HorizontalScroller;Ext.layout.HBoxLayout=Ext.extend(Ext.layout.BoxLayout,{align:'top',type:'hbox',calculateChildBoxes:function(visibleItems,targetSize){var visibleCount=visibleItems.length,padding=this.padding,topOffset=padding.top,leftOffset=padding.left,paddingVert=topOffset+padding.bottom,paddingHoriz=leftOffset+padding.right,width=targetSize.width-this.scrollOffset,height=targetSize.height,availHeight=Math.max(0,height-paddingVert),isStart=this.pack=='start',isCenter=this.pack=='center',isEnd=this.pack=='end',nonFlexWidth=0,maxHeight=0,totalFlex=0,desiredWidth=0,minimumWidth=0,boxes=[],child,childWidth,childHeight,childSize,childMargins,canLayout,i,calcs,flexedWidth,horizMargins,vertMargins,stretchHeight;for(i=0;i<visibleCount;i++){child=visibleItems[i];childHeight=child.height;childWidth=child.width;canLayout=!child.hasLayout&&typeof child.doLayout=='function';if(typeof childWidth!='number'){if(child.flex&&!childWidth){totalFlex+=child.flex;}else{if(!childWidth&&canLayout){child.doLayout();} +childSize=child.getSize();childWidth=childSize.width;childHeight=childSize.height;}} +childMargins=child.margins;horizMargins=childMargins.left+childMargins.right;nonFlexWidth+=horizMargins+(childWidth||0);desiredWidth+=horizMargins+(child.flex?child.minWidth||0:childWidth);minimumWidth+=horizMargins+(child.minWidth||childWidth||0);if(typeof childHeight!='number'){if(canLayout){child.doLayout();} +childHeight=child.getHeight();} +maxHeight=Math.max(maxHeight,childHeight+childMargins.top+childMargins.bottom);boxes.push({component:child,height:childHeight||undefined,width:childWidth||undefined});} +var shortfall=desiredWidth-width,tooNarrow=minimumWidth>width;var availableWidth=Math.max(0,width-nonFlexWidth-paddingHoriz);if(tooNarrow){for(i=0;i<visibleCount;i++){boxes[i].width=visibleItems[i].minWidth||visibleItems[i].width||boxes[i].width;}}else{if(shortfall>0){var minWidths=[];for(var index=0,length=visibleCount;index<length;index++){var item=visibleItems[index],minWidth=item.minWidth||0;if(item.flex){boxes[index].width=minWidth;}else{minWidths.push({minWidth:minWidth,available:boxes[index].width-minWidth,index:index});}} +minWidths.sort(function(a,b){return a.available>b.available?1:-1;});for(var i=0,length=minWidths.length;i<length;i++){var itemIndex=minWidths[i].index;if(itemIndex==undefined){continue;} +var item=visibleItems[itemIndex],box=boxes[itemIndex],oldWidth=box.width,minWidth=item.minWidth,newWidth=Math.max(minWidth,oldWidth-Math.ceil(shortfall/(length-i))),reduction=oldWidth-newWidth;boxes[itemIndex].width=newWidth;shortfall-=reduction;}}else{var remainingWidth=availableWidth,remainingFlex=totalFlex;for(i=0;i<visibleCount;i++){child=visibleItems[i];calcs=boxes[i];childMargins=child.margins;vertMargins=childMargins.top+childMargins.bottom;if(isStart&&child.flex&&!child.width){flexedWidth=Math.ceil((child.flex/remainingFlex)*remainingWidth);remainingWidth-=flexedWidth;remainingFlex-=child.flex;calcs.width=flexedWidth;calcs.dirtySize=true;}}}} +if(isCenter){leftOffset+=availableWidth/2;}else if(isEnd){leftOffset+=availableWidth;} +for(i=0;i<visibleCount;i++){child=visibleItems[i];calcs=boxes[i];childMargins=child.margins;leftOffset+=childMargins.left;vertMargins=childMargins.top+childMargins.bottom;calcs.left=leftOffset;calcs.top=topOffset+childMargins.top;switch(this.align){case'stretch':stretchHeight=availHeight-vertMargins;calcs.height=stretchHeight.constrain(child.minHeight||0,child.maxHeight||1000000);calcs.dirtySize=true;break;case'stretchmax':stretchHeight=maxHeight-vertMargins;calcs.height=stretchHeight.constrain(child.minHeight||0,child.maxHeight||1000000);calcs.dirtySize=true;break;case'middle':var diff=availHeight-calcs.height-vertMargins;if(diff>0){calcs.top=topOffset+vertMargins+(diff/2);}} +leftOffset+=calcs.width+childMargins.right;} +return{boxes:boxes,meta:{maxHeight:maxHeight,nonFlexWidth:nonFlexWidth,desiredWidth:desiredWidth,minimumWidth:minimumWidth,shortfall:desiredWidth-width,tooNarrow:tooNarrow}};}});Ext.Container.LAYOUTS.hbox=Ext.layout.HBoxLayout;Ext.layout.VBoxLayout=Ext.extend(Ext.layout.BoxLayout,{align:'left',type:'vbox',calculateChildBoxes:function(visibleItems,targetSize){var visibleCount=visibleItems.length,padding=this.padding,topOffset=padding.top,leftOffset=padding.left,paddingVert=topOffset+padding.bottom,paddingHoriz=leftOffset+padding.right,width=targetSize.width-this.scrollOffset,height=targetSize.height,availWidth=Math.max(0,width-paddingHoriz),isStart=this.pack=='start',isCenter=this.pack=='center',isEnd=this.pack=='end',nonFlexHeight=0,maxWidth=0,totalFlex=0,desiredHeight=0,minimumHeight=0,boxes=[],child,childWidth,childHeight,childSize,childMargins,canLayout,i,calcs,flexedWidth,horizMargins,vertMargins,stretchWidth;for(i=0;i<visibleCount;i++){child=visibleItems[i];childHeight=child.height;childWidth=child.width;canLayout=!child.hasLayout&&typeof child.doLayout=='function';if(typeof childHeight!='number'){if(child.flex&&!childHeight){totalFlex+=child.flex;}else{if(!childHeight&&canLayout){child.doLayout();} +childSize=child.getSize();childWidth=childSize.width;childHeight=childSize.height;}} +childMargins=child.margins;vertMargins=childMargins.top+childMargins.bottom;nonFlexHeight+=vertMargins+(childHeight||0);desiredHeight+=vertMargins+(child.flex?child.minHeight||0:childHeight);minimumHeight+=vertMargins+(child.minHeight||childHeight||0);if(typeof childWidth!='number'){if(canLayout){child.doLayout();} +childWidth=child.getWidth();} +maxWidth=Math.max(maxWidth,childWidth+childMargins.left+childMargins.right);boxes.push({component:child,height:childHeight||undefined,width:childWidth||undefined});} +var shortfall=desiredHeight-height,tooNarrow=minimumHeight>height;var availableHeight=Math.max(0,(height-nonFlexHeight-paddingVert));if(tooNarrow){for(i=0,length=visibleCount;i<length;i++){boxes[i].height=visibleItems[i].minHeight||visibleItems[i].height||boxes[i].height;}}else{if(shortfall>0){var minHeights=[];for(var index=0,length=visibleCount;index<length;index++){var item=visibleItems[index],minHeight=item.minHeight||0;if(item.flex){boxes[index].height=minHeight;}else{minHeights.push({minHeight:minHeight,available:boxes[index].height-minHeight,index:index});}} +minHeights.sort(function(a,b){return a.available>b.available?1:-1;});for(var i=0,length=minHeights.length;i<length;i++){var itemIndex=minHeights[i].index;if(itemIndex==undefined){continue;} +var item=visibleItems[itemIndex],box=boxes[itemIndex],oldHeight=box.height,minHeight=item.minHeight,newHeight=Math.max(minHeight,oldHeight-Math.ceil(shortfall/(length-i))),reduction=oldHeight-newHeight;boxes[itemIndex].height=newHeight;shortfall-=reduction;}}else{var remainingHeight=availableHeight,remainingFlex=totalFlex;for(i=0;i<visibleCount;i++){child=visibleItems[i];calcs=boxes[i];childMargins=child.margins;horizMargins=childMargins.left+childMargins.right;if(isStart&&child.flex&&!child.height){flexedHeight=Math.ceil((child.flex/remainingFlex)*remainingHeight);remainingHeight-=flexedHeight;remainingFlex-=child.flex;calcs.height=flexedHeight;calcs.dirtySize=true;}}}} +if(isCenter){topOffset+=availableHeight/2;}else if(isEnd){topOffset+=availableHeight;} +for(i=0;i<visibleCount;i++){child=visibleItems[i];calcs=boxes[i];childMargins=child.margins;topOffset+=childMargins.top;horizMargins=childMargins.left+childMargins.right;calcs.left=leftOffset+childMargins.left;calcs.top=topOffset;switch(this.align){case'stretch':stretchWidth=availWidth-horizMargins;calcs.width=stretchWidth.constrain(child.minWidth||0,child.maxWidth||1000000);calcs.dirtySize=true;break;case'stretchmax':stretchWidth=maxWidth-horizMargins;calcs.width=stretchWidth.constrain(child.minWidth||0,child.maxWidth||1000000);calcs.dirtySize=true;break;case'center':var diff=availWidth-calcs.width-horizMargins;if(diff>0){calcs.left=leftOffset+horizMargins+(diff/2);}} +topOffset+=calcs.height+childMargins.bottom;} +return{boxes:boxes,meta:{maxWidth:maxWidth,nonFlexHeight:nonFlexHeight,desiredHeight:desiredHeight,minimumHeight:minimumHeight,shortfall:desiredHeight-height,tooNarrow:tooNarrow}};}});Ext.Container.LAYOUTS.vbox=Ext.layout.VBoxLayout;Ext.layout.ToolbarLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,type:'toolbar',triggerWidth:18,noItemsMenuText:'<div class="x-toolbar-no-items">(None)</div>',lastOverflow:false,tableHTML:['<table cellspacing="0" class="x-toolbar-ct">','<tbody>','<tr>','<td class="x-toolbar-left" align="{0}">','<table cellspacing="0">','<tbody>','<tr class="x-toolbar-left-row"></tr>','</tbody>','</table>','</td>','<td class="x-toolbar-right" align="right">','<table cellspacing="0" class="x-toolbar-right-ct">','<tbody>','<tr>','<td>','<table cellspacing="0">','<tbody>','<tr class="x-toolbar-right-row"></tr>','</tbody>','</table>','</td>','<td>','<table cellspacing="0">','<tbody>','<tr class="x-toolbar-extras-row"></tr>','</tbody>','</table>','</td>','</tr>','</tbody>','</table>','</td>','</tr>','</tbody>','</table>'].join(""),onLayout:function(ct,target){if(!this.leftTr){var align=ct.buttonAlign=='center'?'center':'left';target.addClass('x-toolbar-layout-ct');target.insertHtml('beforeEnd',String.format(this.tableHTML,align));this.leftTr=target.child('tr.x-toolbar-left-row',true);this.rightTr=target.child('tr.x-toolbar-right-row',true);this.extrasTr=target.child('tr.x-toolbar-extras-row',true);if(this.hiddenItem==undefined){this.hiddenItems=[];}} +var side=ct.buttonAlign=='right'?this.rightTr:this.leftTr,items=ct.items.items,position=0;for(var i=0,len=items.length,c;i<len;i++,position++){c=items[i];if(c.isFill){side=this.rightTr;position=-1;}else if(!c.rendered){c.render(this.insertCell(c,side,position));this.configureItem(c);}else{if(!c.xtbHidden&&!this.isValidParent(c,side.childNodes[position])){var td=this.insertCell(c,side,position);td.appendChild(c.getPositionEl().dom);c.container=Ext.get(td);}}} +this.cleanup(this.leftTr);this.cleanup(this.rightTr);this.cleanup(this.extrasTr);this.fitToSize(target);},cleanup:function(el){var cn=el.childNodes,i,c;for(i=cn.length-1;i>=0&&(c=cn[i]);i--){if(!c.firstChild){el.removeChild(c);}}},insertCell:function(c,target,position){var td=document.createElement('td');td.className='x-toolbar-cell';target.insertBefore(td,target.childNodes[position]||null);return td;},hideItem:function(item){this.hiddenItems.push(item);item.xtbHidden=true;item.xtbWidth=item.getPositionEl().dom.parentNode.offsetWidth;item.hide();},unhideItem:function(item){item.show();item.xtbHidden=false;this.hiddenItems.remove(item);},getItemWidth:function(c){return c.hidden?(c.xtbWidth||0):c.getPositionEl().dom.parentNode.offsetWidth;},fitToSize:function(target){if(this.container.enableOverflow===false){return;} +var width=target.dom.clientWidth,tableWidth=target.dom.firstChild.offsetWidth,clipWidth=width-this.triggerWidth,lastWidth=this.lastWidth||0,hiddenItems=this.hiddenItems,hasHiddens=hiddenItems.length!=0,isLarger=width>=lastWidth;this.lastWidth=width;if(tableWidth>width||(hasHiddens&&isLarger)){var items=this.container.items.items,len=items.length,loopWidth=0,item;for(var i=0;i<len;i++){item=items[i];if(!item.isFill){loopWidth+=this.getItemWidth(item);if(loopWidth>clipWidth){if(!(item.hidden||item.xtbHidden)){this.hideItem(item);}}else if(item.xtbHidden){this.unhideItem(item);}}}} +hasHiddens=hiddenItems.length!=0;if(hasHiddens){this.initMore();if(!this.lastOverflow){this.container.fireEvent('overflowchange',this.container,true);this.lastOverflow=true;}}else if(this.more){this.clearMenu();this.more.destroy();delete this.more;if(this.lastOverflow){this.container.fireEvent('overflowchange',this.container,false);this.lastOverflow=false;}}},createMenuConfig:function(component,hideOnClick){var config=Ext.apply({},component.initialConfig),group=component.toggleGroup;Ext.copyTo(config,component,['iconCls','icon','itemId','disabled','handler','scope','menu']);Ext.apply(config,{text:component.overflowText||component.text,hideOnClick:hideOnClick});if(group||component.enableToggle){Ext.apply(config,{group:group,checked:component.pressed,listeners:{checkchange:function(item,checked){component.toggle(checked);}}});} +delete config.ownerCt;delete config.xtype;delete config.id;return config;},addComponentToMenu:function(menu,component){if(component instanceof Ext.Toolbar.Separator){menu.add('-');}else if(Ext.isFunction(component.isXType)){if(component.isXType('splitbutton')){menu.add(this.createMenuConfig(component,true));}else if(component.isXType('button')){menu.add(this.createMenuConfig(component,!component.menu));}else if(component.isXType('buttongroup')){component.items.each(function(item){this.addComponentToMenu(menu,item);},this);}}},clearMenu:function(){var menu=this.moreMenu;if(menu&&menu.items){menu.items.each(function(item){delete item.menu;});}},beforeMoreShow:function(menu){var items=this.container.items.items,len=items.length,item,prev;var needsSep=function(group,item){return group.isXType('buttongroup')&&!(item instanceof Ext.Toolbar.Separator);};this.clearMenu();menu.removeAll();for(var i=0;i<len;i++){item=items[i];if(item.xtbHidden){if(prev&&(needsSep(item,prev)||needsSep(prev,item))){menu.add('-');} +this.addComponentToMenu(menu,item);prev=item;}} +if(menu.items.length<1){menu.add(this.noItemsMenuText);}},initMore:function(){if(!this.more){this.moreMenu=new Ext.menu.Menu({ownerCt:this.container,listeners:{beforeshow:this.beforeMoreShow,scope:this}});this.more=new Ext.Button({iconCls:'x-toolbar-more-icon',cls:'x-toolbar-more',menu:this.moreMenu,ownerCt:this.container});var td=this.insertCell(this.more,this.extrasTr,100);this.more.render(td);}},destroy:function(){Ext.destroy(this.more,this.moreMenu);delete this.leftTr;delete this.rightTr;delete this.extrasTr;Ext.layout.ToolbarLayout.superclass.destroy.call(this);}});Ext.Container.LAYOUTS.toolbar=Ext.layout.ToolbarLayout;Ext.layout.MenuLayout=Ext.extend(Ext.layout.ContainerLayout,{monitorResize:true,type:'menu',setContainer:function(ct){this.monitorResize=!ct.floating;ct.on('autosize',this.doAutoSize,this);Ext.layout.MenuLayout.superclass.setContainer.call(this,ct);},renderItem:function(c,position,target){if(!this.itemTpl){this.itemTpl=Ext.layout.MenuLayout.prototype.itemTpl=new Ext.XTemplate('<li id="{itemId}" class="{itemCls}">','<tpl if="needsIcon">','<img alt="{altText}" src="{icon}" class="{iconCls}"/>','</tpl>','</li>');} +if(c&&!c.rendered){if(Ext.isNumber(position)){position=target.dom.childNodes[position];} +var a=this.getItemArgs(c);c.render(c.positionEl=position?this.itemTpl.insertBefore(position,a,true):this.itemTpl.append(target,a,true));c.positionEl.menuItemId=c.getItemId();if(!a.isMenuItem&&a.needsIcon){c.positionEl.addClass('x-menu-list-item-indent');} +this.configureItem(c);}else if(c&&!this.isValidParent(c,target)){if(Ext.isNumber(position)){position=target.dom.childNodes[position];} +target.dom.insertBefore(c.getActionEl().dom,position||null);}},getItemArgs:function(c){var isMenuItem=c instanceof Ext.menu.Item,canHaveIcon=!(isMenuItem||c instanceof Ext.menu.Separator);return{isMenuItem:isMenuItem,needsIcon:canHaveIcon&&(c.icon||c.iconCls),icon:c.icon||Ext.BLANK_IMAGE_URL,iconCls:'x-menu-item-icon '+(c.iconCls||''),itemId:'x-menu-el-'+c.id,itemCls:'x-menu-list-item ',altText:c.altText||''};},isValidParent:function(c,target){return c.el.up('li.x-menu-list-item',5).dom.parentNode===(target.dom||target);},onLayout:function(ct,target){Ext.layout.MenuLayout.superclass.onLayout.call(this,ct,target);this.doAutoSize();},doAutoSize:function(){var ct=this.container,w=ct.width;if(ct.floating){if(w){ct.setWidth(w);}else if(Ext.isIE){ct.setWidth(Ext.isStrict&&(Ext.isIE7||Ext.isIE8)?'auto':ct.minWidth);var el=ct.getEl(),t=el.dom.offsetWidth;ct.setWidth(ct.getLayoutTarget().getWidth()+el.getFrameWidth('lr'));}}}});Ext.Container.LAYOUTS['menu']=Ext.layout.MenuLayout;Ext.Viewport=Ext.extend(Ext.Container,{initComponent:function(){Ext.Viewport.superclass.initComponent.call(this);document.getElementsByTagName('html')[0].className+=' x-viewport';this.el=Ext.getBody();this.el.setHeight=Ext.emptyFn;this.el.setWidth=Ext.emptyFn;this.el.setSize=Ext.emptyFn;this.el.dom.scroll='no';this.allowDomMove=false;this.autoWidth=true;this.autoHeight=true;Ext.EventManager.onWindowResize(this.fireResize,this);this.renderTo=this.el;},fireResize:function(w,h){this.fireEvent('resize',this,w,h,w,h);}});Ext.reg('viewport',Ext.Viewport);Ext.Panel=Ext.extend(Ext.Container,{baseCls:'x-panel',collapsedCls:'x-panel-collapsed',maskDisabled:true,animCollapse:Ext.enableFx,headerAsText:true,buttonAlign:'right',collapsed:false,collapseFirst:true,minButtonWidth:75,elements:'body',preventBodyReset:false,padding:undefined,resizeEvent:'bodyresize',toolTarget:'header',collapseEl:'bwrap',slideAnchor:'t',disabledClass:'',deferHeight:true,expandDefaults:{duration:0.25},collapseDefaults:{duration:0.25},initComponent:function(){Ext.Panel.superclass.initComponent.call(this);this.addEvents('bodyresize','titlechange','iconchange','collapse','expand','beforecollapse','beforeexpand','beforeclose','close','activate','deactivate');if(this.unstyled){this.baseCls='x-plain';} +this.toolbars=[];if(this.tbar){this.elements+=',tbar';this.topToolbar=this.createToolbar(this.tbar);this.tbar=null;} +if(this.bbar){this.elements+=',bbar';this.bottomToolbar=this.createToolbar(this.bbar);this.bbar=null;} +if(this.header===true){this.elements+=',header';this.header=null;}else if(this.headerCfg||(this.title&&this.header!==false)){this.elements+=',header';} +if(this.footerCfg||this.footer===true){this.elements+=',footer';this.footer=null;} +if(this.buttons){this.fbar=this.buttons;this.buttons=null;} +if(this.fbar){this.createFbar(this.fbar);} +if(this.autoLoad){this.on('render',this.doAutoLoad,this,{delay:10});}},createFbar:function(fbar){var min=this.minButtonWidth;this.elements+=',footer';this.fbar=this.createToolbar(fbar,{buttonAlign:this.buttonAlign,toolbarCls:'x-panel-fbar',enableOverflow:false,defaults:function(c){return{minWidth:c.minWidth||min};}});this.fbar.items.each(function(c){c.minWidth=c.minWidth||this.minButtonWidth;},this);this.buttons=this.fbar.items.items;},createToolbar:function(tb,options){var result;if(Ext.isArray(tb)){tb={items:tb};} +result=tb.events?Ext.apply(tb,options):this.createComponent(Ext.apply({},tb,options),'toolbar');this.toolbars.push(result);return result;},createElement:function(name,pnode){if(this[name]){pnode.appendChild(this[name].dom);return;} +if(name==='bwrap'||this.elements.indexOf(name)!=-1){if(this[name+'Cfg']){this[name]=Ext.fly(pnode).createChild(this[name+'Cfg']);}else{var el=document.createElement('div');el.className=this[name+'Cls'];this[name]=Ext.get(pnode.appendChild(el));} +if(this[name+'CssClass']){this[name].addClass(this[name+'CssClass']);} +if(this[name+'Style']){this[name].applyStyles(this[name+'Style']);}}},onRender:function(ct,position){Ext.Panel.superclass.onRender.call(this,ct,position);this.createClasses();var el=this.el,d=el.dom,bw,ts;if(this.collapsible&&!this.hideCollapseTool){this.tools=this.tools?this.tools.slice(0):[];this.tools[this.collapseFirst?'unshift':'push']({id:'toggle',handler:this.toggleCollapse,scope:this});} +if(this.tools){ts=this.tools;this.elements+=(this.header!==false)?',header':'';} +this.tools={};el.addClass(this.baseCls);if(d.firstChild){this.header=el.down('.'+this.headerCls);this.bwrap=el.down('.'+this.bwrapCls);var cp=this.bwrap?this.bwrap:el;this.tbar=cp.down('.'+this.tbarCls);this.body=cp.down('.'+this.bodyCls);this.bbar=cp.down('.'+this.bbarCls);this.footer=cp.down('.'+this.footerCls);this.fromMarkup=true;} +if(this.preventBodyReset===true){el.addClass('x-panel-reset');} +if(this.cls){el.addClass(this.cls);} +if(this.buttons){this.elements+=',footer';} +if(this.frame){el.insertHtml('afterBegin',String.format(Ext.Element.boxMarkup,this.baseCls));this.createElement('header',d.firstChild.firstChild.firstChild);this.createElement('bwrap',d);bw=this.bwrap.dom;var ml=d.childNodes[1],bl=d.childNodes[2];bw.appendChild(ml);bw.appendChild(bl);var mc=bw.firstChild.firstChild.firstChild;this.createElement('tbar',mc);this.createElement('body',mc);this.createElement('bbar',mc);this.createElement('footer',bw.lastChild.firstChild.firstChild);if(!this.footer){this.bwrap.dom.lastChild.className+=' x-panel-nofooter';} +this.ft=Ext.get(this.bwrap.dom.lastChild);this.mc=Ext.get(mc);}else{this.createElement('header',d);this.createElement('bwrap',d);bw=this.bwrap.dom;this.createElement('tbar',bw);this.createElement('body',bw);this.createElement('bbar',bw);this.createElement('footer',bw);if(!this.header){this.body.addClass(this.bodyCls+'-noheader');if(this.tbar){this.tbar.addClass(this.tbarCls+'-noheader');}}} +if(Ext.isDefined(this.padding)){this.body.setStyle('padding',this.body.addUnits(this.padding));} +if(this.border===false){this.el.addClass(this.baseCls+'-noborder');this.body.addClass(this.bodyCls+'-noborder');if(this.header){this.header.addClass(this.headerCls+'-noborder');} +if(this.footer){this.footer.addClass(this.footerCls+'-noborder');} +if(this.tbar){this.tbar.addClass(this.tbarCls+'-noborder');} +if(this.bbar){this.bbar.addClass(this.bbarCls+'-noborder');}} +if(this.bodyBorder===false){this.body.addClass(this.bodyCls+'-noborder');} +this.bwrap.enableDisplayMode('block');if(this.header){this.header.unselectable();if(this.headerAsText){this.header.dom.innerHTML='<span class="'+this.headerTextCls+'">'+this.header.dom.innerHTML+'</span>';if(this.iconCls){this.setIconClass(this.iconCls);}}} +if(this.floating){this.makeFloating(this.floating);} +if(this.collapsible&&this.titleCollapse&&this.header){this.mon(this.header,'click',this.toggleCollapse,this);this.header.setStyle('cursor','pointer');} +if(ts){this.addTool.apply(this,ts);} +if(this.fbar){this.footer.addClass('x-panel-btns');this.fbar.ownerCt=this;this.fbar.render(this.footer);this.footer.createChild({cls:'x-clear'});} +if(this.tbar&&this.topToolbar){this.topToolbar.ownerCt=this;this.topToolbar.render(this.tbar);} +if(this.bbar&&this.bottomToolbar){this.bottomToolbar.ownerCt=this;this.bottomToolbar.render(this.bbar);}},setIconClass:function(cls){var old=this.iconCls;this.iconCls=cls;if(this.rendered&&this.header){if(this.frame){this.header.addClass('x-panel-icon');this.header.replaceClass(old,this.iconCls);}else{var hd=this.header,img=hd.child('img.x-panel-inline-icon');if(img){Ext.fly(img).replaceClass(old,this.iconCls);}else{var hdspan=hd.child('span.'+this.headerTextCls);if(hdspan){Ext.DomHelper.insertBefore(hdspan.dom,{tag:'img',alt:'',src:Ext.BLANK_IMAGE_URL,cls:'x-panel-inline-icon '+this.iconCls});}}}} +this.fireEvent('iconchange',this,cls,old);},makeFloating:function(cfg){this.floating=true;this.el=new Ext.Layer(Ext.apply({},cfg,{shadow:Ext.isDefined(this.shadow)?this.shadow:'sides',shadowOffset:this.shadowOffset,constrain:false,shim:this.shim===false?false:undefined}),this.el);},getTopToolbar:function(){return this.topToolbar;},getBottomToolbar:function(){return this.bottomToolbar;},getFooterToolbar:function(){return this.fbar;},addButton:function(config,handler,scope){if(!this.fbar){this.createFbar([]);} +if(handler){if(Ext.isString(config)){config={text:config};} +config=Ext.apply({handler:handler,scope:scope},config);} +return this.fbar.add(config);},addTool:function(){if(!this.rendered){if(!this.tools){this.tools=[];} +Ext.each(arguments,function(arg){this.tools.push(arg);},this);return;} +if(!this[this.toolTarget]){return;} +if(!this.toolTemplate){var tt=new Ext.Template('<div class="x-tool x-tool-{id}"> </div>');tt.disableFormats=true;tt.compile();Ext.Panel.prototype.toolTemplate=tt;} +for(var i=0,a=arguments,len=a.length;i<len;i++){var tc=a[i];if(!this.tools[tc.id]){var overCls='x-tool-'+tc.id+'-over';var t=this.toolTemplate.insertFirst(this[this.toolTarget],tc,true);this.tools[tc.id]=t;t.enableDisplayMode('block');this.mon(t,'click',this.createToolHandler(t,tc,overCls,this));if(tc.on){this.mon(t,tc.on);} +if(tc.hidden){t.hide();} +if(tc.qtip){if(Ext.isObject(tc.qtip)){Ext.QuickTips.register(Ext.apply({target:t.id},tc.qtip));}else{t.dom.qtip=tc.qtip;}} +t.addClassOnOver(overCls);}}},onLayout:function(shallow,force){Ext.Panel.superclass.onLayout.apply(this,arguments);if(this.hasLayout&&this.toolbars.length>0){Ext.each(this.toolbars,function(tb){tb.doLayout(undefined,force);});this.syncHeight();}},syncHeight:function(){var h=this.toolbarHeight,bd=this.body,lsh=this.lastSize.height,sz;if(this.autoHeight||!Ext.isDefined(lsh)||lsh=='auto'){return;} +if(h!=this.getToolbarHeight()){h=Math.max(0,lsh-this.getFrameHeight());bd.setHeight(h);sz=bd.getSize();this.toolbarHeight=this.getToolbarHeight();this.onBodyResize(sz.width,sz.height);}},onShow:function(){if(this.floating){return this.el.show();} +Ext.Panel.superclass.onShow.call(this);},onHide:function(){if(this.floating){return this.el.hide();} +Ext.Panel.superclass.onHide.call(this);},createToolHandler:function(t,tc,overCls,panel){return function(e){t.removeClass(overCls);if(tc.stopEvent!==false){e.stopEvent();} +if(tc.handler){tc.handler.call(tc.scope||t,e,t,panel,tc);}};},afterRender:function(){if(this.floating&&!this.hidden){this.el.show();} +if(this.title){this.setTitle(this.title);} +Ext.Panel.superclass.afterRender.call(this);if(this.collapsed){this.collapsed=false;this.collapse(false);} +this.initEvents();},getKeyMap:function(){if(!this.keyMap){this.keyMap=new Ext.KeyMap(this.el,this.keys);} +return this.keyMap;},initEvents:function(){if(this.keys){this.getKeyMap();} +if(this.draggable){this.initDraggable();} +if(this.toolbars.length>0){Ext.each(this.toolbars,function(tb){tb.doLayout();tb.on({scope:this,afterlayout:this.syncHeight,remove:this.syncHeight});},this);this.syncHeight();}},initDraggable:function(){this.dd=new Ext.Panel.DD(this,Ext.isBoolean(this.draggable)?null:this.draggable);},beforeEffect:function(anim){if(this.floating){this.el.beforeAction();} +if(anim!==false){this.el.addClass('x-panel-animated');}},afterEffect:function(anim){this.syncShadow();this.el.removeClass('x-panel-animated');},createEffect:function(a,cb,scope){var o={scope:scope,block:true};if(a===true){o.callback=cb;return o;}else if(!a.callback){o.callback=cb;}else{o.callback=function(){cb.call(scope);Ext.callback(a.callback,a.scope);};} +return Ext.applyIf(o,a);},collapse:function(animate){if(this.collapsed||this.el.hasFxBlock()||this.fireEvent('beforecollapse',this,animate)===false){return;} +var doAnim=animate===true||(animate!==false&&this.animCollapse);this.beforeEffect(doAnim);this.onCollapse(doAnim,animate);return this;},onCollapse:function(doAnim,animArg){if(doAnim){this[this.collapseEl].slideOut(this.slideAnchor,Ext.apply(this.createEffect(animArg||true,this.afterCollapse,this),this.collapseDefaults));}else{this[this.collapseEl].hide(this.hideMode);this.afterCollapse(false);}},afterCollapse:function(anim){this.collapsed=true;this.el.addClass(this.collapsedCls);if(anim!==false){this[this.collapseEl].hide(this.hideMode);} +this.afterEffect(anim);this.cascade(function(c){if(c.lastSize){c.lastSize={width:undefined,height:undefined};}});this.fireEvent('collapse',this);},expand:function(animate){if(!this.collapsed||this.el.hasFxBlock()||this.fireEvent('beforeexpand',this,animate)===false){return;} +var doAnim=animate===true||(animate!==false&&this.animCollapse);this.el.removeClass(this.collapsedCls);this.beforeEffect(doAnim);this.onExpand(doAnim,animate);return this;},onExpand:function(doAnim,animArg){if(doAnim){this[this.collapseEl].slideIn(this.slideAnchor,Ext.apply(this.createEffect(animArg||true,this.afterExpand,this),this.expandDefaults));}else{this[this.collapseEl].show(this.hideMode);this.afterExpand(false);}},afterExpand:function(anim){this.collapsed=false;if(anim!==false){this[this.collapseEl].show(this.hideMode);} +this.afterEffect(anim);if(this.deferLayout){delete this.deferLayout;this.doLayout(true);} +this.fireEvent('expand',this);},toggleCollapse:function(animate){this[this.collapsed?'expand':'collapse'](animate);return this;},onDisable:function(){if(this.rendered&&this.maskDisabled){this.el.mask();} +Ext.Panel.superclass.onDisable.call(this);},onEnable:function(){if(this.rendered&&this.maskDisabled){this.el.unmask();} +Ext.Panel.superclass.onEnable.call(this);},onResize:function(adjWidth,adjHeight,rawWidth,rawHeight){var w=adjWidth,h=adjHeight;if(Ext.isDefined(w)||Ext.isDefined(h)){if(!this.collapsed){if(Ext.isNumber(w)){this.body.setWidth(w=this.adjustBodyWidth(w-this.getFrameWidth()));}else if(w=='auto'){w=this.body.setWidth('auto').dom.offsetWidth;}else{w=this.body.dom.offsetWidth;} +if(this.tbar){this.tbar.setWidth(w);if(this.topToolbar){this.topToolbar.setSize(w);}} +if(this.bbar){this.bbar.setWidth(w);if(this.bottomToolbar){this.bottomToolbar.setSize(w);if(Ext.isIE){this.bbar.setStyle('position','static');this.bbar.setStyle('position','');}}} +if(this.footer){this.footer.setWidth(w);if(this.fbar){this.fbar.setSize(Ext.isIE?(w-this.footer.getFrameWidth('lr')):'auto');}} +if(Ext.isNumber(h)){h=Math.max(0,h-this.getFrameHeight());this.body.setHeight(h);}else if(h=='auto'){this.body.setHeight(h);} +if(this.disabled&&this.el._mask){this.el._mask.setSize(this.el.dom.clientWidth,this.el.getHeight());}}else{this.queuedBodySize={width:w,height:h};if(!this.queuedExpand&&this.allowQueuedExpand!==false){this.queuedExpand=true;this.on('expand',function(){delete this.queuedExpand;this.onResize(this.queuedBodySize.width,this.queuedBodySize.height);},this,{single:true});}} +this.onBodyResize(w,h);} +this.syncShadow();Ext.Panel.superclass.onResize.call(this,adjWidth,adjHeight,rawWidth,rawHeight);},onBodyResize:function(w,h){this.fireEvent('bodyresize',this,w,h);},getToolbarHeight:function(){var h=0;if(this.rendered){Ext.each(this.toolbars,function(tb){h+=tb.getHeight();},this);} +return h;},adjustBodyHeight:function(h){return h;},adjustBodyWidth:function(w){return w;},onPosition:function(){this.syncShadow();},getFrameWidth:function(){var w=this.el.getFrameWidth('lr')+this.bwrap.getFrameWidth('lr');if(this.frame){var l=this.bwrap.dom.firstChild;w+=(Ext.fly(l).getFrameWidth('l')+Ext.fly(l.firstChild).getFrameWidth('r'));w+=this.mc.getFrameWidth('lr');} +return w;},getFrameHeight:function(){var h=this.el.getFrameWidth('tb')+this.bwrap.getFrameWidth('tb');h+=(this.tbar?this.tbar.getHeight():0)+ +(this.bbar?this.bbar.getHeight():0);if(this.frame){h+=this.el.dom.firstChild.offsetHeight+this.ft.dom.offsetHeight+this.mc.getFrameWidth('tb');}else{h+=(this.header?this.header.getHeight():0)+ +(this.footer?this.footer.getHeight():0);} +return h;},getInnerWidth:function(){return this.getSize().width-this.getFrameWidth();},getInnerHeight:function(){return this.body.getHeight();},syncShadow:function(){if(this.floating){this.el.sync(true);}},getLayoutTarget:function(){return this.body;},getContentTarget:function(){return this.body;},setTitle:function(title,iconCls){this.title=title;if(this.header&&this.headerAsText){this.header.child('span').update(title);} +if(iconCls){this.setIconClass(iconCls);} +this.fireEvent('titlechange',this,title);return this;},getUpdater:function(){return this.body.getUpdater();},load:function(){var um=this.body.getUpdater();um.update.apply(um,arguments);return this;},beforeDestroy:function(){Ext.Panel.superclass.beforeDestroy.call(this);if(this.header){this.header.removeAllListeners();} +if(this.tools){for(var k in this.tools){Ext.destroy(this.tools[k]);}} +if(this.toolbars.length>0){Ext.each(this.toolbars,function(tb){tb.un('afterlayout',this.syncHeight,this);tb.un('remove',this.syncHeight,this);},this);} +if(Ext.isArray(this.buttons)){while(this.buttons.length){Ext.destroy(this.buttons[0]);}} +if(this.rendered){Ext.destroy(this.ft,this.header,this.footer,this.tbar,this.bbar,this.body,this.mc,this.bwrap,this.dd);if(this.fbar){Ext.destroy(this.fbar,this.fbar.el);}} +Ext.destroy(this.toolbars);},createClasses:function(){this.headerCls=this.baseCls+'-header';this.headerTextCls=this.baseCls+'-header-text';this.bwrapCls=this.baseCls+'-bwrap';this.tbarCls=this.baseCls+'-tbar';this.bodyCls=this.baseCls+'-body';this.bbarCls=this.baseCls+'-bbar';this.footerCls=this.baseCls+'-footer';},createGhost:function(cls,useShim,appendTo){var el=document.createElement('div');el.className='x-panel-ghost '+(cls?cls:'');if(this.header){el.appendChild(this.el.dom.firstChild.cloneNode(true));} +Ext.fly(el.appendChild(document.createElement('ul'))).setHeight(this.bwrap.getHeight());el.style.width=this.el.dom.offsetWidth+'px';;if(!appendTo){this.container.dom.appendChild(el);}else{Ext.getDom(appendTo).appendChild(el);} +if(useShim!==false&&this.el.useShim!==false){var layer=new Ext.Layer({shadow:false,useDisplay:true,constrain:false},el);layer.show();return layer;}else{return new Ext.Element(el);}},doAutoLoad:function(){var u=this.body.getUpdater();if(this.renderer){u.setRenderer(this.renderer);} +u.update(Ext.isObject(this.autoLoad)?this.autoLoad:{url:this.autoLoad});},getTool:function(id){return this.tools[id];}});Ext.reg('panel',Ext.Panel);Ext.Editor=function(field,config){if(field.field){this.field=Ext.create(field.field,'textfield');config=Ext.apply({},field);delete config.field;}else{this.field=field;} +Ext.Editor.superclass.constructor.call(this,config);};Ext.extend(Ext.Editor,Ext.Component,{allowBlur:true,value:"",alignment:"c-c?",offsets:[0,0],shadow:"frame",constrain:false,swallowKeys:true,completeOnEnter:true,cancelOnEsc:true,updateEl:false,initComponent:function(){Ext.Editor.superclass.initComponent.call(this);this.addEvents("beforestartedit","startedit","beforecomplete","complete","canceledit","specialkey");},onRender:function(ct,position){this.el=new Ext.Layer({shadow:this.shadow,cls:"x-editor",parentEl:ct,shim:this.shim,shadowOffset:this.shadowOffset||4,id:this.id,constrain:this.constrain});if(this.zIndex){this.el.setZIndex(this.zIndex);} +this.el.setStyle("overflow",Ext.isGecko?"auto":"hidden");if(this.field.msgTarget!='title'){this.field.msgTarget='qtip';} +this.field.inEditor=true;this.mon(this.field,{scope:this,blur:this.onBlur,specialkey:this.onSpecialKey});if(this.field.grow){this.mon(this.field,"autosize",this.el.sync,this.el,{delay:1});} +this.field.render(this.el).show();this.field.getEl().dom.name='';if(this.swallowKeys){this.field.el.swallowEvent(['keypress','keydown']);}},onSpecialKey:function(field,e){var key=e.getKey(),complete=this.completeOnEnter&&key==e.ENTER,cancel=this.cancelOnEsc&&key==e.ESC;if(complete||cancel){e.stopEvent();if(complete){this.completeEdit();}else{this.cancelEdit();} +if(field.triggerBlur){field.triggerBlur();}} +this.fireEvent('specialkey',field,e);},startEdit:function(el,value){if(this.editing){this.completeEdit();} +this.boundEl=Ext.get(el);var v=value!==undefined?value:this.boundEl.dom.innerHTML;if(!this.rendered){this.render(this.parentEl||document.body);} +if(this.fireEvent("beforestartedit",this,this.boundEl,v)!==false){this.startValue=v;this.field.reset();this.field.setValue(v);this.realign(true);this.editing=true;this.show();}},doAutoSize:function(){if(this.autoSize){var sz=this.boundEl.getSize(),fs=this.field.getSize();switch(this.autoSize){case"width":this.setSize(sz.width,fs.height);break;case"height":this.setSize(fs.width,sz.height);break;case"none":this.setSize(fs.width,fs.height);break;default:this.setSize(sz.width,sz.height);}}},setSize:function(w,h){delete this.field.lastSize;this.field.setSize(w,h);if(this.el){if(Ext.isGecko2||Ext.isOpera||(Ext.isIE7&&Ext.isStrict)){this.el.setSize(w,h);} +this.el.sync();}},realign:function(autoSize){if(autoSize===true){this.doAutoSize();} +this.el.alignTo(this.boundEl,this.alignment,this.offsets);},completeEdit:function(remainVisible){if(!this.editing){return;} +if(this.field.assertValue){this.field.assertValue();} +var v=this.getValue();if(!this.field.isValid()){if(this.revertInvalid!==false){this.cancelEdit(remainVisible);} +return;} +if(String(v)===String(this.startValue)&&this.ignoreNoChange){this.hideEdit(remainVisible);return;} +if(this.fireEvent("beforecomplete",this,v,this.startValue)!==false){v=this.getValue();if(this.updateEl&&this.boundEl){this.boundEl.update(v);} +this.hideEdit(remainVisible);this.fireEvent("complete",this,v,this.startValue);}},onShow:function(){this.el.show();if(this.hideEl!==false){this.boundEl.hide();} +this.field.show().focus(false,true);this.fireEvent("startedit",this.boundEl,this.startValue);},cancelEdit:function(remainVisible){if(this.editing){var v=this.getValue();this.setValue(this.startValue);this.hideEdit(remainVisible);this.fireEvent("canceledit",this,v,this.startValue);}},hideEdit:function(remainVisible){if(remainVisible!==true){this.editing=false;this.hide();}},onBlur:function(){if(this.allowBlur===true&&this.editing&&this.selectSameEditor!==true){this.completeEdit();}},onHide:function(){if(this.editing){this.completeEdit();return;} +this.field.blur();if(this.field.collapse){this.field.collapse();} +this.el.hide();if(this.hideEl!==false){this.boundEl.show();}},setValue:function(v){this.field.setValue(v);},getValue:function(){return this.field.getValue();},beforeDestroy:function(){Ext.destroyMembers(this,'field');delete this.parentEl;delete this.boundEl;}});Ext.reg('editor',Ext.Editor);Ext.ColorPalette=Ext.extend(Ext.Component,{itemCls:'x-color-palette',value:null,clickEvent:'click',ctype:'Ext.ColorPalette',allowReselect:false,colors:['000000','993300','333300','003300','003366','000080','333399','333333','800000','FF6600','808000','008000','008080','0000FF','666699','808080','FF0000','FF9900','99CC00','339966','33CCCC','3366FF','800080','969696','FF00FF','FFCC00','FFFF00','00FF00','00FFFF','00CCFF','993366','C0C0C0','FF99CC','FFCC99','FFFF99','CCFFCC','CCFFFF','99CCFF','CC99FF','FFFFFF'],initComponent:function(){Ext.ColorPalette.superclass.initComponent.call(this);this.addEvents('select');if(this.handler){this.on('select',this.handler,this.scope,true);}},onRender:function(container,position){this.autoEl={tag:'div',cls:this.itemCls};Ext.ColorPalette.superclass.onRender.call(this,container,position);var t=this.tpl||new Ext.XTemplate('<tpl for="."><a href="#" class="color-{.}" hidefocus="on"><em><span style="background:#{.}" unselectable="on"> </span></em></a></tpl>');t.overwrite(this.el,this.colors);this.mon(this.el,this.clickEvent,this.handleClick,this,{delegate:'a'});if(this.clickEvent!='click'){this.mon(this.el,'click',Ext.emptyFn,this,{delegate:'a',preventDefault:true});}},afterRender:function(){Ext.ColorPalette.superclass.afterRender.call(this);if(this.value){var s=this.value;this.value=null;this.select(s,true);}},handleClick:function(e,t){e.preventDefault();if(!this.disabled){var c=t.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];this.select(c.toUpperCase());}},select:function(color,suppressEvent){color=color.replace('#','');if(color!=this.value||this.allowReselect){var el=this.el;if(this.value){el.child('a.color-'+this.value).removeClass('x-color-palette-sel');} +el.child('a.color-'+color).addClass('x-color-palette-sel');this.value=color;if(suppressEvent!==true){this.fireEvent('select',this,color);}}}});Ext.reg('colorpalette',Ext.ColorPalette);Ext.DatePicker=Ext.extend(Ext.BoxComponent,{todayText:'Today',okText:' OK ',cancelText:'Cancel',todayTip:'{0} (Spacebar)',minText:'This date is before the minimum date',maxText:'This date is after the maximum date',format:'m/d/y',disabledDaysText:'Disabled',disabledDatesText:'Disabled',monthNames:Date.monthNames,dayNames:Date.dayNames,nextText:'Next Month (Control+Right)',prevText:'Previous Month (Control+Left)',monthYearText:'Choose a month (Control+Up/Down to move years)',startDay:0,showToday:true,focusOnSelect:true,initHour:12,initComponent:function(){Ext.DatePicker.superclass.initComponent.call(this);this.value=this.value?this.value.clearTime(true):new Date().clearTime();this.addEvents('select');if(this.handler){this.on('select',this.handler,this.scope||this);} +this.initDisabledDays();},initDisabledDays:function(){if(!this.disabledDatesRE&&this.disabledDates){var dd=this.disabledDates,len=dd.length-1,re='(?:';Ext.each(dd,function(d,i){re+=Ext.isDate(d)?'^'+Ext.escapeRe(d.dateFormat(this.format))+'$':dd[i];if(i!=len){re+='|';}},this);this.disabledDatesRE=new RegExp(re+')');}},setDisabledDates:function(dd){if(Ext.isArray(dd)){this.disabledDates=dd;this.disabledDatesRE=null;}else{this.disabledDatesRE=dd;} +this.initDisabledDays();this.update(this.value,true);},setDisabledDays:function(dd){this.disabledDays=dd;this.update(this.value,true);},setMinDate:function(dt){this.minDate=dt;this.update(this.value,true);},setMaxDate:function(dt){this.maxDate=dt;this.update(this.value,true);},setValue:function(value){this.value=value.clearTime(true);this.update(this.value);},getValue:function(){return this.value;},focus:function(){this.update(this.activeDate);},onEnable:function(initial){Ext.DatePicker.superclass.onEnable.call(this);this.doDisabled(false);this.update(initial?this.value:this.activeDate);if(Ext.isIE){this.el.repaint();}},onDisable:function(){Ext.DatePicker.superclass.onDisable.call(this);this.doDisabled(true);if(Ext.isIE&&!Ext.isIE8){Ext.each([].concat(this.textNodes,this.el.query('th span')),function(el){Ext.fly(el).repaint();});}},doDisabled:function(disabled){this.keyNav.setDisabled(disabled);this.prevRepeater.setDisabled(disabled);this.nextRepeater.setDisabled(disabled);if(this.showToday){this.todayKeyListener.setDisabled(disabled);this.todayBtn.setDisabled(disabled);}},onRender:function(container,position){var m=['<table cellspacing="0">','<tr><td class="x-date-left"><a href="#" title="',this.prevText,'"> </a></td><td class="x-date-middle" align="center"></td><td class="x-date-right"><a href="#" title="',this.nextText,'"> </a></td></tr>','<tr><td colspan="3"><table class="x-date-inner" cellspacing="0"><thead><tr>'],dn=this.dayNames,i;for(i=0;i<7;i++){var d=this.startDay+i;if(d>6){d=d-7;} +m.push('<th><span>',dn[d].substr(0,1),'</span></th>');} +m[m.length]='</tr></thead><tbody><tr>';for(i=0;i<42;i++){if(i%7===0&&i!==0){m[m.length]='</tr><tr>';} +m[m.length]='<td><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span></span></em></a></td>';} +m.push('</tr></tbody></table></td></tr>',this.showToday?'<tr><td colspan="3" class="x-date-bottom" align="center"></td></tr>':'','</table><div class="x-date-mp"></div>');var el=document.createElement('div');el.className='x-date-picker';el.innerHTML=m.join('');container.dom.insertBefore(el,position);this.el=Ext.get(el);this.eventEl=Ext.get(el.firstChild);this.prevRepeater=new Ext.util.ClickRepeater(this.el.child('td.x-date-left a'),{handler:this.showPrevMonth,scope:this,preventDefault:true,stopDefault:true});this.nextRepeater=new Ext.util.ClickRepeater(this.el.child('td.x-date-right a'),{handler:this.showNextMonth,scope:this,preventDefault:true,stopDefault:true});this.monthPicker=this.el.down('div.x-date-mp');this.monthPicker.enableDisplayMode('block');this.keyNav=new Ext.KeyNav(this.eventEl,{'left':function(e){if(e.ctrlKey){this.showPrevMonth();}else{this.update(this.activeDate.add('d',-1));}},'right':function(e){if(e.ctrlKey){this.showNextMonth();}else{this.update(this.activeDate.add('d',1));}},'up':function(e){if(e.ctrlKey){this.showNextYear();}else{this.update(this.activeDate.add('d',-7));}},'down':function(e){if(e.ctrlKey){this.showPrevYear();}else{this.update(this.activeDate.add('d',7));}},'pageUp':function(e){this.showNextMonth();},'pageDown':function(e){this.showPrevMonth();},'enter':function(e){e.stopPropagation();return true;},scope:this});this.el.unselectable();this.cells=this.el.select('table.x-date-inner tbody td');this.textNodes=this.el.query('table.x-date-inner tbody span');this.mbtn=new Ext.Button({text:' ',tooltip:this.monthYearText,renderTo:this.el.child('td.x-date-middle',true)});this.mbtn.el.child('em').addClass('x-btn-arrow');if(this.showToday){this.todayKeyListener=this.eventEl.addKeyListener(Ext.EventObject.SPACE,this.selectToday,this);var today=(new Date()).dateFormat(this.format);this.todayBtn=new Ext.Button({renderTo:this.el.child('td.x-date-bottom',true),text:String.format(this.todayText,today),tooltip:String.format(this.todayTip,today),handler:this.selectToday,scope:this});} +this.mon(this.eventEl,'mousewheel',this.handleMouseWheel,this);this.mon(this.eventEl,'click',this.handleDateClick,this,{delegate:'a.x-date-date'});this.mon(this.mbtn,'click',this.showMonthPicker,this);this.onEnable(true);},createMonthPicker:function(){if(!this.monthPicker.dom.firstChild){var buf=['<table border="0" cellspacing="0">'];for(var i=0;i<6;i++){buf.push('<tr><td class="x-date-mp-month"><a href="#">',Date.getShortMonthName(i),'</a></td>','<td class="x-date-mp-month x-date-mp-sep"><a href="#">',Date.getShortMonthName(i+6),'</a></td>',i===0?'<td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-prev"></a></td><td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-next"></a></td></tr>':'<td class="x-date-mp-year"><a href="#"></a></td><td class="x-date-mp-year"><a href="#"></a></td></tr>');} +buf.push('<tr class="x-date-mp-btns"><td colspan="4"><button type="button" class="x-date-mp-ok">',this.okText,'</button><button type="button" class="x-date-mp-cancel">',this.cancelText,'</button></td></tr>','</table>');this.monthPicker.update(buf.join(''));this.mon(this.monthPicker,'click',this.onMonthClick,this);this.mon(this.monthPicker,'dblclick',this.onMonthDblClick,this);this.mpMonths=this.monthPicker.select('td.x-date-mp-month');this.mpYears=this.monthPicker.select('td.x-date-mp-year');this.mpMonths.each(function(m,a,i){i+=1;if((i%2)===0){m.dom.xmonth=5+Math.round(i*0.5);}else{m.dom.xmonth=Math.round((i-1)*0.5);}});}},showMonthPicker:function(){if(!this.disabled){this.createMonthPicker();var size=this.el.getSize();this.monthPicker.setSize(size);this.monthPicker.child('table').setSize(size);this.mpSelMonth=(this.activeDate||this.value).getMonth();this.updateMPMonth(this.mpSelMonth);this.mpSelYear=(this.activeDate||this.value).getFullYear();this.updateMPYear(this.mpSelYear);this.monthPicker.slideIn('t',{duration:0.2});}},updateMPYear:function(y){this.mpyear=y;var ys=this.mpYears.elements;for(var i=1;i<=10;i++){var td=ys[i-1],y2;if((i%2)===0){y2=y+Math.round(i*0.5);td.firstChild.innerHTML=y2;td.xyear=y2;}else{y2=y-(5-Math.round(i*0.5));td.firstChild.innerHTML=y2;td.xyear=y2;} +this.mpYears.item(i-1)[y2==this.mpSelYear?'addClass':'removeClass']('x-date-mp-sel');}},updateMPMonth:function(sm){this.mpMonths.each(function(m,a,i){m[m.dom.xmonth==sm?'addClass':'removeClass']('x-date-mp-sel');});},selectMPMonth:function(m){},onMonthClick:function(e,t){e.stopEvent();var el=new Ext.Element(t),pn;if(el.is('button.x-date-mp-cancel')){this.hideMonthPicker();} +else if(el.is('button.x-date-mp-ok')){var d=new Date(this.mpSelYear,this.mpSelMonth,(this.activeDate||this.value).getDate());if(d.getMonth()!=this.mpSelMonth){d=new Date(this.mpSelYear,this.mpSelMonth,1).getLastDateOfMonth();} +this.update(d);this.hideMonthPicker();} +else if((pn=el.up('td.x-date-mp-month',2))){this.mpMonths.removeClass('x-date-mp-sel');pn.addClass('x-date-mp-sel');this.mpSelMonth=pn.dom.xmonth;} +else if((pn=el.up('td.x-date-mp-year',2))){this.mpYears.removeClass('x-date-mp-sel');pn.addClass('x-date-mp-sel');this.mpSelYear=pn.dom.xyear;} +else if(el.is('a.x-date-mp-prev')){this.updateMPYear(this.mpyear-10);} +else if(el.is('a.x-date-mp-next')){this.updateMPYear(this.mpyear+10);}},onMonthDblClick:function(e,t){e.stopEvent();var el=new Ext.Element(t),pn;if((pn=el.up('td.x-date-mp-month',2))){this.update(new Date(this.mpSelYear,pn.dom.xmonth,(this.activeDate||this.value).getDate()));this.hideMonthPicker();} +else if((pn=el.up('td.x-date-mp-year',2))){this.update(new Date(pn.dom.xyear,this.mpSelMonth,(this.activeDate||this.value).getDate()));this.hideMonthPicker();}},hideMonthPicker:function(disableAnim){if(this.monthPicker){if(disableAnim===true){this.monthPicker.hide();}else{this.monthPicker.slideOut('t',{duration:0.2});}}},showPrevMonth:function(e){this.update(this.activeDate.add('mo',-1));},showNextMonth:function(e){this.update(this.activeDate.add('mo',1));},showPrevYear:function(){this.update(this.activeDate.add('y',-1));},showNextYear:function(){this.update(this.activeDate.add('y',1));},handleMouseWheel:function(e){e.stopEvent();if(!this.disabled){var delta=e.getWheelDelta();if(delta>0){this.showPrevMonth();}else if(delta<0){this.showNextMonth();}}},handleDateClick:function(e,t){e.stopEvent();if(!this.disabled&&t.dateValue&&!Ext.fly(t.parentNode).hasClass('x-date-disabled')){this.cancelFocus=this.focusOnSelect===false;this.setValue(new Date(t.dateValue));delete this.cancelFocus;this.fireEvent('select',this,this.value);}},selectToday:function(){if(this.todayBtn&&!this.todayBtn.disabled){this.setValue(new Date().clearTime());this.fireEvent('select',this,this.value);}},update:function(date,forceRefresh){if(this.rendered){var vd=this.activeDate,vis=this.isVisible();this.activeDate=date;if(!forceRefresh&&vd&&this.el){var t=date.getTime();if(vd.getMonth()==date.getMonth()&&vd.getFullYear()==date.getFullYear()){this.cells.removeClass('x-date-selected');this.cells.each(function(c){if(c.dom.firstChild.dateValue==t){c.addClass('x-date-selected');if(vis&&!this.cancelFocus){Ext.fly(c.dom.firstChild).focus(50);} +return false;}},this);return;}} +var days=date.getDaysInMonth(),firstOfMonth=date.getFirstDateOfMonth(),startingPos=firstOfMonth.getDay()-this.startDay;if(startingPos<0){startingPos+=7;} +days+=startingPos;var pm=date.add('mo',-1),prevStart=pm.getDaysInMonth()-startingPos,cells=this.cells.elements,textEls=this.textNodes,d=(new Date(pm.getFullYear(),pm.getMonth(),prevStart,this.initHour)),today=new Date().clearTime().getTime(),sel=date.clearTime(true).getTime(),min=this.minDate?this.minDate.clearTime(true):Number.NEGATIVE_INFINITY,max=this.maxDate?this.maxDate.clearTime(true):Number.POSITIVE_INFINITY,ddMatch=this.disabledDatesRE,ddText=this.disabledDatesText,ddays=this.disabledDays?this.disabledDays.join(''):false,ddaysText=this.disabledDaysText,format=this.format;if(this.showToday){var td=new Date().clearTime(),disable=(td<min||td>max||(ddMatch&&format&&ddMatch.test(td.dateFormat(format)))||(ddays&&ddays.indexOf(td.getDay())!=-1));if(!this.disabled){this.todayBtn.setDisabled(disable);this.todayKeyListener[disable?'disable':'enable']();}} +var setCellClass=function(cal,cell){cell.title='';var t=d.clearTime(true).getTime();cell.firstChild.dateValue=t;if(t==today){cell.className+=' x-date-today';cell.title=cal.todayText;} +if(t==sel){cell.className+=' x-date-selected';if(vis){Ext.fly(cell.firstChild).focus(50);}} +if(t<min){cell.className=' x-date-disabled';cell.title=cal.minText;return;} +if(t>max){cell.className=' x-date-disabled';cell.title=cal.maxText;return;} +if(ddays){if(ddays.indexOf(d.getDay())!=-1){cell.title=ddaysText;cell.className=' x-date-disabled';}} +if(ddMatch&&format){var fvalue=d.dateFormat(format);if(ddMatch.test(fvalue)){cell.title=ddText.replace('%0',fvalue);cell.className=' x-date-disabled';}}};var i=0;for(;i<startingPos;i++){textEls[i].innerHTML=(++prevStart);d.setDate(d.getDate()+1);cells[i].className='x-date-prevday';setCellClass(this,cells[i]);} +for(;i<days;i++){var intDay=i-startingPos+1;textEls[i].innerHTML=(intDay);d.setDate(d.getDate()+1);cells[i].className='x-date-active';setCellClass(this,cells[i]);} +var extraDays=0;for(;i<42;i++){textEls[i].innerHTML=(++extraDays);d.setDate(d.getDate()+1);cells[i].className='x-date-nextday';setCellClass(this,cells[i]);} +this.mbtn.setText(this.monthNames[date.getMonth()]+' '+date.getFullYear());if(!this.internalRender){var main=this.el.dom.firstChild,w=main.offsetWidth;this.el.setWidth(w+this.el.getBorderWidth('lr'));Ext.fly(main).setWidth(w);this.internalRender=true;if(Ext.isOpera&&!this.secondPass){main.rows[0].cells[1].style.width=(w-(main.rows[0].cells[0].offsetWidth+main.rows[0].cells[2].offsetWidth))+'px';this.secondPass=true;this.update.defer(10,this,[date]);}}}},beforeDestroy:function(){if(this.rendered){Ext.destroy(this.keyNav,this.monthPicker,this.eventEl,this.mbtn,this.nextRepeater,this.prevRepeater,this.cells.el,this.todayBtn);delete this.textNodes;delete this.cells.elements;}}});Ext.reg('datepicker',Ext.DatePicker);Ext.LoadMask=function(el,config){this.el=Ext.get(el);Ext.apply(this,config);if(this.store){this.store.on({scope:this,beforeload:this.onBeforeLoad,load:this.onLoad,exception:this.onLoad});this.removeMask=Ext.value(this.removeMask,false);}else{var um=this.el.getUpdater();um.showLoadIndicator=false;um.on({scope:this,beforeupdate:this.onBeforeLoad,update:this.onLoad,failure:this.onLoad});this.removeMask=Ext.value(this.removeMask,true);}};Ext.LoadMask.prototype={msg:'Loading...',msgCls:'x-mask-loading',disabled:false,disable:function(){this.disabled=true;},enable:function(){this.disabled=false;},onLoad:function(){this.el.unmask(this.removeMask);},onBeforeLoad:function(){if(!this.disabled){this.el.mask(this.msg,this.msgCls);}},show:function(){this.onBeforeLoad();},hide:function(){this.onLoad();},destroy:function(){if(this.store){this.store.un('beforeload',this.onBeforeLoad,this);this.store.un('load',this.onLoad,this);this.store.un('exception',this.onLoad,this);}else{var um=this.el.getUpdater();um.un('beforeupdate',this.onBeforeLoad,this);um.un('update',this.onLoad,this);um.un('failure',this.onLoad,this);}}};Ext.ns('Ext.slider');Ext.slider.Thumb=Ext.extend(Object,{dragging:false,constructor:function(config){Ext.apply(this,config||{},{cls:'x-slider-thumb',constrain:false});Ext.slider.Thumb.superclass.constructor.call(this,config);if(this.slider.vertical){Ext.apply(this,Ext.slider.Thumb.Vertical);}},render:function(){this.el=this.slider.innerEl.insertFirst({cls:this.cls});this.initEvents();},enable:function(){this.disabled=false;this.el.removeClass(this.slider.disabledClass);},disable:function(){this.disabled=true;this.el.addClass(this.slider.disabledClass);},initEvents:function(){var el=this.el;el.addClassOnOver('x-slider-thumb-over');this.tracker=new Ext.dd.DragTracker({onBeforeStart:this.onBeforeDragStart.createDelegate(this),onStart:this.onDragStart.createDelegate(this),onDrag:this.onDrag.createDelegate(this),onEnd:this.onDragEnd.createDelegate(this),tolerance:3,autoStart:300});this.tracker.initEl(el);},onBeforeDragStart:function(e){if(this.disabled){return false;}else{this.slider.promoteThumb(this);return true;}},onDragStart:function(e){this.el.addClass('x-slider-thumb-drag');this.dragging=true;this.dragStartValue=this.value;this.slider.fireEvent('dragstart',this.slider,e,this);},onDrag:function(e){var slider=this.slider,index=this.index,newValue=this.getNewValue();if(this.constrain){var above=slider.thumbs[index+1],below=slider.thumbs[index-1];if(below!=undefined&&newValue<=below.value)newValue=below.value;if(above!=undefined&&newValue>=above.value)newValue=above.value;} +slider.setValue(index,newValue,false);slider.fireEvent('drag',slider,e,this);},getNewValue:function(){var slider=this.slider,pos=slider.innerEl.translatePoints(this.tracker.getXY());return Ext.util.Format.round(slider.reverseValue(pos.left),slider.decimalPrecision);},onDragEnd:function(e){var slider=this.slider,value=this.value;this.el.removeClass('x-slider-thumb-drag');this.dragging=false;slider.fireEvent('dragend',slider,e);if(this.dragStartValue!=value){slider.fireEvent('changecomplete',slider,value,this);}},destroy:function(){Ext.destroyMembers(this,'tracker','el');}});Ext.slider.MultiSlider=Ext.extend(Ext.BoxComponent,{vertical:false,minValue:0,maxValue:100,decimalPrecision:0,keyIncrement:1,increment:0,clickRange:[5,15],clickToChange:true,animate:true,constrainThumbs:true,topThumbZIndex:10000,initComponent:function(){if(!Ext.isDefined(this.value)){this.value=this.minValue;} +this.thumbs=[];Ext.slider.MultiSlider.superclass.initComponent.call(this);this.keyIncrement=Math.max(this.increment,this.keyIncrement);this.addEvents('beforechange','change','changecomplete','dragstart','drag','dragend');if(this.values==undefined||Ext.isEmpty(this.values))this.values=[0];var values=this.values;for(var i=0;i<values.length;i++){this.addThumb(values[i]);} +if(this.vertical){Ext.apply(this,Ext.slider.Vertical);}},addThumb:function(value){var thumb=new Ext.slider.Thumb({value:value,slider:this,index:this.thumbs.length,constrain:this.constrainThumbs});this.thumbs.push(thumb);if(this.rendered)thumb.render();},promoteThumb:function(topThumb){var thumbs=this.thumbs,zIndex,thumb;for(var i=0,j=thumbs.length;i<j;i++){thumb=thumbs[i];if(thumb==topThumb){zIndex=this.topThumbZIndex;}else{zIndex='';} +thumb.el.setStyle('zIndex',zIndex);}},onRender:function(){this.autoEl={cls:'x-slider '+(this.vertical?'x-slider-vert':'x-slider-horz'),cn:{cls:'x-slider-end',cn:{cls:'x-slider-inner',cn:[{tag:'a',cls:'x-slider-focus',href:"#",tabIndex:'-1',hidefocus:'on'}]}}};Ext.slider.MultiSlider.superclass.onRender.apply(this,arguments);this.endEl=this.el.first();this.innerEl=this.endEl.first();this.focusEl=this.innerEl.child('.x-slider-focus');for(var i=0;i<this.thumbs.length;i++){this.thumbs[i].render();} +var thumb=this.innerEl.child('.x-slider-thumb');this.halfThumb=(this.vertical?thumb.getHeight():thumb.getWidth())/2;this.initEvents();},initEvents:function(){this.mon(this.el,{scope:this,mousedown:this.onMouseDown,keydown:this.onKeyDown});this.focusEl.swallowEvent("click",true);},onMouseDown:function(e){if(this.disabled){return;} +var thumbClicked=false;for(var i=0;i<this.thumbs.length;i++){thumbClicked=thumbClicked||e.target==this.thumbs[i].el.dom;} +if(this.clickToChange&&!thumbClicked){var local=this.innerEl.translatePoints(e.getXY());this.onClickChange(local);} +this.focus();},onClickChange:function(local){if(local.top>this.clickRange[0]&&local.top<this.clickRange[1]){var thumb=this.getNearest(local,'left'),index=thumb.index;this.setValue(index,Ext.util.Format.round(this.reverseValue(local.left),this.decimalPrecision),undefined,true);}},getNearest:function(local,prop){var localValue=prop=='top'?this.innerEl.getHeight()-local[prop]:local[prop],clickValue=this.reverseValue(localValue),nearestDistance=(this.maxValue-this.minValue)+5,index=0,nearest=null;for(var i=0;i<this.thumbs.length;i++){var thumb=this.thumbs[i],value=thumb.value,dist=Math.abs(value-clickValue);if(Math.abs(dist<=nearestDistance)){nearest=thumb;index=i;nearestDistance=dist;}} +return nearest;},onKeyDown:function(e){if(this.disabled||this.thumbs.length!==1){e.preventDefault();return;} +var k=e.getKey(),val;switch(k){case e.UP:case e.RIGHT:e.stopEvent();val=e.ctrlKey?this.maxValue:this.getValue(0)+this.keyIncrement;this.setValue(0,val,undefined,true);break;case e.DOWN:case e.LEFT:e.stopEvent();val=e.ctrlKey?this.minValue:this.getValue(0)-this.keyIncrement;this.setValue(0,val,undefined,true);break;default:e.preventDefault();}},doSnap:function(value){if(!(this.increment&&value)){return value;} +var newValue=value,inc=this.increment,m=value%inc;if(m!=0){newValue-=m;if(m*2>=inc){newValue+=inc;}else if(m*2<-inc){newValue-=inc;}} +return newValue.constrain(this.minValue,this.maxValue);},afterRender:function(){Ext.slider.MultiSlider.superclass.afterRender.apply(this,arguments);for(var i=0;i<this.thumbs.length;i++){var thumb=this.thumbs[i];if(thumb.value!==undefined){var v=this.normalizeValue(thumb.value);if(v!==thumb.value){this.setValue(i,v,false);}else{this.moveThumb(i,this.translateValue(v),false);}}};},getRatio:function(){var w=this.innerEl.getWidth(),v=this.maxValue-this.minValue;return v==0?w:(w/v);},normalizeValue:function(v){v=this.doSnap(v);v=Ext.util.Format.round(v,this.decimalPrecision);v=v.constrain(this.minValue,this.maxValue);return v;},setMinValue:function(val){this.minValue=val;var i=0,thumbs=this.thumbs,len=thumbs.length,t;for(;i<len;++i){t=thumbs[i];t.value=t.value<val?val:t.value;} +this.syncThumb();},setMaxValue:function(val){this.maxValue=val;var i=0,thumbs=this.thumbs,len=thumbs.length,t;for(;i<len;++i){t=thumbs[i];t.value=t.value>val?val:t.value;} +this.syncThumb();},setValue:function(index,v,animate,changeComplete){var thumb=this.thumbs[index],el=thumb.el;v=this.normalizeValue(v);if(v!==thumb.value&&this.fireEvent('beforechange',this,v,thumb.value,thumb)!==false){thumb.value=v;if(this.rendered){this.moveThumb(index,this.translateValue(v),animate!==false);this.fireEvent('change',this,v,thumb);if(changeComplete){this.fireEvent('changecomplete',this,v,thumb);}}}},translateValue:function(v){var ratio=this.getRatio();return(v*ratio)-(this.minValue*ratio)-this.halfThumb;},reverseValue:function(pos){var ratio=this.getRatio();return(pos+(this.minValue*ratio))/ratio;},moveThumb:function(index,v,animate){var thumb=this.thumbs[index].el;if(!animate||this.animate===false){thumb.setLeft(v);}else{thumb.shift({left:v,stopFx:true,duration:.35});}},focus:function(){this.focusEl.focus(10);},onResize:function(w,h){var thumbs=this.thumbs,len=thumbs.length,i=0;for(;i<len;++i){thumbs[i].el.stopFx();} +if(Ext.isNumber(w)){this.innerEl.setWidth(w-(this.el.getPadding('l')+this.endEl.getPadding('r')));} +this.syncThumb();Ext.slider.MultiSlider.superclass.onResize.apply(this,arguments);},onDisable:function(){Ext.slider.MultiSlider.superclass.onDisable.call(this);for(var i=0;i<this.thumbs.length;i++){var thumb=this.thumbs[i],el=thumb.el;thumb.disable();if(Ext.isIE){var xy=el.getXY();el.hide();this.innerEl.addClass(this.disabledClass).dom.disabled=true;if(!this.thumbHolder){this.thumbHolder=this.endEl.createChild({cls:'x-slider-thumb '+this.disabledClass});} +this.thumbHolder.show().setXY(xy);}}},onEnable:function(){Ext.slider.MultiSlider.superclass.onEnable.call(this);for(var i=0;i<this.thumbs.length;i++){var thumb=this.thumbs[i],el=thumb.el;thumb.enable();if(Ext.isIE){this.innerEl.removeClass(this.disabledClass).dom.disabled=false;if(this.thumbHolder)this.thumbHolder.hide();el.show();this.syncThumb();}}},syncThumb:function(){if(this.rendered){for(var i=0;i<this.thumbs.length;i++){this.moveThumb(i,this.translateValue(this.thumbs[i].value));}}},getValue:function(index){return this.thumbs[index].value;},getValues:function(){var values=[];for(var i=0;i<this.thumbs.length;i++){values.push(this.thumbs[i].value);} +return values;},beforeDestroy:function(){var thumbs=this.thumbs;for(var i=0,len=thumbs.length;i<len;++i){thumbs[i].destroy();thumbs[i]=null;} +Ext.destroyMembers(this,'endEl','innerEl','focusEl','thumbHolder');Ext.slider.MultiSlider.superclass.beforeDestroy.call(this);}});Ext.reg('multislider',Ext.slider.MultiSlider);Ext.slider.SingleSlider=Ext.extend(Ext.slider.MultiSlider,{constructor:function(config){config=config||{};Ext.applyIf(config,{values:[config.value||0]});Ext.slider.SingleSlider.superclass.constructor.call(this,config);},getValue:function(){return Ext.slider.SingleSlider.superclass.getValue.call(this,0);},setValue:function(value,animate){var args=Ext.toArray(arguments),len=args.length;if(len==1||(len<=3&&typeof arguments[1]!='number')){args.unshift(0);} +return Ext.slider.SingleSlider.superclass.setValue.apply(this,args);},syncThumb:function(){return Ext.slider.SingleSlider.superclass.syncThumb.apply(this,[0].concat(arguments));},getNearest:function(){return this.thumbs[0];}});Ext.Slider=Ext.slider.SingleSlider;Ext.reg('slider',Ext.slider.SingleSlider);Ext.slider.Vertical={onResize:function(w,h){this.innerEl.setHeight(h-(this.el.getPadding('t')+this.endEl.getPadding('b')));this.syncThumb();},getRatio:function(){var h=this.innerEl.getHeight(),v=this.maxValue-this.minValue;return h/v;},moveThumb:function(index,v,animate){var thumb=this.thumbs[index],el=thumb.el;if(!animate||this.animate===false){el.setBottom(v);}else{el.shift({bottom:v,stopFx:true,duration:.35});}},onClickChange:function(local){if(local.left>this.clickRange[0]&&local.left<this.clickRange[1]){var thumb=this.getNearest(local,'top'),index=thumb.index,value=this.minValue+this.reverseValue(this.innerEl.getHeight()-local.top);this.setValue(index,Ext.util.Format.round(value,this.decimalPrecision),undefined,true);}}};Ext.slider.Thumb.Vertical={getNewValue:function(){var slider=this.slider,innerEl=slider.innerEl,pos=innerEl.translatePoints(this.tracker.getXY()),bottom=innerEl.getHeight()-pos.top;return slider.minValue+Ext.util.Format.round(bottom/slider.getRatio(),slider.decimalPrecision);}};Ext.ProgressBar=Ext.extend(Ext.BoxComponent,{baseCls:'x-progress',animate:false,waitTimer:null,initComponent:function(){Ext.ProgressBar.superclass.initComponent.call(this);this.addEvents("update");},onRender:function(ct,position){var tpl=new Ext.Template('<div class="{cls}-wrap">','<div class="{cls}-inner">','<div class="{cls}-bar">','<div class="{cls}-text">','<div> </div>','</div>','</div>','<div class="{cls}-text {cls}-text-back">','<div> </div>','</div>','</div>','</div>');this.el=position?tpl.insertBefore(position,{cls:this.baseCls},true):tpl.append(ct,{cls:this.baseCls},true);if(this.id){this.el.dom.id=this.id;} +var inner=this.el.dom.firstChild;this.progressBar=Ext.get(inner.firstChild);if(this.textEl){this.textEl=Ext.get(this.textEl);delete this.textTopEl;}else{this.textTopEl=Ext.get(this.progressBar.dom.firstChild);var textBackEl=Ext.get(inner.childNodes[1]);this.textTopEl.setStyle("z-index",99).addClass('x-hidden');this.textEl=new Ext.CompositeElement([this.textTopEl.dom.firstChild,textBackEl.dom.firstChild]);this.textEl.setWidth(inner.offsetWidth);} +this.progressBar.setHeight(inner.offsetHeight);},afterRender:function(){Ext.ProgressBar.superclass.afterRender.call(this);if(this.value){this.updateProgress(this.value,this.text);}else{this.updateText(this.text);}},updateProgress:function(value,text,animate){this.value=value||0;if(text){this.updateText(text);} +if(this.rendered&&!this.isDestroyed){var w=Math.floor(value*this.el.dom.firstChild.offsetWidth);this.progressBar.setWidth(w,animate===true||(animate!==false&&this.animate));if(this.textTopEl){this.textTopEl.removeClass('x-hidden').setWidth(w);}} +this.fireEvent('update',this,value,text);return this;},wait:function(o){if(!this.waitTimer){var scope=this;o=o||{};this.updateText(o.text);this.waitTimer=Ext.TaskMgr.start({run:function(i){var inc=o.increment||10;i-=1;this.updateProgress(((((i+inc)%inc)+1)*(100/inc))*0.01,null,o.animate);},interval:o.interval||1000,duration:o.duration,onStop:function(){if(o.fn){o.fn.apply(o.scope||this);} +this.reset();},scope:scope});} +return this;},isWaiting:function(){return this.waitTimer!==null;},updateText:function(text){this.text=text||' ';if(this.rendered){this.textEl.update(this.text);} +return this;},syncProgressBar:function(){if(this.value){this.updateProgress(this.value,this.text);} +return this;},setSize:function(w,h){Ext.ProgressBar.superclass.setSize.call(this,w,h);if(this.textTopEl){var inner=this.el.dom.firstChild;this.textEl.setSize(inner.offsetWidth,inner.offsetHeight);} +this.syncProgressBar();return this;},reset:function(hide){this.updateProgress(0);if(this.textTopEl){this.textTopEl.addClass('x-hidden');} +this.clearTimer();if(hide===true){this.hide();} +return this;},clearTimer:function(){if(this.waitTimer){this.waitTimer.onStop=null;Ext.TaskMgr.stop(this.waitTimer);this.waitTimer=null;}},onDestroy:function(){this.clearTimer();if(this.rendered){if(this.textEl.isComposite){this.textEl.clear();} +Ext.destroyMembers(this,'textEl','progressBar','textTopEl');} +Ext.ProgressBar.superclass.onDestroy.call(this);}});Ext.reg('progress',Ext.ProgressBar);Ext.DataView=Ext.extend(Ext.BoxComponent,{selectedClass:"x-view-selected",emptyText:"",deferEmptyText:true,trackOver:false,blockRefresh:false,last:false,initComponent:function(){Ext.DataView.superclass.initComponent.call(this);if(Ext.isString(this.tpl)||Ext.isArray(this.tpl)){this.tpl=new Ext.XTemplate(this.tpl);} +this.addEvents("beforeclick","click","mouseenter","mouseleave","containerclick","dblclick","contextmenu","containercontextmenu","selectionchange","beforeselect");this.store=Ext.StoreMgr.lookup(this.store);this.all=new Ext.CompositeElementLite();this.selected=new Ext.CompositeElementLite();},afterRender:function(){Ext.DataView.superclass.afterRender.call(this);this.mon(this.getTemplateTarget(),{"click":this.onClick,"dblclick":this.onDblClick,"contextmenu":this.onContextMenu,scope:this});if(this.overClass||this.trackOver){this.mon(this.getTemplateTarget(),{"mouseover":this.onMouseOver,"mouseout":this.onMouseOut,scope:this});} +if(this.store){this.bindStore(this.store,true);}},refresh:function(){this.clearSelections(false,true);var el=this.getTemplateTarget(),records=this.store.getRange();el.update('');if(records.length<1){if(!this.deferEmptyText||this.hasSkippedEmptyText){el.update(this.emptyText);} +this.all.clear();}else{this.tpl.overwrite(el,this.collectData(records,0));this.all.fill(Ext.query(this.itemSelector,el.dom));this.updateIndexes(0);} +this.hasSkippedEmptyText=true;},getTemplateTarget:function(){return this.el;},prepareData:function(data){return data;},collectData:function(records,startIndex){var r=[],i=0,len=records.length;for(;i<len;i++){r[r.length]=this.prepareData(records[i].data,startIndex+i,records[i]);} +return r;},bufferRender:function(records,index){var div=document.createElement('div');this.tpl.overwrite(div,this.collectData(records,index));return Ext.query(this.itemSelector,div);},onUpdate:function(ds,record){var index=this.store.indexOf(record);if(index>-1){var sel=this.isSelected(index),original=this.all.elements[index],node=this.bufferRender([record],index)[0];this.all.replaceElement(index,node,true);if(sel){this.selected.replaceElement(original,node);this.all.item(index).addClass(this.selectedClass);} +this.updateIndexes(index,index);}},onAdd:function(ds,records,index){if(this.all.getCount()===0){this.refresh();return;} +var nodes=this.bufferRender(records,index),n,a=this.all.elements;if(index<this.all.getCount()){n=this.all.item(index).insertSibling(nodes,'before',true);a.splice.apply(a,[index,0].concat(nodes));}else{n=this.all.last().insertSibling(nodes,'after',true);a.push.apply(a,nodes);} +this.updateIndexes(index);},onRemove:function(ds,record,index){this.deselect(index);this.all.removeElement(index,true);this.updateIndexes(index);if(this.store.getCount()===0){this.refresh();}},refreshNode:function(index){this.onUpdate(this.store,this.store.getAt(index));},updateIndexes:function(startIndex,endIndex){var ns=this.all.elements;startIndex=startIndex||0;endIndex=endIndex||((endIndex===0)?0:(ns.length-1));for(var i=startIndex;i<=endIndex;i++){ns[i].viewIndex=i;}},getStore:function(){return this.store;},bindStore:function(store,initial){if(!initial&&this.store){if(store!==this.store&&this.store.autoDestroy){this.store.destroy();}else{this.store.un("beforeload",this.onBeforeLoad,this);this.store.un("datachanged",this.onDataChanged,this);this.store.un("add",this.onAdd,this);this.store.un("remove",this.onRemove,this);this.store.un("update",this.onUpdate,this);this.store.un("clear",this.refresh,this);} +if(!store){this.store=null;}} +if(store){store=Ext.StoreMgr.lookup(store);store.on({scope:this,beforeload:this.onBeforeLoad,datachanged:this.onDataChanged,add:this.onAdd,remove:this.onRemove,update:this.onUpdate,clear:this.refresh});} +this.store=store;if(store){this.refresh();}},onDataChanged:function(){if(this.blockRefresh!==true){this.refresh.apply(this,arguments);}},findItemFromChild:function(node){return Ext.fly(node).findParent(this.itemSelector,this.getTemplateTarget());},onClick:function(e){var item=e.getTarget(this.itemSelector,this.getTemplateTarget()),index;if(item){index=this.indexOf(item);if(this.onItemClick(item,index,e)!==false){this.fireEvent("click",this,index,item,e);}}else{if(this.fireEvent("containerclick",this,e)!==false){this.onContainerClick(e);}}},onContainerClick:function(e){this.clearSelections();},onContextMenu:function(e){var item=e.getTarget(this.itemSelector,this.getTemplateTarget());if(item){this.fireEvent("contextmenu",this,this.indexOf(item),item,e);}else{this.fireEvent("containercontextmenu",this,e);}},onDblClick:function(e){var item=e.getTarget(this.itemSelector,this.getTemplateTarget());if(item){this.fireEvent("dblclick",this,this.indexOf(item),item,e);}},onMouseOver:function(e){var item=e.getTarget(this.itemSelector,this.getTemplateTarget());if(item&&item!==this.lastItem){this.lastItem=item;Ext.fly(item).addClass(this.overClass);this.fireEvent("mouseenter",this,this.indexOf(item),item,e);}},onMouseOut:function(e){if(this.lastItem){if(!e.within(this.lastItem,true,true)){Ext.fly(this.lastItem).removeClass(this.overClass);this.fireEvent("mouseleave",this,this.indexOf(this.lastItem),this.lastItem,e);delete this.lastItem;}}},onItemClick:function(item,index,e){if(this.fireEvent("beforeclick",this,index,item,e)===false){return false;} +if(this.multiSelect){this.doMultiSelection(item,index,e);e.preventDefault();}else if(this.singleSelect){this.doSingleSelection(item,index,e);e.preventDefault();} +return true;},doSingleSelection:function(item,index,e){if(e.ctrlKey&&this.isSelected(index)){this.deselect(index);}else{this.select(index,false);}},doMultiSelection:function(item,index,e){if(e.shiftKey&&this.last!==false){var last=this.last;this.selectRange(last,index,e.ctrlKey);this.last=last;}else{if((e.ctrlKey||this.simpleSelect)&&this.isSelected(index)){this.deselect(index);}else{this.select(index,e.ctrlKey||e.shiftKey||this.simpleSelect);}}},getSelectionCount:function(){return this.selected.getCount();},getSelectedNodes:function(){return this.selected.elements;},getSelectedIndexes:function(){var indexes=[],selected=this.selected.elements,i=0,len=selected.length;for(;i<len;i++){indexes.push(selected[i].viewIndex);} +return indexes;},getSelectedRecords:function(){return this.getRecords(this.selected.elements);},getRecords:function(nodes){var records=[],i=0,len=nodes.length;for(;i<len;i++){records[records.length]=this.store.getAt(nodes[i].viewIndex);} +return records;},getRecord:function(node){return this.store.getAt(node.viewIndex);},clearSelections:function(suppressEvent,skipUpdate){if((this.multiSelect||this.singleSelect)&&this.selected.getCount()>0){if(!skipUpdate){this.selected.removeClass(this.selectedClass);} +this.selected.clear();this.last=false;if(!suppressEvent){this.fireEvent("selectionchange",this,this.selected.elements);}}},isSelected:function(node){return this.selected.contains(this.getNode(node));},deselect:function(node){if(this.isSelected(node)){node=this.getNode(node);this.selected.removeElement(node);if(this.last==node.viewIndex){this.last=false;} +Ext.fly(node).removeClass(this.selectedClass);this.fireEvent("selectionchange",this,this.selected.elements);}},select:function(nodeInfo,keepExisting,suppressEvent){if(Ext.isArray(nodeInfo)){if(!keepExisting){this.clearSelections(true);} +for(var i=0,len=nodeInfo.length;i<len;i++){this.select(nodeInfo[i],true,true);} +if(!suppressEvent){this.fireEvent("selectionchange",this,this.selected.elements);}}else{var node=this.getNode(nodeInfo);if(!keepExisting){this.clearSelections(true);} +if(node&&!this.isSelected(node)){if(this.fireEvent("beforeselect",this,node,this.selected.elements)!==false){Ext.fly(node).addClass(this.selectedClass);this.selected.add(node);this.last=node.viewIndex;if(!suppressEvent){this.fireEvent("selectionchange",this,this.selected.elements);}}}}},selectRange:function(start,end,keepExisting){if(!keepExisting){this.clearSelections(true);} +this.select(this.getNodes(start,end),true);},getNode:function(nodeInfo){if(Ext.isString(nodeInfo)){return document.getElementById(nodeInfo);}else if(Ext.isNumber(nodeInfo)){return this.all.elements[nodeInfo];}else if(nodeInfo instanceof Ext.data.Record){var idx=this.store.indexOf(nodeInfo);return this.all.elements[idx];} +return nodeInfo;},getNodes:function(start,end){var ns=this.all.elements,nodes=[],i;start=start||0;end=!Ext.isDefined(end)?Math.max(ns.length-1,0):end;if(start<=end){for(i=start;i<=end&&ns[i];i++){nodes.push(ns[i]);}}else{for(i=start;i>=end&&ns[i];i--){nodes.push(ns[i]);}} +return nodes;},indexOf:function(node){node=this.getNode(node);if(Ext.isNumber(node.viewIndex)){return node.viewIndex;} +return this.all.indexOf(node);},onBeforeLoad:function(){if(this.loadingText){this.clearSelections(false,true);this.getTemplateTarget().update('<div class="loading-indicator">'+this.loadingText+'</div>');this.all.clear();}},onDestroy:function(){this.all.clear();this.selected.clear();Ext.DataView.superclass.onDestroy.call(this);this.bindStore(null);}});Ext.DataView.prototype.setStore=Ext.DataView.prototype.bindStore;Ext.reg('dataview',Ext.DataView);Ext.list.ListView=Ext.extend(Ext.DataView,{itemSelector:'dl',selectedClass:'x-list-selected',overClass:'x-list-over',scrollOffset:undefined,columnResize:true,columnSort:true,maxColumnWidth:Ext.isIE?99:100,initComponent:function(){if(this.columnResize){this.colResizer=new Ext.list.ColumnResizer(this.colResizer);this.colResizer.init(this);} +if(this.columnSort){this.colSorter=new Ext.list.Sorter(this.columnSort);this.colSorter.init(this);} +if(!this.internalTpl){this.internalTpl=new Ext.XTemplate('<div class="x-list-header"><div class="x-list-header-inner">','<tpl for="columns">','<div style="width:{[values.width*100]}%;text-align:{align};"><em unselectable="on" id="',this.id,'-xlhd-{#}">','{header}','</em></div>','</tpl>','<div class="x-clear"></div>','</div></div>','<div class="x-list-body"><div class="x-list-body-inner">','</div></div>');} +if(!this.tpl){this.tpl=new Ext.XTemplate('<tpl for="rows">','<dl>','<tpl for="parent.columns">','<dt style="width:{[values.width*100]}%;text-align:{align};">','<em unselectable="on"<tpl if="cls"> class="{cls}</tpl>">','{[values.tpl.apply(parent)]}','</em></dt>','</tpl>','<div class="x-clear"></div>','</dl>','</tpl>');};var cs=this.columns,allocatedWidth=0,colsWithWidth=0,len=cs.length,columns=[];for(var i=0;i<len;i++){var c=cs[i];if(!c.isColumn){c.xtype=c.xtype?(/^lv/.test(c.xtype)?c.xtype:'lv'+c.xtype):'lvcolumn';c=Ext.create(c);} +if(c.width){allocatedWidth+=c.width*100;if(allocatedWidth>this.maxColumnWidth){c.width-=(allocatedWidth-this.maxColumnWidth)/100;} +colsWithWidth++;} +columns.push(c);} +cs=this.columns=columns;if(colsWithWidth<len){var remaining=len-colsWithWidth;if(allocatedWidth<this.maxColumnWidth){var perCol=((this.maxColumnWidth-allocatedWidth)/remaining)/100;for(var j=0;j<len;j++){var c=cs[j];if(!c.width){c.width=perCol;}}}} +Ext.list.ListView.superclass.initComponent.call(this);},onRender:function(){this.autoEl={cls:'x-list-wrap'};Ext.list.ListView.superclass.onRender.apply(this,arguments);this.internalTpl.overwrite(this.el,{columns:this.columns});this.innerBody=Ext.get(this.el.dom.childNodes[1].firstChild);this.innerHd=Ext.get(this.el.dom.firstChild.firstChild);if(this.hideHeaders){this.el.dom.firstChild.style.display='none';}},getTemplateTarget:function(){return this.innerBody;},collectData:function(){var rs=Ext.list.ListView.superclass.collectData.apply(this,arguments);return{columns:this.columns,rows:rs};},verifyInternalSize:function(){if(this.lastSize){this.onResize(this.lastSize.width,this.lastSize.height);}},onResize:function(w,h){var body=this.innerBody.dom,header=this.innerHd.dom,scrollWidth=w-Ext.num(this.scrollOffset,Ext.getScrollBarWidth())+'px',parentNode;if(!body){return;} +parentNode=body.parentNode;if(Ext.isNumber(w)){if(this.reserveScrollOffset||((parentNode.offsetWidth-parentNode.clientWidth)>10)){body.style.width=scrollWidth;header.style.width=scrollWidth;}else{body.style.width=w+'px';header.style.width=w+'px';setTimeout(function(){if((parentNode.offsetWidth-parentNode.clientWidth)>10){body.style.width=scrollWidth;header.style.width=scrollWidth;}},10);}} +if(Ext.isNumber(h)){parentNode.style.height=Math.max(0,h-header.parentNode.offsetHeight)+'px';}},updateIndexes:function(){Ext.list.ListView.superclass.updateIndexes.apply(this,arguments);this.verifyInternalSize();},findHeaderIndex:function(header){header=header.dom||header;var parentNode=header.parentNode,children=parentNode.parentNode.childNodes,i=0,c;for(;c=children[i];i++){if(c==parentNode){return i;}} +return-1;},setHdWidths:function(){var els=this.innerHd.dom.getElementsByTagName('div'),i=0,columns=this.columns,len=columns.length;for(;i<len;i++){els[i].style.width=(columns[i].width*100)+'%';}}});Ext.reg('listview',Ext.list.ListView);Ext.ListView=Ext.list.ListView;Ext.list.Column=Ext.extend(Object,{isColumn:true,align:'left',header:'',width:null,cls:'',constructor:function(c){if(!c.tpl){c.tpl=new Ext.XTemplate('{'+c.dataIndex+'}');} +else if(Ext.isString(c.tpl)){c.tpl=new Ext.XTemplate(c.tpl);} +Ext.apply(this,c);}});Ext.reg('lvcolumn',Ext.list.Column);Ext.list.NumberColumn=Ext.extend(Ext.list.Column,{format:'0,000.00',constructor:function(c){c.tpl=c.tpl||new Ext.XTemplate('{'+c.dataIndex+':number("'+(c.format||this.format)+'")}');Ext.list.NumberColumn.superclass.constructor.call(this,c);}});Ext.reg('lvnumbercolumn',Ext.list.NumberColumn);Ext.list.DateColumn=Ext.extend(Ext.list.Column,{format:'m/d/Y',constructor:function(c){c.tpl=c.tpl||new Ext.XTemplate('{'+c.dataIndex+':date("'+(c.format||this.format)+'")}');Ext.list.DateColumn.superclass.constructor.call(this,c);}});Ext.reg('lvdatecolumn',Ext.list.DateColumn);Ext.list.BooleanColumn=Ext.extend(Ext.list.Column,{trueText:'true',falseText:'false',undefinedText:' ',constructor:function(c){c.tpl=c.tpl||new Ext.XTemplate('{'+c.dataIndex+':this.format}');var t=this.trueText,f=this.falseText,u=this.undefinedText;c.tpl.format=function(v){if(v===undefined){return u;} +if(!v||v==='false'){return f;} +return t;};Ext.list.DateColumn.superclass.constructor.call(this,c);}});Ext.reg('lvbooleancolumn',Ext.list.BooleanColumn);Ext.list.ColumnResizer=Ext.extend(Ext.util.Observable,{minPct:.05,constructor:function(config){Ext.apply(this,config);Ext.list.ColumnResizer.superclass.constructor.call(this);},init:function(listView){this.view=listView;listView.on('render',this.initEvents,this);},initEvents:function(view){view.mon(view.innerHd,'mousemove',this.handleHdMove,this);this.tracker=new Ext.dd.DragTracker({onBeforeStart:this.onBeforeStart.createDelegate(this),onStart:this.onStart.createDelegate(this),onDrag:this.onDrag.createDelegate(this),onEnd:this.onEnd.createDelegate(this),tolerance:3,autoStart:300});this.tracker.initEl(view.innerHd);view.on('beforedestroy',this.tracker.destroy,this.tracker);},handleHdMove:function(e,t){var handleWidth=5,x=e.getPageX(),header=e.getTarget('em',3,true);if(header){var region=header.getRegion(),style=header.dom.style,parentNode=header.dom.parentNode;if(x-region.left<=handleWidth&&parentNode!=parentNode.parentNode.firstChild){this.activeHd=Ext.get(parentNode.previousSibling.firstChild);style.cursor=Ext.isWebKit?'e-resize':'col-resize';}else if(region.right-x<=handleWidth&&parentNode!=parentNode.parentNode.lastChild.previousSibling){this.activeHd=header;style.cursor=Ext.isWebKit?'w-resize':'col-resize';}else{delete this.activeHd;style.cursor='';}}},onBeforeStart:function(e){this.dragHd=this.activeHd;return!!this.dragHd;},onStart:function(e){var me=this,view=me.view,dragHeader=me.dragHd,x=me.tracker.getXY()[0];me.proxy=view.el.createChild({cls:'x-list-resizer'});me.dragX=dragHeader.getX();me.headerIndex=view.findHeaderIndex(dragHeader);me.headersDisabled=view.disableHeaders;view.disableHeaders=true;me.proxy.setHeight(view.el.getHeight());me.proxy.setX(me.dragX);me.proxy.setWidth(x-me.dragX);this.setBoundaries();},setBoundaries:function(relativeX){var view=this.view,headerIndex=this.headerIndex,width=view.innerHd.getWidth(),relativeX=view.innerHd.getX(),minWidth=Math.ceil(width*this.minPct),maxWidth=width-minWidth,numColumns=view.columns.length,headers=view.innerHd.select('em',true),minX=minWidth+relativeX,maxX=maxWidth+relativeX,header;if(numColumns==2){this.minX=minX;this.maxX=maxX;}else{header=headers.item(headerIndex+2);this.minX=headers.item(headerIndex).getX()+minWidth;this.maxX=header?header.getX()-minWidth:maxX;if(headerIndex==0){this.minX=minX;}else if(headerIndex==numColumns-2){this.maxX=maxX;}}},onDrag:function(e){var me=this,cursorX=me.tracker.getXY()[0].constrain(me.minX,me.maxX);me.proxy.setWidth(cursorX-this.dragX);},onEnd:function(e){var newWidth=this.proxy.getWidth(),index=this.headerIndex,view=this.view,columns=view.columns,width=view.innerHd.getWidth(),newPercent=Math.ceil(newWidth*view.maxColumnWidth/width)/100,disabled=this.headersDisabled,headerCol=columns[index],otherCol=columns[index+1],totalPercent=headerCol.width+otherCol.width;this.proxy.remove();headerCol.width=newPercent;otherCol.width=totalPercent-newPercent;delete this.dragHd;view.setHdWidths();view.refresh();setTimeout(function(){view.disableHeaders=disabled;},100);}});Ext.ListView.ColumnResizer=Ext.list.ColumnResizer;Ext.list.Sorter=Ext.extend(Ext.util.Observable,{sortClasses:["sort-asc","sort-desc"],constructor:function(config){Ext.apply(this,config);Ext.list.Sorter.superclass.constructor.call(this);},init:function(listView){this.view=listView;listView.on('render',this.initEvents,this);},initEvents:function(view){view.mon(view.innerHd,'click',this.onHdClick,this);view.innerHd.setStyle('cursor','pointer');view.mon(view.store,'datachanged',this.updateSortState,this);this.updateSortState.defer(10,this,[view.store]);},updateSortState:function(store){var state=store.getSortState();if(!state){return;} +this.sortState=state;var cs=this.view.columns,sortColumn=-1;for(var i=0,len=cs.length;i<len;i++){if(cs[i].dataIndex==state.field){sortColumn=i;break;}} +if(sortColumn!=-1){var sortDir=state.direction;this.updateSortIcon(sortColumn,sortDir);}},updateSortIcon:function(col,dir){var sc=this.sortClasses;var hds=this.view.innerHd.select('em').removeClass(sc);hds.item(col).addClass(sc[dir=="DESC"?1:0]);},onHdClick:function(e){var hd=e.getTarget('em',3);if(hd&&!this.view.disableHeaders){var index=this.view.findHeaderIndex(hd);this.view.store.sort(this.view.columns[index].dataIndex);}}});Ext.ListView.Sorter=Ext.list.Sorter;Ext.DataView.LabelEditor=Ext.extend(Ext.Editor,{alignment:"tl-tl",hideEl:false,cls:"x-small-editor",shim:false,completeOnEnter:true,cancelOnEsc:true,labelSelector:'span.x-editable',constructor:function(cfg,field){Ext.DataView.LabelEditor.superclass.constructor.call(this,field||new Ext.form.TextField({allowBlank:false,growMin:90,growMax:240,grow:true,selectOnFocus:true}),cfg);},init:function(view){this.view=view;view.on('render',this.initEditor,this);this.on('complete',this.onSave,this);},initEditor:function(){this.view.on({scope:this,containerclick:this.doBlur,click:this.doBlur});this.view.getEl().on('mousedown',this.onMouseDown,this,{delegate:this.labelSelector});},doBlur:function(){if(this.editing){this.field.blur();}},onMouseDown:function(e,target){if(!e.ctrlKey&&!e.shiftKey){var item=this.view.findItemFromChild(target);e.stopEvent();var record=this.view.store.getAt(this.view.indexOf(item));this.startEdit(target,record.data[this.dataIndex]);this.activeRecord=record;}else{e.preventDefault();}},onSave:function(ed,value){this.activeRecord.set(this.dataIndex,value);}});Ext.DataView.DragSelector=function(cfg){cfg=cfg||{};var view,proxy,tracker;var rs,bodyRegion,dragRegion=new Ext.lib.Region(0,0,0,0);var dragSafe=cfg.dragSafe===true;this.init=function(dataView){view=dataView;view.on('render',onRender);};function fillRegions(){rs=[];view.all.each(function(el){rs[rs.length]=el.getRegion();});bodyRegion=view.el.getRegion();} +function cancelClick(){return false;} +function onBeforeStart(e){return!dragSafe||e.target==view.el.dom;} +function onStart(e){view.on('containerclick',cancelClick,view,{single:true});if(!proxy){proxy=view.el.createChild({cls:'x-view-selector'});}else{if(proxy.dom.parentNode!==view.el.dom){view.el.dom.appendChild(proxy.dom);} +proxy.setDisplayed('block');} +fillRegions();view.clearSelections();} +function onDrag(e){var startXY=tracker.startXY;var xy=tracker.getXY();var x=Math.min(startXY[0],xy[0]);var y=Math.min(startXY[1],xy[1]);var w=Math.abs(startXY[0]-xy[0]);var h=Math.abs(startXY[1]-xy[1]);dragRegion.left=x;dragRegion.top=y;dragRegion.right=x+w;dragRegion.bottom=y+h;dragRegion.constrainTo(bodyRegion);proxy.setRegion(dragRegion);for(var i=0,len=rs.length;i<len;i++){var r=rs[i],sel=dragRegion.intersect(r);if(sel&&!r.selected){r.selected=true;view.select(i,true);}else if(!sel&&r.selected){r.selected=false;view.deselect(i);}}} +function onEnd(e){if(!Ext.isIE){view.un('containerclick',cancelClick,view);} +if(proxy){proxy.setDisplayed(false);}} +function onRender(view){tracker=new Ext.dd.DragTracker({onBeforeStart:onBeforeStart,onStart:onStart,onDrag:onDrag,onEnd:onEnd});tracker.initEl(view.el);}};Ext.data.Api=(function(){var validActions={};return{actions:{create:'create',read:'read',update:'update',destroy:'destroy'},restActions:{create:'POST',read:'GET',update:'PUT',destroy:'DELETE'},isAction:function(action){return(Ext.data.Api.actions[action])?true:false;},getVerb:function(name){if(validActions[name]){return validActions[name];} +for(var verb in this.actions){if(this.actions[verb]===name){validActions[name]=verb;break;}} +return(validActions[name]!==undefined)?validActions[name]:null;},isValid:function(api){var invalid=[];var crud=this.actions;for(var action in api){if(!(action in crud)){invalid.push(action);}} +return(!invalid.length)?true:invalid;},hasUniqueUrl:function(proxy,verb){var url=(proxy.api[verb])?proxy.api[verb].url:null;var unique=true;for(var action in proxy.api){if((unique=(action===verb)?true:(proxy.api[action].url!=url)?true:false)===false){break;}} +return unique;},prepare:function(proxy){if(!proxy.api){proxy.api={};} +for(var verb in this.actions){var action=this.actions[verb];proxy.api[action]=proxy.api[action]||proxy.url||proxy.directFn;if(typeof(proxy.api[action])=='string'){proxy.api[action]={url:proxy.api[action],method:(proxy.restful===true)?Ext.data.Api.restActions[action]:undefined};}}},restify:function(proxy){proxy.restful=true;for(var verb in this.restActions){proxy.api[this.actions[verb]].method||(proxy.api[this.actions[verb]].method=this.restActions[verb]);} +proxy.onWrite=proxy.onWrite.createInterceptor(function(action,o,response,rs){var reader=o.reader;var res=new Ext.data.Response({action:action,raw:response});switch(response.status){case 200:return true;break;case 201:if(Ext.isEmpty(res.raw.responseText)){res.success=true;}else{return true;} +break;case 204:res.success=true;res.data=null;break;default:return true;break;} +if(res.success===true){this.fireEvent("write",this,action,res.data,res,rs,o.request.arg);}else{this.fireEvent('exception',this,'remote',action,o,res,rs);} +o.request.callback.call(o.request.scope,res.data,res,res.success);return false;},proxy);}};})();Ext.data.Response=function(params,response){Ext.apply(this,params,{raw:response});};Ext.data.Response.prototype={message:null,success:false,status:null,root:null,raw:null,getMessage:function(){return this.message;},getSuccess:function(){return this.success;},getStatus:function(){return this.status;},getRoot:function(){return this.root;},getRawResponse:function(){return this.raw;}};Ext.data.Api.Error=Ext.extend(Ext.Error,{constructor:function(message,arg){this.arg=arg;Ext.Error.call(this,message);},name:'Ext.data.Api'});Ext.apply(Ext.data.Api.Error.prototype,{lang:{'action-url-undefined':'No fallback url defined for this action. When defining a DataProxy api, please be sure to define an url for each CRUD action in Ext.data.Api.actions or define a default url in addition to your api-configuration.','invalid':'received an invalid API-configuration. Please ensure your proxy API-configuration contains only the actions defined in Ext.data.Api.actions','invalid-url':'Invalid url. Please review your proxy configuration.','execute':'Attempted to execute an unknown action. Valid API actions are defined in Ext.data.Api.actions"'}});Ext.data.SortTypes={none:function(s){return s;},stripTagsRE:/<\/?[^>]+>/gi,asText:function(s){return String(s).replace(this.stripTagsRE,"");},asUCText:function(s){return String(s).toUpperCase().replace(this.stripTagsRE,"");},asUCString:function(s){return String(s).toUpperCase();},asDate:function(s){if(!s){return 0;} +if(Ext.isDate(s)){return s.getTime();} +return Date.parse(String(s));},asFloat:function(s){var val=parseFloat(String(s).replace(/,/g,""));return isNaN(val)?0:val;},asInt:function(s){var val=parseInt(String(s).replace(/,/g,""),10);return isNaN(val)?0:val;}};Ext.data.Record=function(data,id){this.id=(id||id===0)?id:Ext.data.Record.id(this);this.data=data||{};};Ext.data.Record.create=function(o){var f=Ext.extend(Ext.data.Record,{});var p=f.prototype;p.fields=new Ext.util.MixedCollection(false,function(field){return field.name;});for(var i=0,len=o.length;i<len;i++){p.fields.add(new Ext.data.Field(o[i]));} +f.getField=function(name){return p.fields.get(name);};return f;};Ext.data.Record.PREFIX='ext-record';Ext.data.Record.AUTO_ID=1;Ext.data.Record.EDIT='edit';Ext.data.Record.REJECT='reject';Ext.data.Record.COMMIT='commit';Ext.data.Record.id=function(rec){rec.phantom=true;return[Ext.data.Record.PREFIX,'-',Ext.data.Record.AUTO_ID++].join('');};Ext.data.Record.prototype={dirty:false,editing:false,error:null,modified:null,phantom:false,join:function(store){this.store=store;},set:function(name,value){var encode=Ext.isPrimitive(value)?String:Ext.encode;if(encode(this.data[name])==encode(value)){return;} +this.dirty=true;if(!this.modified){this.modified={};} +if(this.modified[name]===undefined){this.modified[name]=this.data[name];} +this.data[name]=value;if(!this.editing){this.afterEdit();}},afterEdit:function(){if(this.store!=undefined&&typeof this.store.afterEdit=="function"){this.store.afterEdit(this);}},afterReject:function(){if(this.store){this.store.afterReject(this);}},afterCommit:function(){if(this.store){this.store.afterCommit(this);}},get:function(name){return this.data[name];},beginEdit:function(){this.editing=true;this.modified=this.modified||{};},cancelEdit:function(){this.editing=false;delete this.modified;},endEdit:function(){this.editing=false;if(this.dirty){this.afterEdit();}},reject:function(silent){var m=this.modified;for(var n in m){if(typeof m[n]!="function"){this.data[n]=m[n];}} +this.dirty=false;delete this.modified;this.editing=false;if(silent!==true){this.afterReject();}},commit:function(silent){this.dirty=false;delete this.modified;this.editing=false;if(silent!==true){this.afterCommit();}},getChanges:function(){var m=this.modified,cs={};for(var n in m){if(m.hasOwnProperty(n)){cs[n]=this.data[n];}} +return cs;},hasError:function(){return this.error!==null;},clearError:function(){this.error=null;},copy:function(newId){return new this.constructor(Ext.apply({},this.data),newId||this.id);},isModified:function(fieldName){return!!(this.modified&&this.modified.hasOwnProperty(fieldName));},isValid:function(){return this.fields.find(function(f){return(f.allowBlank===false&&Ext.isEmpty(this.data[f.name]))?true:false;},this)?false:true;},markDirty:function(){this.dirty=true;if(!this.modified){this.modified={};} +this.fields.each(function(f){this.modified[f.name]=this.data[f.name];},this);}};Ext.StoreMgr=Ext.apply(new Ext.util.MixedCollection(),{register:function(){for(var i=0,s;(s=arguments[i]);i++){this.add(s);}},unregister:function(){for(var i=0,s;(s=arguments[i]);i++){this.remove(this.lookup(s));}},lookup:function(id){if(Ext.isArray(id)){var fields=['field1'],expand=!Ext.isArray(id[0]);if(!expand){for(var i=2,len=id[0].length;i<=len;++i){fields.push('field'+i);}} +return new Ext.data.ArrayStore({fields:fields,data:id,expandData:expand,autoDestroy:true,autoCreated:true});} +return Ext.isObject(id)?(id.events?id:Ext.create(id,'store')):this.get(id);},getKey:function(o){return o.storeId;}});Ext.data.Store=Ext.extend(Ext.util.Observable,{writer:undefined,remoteSort:false,autoDestroy:false,pruneModifiedRecords:false,lastOptions:null,autoSave:true,batch:true,restful:false,paramNames:undefined,defaultParamNames:{start:'start',limit:'limit',sort:'sort',dir:'dir'},isDestroyed:false,hasMultiSort:false,batchKey:'_ext_batch_',constructor:function(config){this.data=new Ext.util.MixedCollection(false);this.data.getKey=function(o){return o.id;};this.removed=[];if(config&&config.data){this.inlineData=config.data;delete config.data;} +Ext.apply(this,config);this.baseParams=Ext.isObject(this.baseParams)?this.baseParams:{};this.paramNames=Ext.applyIf(this.paramNames||{},this.defaultParamNames);if((this.url||this.api)&&!this.proxy){this.proxy=new Ext.data.HttpProxy({url:this.url,api:this.api});} +if(this.restful===true&&this.proxy){this.batch=false;Ext.data.Api.restify(this.proxy);} +if(this.reader){if(!this.recordType){this.recordType=this.reader.recordType;} +if(this.reader.onMetaChange){this.reader.onMetaChange=this.reader.onMetaChange.createSequence(this.onMetaChange,this);} +if(this.writer){if(this.writer instanceof(Ext.data.DataWriter)===false){this.writer=this.buildWriter(this.writer);} +this.writer.meta=this.reader.meta;this.pruneModifiedRecords=true;}} +if(this.recordType){this.fields=this.recordType.prototype.fields;} +this.modified=[];this.addEvents('datachanged','metachange','add','remove','update','clear','exception','beforeload','load','loadexception','beforewrite','write','beforesave','save');if(this.proxy){this.relayEvents(this.proxy,['loadexception','exception']);} +if(this.writer){this.on({scope:this,add:this.createRecords,remove:this.destroyRecord,update:this.updateRecord,clear:this.onClear});} +this.sortToggle={};if(this.sortField){this.setDefaultSort(this.sortField,this.sortDir);}else if(this.sortInfo){this.setDefaultSort(this.sortInfo.field,this.sortInfo.direction);} +Ext.data.Store.superclass.constructor.call(this);if(this.id){this.storeId=this.id;delete this.id;} +if(this.storeId){Ext.StoreMgr.register(this);} +if(this.inlineData){this.loadData(this.inlineData);delete this.inlineData;}else if(this.autoLoad){this.load.defer(10,this,[typeof this.autoLoad=='object'?this.autoLoad:undefined]);} +this.batchCounter=0;this.batches={};},buildWriter:function(config){var klass=undefined,type=(config.format||'json').toLowerCase();switch(type){case'json':klass=Ext.data.JsonWriter;break;case'xml':klass=Ext.data.XmlWriter;break;default:klass=Ext.data.JsonWriter;} +return new klass(config);},destroy:function(){if(!this.isDestroyed){if(this.storeId){Ext.StoreMgr.unregister(this);} +this.clearData();this.data=null;Ext.destroy(this.proxy);this.reader=this.writer=null;this.purgeListeners();this.isDestroyed=true;}},add:function(records){var i,len,record,index;records=[].concat(records);if(records.length<1){return;} +for(i=0,len=records.length;i<len;i++){record=records[i];record.join(this);if(record.dirty||record.phantom){this.modified.push(record);}} +index=this.data.length;this.data.addAll(records);if(this.snapshot){this.snapshot.addAll(records);} +this.fireEvent('add',this,records,index);},addSorted:function(record){var index=this.findInsertIndex(record);this.insert(index,record);},doUpdate:function(rec){this.data.replace(rec.id,rec);if(this.snapshot){this.snapshot.replace(rec.id,rec);} +this.fireEvent('update',this,rec,Ext.data.Record.COMMIT);},remove:function(record){if(Ext.isArray(record)){Ext.each(record,function(r){this.remove(r);},this);return;} +var index=this.data.indexOf(record);if(index>-1){record.join(null);this.data.removeAt(index);} +if(this.pruneModifiedRecords){this.modified.remove(record);} +if(this.snapshot){this.snapshot.remove(record);} +if(index>-1){this.fireEvent('remove',this,record,index);}},removeAt:function(index){this.remove(this.getAt(index));},removeAll:function(silent){var items=[];this.each(function(rec){items.push(rec);});this.clearData();if(this.snapshot){this.snapshot.clear();} +if(this.pruneModifiedRecords){this.modified=[];} +if(silent!==true){this.fireEvent('clear',this,items);}},onClear:function(store,records){Ext.each(records,function(rec,index){this.destroyRecord(this,rec,index);},this);},insert:function(index,records){var i,len,record;records=[].concat(records);for(i=0,len=records.length;i<len;i++){record=records[i];this.data.insert(index+i,record);record.join(this);if(record.dirty||record.phantom){this.modified.push(record);}} +if(this.snapshot){this.snapshot.addAll(records);} +this.fireEvent('add',this,records,index);},indexOf:function(record){return this.data.indexOf(record);},indexOfId:function(id){return this.data.indexOfKey(id);},getById:function(id){return(this.snapshot||this.data).key(id);},getAt:function(index){return this.data.itemAt(index);},getRange:function(start,end){return this.data.getRange(start,end);},storeOptions:function(o){o=Ext.apply({},o);delete o.callback;delete o.scope;this.lastOptions=o;},clearData:function(){this.data.each(function(rec){rec.join(null);});this.data.clear();},load:function(options){options=Ext.apply({},options);this.storeOptions(options);if(this.sortInfo&&this.remoteSort){var pn=this.paramNames;options.params=Ext.apply({},options.params);options.params[pn.sort]=this.sortInfo.field;options.params[pn.dir]=this.sortInfo.direction;} +try{return this.execute('read',null,options);}catch(e){this.handleException(e);return false;}},updateRecord:function(store,record,action){if(action==Ext.data.Record.EDIT&&this.autoSave===true&&(!record.phantom||(record.phantom&&record.isValid()))){this.save();}},createRecords:function(store,records,index){var modified=this.modified,length=records.length,record,i;for(i=0;i<length;i++){record=records[i];if(record.phantom&&record.isValid()){record.markDirty();if(modified.indexOf(record)==-1){modified.push(record);}}} +if(this.autoSave===true){this.save();}},destroyRecord:function(store,record,index){if(this.modified.indexOf(record)!=-1){this.modified.remove(record);} +if(!record.phantom){this.removed.push(record);record.lastIndex=index;if(this.autoSave===true){this.save();}}},execute:function(action,rs,options,batch){if(!Ext.data.Api.isAction(action)){throw new Ext.data.Api.Error('execute',action);} +options=Ext.applyIf(options||{},{params:{}});if(batch!==undefined){this.addToBatch(batch);} +var doRequest=true;if(action==='read'){doRequest=this.fireEvent('beforeload',this,options);Ext.applyIf(options.params,this.baseParams);} +else{if(this.writer.listful===true&&this.restful!==true){rs=(Ext.isArray(rs))?rs:[rs];} +else if(Ext.isArray(rs)&&rs.length==1){rs=rs.shift();} +if((doRequest=this.fireEvent('beforewrite',this,action,rs,options))!==false){this.writer.apply(options.params,this.baseParams,action,rs);}} +if(doRequest!==false){if(this.writer&&this.proxy.url&&!this.proxy.restful&&!Ext.data.Api.hasUniqueUrl(this.proxy,action)){options.params.xaction=action;} +this.proxy.request(Ext.data.Api.actions[action],rs,options.params,this.reader,this.createCallback(action,rs,batch),this,options);} +return doRequest;},save:function(){if(!this.writer){throw new Ext.data.Store.Error('writer-undefined');} +var queue=[],len,trans,batch,data={},i;if(this.removed.length){queue.push(['destroy',this.removed]);} +var rs=[].concat(this.getModifiedRecords());if(rs.length){var phantoms=[];for(i=rs.length-1;i>=0;i--){if(rs[i].phantom===true){var rec=rs.splice(i,1).shift();if(rec.isValid()){phantoms.push(rec);}}else if(!rs[i].isValid()){rs.splice(i,1);}} +if(phantoms.length){queue.push(['create',phantoms]);} +if(rs.length){queue.push(['update',rs]);}} +len=queue.length;if(len){batch=++this.batchCounter;for(i=0;i<len;++i){trans=queue[i];data[trans[0]]=trans[1];} +if(this.fireEvent('beforesave',this,data)!==false){for(i=0;i<len;++i){trans=queue[i];this.doTransaction(trans[0],trans[1],batch);} +return batch;}} +return-1;},doTransaction:function(action,rs,batch){function transaction(records){try{this.execute(action,records,undefined,batch);}catch(e){this.handleException(e);}} +if(this.batch===false){for(var i=0,len=rs.length;i<len;i++){transaction.call(this,rs[i]);}}else{transaction.call(this,rs);}},addToBatch:function(batch){var b=this.batches,key=this.batchKey+batch,o=b[key];if(!o){b[key]=o={id:batch,count:0,data:{}};} +++o.count;},removeFromBatch:function(batch,action,data){var b=this.batches,key=this.batchKey+batch,o=b[key],arr;if(o){arr=o.data[action]||[];o.data[action]=arr.concat(data);if(o.count===1){data=o.data;delete b[key];this.fireEvent('save',this,batch,data);}else{--o.count;}}},createCallback:function(action,rs,batch){var actions=Ext.data.Api.actions;return(action=='read')?this.loadRecords:function(data,response,success){this['on'+Ext.util.Format.capitalize(action)+'Records'](success,rs,[].concat(data));if(success===true){this.fireEvent('write',this,action,data,response,rs);} +this.removeFromBatch(batch,action,data);};},clearModified:function(rs){if(Ext.isArray(rs)){for(var n=rs.length-1;n>=0;n--){this.modified.splice(this.modified.indexOf(rs[n]),1);}}else{this.modified.splice(this.modified.indexOf(rs),1);}},reMap:function(record){if(Ext.isArray(record)){for(var i=0,len=record.length;i<len;i++){this.reMap(record[i]);}}else{delete this.data.map[record._phid];this.data.map[record.id]=record;var index=this.data.keys.indexOf(record._phid);this.data.keys.splice(index,1,record.id);delete record._phid;}},onCreateRecords:function(success,rs,data){if(success===true){try{this.reader.realize(rs,data);this.reMap(rs);} +catch(e){this.handleException(e);if(Ext.isArray(rs)){this.onCreateRecords(success,rs,data);}}}},onUpdateRecords:function(success,rs,data){if(success===true){try{this.reader.update(rs,data);}catch(e){this.handleException(e);if(Ext.isArray(rs)){this.onUpdateRecords(success,rs,data);}}}},onDestroyRecords:function(success,rs,data){rs=(rs instanceof Ext.data.Record)?[rs]:[].concat(rs);for(var i=0,len=rs.length;i<len;i++){this.removed.splice(this.removed.indexOf(rs[i]),1);} +if(success===false){for(i=rs.length-1;i>=0;i--){this.insert(rs[i].lastIndex,rs[i]);}}},handleException:function(e){Ext.handleError(e);},reload:function(options){this.load(Ext.applyIf(options||{},this.lastOptions));},loadRecords:function(o,options,success){var i,len;if(this.isDestroyed===true){return;} +if(!o||success===false){if(success!==false){this.fireEvent('load',this,[],options);} +if(options.callback){options.callback.call(options.scope||this,[],options,false,o);} +return;} +var r=o.records,t=o.totalRecords||r.length;if(!options||options.add!==true){if(this.pruneModifiedRecords){this.modified=[];} +for(i=0,len=r.length;i<len;i++){r[i].join(this);} +if(this.snapshot){this.data=this.snapshot;delete this.snapshot;} +this.clearData();this.data.addAll(r);this.totalLength=t;this.applySort();this.fireEvent('datachanged',this);}else{var toAdd=[],rec,cnt=0;for(i=0,len=r.length;i<len;++i){rec=r[i];if(this.indexOfId(rec.id)>-1){this.doUpdate(rec);}else{toAdd.push(rec);++cnt;}} +this.totalLength=Math.max(t,this.data.length+cnt);this.add(toAdd);} +this.fireEvent('load',this,r,options);if(options.callback){options.callback.call(options.scope||this,r,options,true);}},loadData:function(o,append){var r=this.reader.readRecords(o);this.loadRecords(r,{add:append},true);},getCount:function(){return this.data.length||0;},getTotalCount:function(){return this.totalLength||0;},getSortState:function(){return this.sortInfo;},applySort:function(){if((this.sortInfo||this.multiSortInfo)&&!this.remoteSort){this.sortData();}},sortData:function(){var sortInfo=this.hasMultiSort?this.multiSortInfo:this.sortInfo,direction=sortInfo.direction||"ASC",sorters=sortInfo.sorters,sortFns=[];if(!this.hasMultiSort){sorters=[{direction:direction,field:sortInfo.field}];} +for(var i=0,j=sorters.length;i<j;i++){sortFns.push(this.createSortFunction(sorters[i].field,sorters[i].direction));} +if(sortFns.length==0){return;} +var directionModifier=direction.toUpperCase()=="DESC"?-1:1;var fn=function(r1,r2){var result=sortFns[0].call(this,r1,r2);if(sortFns.length>1){for(var i=1,j=sortFns.length;i<j;i++){result=result||sortFns[i].call(this,r1,r2);}} +return directionModifier*result;};this.data.sort(direction,fn);if(this.snapshot&&this.snapshot!=this.data){this.snapshot.sort(direction,fn);}},createSortFunction:function(field,direction){direction=direction||"ASC";var directionModifier=direction.toUpperCase()=="DESC"?-1:1;var sortType=this.fields.get(field).sortType;return function(r1,r2){var v1=sortType(r1.data[field]),v2=sortType(r2.data[field]);return directionModifier*(v1>v2?1:(v1<v2?-1:0));};},setDefaultSort:function(field,dir){dir=dir?dir.toUpperCase():'ASC';this.sortInfo={field:field,direction:dir};this.sortToggle[field]=dir;},sort:function(fieldName,dir){if(Ext.isArray(arguments[0])){return this.multiSort.call(this,fieldName,dir);}else{return this.singleSort(fieldName,dir);}},singleSort:function(fieldName,dir){var field=this.fields.get(fieldName);if(!field){return false;} +var name=field.name,sortInfo=this.sortInfo||null,sortToggle=this.sortToggle?this.sortToggle[name]:null;if(!dir){if(sortInfo&&sortInfo.field==name){dir=(this.sortToggle[name]||'ASC').toggle('ASC','DESC');}else{dir=field.sortDir;}} +this.sortToggle[name]=dir;this.sortInfo={field:name,direction:dir};this.hasMultiSort=false;if(this.remoteSort){if(!this.load(this.lastOptions)){if(sortToggle){this.sortToggle[name]=sortToggle;} +if(sortInfo){this.sortInfo=sortInfo;}}}else{this.applySort();this.fireEvent('datachanged',this);} +return true;},multiSort:function(sorters,direction){this.hasMultiSort=true;direction=direction||"ASC";if(this.multiSortInfo&&direction==this.multiSortInfo.direction){direction=direction.toggle("ASC","DESC");} +this.multiSortInfo={sorters:sorters,direction:direction};if(this.remoteSort){this.singleSort(sorters[0].field,sorters[0].direction);}else{this.applySort();this.fireEvent('datachanged',this);}},each:function(fn,scope){this.data.each(fn,scope);},getModifiedRecords:function(){return this.modified;},sum:function(property,start,end){var rs=this.data.items,v=0;start=start||0;end=(end||end===0)?end:rs.length-1;for(var i=start;i<=end;i++){v+=(rs[i].data[property]||0);} +return v;},createFilterFn:function(property,value,anyMatch,caseSensitive,exactMatch){if(Ext.isEmpty(value,false)){return false;} +value=this.data.createValueMatcher(value,anyMatch,caseSensitive,exactMatch);return function(r){return value.test(r.data[property]);};},createMultipleFilterFn:function(filters){return function(record){var isMatch=true;for(var i=0,j=filters.length;i<j;i++){var filter=filters[i],fn=filter.fn,scope=filter.scope;isMatch=isMatch&&fn.call(scope,record);} +return isMatch;};},filter:function(property,value,anyMatch,caseSensitive,exactMatch){var fn;if(Ext.isObject(property)){property=[property];} +if(Ext.isArray(property)){var filters=[];for(var i=0,j=property.length;i<j;i++){var filter=property[i],func=filter.fn,scope=filter.scope||this;if(!Ext.isFunction(func)){func=this.createFilterFn(filter.property,filter.value,filter.anyMatch,filter.caseSensitive,filter.exactMatch);} +filters.push({fn:func,scope:scope});} +fn=this.createMultipleFilterFn(filters);}else{fn=this.createFilterFn(property,value,anyMatch,caseSensitive,exactMatch);} +return fn?this.filterBy(fn):this.clearFilter();},filterBy:function(fn,scope){this.snapshot=this.snapshot||this.data;this.data=this.queryBy(fn,scope||this);this.fireEvent('datachanged',this);},clearFilter:function(suppressEvent){if(this.isFiltered()){this.data=this.snapshot;delete this.snapshot;if(suppressEvent!==true){this.fireEvent('datachanged',this);}}},isFiltered:function(){return!!this.snapshot&&this.snapshot!=this.data;},query:function(property,value,anyMatch,caseSensitive){var fn=this.createFilterFn(property,value,anyMatch,caseSensitive);return fn?this.queryBy(fn):this.data.clone();},queryBy:function(fn,scope){var data=this.snapshot||this.data;return data.filterBy(fn,scope||this);},find:function(property,value,start,anyMatch,caseSensitive){var fn=this.createFilterFn(property,value,anyMatch,caseSensitive);return fn?this.data.findIndexBy(fn,null,start):-1;},findExact:function(property,value,start){return this.data.findIndexBy(function(rec){return rec.get(property)===value;},this,start);},findBy:function(fn,scope,start){return this.data.findIndexBy(fn,scope,start);},collect:function(dataIndex,allowNull,bypassFilter){var d=(bypassFilter===true&&this.snapshot)?this.snapshot.items:this.data.items;var v,sv,r=[],l={};for(var i=0,len=d.length;i<len;i++){v=d[i].data[dataIndex];sv=String(v);if((allowNull||!Ext.isEmpty(v))&&!l[sv]){l[sv]=true;r[r.length]=v;}} +return r;},afterEdit:function(record){if(this.modified.indexOf(record)==-1){this.modified.push(record);} +this.fireEvent('update',this,record,Ext.data.Record.EDIT);},afterReject:function(record){this.modified.remove(record);this.fireEvent('update',this,record,Ext.data.Record.REJECT);},afterCommit:function(record){this.modified.remove(record);this.fireEvent('update',this,record,Ext.data.Record.COMMIT);},commitChanges:function(){var modified=this.modified.slice(0),length=modified.length,i;for(i=0;i<length;i++){modified[i].commit();} +this.modified=[];this.removed=[];},rejectChanges:function(){var modified=this.modified.slice(0),removed=this.removed.slice(0).reverse(),mLength=modified.length,rLength=removed.length,i;for(i=0;i<mLength;i++){modified[i].reject();} +for(i=0;i<rLength;i++){this.insert(removed[i].lastIndex||0,removed[i]);removed[i].reject();} +this.modified=[];this.removed=[];},onMetaChange:function(meta){this.recordType=this.reader.recordType;this.fields=this.recordType.prototype.fields;delete this.snapshot;if(this.reader.meta.sortInfo){this.sortInfo=this.reader.meta.sortInfo;}else if(this.sortInfo&&!this.fields.get(this.sortInfo.field)){delete this.sortInfo;} +if(this.writer){this.writer.meta=this.reader.meta;} +this.modified=[];this.fireEvent('metachange',this,this.reader.meta);},findInsertIndex:function(record){this.suspendEvents();var data=this.data.clone();this.data.add(record);this.applySort();var index=this.data.indexOf(record);this.data=data;this.resumeEvents();return index;},setBaseParam:function(name,value){this.baseParams=this.baseParams||{};this.baseParams[name]=value;}});Ext.reg('store',Ext.data.Store);Ext.data.Store.Error=Ext.extend(Ext.Error,{name:'Ext.data.Store'});Ext.apply(Ext.data.Store.Error.prototype,{lang:{'writer-undefined':'Attempted to execute a write-action without a DataWriter installed.'}});Ext.data.Field=Ext.extend(Object,{constructor:function(config){if(Ext.isString(config)){config={name:config};} +Ext.apply(this,config);var types=Ext.data.Types,st=this.sortType,t;if(this.type){if(Ext.isString(this.type)){this.type=Ext.data.Types[this.type.toUpperCase()]||types.AUTO;}}else{this.type=types.AUTO;} +if(Ext.isString(st)){this.sortType=Ext.data.SortTypes[st];}else if(Ext.isEmpty(st)){this.sortType=this.type.sortType;} +if(!this.convert){this.convert=this.type.convert;}},dateFormat:null,useNull:false,defaultValue:"",mapping:null,sortType:null,sortDir:"ASC",allowBlank:true});Ext.data.DataReader=function(meta,recordType){this.meta=meta;this.recordType=Ext.isArray(recordType)?Ext.data.Record.create(recordType):recordType;if(this.recordType){this.buildExtractors();}};Ext.data.DataReader.prototype={getTotal:Ext.emptyFn,getRoot:Ext.emptyFn,getMessage:Ext.emptyFn,getSuccess:Ext.emptyFn,getId:Ext.emptyFn,buildExtractors:Ext.emptyFn,extractValues:Ext.emptyFn,realize:function(rs,data){if(Ext.isArray(rs)){for(var i=rs.length-1;i>=0;i--){if(Ext.isArray(data)){this.realize(rs.splice(i,1).shift(),data.splice(i,1).shift());} +else{this.realize(rs.splice(i,1).shift(),data);}}} +else{if(Ext.isArray(data)&&data.length==1){data=data.shift();} +if(!this.isData(data)){throw new Ext.data.DataReader.Error('realize',rs);} +rs.phantom=false;rs._phid=rs.id;rs.id=this.getId(data);rs.data=data;rs.commit();}},update:function(rs,data){if(Ext.isArray(rs)){for(var i=rs.length-1;i>=0;i--){if(Ext.isArray(data)){this.update(rs.splice(i,1).shift(),data.splice(i,1).shift());} +else{this.update(rs.splice(i,1).shift(),data);}}} +else{if(Ext.isArray(data)&&data.length==1){data=data.shift();} +if(this.isData(data)){rs.data=Ext.apply(rs.data,data);} +rs.commit();}},extractData:function(root,returnRecords){var rawName=(this instanceof Ext.data.JsonReader)?'json':'node';var rs=[];if(this.isData(root)&&!(this instanceof Ext.data.XmlReader)){root=[root];} +var f=this.recordType.prototype.fields,fi=f.items,fl=f.length,rs=[];if(returnRecords===true){var Record=this.recordType;for(var i=0;i<root.length;i++){var n=root[i];var record=new Record(this.extractValues(n,fi,fl),this.getId(n));record[rawName]=n;rs.push(record);}} +else{for(var i=0;i<root.length;i++){var data=this.extractValues(root[i],fi,fl);data[this.meta.idProperty]=this.getId(root[i]);rs.push(data);}} +return rs;},isData:function(data){return(data&&Ext.isObject(data)&&!Ext.isEmpty(this.getId(data)))?true:false;},onMetaChange:function(meta){delete this.ef;this.meta=meta;this.recordType=Ext.data.Record.create(meta.fields);this.buildExtractors();}};Ext.data.DataReader.Error=Ext.extend(Ext.Error,{constructor:function(message,arg){this.arg=arg;Ext.Error.call(this,message);},name:'Ext.data.DataReader'});Ext.apply(Ext.data.DataReader.Error.prototype,{lang:{'update':"#update received invalid data from server. Please see docs for DataReader#update and review your DataReader configuration.",'realize':"#realize was called with invalid remote-data. Please see the docs for DataReader#realize and review your DataReader configuration.",'invalid-response':"#readResponse received an invalid response from the server."}});Ext.data.DataWriter=function(config){Ext.apply(this,config);};Ext.data.DataWriter.prototype={writeAllFields:false,listful:false,apply:function(params,baseParams,action,rs){var data=[],renderer=action+'Record';if(Ext.isArray(rs)){Ext.each(rs,function(rec){data.push(this[renderer](rec));},this);} +else if(rs instanceof Ext.data.Record){data=this[renderer](rs);} +this.render(params,baseParams,data);},render:Ext.emptyFn,updateRecord:Ext.emptyFn,createRecord:Ext.emptyFn,destroyRecord:Ext.emptyFn,toHash:function(rec,config){var map=rec.fields.map,data={},raw=(this.writeAllFields===false&&rec.phantom===false)?rec.getChanges():rec.data,m;Ext.iterate(raw,function(prop,value){if((m=map[prop])){data[m.mapping?m.mapping:m.name]=value;}});if(rec.phantom){if(rec.fields.containsKey(this.meta.idProperty)&&Ext.isEmpty(rec.data[this.meta.idProperty])){delete data[this.meta.idProperty];}}else{data[this.meta.idProperty]=rec.id;} +return data;},toArray:function(data){var fields=[];Ext.iterate(data,function(k,v){fields.push({name:k,value:v});},this);return fields;}};Ext.data.DataProxy=function(conn){conn=conn||{};this.api=conn.api;this.url=conn.url;this.restful=conn.restful;this.listeners=conn.listeners;this.prettyUrls=conn.prettyUrls;this.addEvents('exception','beforeload','load','loadexception','beforewrite','write');Ext.data.DataProxy.superclass.constructor.call(this);try{Ext.data.Api.prepare(this);}catch(e){if(e instanceof Ext.data.Api.Error){e.toConsole();}} +Ext.data.DataProxy.relayEvents(this,['beforewrite','write','exception']);};Ext.extend(Ext.data.DataProxy,Ext.util.Observable,{restful:false,setApi:function(){if(arguments.length==1){var valid=Ext.data.Api.isValid(arguments[0]);if(valid===true){this.api=arguments[0];} +else{throw new Ext.data.Api.Error('invalid',valid);}} +else if(arguments.length==2){if(!Ext.data.Api.isAction(arguments[0])){throw new Ext.data.Api.Error('invalid',arguments[0]);} +this.api[arguments[0]]=arguments[1];} +Ext.data.Api.prepare(this);},isApiAction:function(action){return(this.api[action])?true:false;},request:function(action,rs,params,reader,callback,scope,options){if(!this.api[action]&&!this.load){throw new Ext.data.DataProxy.Error('action-undefined',action);} +params=params||{};if((action===Ext.data.Api.actions.read)?this.fireEvent("beforeload",this,params):this.fireEvent("beforewrite",this,action,rs,params)!==false){this.doRequest.apply(this,arguments);} +else{callback.call(scope||this,null,options,false);}},load:null,doRequest:function(action,rs,params,reader,callback,scope,options){this.load(params,reader,callback,scope,options);},onRead:Ext.emptyFn,onWrite:Ext.emptyFn,buildUrl:function(action,record){record=record||null;var url=(this.conn&&this.conn.url)?this.conn.url:(this.api[action])?this.api[action].url:this.url;if(!url){throw new Ext.data.Api.Error('invalid-url',action);} +var provides=null;var m=url.match(/(.*)(\.json|\.xml|\.html)$/);if(m){provides=m[2];url=m[1];} +if((this.restful===true||this.prettyUrls===true)&&record instanceof Ext.data.Record&&!record.phantom){url+='/'+record.id;} +return(provides===null)?url:url+provides;},destroy:function(){this.purgeListeners();}});Ext.apply(Ext.data.DataProxy,Ext.util.Observable.prototype);Ext.util.Observable.call(Ext.data.DataProxy);Ext.data.DataProxy.Error=Ext.extend(Ext.Error,{constructor:function(message,arg){this.arg=arg;Ext.Error.call(this,message);},name:'Ext.data.DataProxy'});Ext.apply(Ext.data.DataProxy.Error.prototype,{lang:{'action-undefined':"DataProxy attempted to execute an API-action but found an undefined url / function. Please review your Proxy url/api-configuration.",'api-invalid':'Recieved an invalid API-configuration. Please ensure your proxy API-configuration contains only the actions from Ext.data.Api.actions.'}});Ext.data.Request=function(params){Ext.apply(this,params);};Ext.data.Request.prototype={action:undefined,rs:undefined,params:undefined,callback:Ext.emptyFn,scope:undefined,reader:undefined};Ext.data.Response=function(params){Ext.apply(this,params);};Ext.data.Response.prototype={action:undefined,success:undefined,message:undefined,data:undefined,raw:undefined,records:undefined};Ext.data.ScriptTagProxy=function(config){Ext.apply(this,config);Ext.data.ScriptTagProxy.superclass.constructor.call(this,config);this.head=document.getElementsByTagName("head")[0];};Ext.data.ScriptTagProxy.TRANS_ID=1000;Ext.extend(Ext.data.ScriptTagProxy,Ext.data.DataProxy,{timeout:30000,callbackParam:"callback",nocache:true,doRequest:function(action,rs,params,reader,callback,scope,arg){var p=Ext.urlEncode(Ext.apply(params,this.extraParams));var url=this.buildUrl(action,rs);if(!url){throw new Ext.data.Api.Error('invalid-url',url);} +url=Ext.urlAppend(url,p);if(this.nocache){url=Ext.urlAppend(url,'_dc='+(new Date().getTime()));} +var transId=++Ext.data.ScriptTagProxy.TRANS_ID;var trans={id:transId,action:action,cb:"stcCallback"+transId,scriptId:"stcScript"+transId,params:params,arg:arg,url:url,callback:callback,scope:scope,reader:reader};window[trans.cb]=this.createCallback(action,rs,trans);url+=String.format("&{0}={1}",this.callbackParam,trans.cb);if(this.autoAbort!==false){this.abort();} +trans.timeoutId=this.handleFailure.defer(this.timeout,this,[trans]);var script=document.createElement("script");script.setAttribute("src",url);script.setAttribute("type","text/javascript");script.setAttribute("id",trans.scriptId);this.head.appendChild(script);this.trans=trans;},createCallback:function(action,rs,trans){var self=this;return function(res){self.trans=false;self.destroyTrans(trans,true);if(action===Ext.data.Api.actions.read){self.onRead.call(self,action,trans,res);}else{self.onWrite.call(self,action,trans,res,rs);}};},onRead:function(action,trans,res){var result;try{result=trans.reader.readRecords(res);}catch(e){this.fireEvent("loadexception",this,trans,res,e);this.fireEvent('exception',this,'response',action,trans,res,e);trans.callback.call(trans.scope||window,null,trans.arg,false);return;} +if(result.success===false){this.fireEvent('loadexception',this,trans,res);this.fireEvent('exception',this,'remote',action,trans,res,null);}else{this.fireEvent("load",this,res,trans.arg);} +trans.callback.call(trans.scope||window,result,trans.arg,result.success);},onWrite:function(action,trans,response,rs){var reader=trans.reader;try{var res=reader.readResponse(action,response);}catch(e){this.fireEvent('exception',this,'response',action,trans,res,e);trans.callback.call(trans.scope||window,null,res,false);return;} +if(!res.success===true){this.fireEvent('exception',this,'remote',action,trans,res,rs);trans.callback.call(trans.scope||window,null,res,false);return;} +this.fireEvent("write",this,action,res.data,res,rs,trans.arg);trans.callback.call(trans.scope||window,res.data,res,true);},isLoading:function(){return this.trans?true:false;},abort:function(){if(this.isLoading()){this.destroyTrans(this.trans);}},destroyTrans:function(trans,isLoaded){this.head.removeChild(document.getElementById(trans.scriptId));clearTimeout(trans.timeoutId);if(isLoaded){window[trans.cb]=undefined;try{delete window[trans.cb];}catch(e){}}else{window[trans.cb]=function(){window[trans.cb]=undefined;try{delete window[trans.cb];}catch(e){}};}},handleFailure:function(trans){this.trans=false;this.destroyTrans(trans,false);if(trans.action===Ext.data.Api.actions.read){this.fireEvent("loadexception",this,null,trans.arg);} +this.fireEvent('exception',this,'response',trans.action,{response:null,options:trans.arg});trans.callback.call(trans.scope||window,null,trans.arg,false);},destroy:function(){this.abort();Ext.data.ScriptTagProxy.superclass.destroy.call(this);}});Ext.data.HttpProxy=function(conn){Ext.data.HttpProxy.superclass.constructor.call(this,conn);this.conn=conn;this.conn.url=null;this.useAjax=!conn||!conn.events;var actions=Ext.data.Api.actions;this.activeRequest={};for(var verb in actions){this.activeRequest[actions[verb]]=undefined;}};Ext.extend(Ext.data.HttpProxy,Ext.data.DataProxy,{getConnection:function(){return this.useAjax?Ext.Ajax:this.conn;},setUrl:function(url,makePermanent){this.conn.url=url;if(makePermanent===true){this.url=url;this.api=null;Ext.data.Api.prepare(this);}},doRequest:function(action,rs,params,reader,cb,scope,arg){var o={method:(this.api[action])?this.api[action]['method']:undefined,request:{callback:cb,scope:scope,arg:arg},reader:reader,callback:this.createCallback(action,rs),scope:this};if(params.jsonData){o.jsonData=params.jsonData;}else if(params.xmlData){o.xmlData=params.xmlData;}else{o.params=params||{};} +this.conn.url=this.buildUrl(action,rs);if(this.useAjax){Ext.applyIf(o,this.conn);if(this.activeRequest[action]){} +this.activeRequest[action]=Ext.Ajax.request(o);}else{this.conn.request(o);} +this.conn.url=null;},createCallback:function(action,rs){return function(o,success,response){this.activeRequest[action]=undefined;if(!success){if(action===Ext.data.Api.actions.read){this.fireEvent('loadexception',this,o,response);} +this.fireEvent('exception',this,'response',action,o,response);o.request.callback.call(o.request.scope,null,o.request.arg,false);return;} +if(action===Ext.data.Api.actions.read){this.onRead(action,o,response);}else{this.onWrite(action,o,response,rs);}};},onRead:function(action,o,response){var result;try{result=o.reader.read(response);}catch(e){this.fireEvent('loadexception',this,o,response,e);this.fireEvent('exception',this,'response',action,o,response,e);o.request.callback.call(o.request.scope,null,o.request.arg,false);return;} +if(result.success===false){this.fireEvent('loadexception',this,o,response);var res=o.reader.readResponse(action,response);this.fireEvent('exception',this,'remote',action,o,res,null);} +else{this.fireEvent('load',this,o,o.request.arg);} +o.request.callback.call(o.request.scope,result,o.request.arg,result.success);},onWrite:function(action,o,response,rs){var reader=o.reader;var res;try{res=reader.readResponse(action,response);}catch(e){this.fireEvent('exception',this,'response',action,o,response,e);o.request.callback.call(o.request.scope,null,o.request.arg,false);return;} +if(res.success===true){this.fireEvent('write',this,action,res.data,res,rs,o.request.arg);}else{this.fireEvent('exception',this,'remote',action,o,res,rs);} +o.request.callback.call(o.request.scope,res.data,res,res.success);},destroy:function(){if(!this.useAjax){this.conn.abort();}else if(this.activeRequest){var actions=Ext.data.Api.actions;for(var verb in actions){if(this.activeRequest[actions[verb]]){Ext.Ajax.abort(this.activeRequest[actions[verb]]);}}} +Ext.data.HttpProxy.superclass.destroy.call(this);}});Ext.data.MemoryProxy=function(data){var api={};api[Ext.data.Api.actions.read]=true;Ext.data.MemoryProxy.superclass.constructor.call(this,{api:api});this.data=data;};Ext.extend(Ext.data.MemoryProxy,Ext.data.DataProxy,{doRequest:function(action,rs,params,reader,callback,scope,arg){params=params||{};var result;try{result=reader.readRecords(this.data);}catch(e){this.fireEvent("loadexception",this,null,arg,e);this.fireEvent('exception',this,'response',action,arg,null,e);callback.call(scope,null,arg,false);return;} +callback.call(scope,result,arg,true);}});Ext.data.Types=new function(){var st=Ext.data.SortTypes;Ext.apply(this,{stripRe:/[\$,%]/g,AUTO:{convert:function(v){return v;},sortType:st.none,type:'auto'},STRING:{convert:function(v){return(v===undefined||v===null)?'':String(v);},sortType:st.asUCString,type:'string'},INT:{convert:function(v){return v!==undefined&&v!==null&&v!==''?parseInt(String(v).replace(Ext.data.Types.stripRe,''),10):(this.useNull?null:0);},sortType:st.none,type:'int'},FLOAT:{convert:function(v){return v!==undefined&&v!==null&&v!==''?parseFloat(String(v).replace(Ext.data.Types.stripRe,''),10):(this.useNull?null:0);},sortType:st.none,type:'float'},BOOL:{convert:function(v){return v===true||v==='true'||v==1;},sortType:st.none,type:'bool'},DATE:{convert:function(v){var df=this.dateFormat;if(!v){return null;} +if(Ext.isDate(v)){return v;} +if(df){if(df=='timestamp'){return new Date(v*1000);} +if(df=='time'){return new Date(parseInt(v,10));} +return Date.parseDate(v,df);} +var parsed=Date.parse(v);return parsed?new Date(parsed):null;},sortType:st.asDate,type:'date'}});Ext.apply(this,{BOOLEAN:this.BOOL,INTEGER:this.INT,NUMBER:this.FLOAT});};Ext.data.JsonWriter=Ext.extend(Ext.data.DataWriter,{encode:true,encodeDelete:false,constructor:function(config){Ext.data.JsonWriter.superclass.constructor.call(this,config);},render:function(params,baseParams,data){if(this.encode===true){Ext.apply(params,baseParams);params[this.meta.root]=Ext.encode(data);}else{var jdata=Ext.apply({},baseParams);jdata[this.meta.root]=data;params.jsonData=jdata;}},createRecord:function(rec){return this.toHash(rec);},updateRecord:function(rec){return this.toHash(rec);},destroyRecord:function(rec){if(this.encodeDelete){var data={};data[this.meta.idProperty]=rec.id;return data;}else{return rec.id;}}});Ext.data.JsonReader=function(meta,recordType){meta=meta||{};Ext.applyIf(meta,{idProperty:'id',successProperty:'success',totalProperty:'total'});Ext.data.JsonReader.superclass.constructor.call(this,meta,recordType||meta.fields);};Ext.extend(Ext.data.JsonReader,Ext.data.DataReader,{read:function(response){var json=response.responseText;var o=Ext.decode(json);if(!o){throw{message:'JsonReader.read: Json object not found'};} +return this.readRecords(o);},readResponse:function(action,response){var o=(response.responseText!==undefined)?Ext.decode(response.responseText):response;if(!o){throw new Ext.data.JsonReader.Error('response');} +var root=this.getRoot(o);if(action===Ext.data.Api.actions.create){var def=Ext.isDefined(root);if(def&&Ext.isEmpty(root)){throw new Ext.data.JsonReader.Error('root-empty',this.meta.root);} +else if(!def){throw new Ext.data.JsonReader.Error('root-undefined-response',this.meta.root);}} +var res=new Ext.data.Response({action:action,success:this.getSuccess(o),data:(root)?this.extractData(root,false):[],message:this.getMessage(o),raw:o});if(Ext.isEmpty(res.success)){throw new Ext.data.JsonReader.Error('successProperty-response',this.meta.successProperty);} +return res;},readRecords:function(o){this.jsonData=o;if(o.metaData){this.onMetaChange(o.metaData);} +var s=this.meta,Record=this.recordType,f=Record.prototype.fields,fi=f.items,fl=f.length,v;var root=this.getRoot(o),c=root.length,totalRecords=c,success=true;if(s.totalProperty){v=parseInt(this.getTotal(o),10);if(!isNaN(v)){totalRecords=v;}} +if(s.successProperty){v=this.getSuccess(o);if(v===false||v==='false'){success=false;}} +return{success:success,records:this.extractData(root,true),totalRecords:totalRecords};},buildExtractors:function(){if(this.ef){return;} +var s=this.meta,Record=this.recordType,f=Record.prototype.fields,fi=f.items,fl=f.length;if(s.totalProperty){this.getTotal=this.createAccessor(s.totalProperty);} +if(s.successProperty){this.getSuccess=this.createAccessor(s.successProperty);} +if(s.messageProperty){this.getMessage=this.createAccessor(s.messageProperty);} +this.getRoot=s.root?this.createAccessor(s.root):function(p){return p;};if(s.id||s.idProperty){var g=this.createAccessor(s.id||s.idProperty);this.getId=function(rec){var r=g(rec);return(r===undefined||r==='')?null:r;};}else{this.getId=function(){return null;};} +var ef=[];for(var i=0;i<fl;i++){f=fi[i];var map=(f.mapping!==undefined&&f.mapping!==null)?f.mapping:f.name;ef.push(this.createAccessor(map));} +this.ef=ef;},simpleAccess:function(obj,subsc){return obj[subsc];},createAccessor:function(){var re=/[\[\.]/;return function(expr){if(Ext.isEmpty(expr)){return Ext.emptyFn;} +if(Ext.isFunction(expr)){return expr;} +var i=String(expr).search(re);if(i>=0){return new Function('obj','return obj'+(i>0?'.':'')+expr);} +return function(obj){return obj[expr];};};}(),extractValues:function(data,items,len){var f,values={};for(var j=0;j<len;j++){f=items[j];var v=this.ef[j](data);values[f.name]=f.convert((v!==undefined)?v:f.defaultValue,data);} +return values;}});Ext.data.JsonReader.Error=Ext.extend(Ext.Error,{constructor:function(message,arg){this.arg=arg;Ext.Error.call(this,message);},name:'Ext.data.JsonReader'});Ext.apply(Ext.data.JsonReader.Error.prototype,{lang:{'response':'An error occurred while json-decoding your server response','successProperty-response':'Could not locate your "successProperty" in your server response. Please review your JsonReader config to ensure the config-property "successProperty" matches the property in your server-response. See the JsonReader docs.','root-undefined-config':'Your JsonReader was configured without a "root" property. Please review your JsonReader config and make sure to define the root property. See the JsonReader docs.','idProperty-undefined':'Your JsonReader was configured without an "idProperty" Please review your JsonReader configuration and ensure the "idProperty" is set (e.g.: "id"). See the JsonReader docs.','root-empty':'Data was expected to be returned by the server in the "root" property of the response. Please review your JsonReader configuration to ensure the "root" property matches that returned in the server-response. See JsonReader docs.'}});Ext.data.ArrayReader=Ext.extend(Ext.data.JsonReader,{readRecords:function(o){this.arrayData=o;var s=this.meta,sid=s?Ext.num(s.idIndex,s.id):null,recordType=this.recordType,fields=recordType.prototype.fields,records=[],success=true,v;var root=this.getRoot(o);for(var i=0,len=root.length;i<len;i++){var n=root[i],values={},id=((sid||sid===0)&&n[sid]!==undefined&&n[sid]!==""?n[sid]:null);for(var j=0,jlen=fields.length;j<jlen;j++){var f=fields.items[j],k=f.mapping!==undefined&&f.mapping!==null?f.mapping:j;v=n[k]!==undefined?n[k]:f.defaultValue;v=f.convert(v,n);values[f.name]=v;} +var record=new recordType(values,id);record.json=n;records[records.length]=record;} +var totalRecords=records.length;if(s.totalProperty){v=parseInt(this.getTotal(o),10);if(!isNaN(v)){totalRecords=v;}} +if(s.successProperty){v=this.getSuccess(o);if(v===false||v==='false'){success=false;}} +return{success:success,records:records,totalRecords:totalRecords};}});Ext.data.ArrayStore=Ext.extend(Ext.data.Store,{constructor:function(config){Ext.data.ArrayStore.superclass.constructor.call(this,Ext.apply(config,{reader:new Ext.data.ArrayReader(config)}));},loadData:function(data,append){if(this.expandData===true){var r=[];for(var i=0,len=data.length;i<len;i++){r[r.length]=[data[i]];} +data=r;} +Ext.data.ArrayStore.superclass.loadData.call(this,data,append);}});Ext.reg('arraystore',Ext.data.ArrayStore);Ext.data.SimpleStore=Ext.data.ArrayStore;Ext.reg('simplestore',Ext.data.SimpleStore);Ext.data.JsonStore=Ext.extend(Ext.data.Store,{constructor:function(config){Ext.data.JsonStore.superclass.constructor.call(this,Ext.apply(config,{reader:new Ext.data.JsonReader(config)}));}});Ext.reg('jsonstore',Ext.data.JsonStore);Ext.form.Field=Ext.extend(Ext.BoxComponent,{invalidClass:'x-form-invalid',invalidText:'The value in this field is invalid',focusClass:'x-form-focus',validationEvent:'keyup',validateOnBlur:true,validationDelay:250,defaultAutoCreate:{tag:'input',type:'text',size:'20',autocomplete:'off'},fieldClass:'x-form-field',msgTarget:'qtip',msgFx:'normal',readOnly:false,disabled:false,submitValue:true,isFormField:true,msgDisplay:'',hasFocus:false,initComponent:function(){Ext.form.Field.superclass.initComponent.call(this);this.addEvents('focus','blur','specialkey','change','invalid','valid');},getName:function(){return this.rendered&&this.el.dom.name?this.el.dom.name:this.name||this.id||'';},onRender:function(ct,position){if(!this.el){var cfg=this.getAutoCreate();if(!cfg.name){cfg.name=this.name||this.id;} +if(this.inputType){cfg.type=this.inputType;} +this.autoEl=cfg;} +Ext.form.Field.superclass.onRender.call(this,ct,position);if(this.submitValue===false){this.el.dom.removeAttribute('name');} +var type=this.el.dom.type;if(type){if(type=='password'){type='text';} +this.el.addClass('x-form-'+type);} +if(this.readOnly){this.setReadOnly(true);} +if(this.tabIndex!==undefined){this.el.dom.setAttribute('tabIndex',this.tabIndex);} +this.el.addClass([this.fieldClass,this.cls]);},getItemCt:function(){return this.itemCt;},initValue:function(){if(this.value!==undefined){this.setValue(this.value);}else if(!Ext.isEmpty(this.el.dom.value)&&this.el.dom.value!=this.emptyText){this.setValue(this.el.dom.value);} +this.originalValue=this.getValue();},isDirty:function(){if(this.disabled||!this.rendered){return false;} +return String(this.getValue())!==String(this.originalValue);},setReadOnly:function(readOnly){if(this.rendered){this.el.dom.readOnly=readOnly;} +this.readOnly=readOnly;},afterRender:function(){Ext.form.Field.superclass.afterRender.call(this);this.initEvents();this.initValue();},fireKey:function(e){if(e.isSpecialKey()){this.fireEvent('specialkey',this,e);}},reset:function(){this.setValue(this.originalValue);this.clearInvalid();},initEvents:function(){this.mon(this.el,Ext.EventManager.getKeyEvent(),this.fireKey,this);this.mon(this.el,'focus',this.onFocus,this);this.mon(this.el,'blur',this.onBlur,this,this.inEditor?{buffer:10}:null);},preFocus:Ext.emptyFn,onFocus:function(){this.preFocus();if(this.focusClass){this.el.addClass(this.focusClass);} +if(!this.hasFocus){this.hasFocus=true;this.startValue=this.getValue();this.fireEvent('focus',this);}},beforeBlur:Ext.emptyFn,onBlur:function(){this.beforeBlur();if(this.focusClass){this.el.removeClass(this.focusClass);} +this.hasFocus=false;if(this.validationEvent!==false&&(this.validateOnBlur||this.validationEvent=='blur')){this.validate();} +var v=this.getValue();if(String(v)!==String(this.startValue)){this.fireEvent('change',this,v,this.startValue);} +this.fireEvent('blur',this);this.postBlur();},postBlur:Ext.emptyFn,isValid:function(preventMark){if(this.disabled){return true;} +var restore=this.preventMark;this.preventMark=preventMark===true;var v=this.validateValue(this.processValue(this.getRawValue()));this.preventMark=restore;return v;},validate:function(){if(this.disabled||this.validateValue(this.processValue(this.getRawValue()))){this.clearInvalid();return true;} +return false;},processValue:function(value){return value;},validateValue:function(value){var error=this.getErrors(value)[0];if(error==undefined){return true;}else{this.markInvalid(error);return false;}},getErrors:function(){return[];},getActiveError:function(){return this.activeError||'';},markInvalid:function(msg){if(this.rendered&&!this.preventMark){msg=msg||this.invalidText;var mt=this.getMessageHandler();if(mt){mt.mark(this,msg);}else if(this.msgTarget){this.el.addClass(this.invalidClass);var t=Ext.getDom(this.msgTarget);if(t){t.innerHTML=msg;t.style.display=this.msgDisplay;}}} +this.setActiveError(msg);},clearInvalid:function(){if(this.rendered&&!this.preventMark){this.el.removeClass(this.invalidClass);var mt=this.getMessageHandler();if(mt){mt.clear(this);}else if(this.msgTarget){this.el.removeClass(this.invalidClass);var t=Ext.getDom(this.msgTarget);if(t){t.innerHTML='';t.style.display='none';}}} +this.unsetActiveError();},setActiveError:function(msg,suppressEvent){this.activeError=msg;if(suppressEvent!==true)this.fireEvent('invalid',this,msg);},unsetActiveError:function(suppressEvent){delete this.activeError;if(suppressEvent!==true)this.fireEvent('valid',this);},getMessageHandler:function(){return Ext.form.MessageTargets[this.msgTarget];},getErrorCt:function(){return this.el.findParent('.x-form-element',5,true)||this.el.findParent('.x-form-field-wrap',5,true);},alignErrorEl:function(){this.errorEl.setWidth(this.getErrorCt().getWidth(true)-20);},alignErrorIcon:function(){this.errorIcon.alignTo(this.el,'tl-tr',[2,0]);},getRawValue:function(){var v=this.rendered?this.el.getValue():Ext.value(this.value,'');if(v===this.emptyText){v='';} +return v;},getValue:function(){if(!this.rendered){return this.value;} +var v=this.el.getValue();if(v===this.emptyText||v===undefined){v='';} +return v;},setRawValue:function(v){return this.rendered?(this.el.dom.value=(Ext.isEmpty(v)?'':v)):'';},setValue:function(v){this.value=v;if(this.rendered){this.el.dom.value=(Ext.isEmpty(v)?'':v);this.validate();} +return this;},append:function(v){this.setValue([this.getValue(),v].join(''));}});Ext.form.MessageTargets={'qtip':{mark:function(field,msg){field.el.addClass(field.invalidClass);field.el.dom.qtip=msg;field.el.dom.qclass='x-form-invalid-tip';if(Ext.QuickTips){Ext.QuickTips.enable();}},clear:function(field){field.el.removeClass(field.invalidClass);field.el.dom.qtip='';}},'title':{mark:function(field,msg){field.el.addClass(field.invalidClass);field.el.dom.title=msg;},clear:function(field){field.el.dom.title='';}},'under':{mark:function(field,msg){field.el.addClass(field.invalidClass);if(!field.errorEl){var elp=field.getErrorCt();if(!elp){field.el.dom.title=msg;return;} +field.errorEl=elp.createChild({cls:'x-form-invalid-msg'});field.on('resize',field.alignErrorEl,field);field.on('destroy',function(){Ext.destroy(this.errorEl);},field);} +field.alignErrorEl();field.errorEl.update(msg);Ext.form.Field.msgFx[field.msgFx].show(field.errorEl,field);},clear:function(field){field.el.removeClass(field.invalidClass);if(field.errorEl){Ext.form.Field.msgFx[field.msgFx].hide(field.errorEl,field);}else{field.el.dom.title='';}}},'side':{mark:function(field,msg){field.el.addClass(field.invalidClass);if(!field.errorIcon){var elp=field.getErrorCt();if(!elp){field.el.dom.title=msg;return;} +field.errorIcon=elp.createChild({cls:'x-form-invalid-icon'});if(field.ownerCt){field.ownerCt.on('afterlayout',field.alignErrorIcon,field);field.ownerCt.on('expand',field.alignErrorIcon,field);} +field.on('resize',field.alignErrorIcon,field);field.on('destroy',function(){Ext.destroy(this.errorIcon);},field);} +field.alignErrorIcon();field.errorIcon.dom.qtip=msg;field.errorIcon.dom.qclass='x-form-invalid-tip';field.errorIcon.show();},clear:function(field){field.el.removeClass(field.invalidClass);if(field.errorIcon){field.errorIcon.dom.qtip='';field.errorIcon.hide();}else{field.el.dom.title='';}}}};Ext.form.Field.msgFx={normal:{show:function(msgEl,f){msgEl.setDisplayed('block');},hide:function(msgEl,f){msgEl.setDisplayed(false).update('');}},slide:{show:function(msgEl,f){msgEl.slideIn('t',{stopFx:true});},hide:function(msgEl,f){msgEl.slideOut('t',{stopFx:true,useDisplay:true});}},slideRight:{show:function(msgEl,f){msgEl.fixDisplay();msgEl.alignTo(f.el,'tl-tr');msgEl.slideIn('l',{stopFx:true});},hide:function(msgEl,f){msgEl.slideOut('l',{stopFx:true,useDisplay:true});}}};Ext.reg('field',Ext.form.Field);Ext.form.TextField=Ext.extend(Ext.form.Field,{grow:false,growMin:30,growMax:800,vtype:null,maskRe:null,disableKeyFilter:false,allowBlank:true,minLength:0,maxLength:Number.MAX_VALUE,minLengthText:'The minimum length for this field is {0}',maxLengthText:'The maximum length for this field is {0}',selectOnFocus:false,blankText:'This field is required',validator:null,regex:null,regexText:'',emptyText:null,emptyClass:'x-form-empty-field',initComponent:function(){Ext.form.TextField.superclass.initComponent.call(this);this.addEvents('autosize','keydown','keyup','keypress');},initEvents:function(){Ext.form.TextField.superclass.initEvents.call(this);if(this.validationEvent=='keyup'){this.validationTask=new Ext.util.DelayedTask(this.validate,this);this.mon(this.el,'keyup',this.filterValidation,this);} +else if(this.validationEvent!==false&&this.validationEvent!='blur'){this.mon(this.el,this.validationEvent,this.validate,this,{buffer:this.validationDelay});} +if(this.selectOnFocus||this.emptyText){this.mon(this.el,'mousedown',this.onMouseDown,this);if(this.emptyText){this.applyEmptyText();}} +if(this.maskRe||(this.vtype&&this.disableKeyFilter!==true&&(this.maskRe=Ext.form.VTypes[this.vtype+'Mask']))){this.mon(this.el,'keypress',this.filterKeys,this);} +if(this.grow){this.mon(this.el,'keyup',this.onKeyUpBuffered,this,{buffer:50});this.mon(this.el,'click',this.autoSize,this);} +if(this.enableKeyEvents){this.mon(this.el,{scope:this,keyup:this.onKeyUp,keydown:this.onKeyDown,keypress:this.onKeyPress});}},onMouseDown:function(e){if(!this.hasFocus){this.mon(this.el,'mouseup',Ext.emptyFn,this,{single:true,preventDefault:true});}},processValue:function(value){if(this.stripCharsRe){var newValue=value.replace(this.stripCharsRe,'');if(newValue!==value){this.setRawValue(newValue);return newValue;}} +return value;},filterValidation:function(e){if(!e.isNavKeyPress()){this.validationTask.delay(this.validationDelay);}},onDisable:function(){Ext.form.TextField.superclass.onDisable.call(this);if(Ext.isIE){this.el.dom.unselectable='on';}},onEnable:function(){Ext.form.TextField.superclass.onEnable.call(this);if(Ext.isIE){this.el.dom.unselectable='';}},onKeyUpBuffered:function(e){if(this.doAutoSize(e)){this.autoSize();}},doAutoSize:function(e){return!e.isNavKeyPress();},onKeyUp:function(e){this.fireEvent('keyup',this,e);},onKeyDown:function(e){this.fireEvent('keydown',this,e);},onKeyPress:function(e){this.fireEvent('keypress',this,e);},reset:function(){Ext.form.TextField.superclass.reset.call(this);this.applyEmptyText();},applyEmptyText:function(){if(this.rendered&&this.emptyText&&this.getRawValue().length<1&&!this.hasFocus){this.setRawValue(this.emptyText);this.el.addClass(this.emptyClass);}},preFocus:function(){var el=this.el,isEmpty;if(this.emptyText){if(el.dom.value==this.emptyText){this.setRawValue('');isEmpty=true;} +el.removeClass(this.emptyClass);} +if(this.selectOnFocus||isEmpty){el.dom.select();}},postBlur:function(){this.applyEmptyText();},filterKeys:function(e){if(e.ctrlKey){return;} +var k=e.getKey();if(Ext.isGecko&&(e.isNavKeyPress()||k==e.BACKSPACE||(k==e.DELETE&&e.button==-1))){return;} +var cc=String.fromCharCode(e.getCharCode());if(!Ext.isGecko&&e.isSpecialKey()&&!cc){return;} +if(!this.maskRe.test(cc)){e.stopEvent();}},setValue:function(v){if(this.emptyText&&this.el&&!Ext.isEmpty(v)){this.el.removeClass(this.emptyClass);} +Ext.form.TextField.superclass.setValue.apply(this,arguments);this.applyEmptyText();this.autoSize();return this;},getErrors:function(value){var errors=Ext.form.TextField.superclass.getErrors.apply(this,arguments);value=Ext.isDefined(value)?value:this.processValue(this.getRawValue());if(Ext.isFunction(this.validator)){var msg=this.validator(value);if(msg!==true){errors.push(msg);}} +if(value.length<1||value===this.emptyText){if(this.allowBlank){return errors;}else{errors.push(this.blankText);}} +if(!this.allowBlank&&(value.length<1||value===this.emptyText)){errors.push(this.blankText);} +if(value.length<this.minLength){errors.push(String.format(this.minLengthText,this.minLength));} +if(value.length>this.maxLength){errors.push(String.format(this.maxLengthText,this.maxLength));} +if(this.vtype){var vt=Ext.form.VTypes;if(!vt[this.vtype](value,this)){errors.push(this.vtypeText||vt[this.vtype+'Text']);}} +if(this.regex&&!this.regex.test(value)){errors.push(this.regexText);} +return errors;},selectText:function(start,end){var v=this.getRawValue();var doFocus=false;if(v.length>0){start=start===undefined?0:start;end=end===undefined?v.length:end;var d=this.el.dom;if(d.setSelectionRange){d.setSelectionRange(start,end);}else if(d.createTextRange){var range=d.createTextRange();range.moveStart('character',start);range.moveEnd('character',end-v.length);range.select();} +doFocus=Ext.isGecko||Ext.isOpera;}else{doFocus=true;} +if(doFocus){this.focus();}},autoSize:function(){if(!this.grow||!this.rendered){return;} +if(!this.metrics){this.metrics=Ext.util.TextMetrics.createInstance(this.el);} +var el=this.el;var v=el.dom.value;var d=document.createElement('div');d.appendChild(document.createTextNode(v));v=d.innerHTML;Ext.removeNode(d);d=null;v+=' ';var w=Math.min(this.growMax,Math.max(this.metrics.getWidth(v)+10,this.growMin));this.el.setWidth(w);this.fireEvent('autosize',this,w);},onDestroy:function(){if(this.validationTask){this.validationTask.cancel();this.validationTask=null;} +Ext.form.TextField.superclass.onDestroy.call(this);}});Ext.reg('textfield',Ext.form.TextField);Ext.form.TriggerField=Ext.extend(Ext.form.TextField,{defaultAutoCreate:{tag:"input",type:"text",size:"16",autocomplete:"off"},hideTrigger:false,editable:true,readOnly:false,wrapFocusClass:'x-trigger-wrap-focus',autoSize:Ext.emptyFn,monitorTab:true,deferHeight:true,mimicing:false,actionMode:'wrap',defaultTriggerWidth:17,onResize:function(w,h){Ext.form.TriggerField.superclass.onResize.call(this,w,h);var tw=this.getTriggerWidth();if(Ext.isNumber(w)){this.el.setWidth(w-tw);} +this.wrap.setWidth(this.el.getWidth()+tw);},getTriggerWidth:function(){var tw=this.trigger.getWidth();if(!this.hideTrigger&&!this.readOnly&&tw===0){tw=this.defaultTriggerWidth;} +return tw;},alignErrorIcon:function(){if(this.wrap){this.errorIcon.alignTo(this.wrap,'tl-tr',[2,0]);}},onRender:function(ct,position){this.doc=Ext.isIE?Ext.getBody():Ext.getDoc();Ext.form.TriggerField.superclass.onRender.call(this,ct,position);this.wrap=this.el.wrap({cls:'x-form-field-wrap x-form-field-trigger-wrap'});this.trigger=this.wrap.createChild(this.triggerConfig||{tag:"img",src:Ext.BLANK_IMAGE_URL,alt:"",cls:"x-form-trigger "+this.triggerClass});this.initTrigger();if(!this.width){this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth());} +this.resizeEl=this.positionEl=this.wrap;},getWidth:function(){return(this.el.getWidth()+this.trigger.getWidth());},updateEditState:function(){if(this.rendered){if(this.readOnly){this.el.dom.readOnly=true;this.el.addClass('x-trigger-noedit');this.mun(this.el,'click',this.onTriggerClick,this);this.trigger.setDisplayed(false);}else{if(!this.editable){this.el.dom.readOnly=true;this.el.addClass('x-trigger-noedit');this.mon(this.el,'click',this.onTriggerClick,this);}else{this.el.dom.readOnly=false;this.el.removeClass('x-trigger-noedit');this.mun(this.el,'click',this.onTriggerClick,this);} +this.trigger.setDisplayed(!this.hideTrigger);} +this.onResize(this.width||this.wrap.getWidth());}},setHideTrigger:function(hideTrigger){if(hideTrigger!=this.hideTrigger){this.hideTrigger=hideTrigger;this.updateEditState();}},setEditable:function(editable){if(editable!=this.editable){this.editable=editable;this.updateEditState();}},setReadOnly:function(readOnly){if(readOnly!=this.readOnly){this.readOnly=readOnly;this.updateEditState();}},afterRender:function(){Ext.form.TriggerField.superclass.afterRender.call(this);this.updateEditState();},initTrigger:function(){this.mon(this.trigger,'click',this.onTriggerClick,this,{preventDefault:true});this.trigger.addClassOnOver('x-form-trigger-over');this.trigger.addClassOnClick('x-form-trigger-click');},onDestroy:function(){Ext.destroy(this.trigger,this.wrap);if(this.mimicing){this.doc.un('mousedown',this.mimicBlur,this);} +delete this.doc;Ext.form.TriggerField.superclass.onDestroy.call(this);},onFocus:function(){Ext.form.TriggerField.superclass.onFocus.call(this);if(!this.mimicing){this.wrap.addClass(this.wrapFocusClass);this.mimicing=true;this.doc.on('mousedown',this.mimicBlur,this,{delay:10});if(this.monitorTab){this.on('specialkey',this.checkTab,this);}}},checkTab:function(me,e){if(e.getKey()==e.TAB){this.triggerBlur();}},onBlur:Ext.emptyFn,mimicBlur:function(e){if(!this.isDestroyed&&!this.wrap.contains(e.target)&&this.validateBlur(e)){this.triggerBlur();}},triggerBlur:function(){this.mimicing=false;this.doc.un('mousedown',this.mimicBlur,this);if(this.monitorTab&&this.el){this.un('specialkey',this.checkTab,this);} +Ext.form.TriggerField.superclass.onBlur.call(this);if(this.wrap){this.wrap.removeClass(this.wrapFocusClass);}},beforeBlur:Ext.emptyFn,validateBlur:function(e){return true;},onTriggerClick:Ext.emptyFn});Ext.form.TwinTriggerField=Ext.extend(Ext.form.TriggerField,{initComponent:function(){Ext.form.TwinTriggerField.superclass.initComponent.call(this);this.triggerConfig={tag:'span',cls:'x-form-twin-triggers',cn:[{tag:"img",src:Ext.BLANK_IMAGE_URL,alt:"",cls:"x-form-trigger "+this.trigger1Class},{tag:"img",src:Ext.BLANK_IMAGE_URL,alt:"",cls:"x-form-trigger "+this.trigger2Class}]};},getTrigger:function(index){return this.triggers[index];},afterRender:function(){Ext.form.TwinTriggerField.superclass.afterRender.call(this);var triggers=this.triggers,i=0,len=triggers.length;for(;i<len;++i){if(this['hideTrigger'+(i+1)]){triggers[i].hide();}}},initTrigger:function(){var ts=this.trigger.select('.x-form-trigger',true),triggerField=this;ts.each(function(t,all,index){var triggerIndex='Trigger'+(index+1);t.hide=function(){var w=triggerField.wrap.getWidth();this.dom.style.display='none';triggerField.el.setWidth(w-triggerField.trigger.getWidth());triggerField['hidden'+triggerIndex]=true;};t.show=function(){var w=triggerField.wrap.getWidth();this.dom.style.display='';triggerField.el.setWidth(w-triggerField.trigger.getWidth());triggerField['hidden'+triggerIndex]=false;};this.mon(t,'click',this['on'+triggerIndex+'Click'],this,{preventDefault:true});t.addClassOnOver('x-form-trigger-over');t.addClassOnClick('x-form-trigger-click');},this);this.triggers=ts.elements;},getTriggerWidth:function(){var tw=0;Ext.each(this.triggers,function(t,index){var triggerIndex='Trigger'+(index+1),w=t.getWidth();if(w===0&&!this['hidden'+triggerIndex]){tw+=this.defaultTriggerWidth;}else{tw+=w;}},this);return tw;},onDestroy:function(){Ext.destroy(this.triggers);Ext.form.TwinTriggerField.superclass.onDestroy.call(this);},onTrigger1Click:Ext.emptyFn,onTrigger2Click:Ext.emptyFn});Ext.reg('trigger',Ext.form.TriggerField);Ext.form.TextArea=Ext.extend(Ext.form.TextField,{growMin:60,growMax:1000,growAppend:' \n ',enterIsSpecial:false,preventScrollbars:false,onRender:function(ct,position){if(!this.el){this.defaultAutoCreate={tag:"textarea",style:"width:100px;height:60px;",autocomplete:"off"};} +Ext.form.TextArea.superclass.onRender.call(this,ct,position);if(this.grow){this.textSizeEl=Ext.DomHelper.append(document.body,{tag:"pre",cls:"x-form-grow-sizer"});if(this.preventScrollbars){this.el.setStyle("overflow","hidden");} +this.el.setHeight(this.growMin);}},onDestroy:function(){Ext.removeNode(this.textSizeEl);Ext.form.TextArea.superclass.onDestroy.call(this);},fireKey:function(e){if(e.isSpecialKey()&&(this.enterIsSpecial||(e.getKey()!=e.ENTER||e.hasModifier()))){this.fireEvent("specialkey",this,e);}},doAutoSize:function(e){return!e.isNavKeyPress()||e.getKey()==e.ENTER;},filterValidation:function(e){if(!e.isNavKeyPress()||(!this.enterIsSpecial&&e.keyCode==e.ENTER)){this.validationTask.delay(this.validationDelay);}},autoSize:function(){if(!this.grow||!this.textSizeEl){return;} +var el=this.el,v=Ext.util.Format.htmlEncode(el.dom.value),ts=this.textSizeEl,h;Ext.fly(ts).setWidth(this.el.getWidth());if(v.length<1){v="  ";}else{v+=this.growAppend;if(Ext.isIE){v=v.replace(/\n/g,' <br />');}} +ts.innerHTML=v;h=Math.min(this.growMax,Math.max(ts.offsetHeight,this.growMin));if(h!=this.lastHeight){this.lastHeight=h;this.el.setHeight(h);this.fireEvent("autosize",this,h);}}});Ext.reg('textarea',Ext.form.TextArea);Ext.form.NumberField=Ext.extend(Ext.form.TextField,{fieldClass:"x-form-field x-form-num-field",allowDecimals:true,decimalSeparator:".",decimalPrecision:2,allowNegative:true,minValue:Number.NEGATIVE_INFINITY,maxValue:Number.MAX_VALUE,minText:"The minimum value for this field is {0}",maxText:"The maximum value for this field is {0}",nanText:"{0} is not a valid number",baseChars:"0123456789",autoStripChars:false,initEvents:function(){var allowed=this.baseChars+'';if(this.allowDecimals){allowed+=this.decimalSeparator;} +if(this.allowNegative){allowed+='-';} +allowed=Ext.escapeRe(allowed);this.maskRe=new RegExp('['+allowed+']');if(this.autoStripChars){this.stripCharsRe=new RegExp('[^'+allowed+']','gi');} +Ext.form.NumberField.superclass.initEvents.call(this);},getErrors:function(value){var errors=Ext.form.NumberField.superclass.getErrors.apply(this,arguments);value=Ext.isDefined(value)?value:this.processValue(this.getRawValue());if(value.length<1){return errors;} +value=String(value).replace(this.decimalSeparator,".");if(isNaN(value)){errors.push(String.format(this.nanText,value));} +var num=this.parseValue(value);if(num<this.minValue){errors.push(String.format(this.minText,this.minValue));} +if(num>this.maxValue){errors.push(String.format(this.maxText,this.maxValue));} +return errors;},getValue:function(){return this.fixPrecision(this.parseValue(Ext.form.NumberField.superclass.getValue.call(this)));},setValue:function(v){v=this.fixPrecision(v);v=Ext.isNumber(v)?v:parseFloat(String(v).replace(this.decimalSeparator,"."));v=isNaN(v)?'':String(v).replace(".",this.decimalSeparator);return Ext.form.NumberField.superclass.setValue.call(this,v);},setMinValue:function(value){this.minValue=Ext.num(value,Number.NEGATIVE_INFINITY);},setMaxValue:function(value){this.maxValue=Ext.num(value,Number.MAX_VALUE);},parseValue:function(value){value=parseFloat(String(value).replace(this.decimalSeparator,"."));return isNaN(value)?'':value;},fixPrecision:function(value){var nan=isNaN(value);if(!this.allowDecimals||this.decimalPrecision==-1||nan||!value){return nan?'':value;} +return parseFloat(parseFloat(value).toFixed(this.decimalPrecision));},beforeBlur:function(){var v=this.parseValue(this.getRawValue());if(!Ext.isEmpty(v)){this.setValue(v);}}});Ext.reg('numberfield',Ext.form.NumberField);Ext.form.DateField=Ext.extend(Ext.form.TriggerField,{format:"m/d/Y",altFormats:"m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d|n-j|n/j",disabledDaysText:"Disabled",disabledDatesText:"Disabled",minText:"The date in this field must be equal to or after {0}",maxText:"The date in this field must be equal to or before {0}",invalidText:"{0} is not a valid date - it must be in the format {1}",triggerClass:'x-form-date-trigger',showToday:true,startDay:0,defaultAutoCreate:{tag:"input",type:"text",size:"10",autocomplete:"off"},initTime:'12',initTimeFormat:'H',safeParse:function(value,format){if(/[gGhH]/.test(format.replace(/(\\.)/g,''))){return Date.parseDate(value,format);}else{var parsedDate=Date.parseDate(value+' '+this.initTime,format+' '+this.initTimeFormat);if(parsedDate){return parsedDate.clearTime();}}},initComponent:function(){Ext.form.DateField.superclass.initComponent.call(this);this.addEvents('select');if(Ext.isString(this.minValue)){this.minValue=this.parseDate(this.minValue);} +if(Ext.isString(this.maxValue)){this.maxValue=this.parseDate(this.maxValue);} +this.disabledDatesRE=null;this.initDisabledDays();},initEvents:function(){Ext.form.DateField.superclass.initEvents.call(this);this.keyNav=new Ext.KeyNav(this.el,{"down":function(e){this.onTriggerClick();},scope:this,forceKeyDown:true});},initDisabledDays:function(){if(this.disabledDates){var dd=this.disabledDates,len=dd.length-1,re="(?:";Ext.each(dd,function(d,i){re+=Ext.isDate(d)?'^'+Ext.escapeRe(d.dateFormat(this.format))+'$':dd[i];if(i!=len){re+='|';}},this);this.disabledDatesRE=new RegExp(re+')');}},setDisabledDates:function(dd){this.disabledDates=dd;this.initDisabledDays();if(this.menu){this.menu.picker.setDisabledDates(this.disabledDatesRE);}},setDisabledDays:function(dd){this.disabledDays=dd;if(this.menu){this.menu.picker.setDisabledDays(dd);}},setMinValue:function(dt){this.minValue=(Ext.isString(dt)?this.parseDate(dt):dt);if(this.menu){this.menu.picker.setMinDate(this.minValue);}},setMaxValue:function(dt){this.maxValue=(Ext.isString(dt)?this.parseDate(dt):dt);if(this.menu){this.menu.picker.setMaxDate(this.maxValue);}},getErrors:function(value){var errors=Ext.form.DateField.superclass.getErrors.apply(this,arguments);value=this.formatDate(value||this.processValue(this.getRawValue()));if(value.length<1){return errors;} +var svalue=value;value=this.parseDate(value);if(!value){errors.push(String.format(this.invalidText,svalue,this.format));return errors;} +var time=value.getTime();if(this.minValue&&time<this.minValue.clearTime().getTime()){errors.push(String.format(this.minText,this.formatDate(this.minValue)));} +if(this.maxValue&&time>this.maxValue.clearTime().getTime()){errors.push(String.format(this.maxText,this.formatDate(this.maxValue)));} +if(this.disabledDays){var day=value.getDay();for(var i=0;i<this.disabledDays.length;i++){if(day===this.disabledDays[i]){errors.push(this.disabledDaysText);break;}}} +var fvalue=this.formatDate(value);if(this.disabledDatesRE&&this.disabledDatesRE.test(fvalue)){errors.push(String.format(this.disabledDatesText,fvalue));} +return errors;},validateBlur:function(){return!this.menu||!this.menu.isVisible();},getValue:function(){return this.parseDate(Ext.form.DateField.superclass.getValue.call(this))||"";},setValue:function(date){return Ext.form.DateField.superclass.setValue.call(this,this.formatDate(this.parseDate(date)));},parseDate:function(value){if(!value||Ext.isDate(value)){return value;} +var v=this.safeParse(value,this.format),af=this.altFormats,afa=this.altFormatsArray;if(!v&&af){afa=afa||af.split("|");for(var i=0,len=afa.length;i<len&&!v;i++){v=this.safeParse(value,afa[i]);}} +return v;},onDestroy:function(){Ext.destroy(this.menu,this.keyNav);Ext.form.DateField.superclass.onDestroy.call(this);},formatDate:function(date){return Ext.isDate(date)?date.dateFormat(this.format):date;},onTriggerClick:function(){if(this.disabled){return;} +if(this.menu==null){this.menu=new Ext.menu.DateMenu({hideOnClick:false,focusOnSelect:false});} +this.onFocus();Ext.apply(this.menu.picker,{minDate:this.minValue,maxDate:this.maxValue,disabledDatesRE:this.disabledDatesRE,disabledDatesText:this.disabledDatesText,disabledDays:this.disabledDays,disabledDaysText:this.disabledDaysText,format:this.format,showToday:this.showToday,startDay:this.startDay,minText:String.format(this.minText,this.formatDate(this.minValue)),maxText:String.format(this.maxText,this.formatDate(this.maxValue))});this.menu.picker.setValue(this.getValue()||new Date());this.menu.show(this.el,"tl-bl?");this.menuEvents('on');},menuEvents:function(method){this.menu[method]('select',this.onSelect,this);this.menu[method]('hide',this.onMenuHide,this);this.menu[method]('show',this.onFocus,this);},onSelect:function(m,d){this.setValue(d);this.fireEvent('select',this,d);this.menu.hide();},onMenuHide:function(){this.focus(false,60);this.menuEvents('un');},beforeBlur:function(){var v=this.parseDate(this.getRawValue());if(v){this.setValue(v);}}});Ext.reg('datefield',Ext.form.DateField);Ext.form.DisplayField=Ext.extend(Ext.form.Field,{validationEvent:false,validateOnBlur:false,defaultAutoCreate:{tag:"div"},fieldClass:"x-form-display-field",htmlEncode:false,initEvents:Ext.emptyFn,isValid:function(){return true;},validate:function(){return true;},getRawValue:function(){var v=this.rendered?this.el.dom.innerHTML:Ext.value(this.value,'');if(v===this.emptyText){v='';} +if(this.htmlEncode){v=Ext.util.Format.htmlDecode(v);} +return v;},getValue:function(){return this.getRawValue();},getName:function(){return this.name;},setRawValue:function(v){if(this.htmlEncode){v=Ext.util.Format.htmlEncode(v);} +return this.rendered?(this.el.dom.innerHTML=(Ext.isEmpty(v)?'':v)):(this.value=v);},setValue:function(v){this.setRawValue(v);return this;}});Ext.reg('displayfield',Ext.form.DisplayField);Ext.form.ComboBox=Ext.extend(Ext.form.TriggerField,{defaultAutoCreate:{tag:"input",type:"text",size:"24",autocomplete:"off"},listClass:'',selectedClass:'x-combo-selected',listEmptyText:'',triggerClass:'x-form-arrow-trigger',shadow:'sides',listAlign:'tl-bl?',maxHeight:300,minHeight:90,triggerAction:'query',minChars:4,autoSelect:true,typeAhead:false,queryDelay:500,pageSize:0,selectOnFocus:false,queryParam:'query',loadingText:'Loading...',resizable:false,handleHeight:8,allQuery:'',mode:'remote',minListWidth:70,forceSelection:false,typeAheadDelay:250,lazyInit:true,clearFilterOnReset:true,submitValue:undefined,initComponent:function(){Ext.form.ComboBox.superclass.initComponent.call(this);this.addEvents('expand','collapse','beforeselect','select','beforequery');if(this.transform){var s=Ext.getDom(this.transform);if(!this.hiddenName){this.hiddenName=s.name;} +if(!this.store){this.mode='local';var d=[],opts=s.options;for(var i=0,len=opts.length;i<len;i++){var o=opts[i],value=(o.hasAttribute?o.hasAttribute('value'):o.getAttributeNode('value').specified)?o.value:o.text;if(o.selected&&Ext.isEmpty(this.value,true)){this.value=value;} +d.push([value,o.text]);} +this.store=new Ext.data.ArrayStore({idIndex:0,fields:['value','text'],data:d,autoDestroy:true});this.valueField='value';this.displayField='text';} +s.name=Ext.id();if(!this.lazyRender){this.target=true;this.el=Ext.DomHelper.insertBefore(s,this.autoCreate||this.defaultAutoCreate);this.render(this.el.parentNode,s);} +Ext.removeNode(s);} +else if(this.store){this.store=Ext.StoreMgr.lookup(this.store);if(this.store.autoCreated){this.displayField=this.valueField='field1';if(!this.store.expandData){this.displayField='field2';} +this.mode='local';}} +this.selectedIndex=-1;if(this.mode=='local'){if(!Ext.isDefined(this.initialConfig.queryDelay)){this.queryDelay=10;} +if(!Ext.isDefined(this.initialConfig.minChars)){this.minChars=0;}}},onRender:function(ct,position){if(this.hiddenName&&!Ext.isDefined(this.submitValue)){this.submitValue=false;} +Ext.form.ComboBox.superclass.onRender.call(this,ct,position);if(this.hiddenName){this.hiddenField=this.el.insertSibling({tag:'input',type:'hidden',name:this.hiddenName,id:(this.hiddenId||Ext.id())},'before',true);} +if(Ext.isGecko){this.el.dom.setAttribute('autocomplete','off');} +if(!this.lazyInit){this.initList();}else{this.on('focus',this.initList,this,{single:true});}},initValue:function(){Ext.form.ComboBox.superclass.initValue.call(this);if(this.hiddenField){this.hiddenField.value=Ext.value(Ext.isDefined(this.hiddenValue)?this.hiddenValue:this.value,'');}},getParentZIndex:function(){var zindex;if(this.ownerCt){this.findParentBy(function(ct){zindex=parseInt(ct.getPositionEl().getStyle('z-index'),10);return!!zindex;});} +return zindex;},getZIndex:function(listParent){listParent=listParent||Ext.getDom(this.getListParent()||Ext.getBody());var zindex=parseInt(Ext.fly(listParent).getStyle('z-index'),10);if(!zindex){zindex=this.getParentZIndex();} +return(zindex||12000)+5;},initList:function(){if(!this.list){var cls='x-combo-list',listParent=Ext.getDom(this.getListParent()||Ext.getBody());this.list=new Ext.Layer({parentEl:listParent,shadow:this.shadow,cls:[cls,this.listClass].join(' '),constrain:false,zindex:this.getZIndex(listParent)});var lw=this.listWidth||Math.max(this.wrap.getWidth(),this.minListWidth);this.list.setSize(lw,0);this.list.swallowEvent('mousewheel');this.assetHeight=0;if(this.syncFont!==false){this.list.setStyle('font-size',this.el.getStyle('font-size'));} +if(this.title){this.header=this.list.createChild({cls:cls+'-hd',html:this.title});this.assetHeight+=this.header.getHeight();} +this.innerList=this.list.createChild({cls:cls+'-inner'});this.mon(this.innerList,'mouseover',this.onViewOver,this);this.mon(this.innerList,'mousemove',this.onViewMove,this);this.innerList.setWidth(lw-this.list.getFrameWidth('lr'));if(this.pageSize){this.footer=this.list.createChild({cls:cls+'-ft'});this.pageTb=new Ext.PagingToolbar({store:this.store,pageSize:this.pageSize,renderTo:this.footer});this.assetHeight+=this.footer.getHeight();} +if(!this.tpl){this.tpl='<tpl for="."><div class="'+cls+'-item">{'+this.displayField+'}</div></tpl>';} +this.view=new Ext.DataView({applyTo:this.innerList,tpl:this.tpl,singleSelect:true,selectedClass:this.selectedClass,itemSelector:this.itemSelector||'.'+cls+'-item',emptyText:this.listEmptyText,deferEmptyText:false});this.mon(this.view,{containerclick:this.onViewClick,click:this.onViewClick,scope:this});this.bindStore(this.store,true);if(this.resizable){this.resizer=new Ext.Resizable(this.list,{pinned:true,handles:'se'});this.mon(this.resizer,'resize',function(r,w,h){this.maxHeight=h-this.handleHeight-this.list.getFrameWidth('tb')-this.assetHeight;this.listWidth=w;this.innerList.setWidth(w-this.list.getFrameWidth('lr'));this.restrictHeight();},this);this[this.pageSize?'footer':'innerList'].setStyle('margin-bottom',this.handleHeight+'px');}}},getListParent:function(){return document.body;},getStore:function(){return this.store;},bindStore:function(store,initial){if(this.store&&!initial){if(this.store!==store&&this.store.autoDestroy){this.store.destroy();}else{this.store.un('beforeload',this.onBeforeLoad,this);this.store.un('load',this.onLoad,this);this.store.un('exception',this.collapse,this);} +if(!store){this.store=null;if(this.view){this.view.bindStore(null);} +if(this.pageTb){this.pageTb.bindStore(null);}}} +if(store){if(!initial){this.lastQuery=null;if(this.pageTb){this.pageTb.bindStore(store);}} +this.store=Ext.StoreMgr.lookup(store);this.store.on({scope:this,beforeload:this.onBeforeLoad,load:this.onLoad,exception:this.collapse});if(this.view){this.view.bindStore(store);}}},reset:function(){if(this.clearFilterOnReset&&this.mode=='local'){this.store.clearFilter();} +Ext.form.ComboBox.superclass.reset.call(this);},initEvents:function(){Ext.form.ComboBox.superclass.initEvents.call(this);this.keyNav=new Ext.KeyNav(this.el,{"up":function(e){this.inKeyMode=true;this.selectPrev();},"down":function(e){if(!this.isExpanded()){this.onTriggerClick();}else{this.inKeyMode=true;this.selectNext();}},"enter":function(e){this.onViewClick();},"esc":function(e){this.collapse();},"tab":function(e){if(this.forceSelection===true){this.collapse();}else{this.onViewClick(false);} +return true;},scope:this,doRelay:function(e,h,hname){if(hname=='down'||this.scope.isExpanded()){var relay=Ext.KeyNav.prototype.doRelay.apply(this,arguments);if(!Ext.isIE&&Ext.EventManager.useKeydown){this.scope.fireKey(e);} +return relay;} +return true;},forceKeyDown:true,defaultEventAction:'stopEvent'});this.queryDelay=Math.max(this.queryDelay||10,this.mode=='local'?10:250);this.dqTask=new Ext.util.DelayedTask(this.initQuery,this);if(this.typeAhead){this.taTask=new Ext.util.DelayedTask(this.onTypeAhead,this);} +if(!this.enableKeyEvents){this.mon(this.el,'keyup',this.onKeyUp,this);}},onDestroy:function(){if(this.dqTask){this.dqTask.cancel();this.dqTask=null;} +this.bindStore(null);Ext.destroy(this.resizer,this.view,this.pageTb,this.list);Ext.destroyMembers(this,'hiddenField');Ext.form.ComboBox.superclass.onDestroy.call(this);},fireKey:function(e){if(!this.isExpanded()){Ext.form.ComboBox.superclass.fireKey.call(this,e);}},onResize:function(w,h){Ext.form.ComboBox.superclass.onResize.apply(this,arguments);if(!isNaN(w)&&this.isVisible()&&this.list){this.doResize(w);}else{this.bufferSize=w;}},doResize:function(w){if(!Ext.isDefined(this.listWidth)){var lw=Math.max(w,this.minListWidth);this.list.setWidth(lw);this.innerList.setWidth(lw-this.list.getFrameWidth('lr'));}},onEnable:function(){Ext.form.ComboBox.superclass.onEnable.apply(this,arguments);if(this.hiddenField){this.hiddenField.disabled=false;}},onDisable:function(){Ext.form.ComboBox.superclass.onDisable.apply(this,arguments);if(this.hiddenField){this.hiddenField.disabled=true;}},onBeforeLoad:function(){if(!this.hasFocus){return;} +this.innerList.update(this.loadingText?'<div class="loading-indicator">'+this.loadingText+'</div>':'');this.restrictHeight();this.selectedIndex=-1;},onLoad:function(){if(!this.hasFocus){return;} +if(this.store.getCount()>0||this.listEmptyText){this.expand();this.restrictHeight();if(this.lastQuery==this.allQuery){if(this.editable){this.el.dom.select();} +if(this.autoSelect!==false&&!this.selectByValue(this.value,true)){this.select(0,true);}}else{if(this.autoSelect!==false){this.selectNext();} +if(this.typeAhead&&this.lastKey!=Ext.EventObject.BACKSPACE&&this.lastKey!=Ext.EventObject.DELETE){this.taTask.delay(this.typeAheadDelay);}}}else{this.collapse();}},onTypeAhead:function(){if(this.store.getCount()>0){var r=this.store.getAt(0);var newValue=r.data[this.displayField];var len=newValue.length;var selStart=this.getRawValue().length;if(selStart!=len){this.setRawValue(newValue);this.selectText(selStart,newValue.length);}}},assertValue:function(){var val=this.getRawValue(),rec;if(this.valueField&&Ext.isDefined(this.value)){rec=this.findRecord(this.valueField,this.value);} +if(!rec||rec.get(this.displayField)!=val){rec=this.findRecord(this.displayField,val);} +if(!rec&&this.forceSelection){if(val.length>0&&val!=this.emptyText){this.el.dom.value=Ext.value(this.lastSelectionText,'');this.applyEmptyText();}else{this.clearValue();}}else{if(rec&&this.valueField){if(this.value==val){return;} +val=rec.get(this.valueField||this.displayField);} +this.setValue(val);}},onSelect:function(record,index){if(this.fireEvent('beforeselect',this,record,index)!==false){this.setValue(record.data[this.valueField||this.displayField]);this.collapse();this.fireEvent('select',this,record,index);}},getName:function(){var hf=this.hiddenField;return hf&&hf.name?hf.name:this.hiddenName||Ext.form.ComboBox.superclass.getName.call(this);},getValue:function(){if(this.valueField){return Ext.isDefined(this.value)?this.value:'';}else{return Ext.form.ComboBox.superclass.getValue.call(this);}},clearValue:function(){if(this.hiddenField){this.hiddenField.value='';} +this.setRawValue('');this.lastSelectionText='';this.applyEmptyText();this.value='';},setValue:function(v){var text=v;if(this.valueField){var r=this.findRecord(this.valueField,v);if(r){text=r.data[this.displayField];}else if(Ext.isDefined(this.valueNotFoundText)){text=this.valueNotFoundText;}} +this.lastSelectionText=text;if(this.hiddenField){this.hiddenField.value=Ext.value(v,'');} +Ext.form.ComboBox.superclass.setValue.call(this,text);this.value=v;return this;},findRecord:function(prop,value){var record;if(this.store.getCount()>0){this.store.each(function(r){if(r.data[prop]==value){record=r;return false;}});} +return record;},onViewMove:function(e,t){this.inKeyMode=false;},onViewOver:function(e,t){if(this.inKeyMode){return;} +var item=this.view.findItemFromChild(t);if(item){var index=this.view.indexOf(item);this.select(index,false);}},onViewClick:function(doFocus){var index=this.view.getSelectedIndexes()[0],s=this.store,r=s.getAt(index);if(r){this.onSelect(r,index);}else{this.collapse();} +if(doFocus!==false){this.el.focus();}},restrictHeight:function(){this.innerList.dom.style.height='';var inner=this.innerList.dom,pad=this.list.getFrameWidth('tb')+(this.resizable?this.handleHeight:0)+this.assetHeight,h=Math.max(inner.clientHeight,inner.offsetHeight,inner.scrollHeight),ha=this.getPosition()[1]-Ext.getBody().getScroll().top,hb=Ext.lib.Dom.getViewHeight()-ha-this.getSize().height,space=Math.max(ha,hb,this.minHeight||0)-this.list.shadowOffset-pad-5;h=Math.min(h,space,this.maxHeight);this.innerList.setHeight(h);this.list.beginUpdate();this.list.setHeight(h+pad);this.list.alignTo.apply(this.list,[this.el].concat(this.listAlign));this.list.endUpdate();},isExpanded:function(){return this.list&&this.list.isVisible();},selectByValue:function(v,scrollIntoView){if(!Ext.isEmpty(v,true)){var r=this.findRecord(this.valueField||this.displayField,v);if(r){this.select(this.store.indexOf(r),scrollIntoView);return true;}} +return false;},select:function(index,scrollIntoView){this.selectedIndex=index;this.view.select(index);if(scrollIntoView!==false){var el=this.view.getNode(index);if(el){this.innerList.scrollChildIntoView(el,false);}}},selectNext:function(){var ct=this.store.getCount();if(ct>0){if(this.selectedIndex==-1){this.select(0);}else if(this.selectedIndex<ct-1){this.select(this.selectedIndex+1);}}},selectPrev:function(){var ct=this.store.getCount();if(ct>0){if(this.selectedIndex==-1){this.select(0);}else if(this.selectedIndex!==0){this.select(this.selectedIndex-1);}}},onKeyUp:function(e){var k=e.getKey();if(this.editable!==false&&this.readOnly!==true&&(k==e.BACKSPACE||!e.isSpecialKey())){this.lastKey=k;this.dqTask.delay(this.queryDelay);} +Ext.form.ComboBox.superclass.onKeyUp.call(this,e);},validateBlur:function(){return!this.list||!this.list.isVisible();},initQuery:function(){this.doQuery(this.getRawValue());},beforeBlur:function(){this.assertValue();},postBlur:function(){Ext.form.ComboBox.superclass.postBlur.call(this);this.collapse();this.inKeyMode=false;},doQuery:function(q,forceAll){q=Ext.isEmpty(q)?'':q;var qe={query:q,forceAll:forceAll,combo:this,cancel:false};if(this.fireEvent('beforequery',qe)===false||qe.cancel){return false;} +q=qe.query;forceAll=qe.forceAll;if(forceAll===true||(q.length>=this.minChars)){if(this.lastQuery!==q){this.lastQuery=q;if(this.mode=='local'){this.selectedIndex=-1;if(forceAll){this.store.clearFilter();}else{this.store.filter(this.displayField,q);} +this.onLoad();}else{this.store.baseParams[this.queryParam]=q;this.store.load({params:this.getParams(q)});this.expand();}}else{this.selectedIndex=-1;this.onLoad();}}},getParams:function(q){var params={},paramNames=this.store.paramNames;if(this.pageSize){params[paramNames.start]=0;params[paramNames.limit]=this.pageSize;} +return params;},collapse:function(){if(!this.isExpanded()){return;} +this.list.hide();Ext.getDoc().un('mousewheel',this.collapseIf,this);Ext.getDoc().un('mousedown',this.collapseIf,this);this.fireEvent('collapse',this);},collapseIf:function(e){if(!this.isDestroyed&&!e.within(this.wrap)&&!e.within(this.list)){this.collapse();}},expand:function(){if(this.isExpanded()||!this.hasFocus){return;} +if(this.title||this.pageSize){this.assetHeight=0;if(this.title){this.assetHeight+=this.header.getHeight();} +if(this.pageSize){this.assetHeight+=this.footer.getHeight();}} +if(this.bufferSize){this.doResize(this.bufferSize);delete this.bufferSize;} +this.list.alignTo.apply(this.list,[this.el].concat(this.listAlign));this.list.setZIndex(this.getZIndex());this.list.show();if(Ext.isGecko2){this.innerList.setOverflow('auto');} +this.mon(Ext.getDoc(),{scope:this,mousewheel:this.collapseIf,mousedown:this.collapseIf});this.fireEvent('expand',this);},onTriggerClick:function(){if(this.readOnly||this.disabled){return;} +if(this.isExpanded()){this.collapse();this.el.focus();}else{this.onFocus({});if(this.triggerAction=='all'){this.doQuery(this.allQuery,true);}else{this.doQuery(this.getRawValue());} +this.el.focus();}}});Ext.reg('combo',Ext.form.ComboBox);Ext.form.Checkbox=Ext.extend(Ext.form.Field,{focusClass:undefined,fieldClass:'x-form-field',checked:false,boxLabel:' ',defaultAutoCreate:{tag:'input',type:'checkbox',autocomplete:'off'},actionMode:'wrap',initComponent:function(){Ext.form.Checkbox.superclass.initComponent.call(this);this.addEvents('check');},onResize:function(){Ext.form.Checkbox.superclass.onResize.apply(this,arguments);if(!this.boxLabel&&!this.fieldLabel){this.el.alignTo(this.wrap,'c-c');}},initEvents:function(){Ext.form.Checkbox.superclass.initEvents.call(this);this.mon(this.el,{scope:this,click:this.onClick,change:this.onClick});},markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn,onRender:function(ct,position){Ext.form.Checkbox.superclass.onRender.call(this,ct,position);if(this.inputValue!==undefined){this.el.dom.value=this.inputValue;} +this.wrap=this.el.wrap({cls:'x-form-check-wrap'});if(this.boxLabel){this.wrap.createChild({tag:'label',htmlFor:this.el.id,cls:'x-form-cb-label',html:this.boxLabel});} +if(this.checked){this.setValue(true);}else{this.checked=this.el.dom.checked;} +if(Ext.isIE&&!Ext.isStrict){this.wrap.repaint();} +this.resizeEl=this.positionEl=this.wrap;},onDestroy:function(){Ext.destroy(this.wrap);Ext.form.Checkbox.superclass.onDestroy.call(this);},initValue:function(){this.originalValue=this.getValue();},getValue:function(){if(this.rendered){return this.el.dom.checked;} +return this.checked;},onClick:function(){if(this.el.dom.checked!=this.checked){this.setValue(this.el.dom.checked);}},setValue:function(v){var checked=this.checked,inputVal=this.inputValue;this.checked=(v===true||v==='true'||v=='1'||(inputVal?v==inputVal:String(v).toLowerCase()=='on'));if(this.rendered){this.el.dom.checked=this.checked;this.el.dom.defaultChecked=this.checked;} +if(checked!=this.checked){this.fireEvent('check',this,this.checked);if(this.handler){this.handler.call(this.scope||this,this,this.checked);}} +return this;}});Ext.reg('checkbox',Ext.form.Checkbox);Ext.form.CheckboxGroup=Ext.extend(Ext.form.Field,{columns:'auto',vertical:false,allowBlank:true,blankText:"You must select at least one item in this group",defaultType:'checkbox',groupCls:'x-form-check-group',initComponent:function(){this.addEvents('change');this.on('change',this.validate,this);Ext.form.CheckboxGroup.superclass.initComponent.call(this);},onRender:function(ct,position){if(!this.el){var panelCfg={autoEl:{id:this.id},cls:this.groupCls,layout:'column',renderTo:ct,bufferResize:false};var colCfg={xtype:'container',defaultType:this.defaultType,layout:'form',defaults:{hideLabel:true,anchor:'100%'}};if(this.items[0].items){Ext.apply(panelCfg,{layoutConfig:{columns:this.items.length},defaults:this.defaults,items:this.items});for(var i=0,len=this.items.length;i<len;i++){Ext.applyIf(this.items[i],colCfg);}}else{var numCols,cols=[];if(typeof this.columns=='string'){this.columns=this.items.length;} +if(!Ext.isArray(this.columns)){var cs=[];for(var i=0;i<this.columns;i++){cs.push((100/this.columns)*.01);} +this.columns=cs;} +numCols=this.columns.length;for(var i=0;i<numCols;i++){var cc=Ext.apply({items:[]},colCfg);cc[this.columns[i]<=1?'columnWidth':'width']=this.columns[i];if(this.defaults){cc.defaults=Ext.apply(cc.defaults||{},this.defaults);} +cols.push(cc);};if(this.vertical){var rows=Math.ceil(this.items.length/numCols),ri=0;for(var i=0,len=this.items.length;i<len;i++){if(i>0&&i%rows==0){ri++;} +if(this.items[i].fieldLabel){this.items[i].hideLabel=false;} +cols[ri].items.push(this.items[i]);};}else{for(var i=0,len=this.items.length;i<len;i++){var ci=i%numCols;if(this.items[i].fieldLabel){this.items[i].hideLabel=false;} +cols[ci].items.push(this.items[i]);};} +Ext.apply(panelCfg,{layoutConfig:{columns:numCols},items:cols});} +this.panel=new Ext.Container(panelCfg);this.panel.ownerCt=this;this.el=this.panel.getEl();if(this.forId&&this.itemCls){var l=this.el.up(this.itemCls).child('label',true);if(l){l.setAttribute('htmlFor',this.forId);}} +var fields=this.panel.findBy(function(c){return c.isFormField;},this);this.items=new Ext.util.MixedCollection();this.items.addAll(fields);} +Ext.form.CheckboxGroup.superclass.onRender.call(this,ct,position);},initValue:function(){if(this.value){this.setValue.apply(this,this.buffered?this.value:[this.value]);delete this.buffered;delete this.value;}},afterRender:function(){Ext.form.CheckboxGroup.superclass.afterRender.call(this);this.eachItem(function(item){item.on('check',this.fireChecked,this);item.inGroup=true;});},doLayout:function(){if(this.rendered){this.panel.forceLayout=this.ownerCt.forceLayout;this.panel.doLayout();}},fireChecked:function(){var arr=[];this.eachItem(function(item){if(item.checked){arr.push(item);}});this.fireEvent('change',this,arr);},getErrors:function(){var errors=Ext.form.CheckboxGroup.superclass.getErrors.apply(this,arguments);if(!this.allowBlank){var blank=true;this.eachItem(function(f){if(f.checked){return(blank=false);}});if(blank)errors.push(this.blankText);} +return errors;},isDirty:function(){if(this.disabled||!this.rendered){return false;} +var dirty=false;this.eachItem(function(item){if(item.isDirty()){dirty=true;return false;}});return dirty;},setReadOnly:function(readOnly){if(this.rendered){this.eachItem(function(item){item.setReadOnly(readOnly);});} +this.readOnly=readOnly;},onDisable:function(){this.eachItem(function(item){item.disable();});},onEnable:function(){this.eachItem(function(item){item.enable();});},onResize:function(w,h){this.panel.setSize(w,h);this.panel.doLayout();},reset:function(){if(this.originalValue){this.eachItem(function(c){if(c.setValue){c.setValue(false);c.originalValue=c.getValue();}});this.resetOriginal=true;this.setValue(this.originalValue);delete this.resetOriginal;}else{this.eachItem(function(c){if(c.reset){c.reset();}});} +(function(){this.clearInvalid();}).defer(50,this);},setValue:function(){if(this.rendered){this.onSetValue.apply(this,arguments);}else{this.buffered=true;this.value=arguments;} +return this;},onSetValue:function(id,value){if(arguments.length==1){if(Ext.isArray(id)){Ext.each(id,function(val,idx){if(Ext.isObject(val)&&val.setValue){val.setValue(true);if(this.resetOriginal===true){val.originalValue=val.getValue();}}else{var item=this.items.itemAt(idx);if(item){item.setValue(val);}}},this);}else if(Ext.isObject(id)){for(var i in id){var f=this.getBox(i);if(f){f.setValue(id[i]);}}}else{this.setValueForItem(id);}}else{var f=this.getBox(id);if(f){f.setValue(value);}}},beforeDestroy:function(){Ext.destroy(this.panel);if(!this.rendered){Ext.destroy(this.items);} +Ext.form.CheckboxGroup.superclass.beforeDestroy.call(this);},setValueForItem:function(val){val=String(val).split(',');this.eachItem(function(item){if(val.indexOf(item.inputValue)>-1){item.setValue(true);}});},getBox:function(id){var box=null;this.eachItem(function(f){if(id==f||f.dataIndex==id||f.id==id||f.getName()==id){box=f;return false;}});return box;},getValue:function(){var out=[];this.eachItem(function(item){if(item.checked){out.push(item);}});return out;},eachItem:function(fn,scope){if(this.items&&this.items.each){this.items.each(fn,scope||this);}},getRawValue:Ext.emptyFn,setRawValue:Ext.emptyFn});Ext.reg('checkboxgroup',Ext.form.CheckboxGroup);Ext.form.CompositeField=Ext.extend(Ext.form.Field,{defaultMargins:'0 5 0 0',skipLastItemMargin:true,isComposite:true,combineErrors:true,labelConnector:', ',initComponent:function(){var labels=[],items=this.items,item;for(var i=0,j=items.length;i<j;i++){item=items[i];if(!Ext.isEmpty(item.ref)){item.ref='../'+item.ref;} +labels.push(item.fieldLabel);Ext.applyIf(item,this.defaults);if(!(i==j-1&&this.skipLastItemMargin)){Ext.applyIf(item,{margins:this.defaultMargins});}} +this.fieldLabel=this.fieldLabel||this.buildLabel(labels);this.fieldErrors=new Ext.util.MixedCollection(true,function(item){return item.field;});this.fieldErrors.on({scope:this,add:this.updateInvalidMark,remove:this.updateInvalidMark,replace:this.updateInvalidMark});Ext.form.CompositeField.superclass.initComponent.apply(this,arguments);this.innerCt=new Ext.Container({layout:'hbox',items:this.items,cls:'x-form-composite',defaultMargins:'0 3 0 0',ownerCt:this});this.innerCt.ownerCt=undefined;var fields=this.innerCt.findBy(function(c){return c.isFormField;},this);this.items=new Ext.util.MixedCollection();this.items.addAll(fields);},onRender:function(ct,position){if(!this.el){var innerCt=this.innerCt;innerCt.render(ct);this.el=innerCt.getEl();if(this.combineErrors){this.eachItem(function(field){Ext.apply(field,{markInvalid:this.onFieldMarkInvalid.createDelegate(this,[field],0),clearInvalid:this.onFieldClearInvalid.createDelegate(this,[field],0)});});} +var l=this.el.parent().parent().child('label',true);if(l){l.setAttribute('for',this.items.items[0].id);}} +Ext.form.CompositeField.superclass.onRender.apply(this,arguments);},onFieldMarkInvalid:function(field,message){var name=field.getName(),error={field:name,errorName:field.fieldLabel||name,error:message};this.fieldErrors.replace(name,error);field.el.addClass(field.invalidClass);},onFieldClearInvalid:function(field){this.fieldErrors.removeKey(field.getName());field.el.removeClass(field.invalidClass);},updateInvalidMark:function(){var ieStrict=Ext.isIE6&&Ext.isStrict;if(this.fieldErrors.length==0){this.clearInvalid();if(ieStrict){this.clearInvalid.defer(50,this);}}else{var message=this.buildCombinedErrorMessage(this.fieldErrors.items);this.sortErrors();this.markInvalid(message);if(ieStrict){this.markInvalid(message);}}},validateValue:function(){var valid=true;this.eachItem(function(field){if(!field.isValid())valid=false;});return valid;},buildCombinedErrorMessage:function(errors){var combined=[],error;for(var i=0,j=errors.length;i<j;i++){error=errors[i];combined.push(String.format("{0}: {1}",error.errorName,error.error));} +return combined.join("<br />");},sortErrors:function(){var fields=this.items;this.fieldErrors.sort("ASC",function(a,b){var findByName=function(key){return function(field){return field.getName()==key;};};var aIndex=fields.findIndexBy(findByName(a.field)),bIndex=fields.findIndexBy(findByName(b.field));return aIndex<bIndex?-1:1;});},reset:function(){this.eachItem(function(item){item.reset();});(function(){this.clearInvalid();}).defer(50,this);},clearInvalidChildren:function(){this.eachItem(function(item){item.clearInvalid();});},buildLabel:function(segments){return Ext.clean(segments).join(this.labelConnector);},isDirty:function(){if(this.disabled||!this.rendered){return false;} +var dirty=false;this.eachItem(function(item){if(item.isDirty()){dirty=true;return false;}});return dirty;},eachItem:function(fn,scope){if(this.items&&this.items.each){this.items.each(fn,scope||this);}},onResize:function(adjWidth,adjHeight,rawWidth,rawHeight){var innerCt=this.innerCt;if(this.rendered&&innerCt.rendered){innerCt.setSize(adjWidth,adjHeight);} +Ext.form.CompositeField.superclass.onResize.apply(this,arguments);},doLayout:function(shallow,force){if(this.rendered){var innerCt=this.innerCt;innerCt.forceLayout=this.ownerCt.forceLayout;innerCt.doLayout(shallow,force);}},beforeDestroy:function(){Ext.destroy(this.innerCt);Ext.form.CompositeField.superclass.beforeDestroy.call(this);},setReadOnly:function(readOnly){if(readOnly==undefined){readOnly=true;} +readOnly=!!readOnly;if(this.rendered){this.eachItem(function(item){item.setReadOnly(readOnly);});} +this.readOnly=readOnly;},onShow:function(){Ext.form.CompositeField.superclass.onShow.call(this);this.doLayout();},onDisable:function(){this.eachItem(function(item){item.disable();});},onEnable:function(){this.eachItem(function(item){item.enable();});}});Ext.reg('compositefield',Ext.form.CompositeField);Ext.form.Radio=Ext.extend(Ext.form.Checkbox,{inputType:'radio',markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn,getGroupValue:function(){var p=this.el.up('form')||Ext.getBody();var c=p.child('input[name='+this.el.dom.name+']:checked',true);return c?c.value:null;},setValue:function(v){var checkEl,els,radio;if(typeof v=='boolean'){Ext.form.Radio.superclass.setValue.call(this,v);}else if(this.rendered){checkEl=this.getCheckEl();radio=checkEl.child('input[name='+this.el.dom.name+'][value='+v+']',true);if(radio){Ext.getCmp(radio.id).setValue(true);}} +if(this.rendered&&this.checked){checkEl=checkEl||this.getCheckEl();els=this.getCheckEl().select('input[name='+this.el.dom.name+']');els.each(function(el){if(el.dom.id!=this.id){Ext.getCmp(el.dom.id).setValue(false);}},this);} +return this;},getCheckEl:function(){if(this.inGroup){return this.el.up('.x-form-radio-group');} +return this.el.up('form')||Ext.getBody();}});Ext.reg('radio',Ext.form.Radio);Ext.form.RadioGroup=Ext.extend(Ext.form.CheckboxGroup,{allowBlank:true,blankText:'You must select one item in this group',defaultType:'radio',groupCls:'x-form-radio-group',getValue:function(){var out=null;this.eachItem(function(item){if(item.checked){out=item;return false;}});return out;},onSetValue:function(id,value){if(arguments.length>1){var f=this.getBox(id);if(f){f.setValue(value);if(f.checked){this.eachItem(function(item){if(item!==f){item.setValue(false);}});}}}else{this.setValueForItem(id);}},setValueForItem:function(val){val=String(val).split(',')[0];this.eachItem(function(item){item.setValue(val==item.inputValue);});},fireChecked:function(){if(!this.checkTask){this.checkTask=new Ext.util.DelayedTask(this.bufferChecked,this);} +this.checkTask.delay(10);},bufferChecked:function(){var out=null;this.eachItem(function(item){if(item.checked){out=item;return false;}});this.fireEvent('change',this,out);},onDestroy:function(){if(this.checkTask){this.checkTask.cancel();this.checkTask=null;} +Ext.form.RadioGroup.superclass.onDestroy.call(this);}});Ext.reg('radiogroup',Ext.form.RadioGroup);Ext.form.Hidden=Ext.extend(Ext.form.Field,{inputType:'hidden',shouldLayout:false,onRender:function(){Ext.form.Hidden.superclass.onRender.apply(this,arguments);},initEvents:function(){this.originalValue=this.getValue();},setSize:Ext.emptyFn,setWidth:Ext.emptyFn,setHeight:Ext.emptyFn,setPosition:Ext.emptyFn,setPagePosition:Ext.emptyFn,markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn});Ext.reg('hidden',Ext.form.Hidden);Ext.form.BasicForm=Ext.extend(Ext.util.Observable,{constructor:function(el,config){Ext.apply(this,config);if(Ext.isString(this.paramOrder)){this.paramOrder=this.paramOrder.split(/[\s,|]/);} +this.items=new Ext.util.MixedCollection(false,function(o){return o.getItemId();});this.addEvents('beforeaction','actionfailed','actioncomplete');if(el){this.initEl(el);} +Ext.form.BasicForm.superclass.constructor.call(this);},timeout:30,paramOrder:undefined,paramsAsHash:false,waitTitle:'Please Wait...',activeAction:null,trackResetOnLoad:false,initEl:function(el){this.el=Ext.get(el);this.id=this.el.id||Ext.id();if(!this.standardSubmit){this.el.on('submit',this.onSubmit,this);} +this.el.addClass('x-form');},getEl:function(){return this.el;},onSubmit:function(e){e.stopEvent();},destroy:function(bound){if(bound!==true){this.items.each(function(f){Ext.destroy(f);});Ext.destroy(this.el);} +this.items.clear();this.purgeListeners();},isValid:function(){var valid=true;this.items.each(function(f){if(!f.validate()){valid=false;}});return valid;},isDirty:function(){var dirty=false;this.items.each(function(f){if(f.isDirty()){dirty=true;return false;}});return dirty;},doAction:function(action,options){if(Ext.isString(action)){action=new Ext.form.Action.ACTION_TYPES[action](this,options);} +if(this.fireEvent('beforeaction',this,action)!==false){this.beforeAction(action);action.run.defer(100,action);} +return this;},submit:function(options){options=options||{};if(this.standardSubmit){var v=options.clientValidation===false||this.isValid();if(v){var el=this.el.dom;if(this.url&&Ext.isEmpty(el.action)){el.action=this.url;} +el.submit();} +return v;} +var submitAction=String.format('{0}submit',this.api?'direct':'');this.doAction(submitAction,options);return this;},load:function(options){var loadAction=String.format('{0}load',this.api?'direct':'');this.doAction(loadAction,options);return this;},updateRecord:function(record){record.beginEdit();var fs=record.fields,field,value;fs.each(function(f){field=this.findField(f.name);if(field){value=field.getValue();if(typeof value!=undefined&&value.getGroupValue){value=value.getGroupValue();}else if(field.eachItem){value=[];field.eachItem(function(item){value.push(item.getValue());});} +record.set(f.name,value);}},this);record.endEdit();return this;},loadRecord:function(record){this.setValues(record.data);return this;},beforeAction:function(action){this.items.each(function(f){if(f.isFormField&&f.syncValue){f.syncValue();}});var o=action.options;if(o.waitMsg){if(this.waitMsgTarget===true){this.el.mask(o.waitMsg,'x-mask-loading');}else if(this.waitMsgTarget){this.waitMsgTarget=Ext.get(this.waitMsgTarget);this.waitMsgTarget.mask(o.waitMsg,'x-mask-loading');}else{Ext.MessageBox.wait(o.waitMsg,o.waitTitle||this.waitTitle);}}},afterAction:function(action,success){this.activeAction=null;var o=action.options;if(o.waitMsg){if(this.waitMsgTarget===true){this.el.unmask();}else if(this.waitMsgTarget){this.waitMsgTarget.unmask();}else{Ext.MessageBox.updateProgress(1);Ext.MessageBox.hide();}} +if(success){if(o.reset){this.reset();} +Ext.callback(o.success,o.scope,[this,action]);this.fireEvent('actioncomplete',this,action);}else{Ext.callback(o.failure,o.scope,[this,action]);this.fireEvent('actionfailed',this,action);}},findField:function(id){var field=this.items.get(id);if(!Ext.isObject(field)){var findMatchingField=function(f){if(f.isFormField){if(f.dataIndex==id||f.id==id||f.getName()==id){field=f;return false;}else if(f.isComposite){return f.items.each(findMatchingField);}else if(f instanceof Ext.form.CheckboxGroup&&f.rendered){return f.eachItem(findMatchingField);}}};this.items.each(findMatchingField);} +return field||null;},markInvalid:function(errors){if(Ext.isArray(errors)){for(var i=0,len=errors.length;i<len;i++){var fieldError=errors[i];var f=this.findField(fieldError.id);if(f){f.markInvalid(fieldError.msg);}}}else{var field,id;for(id in errors){if(!Ext.isFunction(errors[id])&&(field=this.findField(id))){field.markInvalid(errors[id]);}}} +return this;},setValues:function(values){if(Ext.isArray(values)){for(var i=0,len=values.length;i<len;i++){var v=values[i];var f=this.findField(v.id);if(f){f.setValue(v.value);if(this.trackResetOnLoad){f.originalValue=f.getValue();}}}}else{var field,id;for(id in values){if(!Ext.isFunction(values[id])&&(field=this.findField(id))){field.setValue(values[id]);if(this.trackResetOnLoad){field.originalValue=field.getValue();}}}} +return this;},getValues:function(asString){var fs=Ext.lib.Ajax.serializeForm(this.el.dom);if(asString===true){return fs;} +return Ext.urlDecode(fs);},getFieldValues:function(dirtyOnly){var o={},n,key,val;this.items.each(function(f){if(!f.disabled&&(dirtyOnly!==true||f.isDirty())){n=f.getName();key=o[n];val=f.getValue();if(Ext.isDefined(key)){if(Ext.isArray(key)){o[n].push(val);}else{o[n]=[key,val];}}else{o[n]=val;}}});return o;},clearInvalid:function(){this.items.each(function(f){f.clearInvalid();});return this;},reset:function(){this.items.each(function(f){f.reset();});return this;},add:function(){this.items.addAll(Array.prototype.slice.call(arguments,0));return this;},remove:function(field){this.items.remove(field);return this;},cleanDestroyed:function(){this.items.filterBy(function(o){return!!o.isDestroyed;}).each(this.remove,this);},render:function(){this.items.each(function(f){if(f.isFormField&&!f.rendered&&document.getElementById(f.id)){f.applyToMarkup(f.id);}});return this;},applyToFields:function(o){this.items.each(function(f){Ext.apply(f,o);});return this;},applyIfToFields:function(o){this.items.each(function(f){Ext.applyIf(f,o);});return this;},callFieldMethod:function(fnName,args){args=args||[];this.items.each(function(f){if(Ext.isFunction(f[fnName])){f[fnName].apply(f,args);}});return this;}});Ext.BasicForm=Ext.form.BasicForm;Ext.FormPanel=Ext.extend(Ext.Panel,{minButtonWidth:75,labelAlign:'left',monitorValid:false,monitorPoll:200,layout:'form',initComponent:function(){this.form=this.createForm();Ext.FormPanel.superclass.initComponent.call(this);this.bodyCfg={tag:'form',cls:this.baseCls+'-body',method:this.method||'POST',id:this.formId||Ext.id()};if(this.fileUpload){this.bodyCfg.enctype='multipart/form-data';} +this.initItems();this.addEvents('clientvalidation');this.relayEvents(this.form,['beforeaction','actionfailed','actioncomplete']);},createForm:function(){var config=Ext.applyIf({listeners:{}},this.initialConfig);return new Ext.form.BasicForm(null,config);},initFields:function(){var f=this.form;var formPanel=this;var fn=function(c){if(formPanel.isField(c)){f.add(c);}else if(c.findBy&&c!=formPanel){formPanel.applySettings(c);if(c.items&&c.items.each){c.items.each(fn,this);}}};this.items.each(fn,this);},applySettings:function(c){var ct=c.ownerCt;Ext.applyIf(c,{labelAlign:ct.labelAlign,labelWidth:ct.labelWidth,itemCls:ct.itemCls});},getLayoutTarget:function(){return this.form.el;},getForm:function(){return this.form;},onRender:function(ct,position){this.initFields();Ext.FormPanel.superclass.onRender.call(this,ct,position);this.form.initEl(this.body);},beforeDestroy:function(){this.stopMonitoring();this.form.destroy(true);Ext.FormPanel.superclass.beforeDestroy.call(this);},isField:function(c){return!!c.setValue&&!!c.getValue&&!!c.markInvalid&&!!c.clearInvalid;},initEvents:function(){Ext.FormPanel.superclass.initEvents.call(this);this.on({scope:this,add:this.onAddEvent,remove:this.onRemoveEvent});if(this.monitorValid){this.startMonitoring();}},onAdd:function(c){Ext.FormPanel.superclass.onAdd.call(this,c);this.processAdd(c);},onAddEvent:function(ct,c){if(ct!==this){this.processAdd(c);}},processAdd:function(c){if(this.isField(c)){this.form.add(c);}else if(c.findBy){this.applySettings(c);this.form.add.apply(this.form,c.findBy(this.isField));}},onRemove:function(c){Ext.FormPanel.superclass.onRemove.call(this,c);this.processRemove(c);},onRemoveEvent:function(ct,c){if(ct!==this){this.processRemove(c);}},processRemove:function(c){if(!this.destroying){if(this.isField(c)){this.form.remove(c);}else if(c.findBy){Ext.each(c.findBy(this.isField),this.form.remove,this.form);this.form.cleanDestroyed();}}},startMonitoring:function(){if(!this.validTask){this.validTask=new Ext.util.TaskRunner();this.validTask.start({run:this.bindHandler,interval:this.monitorPoll||200,scope:this});}},stopMonitoring:function(){if(this.validTask){this.validTask.stopAll();this.validTask=null;}},load:function(){this.form.load.apply(this.form,arguments);},onDisable:function(){Ext.FormPanel.superclass.onDisable.call(this);if(this.form){this.form.items.each(function(){this.disable();});}},onEnable:function(){Ext.FormPanel.superclass.onEnable.call(this);if(this.form){this.form.items.each(function(){this.enable();});}},bindHandler:function(){var valid=true;this.form.items.each(function(f){if(!f.isValid(true)){valid=false;return false;}});if(this.fbar){var fitems=this.fbar.items.items;for(var i=0,len=fitems.length;i<len;i++){var btn=fitems[i];if(btn.formBind===true&&btn.disabled===valid){btn.setDisabled(!valid);}}} +this.fireEvent('clientvalidation',this,valid);}});Ext.reg('form',Ext.FormPanel);Ext.form.FormPanel=Ext.FormPanel;Ext.form.FieldSet=Ext.extend(Ext.Panel,{baseCls:'x-fieldset',layout:'form',animCollapse:false,onRender:function(ct,position){if(!this.el){this.el=document.createElement('fieldset');this.el.id=this.id;if(this.title||this.header||this.checkboxToggle){this.el.appendChild(document.createElement('legend')).className=this.baseCls+'-header';}} +Ext.form.FieldSet.superclass.onRender.call(this,ct,position);if(this.checkboxToggle){var o=typeof this.checkboxToggle=='object'?this.checkboxToggle:{tag:'input',type:'checkbox',name:this.checkboxName||this.id+'-checkbox'};this.checkbox=this.header.insertFirst(o);this.checkbox.dom.checked=!this.collapsed;this.mon(this.checkbox,'click',this.onCheckClick,this);}},onCollapse:function(doAnim,animArg){if(this.checkbox){this.checkbox.dom.checked=false;} +Ext.form.FieldSet.superclass.onCollapse.call(this,doAnim,animArg);},onExpand:function(doAnim,animArg){if(this.checkbox){this.checkbox.dom.checked=true;} +Ext.form.FieldSet.superclass.onExpand.call(this,doAnim,animArg);},onCheckClick:function(){this[this.checkbox.dom.checked?'expand':'collapse']();}});Ext.reg('fieldset',Ext.form.FieldSet);Ext.form.HtmlEditor=Ext.extend(Ext.form.Field,{enableFormat:true,enableFontSize:true,enableColors:true,enableAlignments:true,enableLists:true,enableSourceEdit:true,enableLinks:true,enableFont:true,createLinkText:'Please enter the URL for the link:',defaultLinkValue:'http:/'+'/',fontFamilies:['Arial','Courier New','Tahoma','Times New Roman','Verdana'],defaultFont:'tahoma',defaultValue:(Ext.isOpera||Ext.isIE6)?' ':'​',actionMode:'wrap',validationEvent:false,deferHeight:true,initialized:false,activated:false,sourceEditMode:false,onFocus:Ext.emptyFn,iframePad:3,hideMode:'offsets',defaultAutoCreate:{tag:"textarea",style:"width:500px;height:300px;",autocomplete:"off"},initComponent:function(){this.addEvents('initialize','activate','beforesync','beforepush','sync','push','editmodechange');Ext.form.HtmlEditor.superclass.initComponent.call(this);},createFontOptions:function(){var buf=[],fs=this.fontFamilies,ff,lc;for(var i=0,len=fs.length;i<len;i++){ff=fs[i];lc=ff.toLowerCase();buf.push('<option value="',lc,'" style="font-family:',ff,';"',(this.defaultFont==lc?' selected="true">':'>'),ff,'</option>');} +return buf.join('');},createToolbar:function(editor){var items=[];var tipsEnabled=Ext.QuickTips&&Ext.QuickTips.isEnabled();function btn(id,toggle,handler){return{itemId:id,cls:'x-btn-icon',iconCls:'x-edit-'+id,enableToggle:toggle!==false,scope:editor,handler:handler||editor.relayBtnCmd,clickEvent:'mousedown',tooltip:tipsEnabled?editor.buttonTips[id]||undefined:undefined,overflowText:editor.buttonTips[id].title||undefined,tabIndex:-1};} +if(this.enableFont&&!Ext.isSafari2){var fontSelectItem=new Ext.Toolbar.Item({autoEl:{tag:'select',cls:'x-font-select',html:this.createFontOptions()}});items.push(fontSelectItem,'-');} +if(this.enableFormat){items.push(btn('bold'),btn('italic'),btn('underline'));} +if(this.enableFontSize){items.push('-',btn('increasefontsize',false,this.adjustFont),btn('decreasefontsize',false,this.adjustFont));} +if(this.enableColors){items.push('-',{itemId:'forecolor',cls:'x-btn-icon',iconCls:'x-edit-forecolor',clickEvent:'mousedown',tooltip:tipsEnabled?editor.buttonTips.forecolor||undefined:undefined,tabIndex:-1,menu:new Ext.menu.ColorMenu({allowReselect:true,focus:Ext.emptyFn,value:'000000',plain:true,listeners:{scope:this,select:function(cp,color){this.execCmd('forecolor',Ext.isWebKit||Ext.isIE?'#'+color:color);this.deferFocus();}},clickEvent:'mousedown'})},{itemId:'backcolor',cls:'x-btn-icon',iconCls:'x-edit-backcolor',clickEvent:'mousedown',tooltip:tipsEnabled?editor.buttonTips.backcolor||undefined:undefined,tabIndex:-1,menu:new Ext.menu.ColorMenu({focus:Ext.emptyFn,value:'FFFFFF',plain:true,allowReselect:true,listeners:{scope:this,select:function(cp,color){if(Ext.isGecko){this.execCmd('useCSS',false);this.execCmd('hilitecolor',color);this.execCmd('useCSS',true);this.deferFocus();}else{this.execCmd(Ext.isOpera?'hilitecolor':'backcolor',Ext.isWebKit||Ext.isIE?'#'+color:color);this.deferFocus();}}},clickEvent:'mousedown'})});} +if(this.enableAlignments){items.push('-',btn('justifyleft'),btn('justifycenter'),btn('justifyright'));} +if(!Ext.isSafari2){if(this.enableLinks){items.push('-',btn('createlink',false,this.createLink));} +if(this.enableLists){items.push('-',btn('insertorderedlist'),btn('insertunorderedlist'));} +if(this.enableSourceEdit){items.push('-',btn('sourceedit',true,function(btn){this.toggleSourceEdit(!this.sourceEditMode);}));}} +var tb=new Ext.Toolbar({renderTo:this.wrap.dom.firstChild,items:items});if(fontSelectItem){this.fontSelect=fontSelectItem.el;this.mon(this.fontSelect,'change',function(){var font=this.fontSelect.dom.value;this.relayCmd('fontname',font);this.deferFocus();},this);} +this.mon(tb.el,'click',function(e){e.preventDefault();});this.tb=tb;this.tb.doLayout();},onDisable:function(){this.wrap.mask();Ext.form.HtmlEditor.superclass.onDisable.call(this);},onEnable:function(){this.wrap.unmask();Ext.form.HtmlEditor.superclass.onEnable.call(this);},setReadOnly:function(readOnly){Ext.form.HtmlEditor.superclass.setReadOnly.call(this,readOnly);if(this.initialized){if(Ext.isIE){this.getEditorBody().contentEditable=!readOnly;}else{this.setDesignMode(!readOnly);} +var bd=this.getEditorBody();if(bd){bd.style.cursor=this.readOnly?'default':'text';} +this.disableItems(readOnly);}},getDocMarkup:function(){var h=Ext.fly(this.iframe).getHeight()-this.iframePad*2;return String.format('<html><head><style type="text/css">body{border: 0; margin: 0; padding: {0}px; height: {1}px; cursor: text}</style></head><body></body></html>',this.iframePad,h);},getEditorBody:function(){var doc=this.getDoc();return doc.body||doc.documentElement;},getDoc:function(){return Ext.isIE?this.getWin().document:(this.iframe.contentDocument||this.getWin().document);},getWin:function(){return Ext.isIE?this.iframe.contentWindow:window.frames[this.iframe.name];},onRender:function(ct,position){Ext.form.HtmlEditor.superclass.onRender.call(this,ct,position);this.el.dom.style.border='0 none';this.el.dom.setAttribute('tabIndex',-1);this.el.addClass('x-hidden');if(Ext.isIE){this.el.applyStyles('margin-top:-1px;margin-bottom:-1px;');} +this.wrap=this.el.wrap({cls:'x-html-editor-wrap',cn:{cls:'x-html-editor-tb'}});this.createToolbar(this);this.disableItems(true);this.tb.doLayout();this.createIFrame();if(!this.width){var sz=this.el.getSize();this.setSize(sz.width,this.height||sz.height);} +this.resizeEl=this.positionEl=this.wrap;},createIFrame:function(){var iframe=document.createElement('iframe');iframe.name=Ext.id();iframe.frameBorder='0';iframe.style.overflow='auto';iframe.src=Ext.SSL_SECURE_URL;this.wrap.dom.appendChild(iframe);this.iframe=iframe;this.monitorTask=Ext.TaskMgr.start({run:this.checkDesignMode,scope:this,interval:100});},initFrame:function(){Ext.TaskMgr.stop(this.monitorTask);var doc=this.getDoc();this.win=this.getWin();doc.open();doc.write(this.getDocMarkup());doc.close();var task={run:function(){var doc=this.getDoc();if(doc.body||doc.readyState=='complete'){Ext.TaskMgr.stop(task);this.setDesignMode(true);this.initEditor.defer(10,this);}},interval:10,duration:10000,scope:this};Ext.TaskMgr.start(task);},checkDesignMode:function(){if(this.wrap&&this.wrap.dom.offsetWidth){var doc=this.getDoc();if(!doc){return;} +if(!doc.editorInitialized||this.getDesignMode()!='on'){this.initFrame();}}},setDesignMode:function(mode){var doc=this.getDoc();if(doc){if(this.readOnly){mode=false;} +doc.designMode=(/on|true/i).test(String(mode).toLowerCase())?'on':'off';}},getDesignMode:function(){var doc=this.getDoc();if(!doc){return'';} +return String(doc.designMode).toLowerCase();},disableItems:function(disabled){if(this.fontSelect){this.fontSelect.dom.disabled=disabled;} +this.tb.items.each(function(item){if(item.getItemId()!='sourceedit'){item.setDisabled(disabled);}});},onResize:function(w,h){Ext.form.HtmlEditor.superclass.onResize.apply(this,arguments);if(this.el&&this.iframe){if(Ext.isNumber(w)){var aw=w-this.wrap.getFrameWidth('lr');this.el.setWidth(aw);this.tb.setWidth(aw);this.iframe.style.width=Math.max(aw,0)+'px';} +if(Ext.isNumber(h)){var ah=h-this.wrap.getFrameWidth('tb')-this.tb.el.getHeight();this.el.setHeight(ah);this.iframe.style.height=Math.max(ah,0)+'px';var bd=this.getEditorBody();if(bd){bd.style.height=Math.max((ah-(this.iframePad*2)),0)+'px';}}}},toggleSourceEdit:function(sourceEditMode){var iframeHeight,elHeight;if(sourceEditMode===undefined){sourceEditMode=!this.sourceEditMode;} +this.sourceEditMode=sourceEditMode===true;var btn=this.tb.getComponent('sourceedit');if(btn.pressed!==this.sourceEditMode){btn.toggle(this.sourceEditMode);if(!btn.xtbHidden){return;}} +if(this.sourceEditMode){this.previousSize=this.getSize();iframeHeight=Ext.get(this.iframe).getHeight();this.disableItems(true);this.syncValue();this.iframe.className='x-hidden';this.el.removeClass('x-hidden');this.el.dom.removeAttribute('tabIndex');this.el.focus();this.el.dom.style.height=iframeHeight+'px';} +else{elHeight=parseInt(this.el.dom.style.height,10);if(this.initialized){this.disableItems(this.readOnly);} +this.pushValue();this.iframe.className='';this.el.addClass('x-hidden');this.el.dom.setAttribute('tabIndex',-1);this.deferFocus();this.setSize(this.previousSize);delete this.previousSize;this.iframe.style.height=elHeight+'px';} +this.fireEvent('editmodechange',this,this.sourceEditMode);},createLink:function(){var url=prompt(this.createLinkText,this.defaultLinkValue);if(url&&url!='http:/'+'/'){this.relayCmd('createlink',url);}},initEvents:function(){this.originalValue=this.getValue();},markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn,setValue:function(v){Ext.form.HtmlEditor.superclass.setValue.call(this,v);this.pushValue();return this;},cleanHtml:function(html){html=String(html);if(Ext.isWebKit){html=html.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi,'');} +if(html.charCodeAt(0)==this.defaultValue.replace(/\D/g,'')){html=html.substring(1);} +return html;},syncValue:function(){if(this.initialized){var bd=this.getEditorBody();var html=bd.innerHTML;if(Ext.isWebKit){var bs=bd.getAttribute('style');var m=bs.match(/text-align:(.*?);/i);if(m&&m[1]){html='<div style="'+m[0]+'">'+html+'</div>';}} +html=this.cleanHtml(html);if(this.fireEvent('beforesync',this,html)!==false){this.el.dom.value=html;this.fireEvent('sync',this,html);}}},getValue:function(){this[this.sourceEditMode?'pushValue':'syncValue']();return Ext.form.HtmlEditor.superclass.getValue.call(this);},pushValue:function(){if(this.initialized){var v=this.el.dom.value;if(!this.activated&&v.length<1){v=this.defaultValue;} +if(this.fireEvent('beforepush',this,v)!==false){this.getEditorBody().innerHTML=v;if(Ext.isGecko){this.setDesignMode(false);this.setDesignMode(true);} +this.fireEvent('push',this,v);}}},deferFocus:function(){this.focus.defer(10,this);},focus:function(){if(this.win&&!this.sourceEditMode){this.win.focus();}else{this.el.focus();}},initEditor:function(){try{var dbody=this.getEditorBody(),ss=this.el.getStyles('font-size','font-family','background-image','background-repeat','background-color','color'),doc,fn;ss['background-attachment']='fixed';dbody.bgProperties='fixed';Ext.DomHelper.applyStyles(dbody,ss);doc=this.getDoc();if(doc){try{Ext.EventManager.removeAll(doc);}catch(e){}} +fn=this.onEditorEvent.createDelegate(this);Ext.EventManager.on(doc,{mousedown:fn,dblclick:fn,click:fn,keyup:fn,buffer:100});if(Ext.isGecko){Ext.EventManager.on(doc,'keypress',this.applyCommand,this);} +if(Ext.isIE||Ext.isWebKit||Ext.isOpera){Ext.EventManager.on(doc,'keydown',this.fixKeys,this);} +doc.editorInitialized=true;this.initialized=true;this.pushValue();this.setReadOnly(this.readOnly);this.fireEvent('initialize',this);}catch(e){}},beforeDestroy:function(){if(this.monitorTask){Ext.TaskMgr.stop(this.monitorTask);} +if(this.rendered){Ext.destroy(this.tb);var doc=this.getDoc();if(doc){try{Ext.EventManager.removeAll(doc);for(var prop in doc){delete doc[prop];}}catch(e){}} +if(this.wrap){this.wrap.dom.innerHTML='';this.wrap.remove();}} +Ext.form.HtmlEditor.superclass.beforeDestroy.call(this);},onFirstFocus:function(){this.activated=true;this.disableItems(this.readOnly);if(Ext.isGecko){this.win.focus();var s=this.win.getSelection();if(!s.focusNode||s.focusNode.nodeType!=3){var r=s.getRangeAt(0);r.selectNodeContents(this.getEditorBody());r.collapse(true);this.deferFocus();} +try{this.execCmd('useCSS',true);this.execCmd('styleWithCSS',false);}catch(e){}} +this.fireEvent('activate',this);},adjustFont:function(btn){var adjust=btn.getItemId()=='increasefontsize'?1:-1,doc=this.getDoc(),v=parseInt(doc.queryCommandValue('FontSize')||2,10);if((Ext.isSafari&&!Ext.isSafari2)||Ext.isChrome||Ext.isAir){if(v<=10){v=1+adjust;}else if(v<=13){v=2+adjust;}else if(v<=16){v=3+adjust;}else if(v<=18){v=4+adjust;}else if(v<=24){v=5+adjust;}else{v=6+adjust;} +v=v.constrain(1,6);}else{if(Ext.isSafari){adjust*=2;} +v=Math.max(1,v+adjust)+(Ext.isSafari?'px':0);} +this.execCmd('FontSize',v);},onEditorEvent:function(e){this.updateToolbar();},updateToolbar:function(){if(this.readOnly){return;} +if(!this.activated){this.onFirstFocus();return;} +var btns=this.tb.items.map,doc=this.getDoc();if(this.enableFont&&!Ext.isSafari2){var name=(doc.queryCommandValue('FontName')||this.defaultFont).toLowerCase();if(name!=this.fontSelect.dom.value){this.fontSelect.dom.value=name;}} +if(this.enableFormat){btns.bold.toggle(doc.queryCommandState('bold'));btns.italic.toggle(doc.queryCommandState('italic'));btns.underline.toggle(doc.queryCommandState('underline'));} +if(this.enableAlignments){btns.justifyleft.toggle(doc.queryCommandState('justifyleft'));btns.justifycenter.toggle(doc.queryCommandState('justifycenter'));btns.justifyright.toggle(doc.queryCommandState('justifyright'));} +if(!Ext.isSafari2&&this.enableLists){btns.insertorderedlist.toggle(doc.queryCommandState('insertorderedlist'));btns.insertunorderedlist.toggle(doc.queryCommandState('insertunorderedlist'));} +Ext.menu.MenuMgr.hideAll();this.syncValue();},relayBtnCmd:function(btn){this.relayCmd(btn.getItemId());},relayCmd:function(cmd,value){(function(){this.focus();this.execCmd(cmd,value);this.updateToolbar();}).defer(10,this);},execCmd:function(cmd,value){var doc=this.getDoc();doc.execCommand(cmd,false,value===undefined?null:value);this.syncValue();},applyCommand:function(e){if(e.ctrlKey){var c=e.getCharCode(),cmd;if(c>0){c=String.fromCharCode(c);switch(c){case'b':cmd='bold';break;case'i':cmd='italic';break;case'u':cmd='underline';break;} +if(cmd){this.win.focus();this.execCmd(cmd);this.deferFocus();e.preventDefault();}}}},insertAtCursor:function(text){if(!this.activated){return;} +if(Ext.isIE){this.win.focus();var doc=this.getDoc(),r=doc.selection.createRange();if(r){r.pasteHTML(text);this.syncValue();this.deferFocus();}}else{this.win.focus();this.execCmd('InsertHTML',text);this.deferFocus();}},fixKeys:function(){if(Ext.isIE){return function(e){var k=e.getKey(),doc=this.getDoc(),r;if(k==e.TAB){e.stopEvent();r=doc.selection.createRange();if(r){r.collapse(true);r.pasteHTML(' ');this.deferFocus();}}else if(k==e.ENTER){r=doc.selection.createRange();if(r){var target=r.parentElement();if(!target||target.tagName.toLowerCase()!='li'){e.stopEvent();r.pasteHTML('<br />');r.collapse(false);r.select();}}}};}else if(Ext.isOpera){return function(e){var k=e.getKey();if(k==e.TAB){e.stopEvent();this.win.focus();this.execCmd('InsertHTML',' ');this.deferFocus();}};}else if(Ext.isWebKit){return function(e){var k=e.getKey();if(k==e.TAB){e.stopEvent();this.execCmd('InsertText','\t');this.deferFocus();}else if(k==e.ENTER){e.stopEvent();this.execCmd('InsertHtml','<br /><br />');this.deferFocus();}};}}(),getToolbar:function(){return this.tb;},buttonTips:{bold:{title:'Bold (Ctrl+B)',text:'Make the selected text bold.',cls:'x-html-editor-tip'},italic:{title:'Italic (Ctrl+I)',text:'Make the selected text italic.',cls:'x-html-editor-tip'},underline:{title:'Underline (Ctrl+U)',text:'Underline the selected text.',cls:'x-html-editor-tip'},increasefontsize:{title:'Grow Text',text:'Increase the font size.',cls:'x-html-editor-tip'},decreasefontsize:{title:'Shrink Text',text:'Decrease the font size.',cls:'x-html-editor-tip'},backcolor:{title:'Text Highlight Color',text:'Change the background color of the selected text.',cls:'x-html-editor-tip'},forecolor:{title:'Font Color',text:'Change the color of the selected text.',cls:'x-html-editor-tip'},justifyleft:{title:'Align Text Left',text:'Align text to the left.',cls:'x-html-editor-tip'},justifycenter:{title:'Center Text',text:'Center text in the editor.',cls:'x-html-editor-tip'},justifyright:{title:'Align Text Right',text:'Align text to the right.',cls:'x-html-editor-tip'},insertunorderedlist:{title:'Bullet List',text:'Start a bulleted list.',cls:'x-html-editor-tip'},insertorderedlist:{title:'Numbered List',text:'Start a numbered list.',cls:'x-html-editor-tip'},createlink:{title:'Hyperlink',text:'Make the selected text a hyperlink.',cls:'x-html-editor-tip'},sourceedit:{title:'Source Edit',text:'Switch to source editing mode.',cls:'x-html-editor-tip'}}});Ext.reg('htmleditor',Ext.form.HtmlEditor);Ext.form.TimeField=Ext.extend(Ext.form.ComboBox,{minValue:undefined,maxValue:undefined,minText:"The time in this field must be equal to or after {0}",maxText:"The time in this field must be equal to or before {0}",invalidText:"{0} is not a valid time",format:"g:i A",altFormats:"g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H|gi a|hi a|giA|hiA|gi A|hi A",increment:15,mode:'local',triggerAction:'all',typeAhead:false,initDate:'1/1/2008',initDateFormat:'j/n/Y',initComponent:function(){if(Ext.isDefined(this.minValue)){this.setMinValue(this.minValue,true);} +if(Ext.isDefined(this.maxValue)){this.setMaxValue(this.maxValue,true);} +if(!this.store){this.generateStore(true);} +Ext.form.TimeField.superclass.initComponent.call(this);},setMinValue:function(value,initial){this.setLimit(value,true,initial);return this;},setMaxValue:function(value,initial){this.setLimit(value,false,initial);return this;},generateStore:function(initial){var min=this.minValue||new Date(this.initDate).clearTime(),max=this.maxValue||new Date(this.initDate).clearTime().add('mi',(24*60)-1),times=[];while(min<=max){times.push(min.dateFormat(this.format));min=min.add('mi',this.increment);} +this.bindStore(times,initial);},setLimit:function(value,isMin,initial){var d;if(Ext.isString(value)){d=this.parseDate(value);}else if(Ext.isDate(value)){d=value;} +if(d){var val=new Date(this.initDate).clearTime();val.setHours(d.getHours(),d.getMinutes(),d.getSeconds(),d.getMilliseconds());this[isMin?'minValue':'maxValue']=val;if(!initial){this.generateStore();}}},getValue:function(){var v=Ext.form.TimeField.superclass.getValue.call(this);return this.formatDate(this.parseDate(v))||'';},setValue:function(value){return Ext.form.TimeField.superclass.setValue.call(this,this.formatDate(this.parseDate(value)));},validateValue:Ext.form.DateField.prototype.validateValue,formatDate:Ext.form.DateField.prototype.formatDate,parseDate:function(value){if(!value||Ext.isDate(value)){return value;} +var id=this.initDate+' ',idf=this.initDateFormat+' ',v=Date.parseDate(id+value,idf+this.format),af=this.altFormats;if(!v&&af){if(!this.altFormatsArray){this.altFormatsArray=af.split("|");} +for(var i=0,afa=this.altFormatsArray,len=afa.length;i<len&&!v;i++){v=Date.parseDate(id+value,idf+afa[i]);}} +return v;}});Ext.reg('timefield',Ext.form.TimeField);Ext.form.SliderField=Ext.extend(Ext.form.Field,{useTips:true,tipText:null,actionMode:'wrap',initComponent:function(){var cfg=Ext.copyTo({id:this.id+'-slider'},this.initialConfig,['vertical','minValue','maxValue','decimalPrecision','keyIncrement','increment','clickToChange','animate']);if(this.useTips){var plug=this.tipText?{getText:this.tipText}:{};cfg.plugins=[new Ext.slider.Tip(plug)];} +this.slider=new Ext.Slider(cfg);Ext.form.SliderField.superclass.initComponent.call(this);},onRender:function(ct,position){this.autoCreate={id:this.id,name:this.name,type:'hidden',tag:'input'};Ext.form.SliderField.superclass.onRender.call(this,ct,position);this.wrap=this.el.wrap({cls:'x-form-field-wrap'});this.resizeEl=this.positionEl=this.wrap;this.slider.render(this.wrap);},onResize:function(w,h,aw,ah){Ext.form.SliderField.superclass.onResize.call(this,w,h,aw,ah);this.slider.setSize(w,h);},initEvents:function(){Ext.form.SliderField.superclass.initEvents.call(this);this.slider.on('change',this.onChange,this);},onChange:function(slider,v){this.setValue(v,undefined,true);},onEnable:function(){Ext.form.SliderField.superclass.onEnable.call(this);this.slider.enable();},onDisable:function(){Ext.form.SliderField.superclass.onDisable.call(this);this.slider.disable();},beforeDestroy:function(){Ext.destroy(this.slider);Ext.form.SliderField.superclass.beforeDestroy.call(this);},alignErrorIcon:function(){this.errorIcon.alignTo(this.slider.el,'tl-tr',[2,0]);},setMinValue:function(v){this.slider.setMinValue(v);return this;},setMaxValue:function(v){this.slider.setMaxValue(v);return this;},setValue:function(v,animate,silent){if(!silent){this.slider.setValue(v,animate);} +return Ext.form.SliderField.superclass.setValue.call(this,this.slider.getValue());},getValue:function(){return this.slider.getValue();}});Ext.reg('sliderfield',Ext.form.SliderField);Ext.form.Label=Ext.extend(Ext.BoxComponent,{onRender:function(ct,position){if(!this.el){this.el=document.createElement('label');this.el.id=this.getId();this.el.innerHTML=this.text?Ext.util.Format.htmlEncode(this.text):(this.html||'');if(this.forId){this.el.setAttribute('for',this.forId);}} +Ext.form.Label.superclass.onRender.call(this,ct,position);},setText:function(t,encode){var e=encode===false;this[!e?'text':'html']=t;delete this[e?'text':'html'];if(this.rendered){this.el.dom.innerHTML=encode!==false?Ext.util.Format.htmlEncode(t):t;} +return this;}});Ext.reg('label',Ext.form.Label);Ext.form.Action=function(form,options){this.form=form;this.options=options||{};};Ext.form.Action.CLIENT_INVALID='client';Ext.form.Action.SERVER_INVALID='server';Ext.form.Action.CONNECT_FAILURE='connect';Ext.form.Action.LOAD_FAILURE='load';Ext.form.Action.prototype={type:'default',run:function(options){},success:function(response){},handleResponse:function(response){},failure:function(response){this.response=response;this.failureType=Ext.form.Action.CONNECT_FAILURE;this.form.afterAction(this,false);},processResponse:function(response){this.response=response;if(!response.responseText&&!response.responseXML){return true;} +this.result=this.handleResponse(response);return this.result;},getUrl:function(appendParams){var url=this.options.url||this.form.url||this.form.el.dom.action;if(appendParams){var p=this.getParams();if(p){url=Ext.urlAppend(url,p);}} +return url;},getMethod:function(){return(this.options.method||this.form.method||this.form.el.dom.method||'POST').toUpperCase();},getParams:function(){var bp=this.form.baseParams;var p=this.options.params;if(p){if(typeof p=="object"){p=Ext.urlEncode(Ext.applyIf(p,bp));}else if(typeof p=='string'&&bp){p+='&'+Ext.urlEncode(bp);}}else if(bp){p=Ext.urlEncode(bp);} +return p;},createCallback:function(opts){var opts=opts||{};return{success:this.success,failure:this.failure,scope:this,timeout:(opts.timeout*1000)||(this.form.timeout*1000),upload:this.form.fileUpload?this.success:undefined};}};Ext.form.Action.Submit=function(form,options){Ext.form.Action.Submit.superclass.constructor.call(this,form,options);};Ext.extend(Ext.form.Action.Submit,Ext.form.Action,{type:'submit',run:function(){var o=this.options,method=this.getMethod(),isGet=method=='GET';if(o.clientValidation===false||this.form.isValid()){if(o.submitEmptyText===false){var fields=this.form.items,emptyFields=[],setupEmptyFields=function(f){if(f.el.getValue()==f.emptyText){emptyFields.push(f);f.el.dom.value="";} +if(f.isComposite&&f.rendered){f.items.each(setupEmptyFields);}};fields.each(setupEmptyFields);} +Ext.Ajax.request(Ext.apply(this.createCallback(o),{form:this.form.el.dom,url:this.getUrl(isGet),method:method,headers:o.headers,params:!isGet?this.getParams():null,isUpload:this.form.fileUpload}));if(o.submitEmptyText===false){Ext.each(emptyFields,function(f){if(f.applyEmptyText){f.applyEmptyText();}});}}else if(o.clientValidation!==false){this.failureType=Ext.form.Action.CLIENT_INVALID;this.form.afterAction(this,false);}},success:function(response){var result=this.processResponse(response);if(result===true||result.success){this.form.afterAction(this,true);return;} +if(result.errors){this.form.markInvalid(result.errors);} +this.failureType=Ext.form.Action.SERVER_INVALID;this.form.afterAction(this,false);},handleResponse:function(response){if(this.form.errorReader){var rs=this.form.errorReader.read(response);var errors=[];if(rs.records){for(var i=0,len=rs.records.length;i<len;i++){var r=rs.records[i];errors[i]=r.data;}} +if(errors.length<1){errors=null;} +return{success:rs.success,errors:errors};} +return Ext.decode(response.responseText);}});Ext.form.Action.Load=function(form,options){Ext.form.Action.Load.superclass.constructor.call(this,form,options);this.reader=this.form.reader;};Ext.extend(Ext.form.Action.Load,Ext.form.Action,{type:'load',run:function(){Ext.Ajax.request(Ext.apply(this.createCallback(this.options),{method:this.getMethod(),url:this.getUrl(false),headers:this.options.headers,params:this.getParams()}));},success:function(response){var result=this.processResponse(response);if(result===true||!result.success||!result.data){this.failureType=Ext.form.Action.LOAD_FAILURE;this.form.afterAction(this,false);return;} +this.form.clearInvalid();this.form.setValues(result.data);this.form.afterAction(this,true);},handleResponse:function(response){if(this.form.reader){var rs=this.form.reader.read(response);var data=rs.records&&rs.records[0]?rs.records[0].data:null;return{success:rs.success,data:data};} +return Ext.decode(response.responseText);}});Ext.form.Action.DirectLoad=Ext.extend(Ext.form.Action.Load,{constructor:function(form,opts){Ext.form.Action.DirectLoad.superclass.constructor.call(this,form,opts);},type:'directload',run:function(){var args=this.getParams();args.push(this.success,this);this.form.api.load.apply(window,args);},getParams:function(){var buf=[],o={};var bp=this.form.baseParams;var p=this.options.params;Ext.apply(o,p,bp);var paramOrder=this.form.paramOrder;if(paramOrder){for(var i=0,len=paramOrder.length;i<len;i++){buf.push(o[paramOrder[i]]);}}else if(this.form.paramsAsHash){buf.push(o);} +return buf;},processResponse:function(result){this.result=result;return result;},success:function(response,trans){if(trans.type==Ext.Direct.exceptions.SERVER){response={};} +Ext.form.Action.DirectLoad.superclass.success.call(this,response);}});Ext.form.Action.DirectSubmit=Ext.extend(Ext.form.Action.Submit,{constructor:function(form,opts){Ext.form.Action.DirectSubmit.superclass.constructor.call(this,form,opts);},type:'directsubmit',run:function(){var o=this.options;if(o.clientValidation===false||this.form.isValid()){this.success.params=this.getParams();this.form.api.submit(this.form.el.dom,this.success,this);}else if(o.clientValidation!==false){this.failureType=Ext.form.Action.CLIENT_INVALID;this.form.afterAction(this,false);}},getParams:function(){var o={};var bp=this.form.baseParams;var p=this.options.params;Ext.apply(o,p,bp);return o;},processResponse:function(result){this.result=result;return result;},success:function(response,trans){if(trans.type==Ext.Direct.exceptions.SERVER){response={};} +Ext.form.Action.DirectSubmit.superclass.success.call(this,response);}});Ext.form.Action.ACTION_TYPES={'load':Ext.form.Action.Load,'submit':Ext.form.Action.Submit,'directload':Ext.form.Action.DirectLoad,'directsubmit':Ext.form.Action.DirectSubmit};Ext.form.VTypes=function(){var alpha=/^[a-zA-Z_]+$/,alphanum=/^[a-zA-Z0-9_]+$/,email=/^(\w+)([\-+.][\w]+)*@(\w[\-\w]*\.){1,5}([A-Za-z]){2,6}$/,url=/(((^https?)|(^ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;return{'email':function(v){return email.test(v);},'emailText':'This field should be an e-mail address in the format "user@example.com"','emailMask':/[a-z0-9_\.\-@\+]/i,'url':function(v){return url.test(v);},'urlText':'This field should be a URL in the format "http:/'+'/www.example.com"','alpha':function(v){return alpha.test(v);},'alphaText':'This field should only contain letters and _','alphaMask':/[a-z_]/i,'alphanum':function(v){return alphanum.test(v);},'alphanumText':'This field should only contain letters, numbers and _','alphanumMask':/[a-z0-9_]/i};}();Ext.Button=Ext.extend(Ext.BoxComponent,{hidden:false,disabled:false,pressed:false,enableToggle:false,menuAlign:'tl-bl?',type:'button',menuClassTarget:'tr:nth(2)',clickEvent:'click',handleMouseEvents:true,tooltipType:'qtip',buttonSelector:'button:first-child',scale:'small',iconAlign:'left',arrowAlign:'right',initComponent:function(){if(this.menu){this.menu=Ext.menu.MenuMgr.get(this.menu);this.menu.ownerCt=this;} +Ext.Button.superclass.initComponent.call(this);this.addEvents('click','toggle','mouseover','mouseout','menushow','menuhide','menutriggerover','menutriggerout');if(this.menu){this.menu.ownerCt=undefined;} +if(Ext.isString(this.toggleGroup)){this.enableToggle=true;}},getTemplateArgs:function(){return[this.type,'x-btn-'+this.scale+' x-btn-icon-'+this.scale+'-'+this.iconAlign,this.getMenuClass(),this.cls,this.id];},setButtonClass:function(){if(this.useSetClass){if(!Ext.isEmpty(this.oldCls)){this.el.removeClass([this.oldCls,'x-btn-pressed']);} +this.oldCls=(this.iconCls||this.icon)?(this.text?'x-btn-text-icon':'x-btn-icon'):'x-btn-noicon';this.el.addClass([this.oldCls,this.pressed?'x-btn-pressed':null]);}},getMenuClass:function(){return this.menu?(this.arrowAlign!='bottom'?'x-btn-arrow':'x-btn-arrow-bottom'):'';},onRender:function(ct,position){if(!this.template){if(!Ext.Button.buttonTemplate){Ext.Button.buttonTemplate=new Ext.Template('<table id="{4}" cellspacing="0" class="x-btn {3}"><tbody class="{1}">','<tr><td class="x-btn-tl"><i> </i></td><td class="x-btn-tc"></td><td class="x-btn-tr"><i> </i></td></tr>','<tr><td class="x-btn-ml"><i> </i></td><td class="x-btn-mc"><em class="{2}" unselectable="on"><button type="{0}"></button></em></td><td class="x-btn-mr"><i> </i></td></tr>','<tr><td class="x-btn-bl"><i> </i></td><td class="x-btn-bc"></td><td class="x-btn-br"><i> </i></td></tr>','</tbody></table>');Ext.Button.buttonTemplate.compile();} +this.template=Ext.Button.buttonTemplate;} +var btn,targs=this.getTemplateArgs();if(position){btn=this.template.insertBefore(position,targs,true);}else{btn=this.template.append(ct,targs,true);} +this.btnEl=btn.child(this.buttonSelector);this.mon(this.btnEl,{scope:this,focus:this.onFocus,blur:this.onBlur});this.initButtonEl(btn,this.btnEl);Ext.ButtonToggleMgr.register(this);},initButtonEl:function(btn,btnEl){this.el=btn;this.setIcon(this.icon);this.setText(this.text);this.setIconClass(this.iconCls);if(Ext.isDefined(this.tabIndex)){btnEl.dom.tabIndex=this.tabIndex;} +if(this.tooltip){this.setTooltip(this.tooltip,true);} +if(this.handleMouseEvents){this.mon(btn,{scope:this,mouseover:this.onMouseOver,mousedown:this.onMouseDown});} +if(this.menu){this.mon(this.menu,{scope:this,show:this.onMenuShow,hide:this.onMenuHide});} +if(this.repeat){var repeater=new Ext.util.ClickRepeater(btn,Ext.isObject(this.repeat)?this.repeat:{});this.mon(repeater,'click',this.onRepeatClick,this);}else{this.mon(btn,this.clickEvent,this.onClick,this);}},afterRender:function(){Ext.Button.superclass.afterRender.call(this);this.useSetClass=true;this.setButtonClass();this.doc=Ext.getDoc();this.doAutoWidth();},setIconClass:function(cls){this.iconCls=cls;if(this.el){this.btnEl.dom.className='';this.btnEl.addClass(['x-btn-text',cls||'']);this.setButtonClass();} +return this;},setTooltip:function(tooltip,initial){if(this.rendered){if(!initial){this.clearTip();} +if(Ext.isObject(tooltip)){Ext.QuickTips.register(Ext.apply({target:this.btnEl.id},tooltip));this.tooltip=tooltip;}else{this.btnEl.dom[this.tooltipType]=tooltip;}}else{this.tooltip=tooltip;} +return this;},clearTip:function(){if(Ext.isObject(this.tooltip)){Ext.QuickTips.unregister(this.btnEl);}},beforeDestroy:function(){if(this.rendered){this.clearTip();} +if(this.menu&&this.destroyMenu!==false){Ext.destroy(this.btnEl,this.menu);} +Ext.destroy(this.repeater);},onDestroy:function(){if(this.rendered){this.doc.un('mouseover',this.monitorMouseOver,this);this.doc.un('mouseup',this.onMouseUp,this);delete this.doc;delete this.btnEl;Ext.ButtonToggleMgr.unregister(this);} +Ext.Button.superclass.onDestroy.call(this);},doAutoWidth:function(){if(this.autoWidth!==false&&this.el&&this.text&&this.width===undefined){this.el.setWidth('auto');if(Ext.isIE7&&Ext.isStrict){var ib=this.btnEl;if(ib&&ib.getWidth()>20){ib.clip();ib.setWidth(Ext.util.TextMetrics.measure(ib,this.text).width+ib.getFrameWidth('lr'));}} +if(this.minWidth){if(this.el.getWidth()<this.minWidth){this.el.setWidth(this.minWidth);}}}},setHandler:function(handler,scope){this.handler=handler;this.scope=scope;return this;},setText:function(text){this.text=text;if(this.el){this.btnEl.update(text||' ');this.setButtonClass();} +this.doAutoWidth();return this;},setIcon:function(icon){this.icon=icon;if(this.el){this.btnEl.setStyle('background-image',icon?'url('+icon+')':'');this.setButtonClass();} +return this;},getText:function(){return this.text;},toggle:function(state,suppressEvent){state=state===undefined?!this.pressed:!!state;if(state!=this.pressed){if(this.rendered){this.el[state?'addClass':'removeClass']('x-btn-pressed');} +this.pressed=state;if(!suppressEvent){this.fireEvent('toggle',this,state);if(this.toggleHandler){this.toggleHandler.call(this.scope||this,this,state);}}} +return this;},onDisable:function(){this.onDisableChange(true);},onEnable:function(){this.onDisableChange(false);},onDisableChange:function(disabled){if(this.el){if(!Ext.isIE6||!this.text){this.el[disabled?'addClass':'removeClass'](this.disabledClass);} +this.el.dom.disabled=disabled;} +this.disabled=disabled;},showMenu:function(){if(this.rendered&&this.menu){if(this.tooltip){Ext.QuickTips.getQuickTip().cancelShow(this.btnEl);} +if(this.menu.isVisible()){this.menu.hide();} +this.menu.ownerCt=this;this.menu.show(this.el,this.menuAlign);} +return this;},hideMenu:function(){if(this.hasVisibleMenu()){this.menu.hide();} +return this;},hasVisibleMenu:function(){return this.menu&&this.menu.ownerCt==this&&this.menu.isVisible();},onRepeatClick:function(repeat,e){this.onClick(e);},onClick:function(e){if(e){e.preventDefault();} +if(e.button!==0){return;} +if(!this.disabled){this.doToggle();if(this.menu&&!this.hasVisibleMenu()&&!this.ignoreNextClick){this.showMenu();} +this.fireEvent('click',this,e);if(this.handler){this.handler.call(this.scope||this,this,e);}}},doToggle:function(){if(this.enableToggle&&(this.allowDepress!==false||!this.pressed)){this.toggle();}},isMenuTriggerOver:function(e,internal){return this.menu&&!internal;},isMenuTriggerOut:function(e,internal){return this.menu&&!internal;},onMouseOver:function(e){if(!this.disabled){var internal=e.within(this.el,true);if(!internal){this.el.addClass('x-btn-over');if(!this.monitoringMouseOver){this.doc.on('mouseover',this.monitorMouseOver,this);this.monitoringMouseOver=true;} +this.fireEvent('mouseover',this,e);} +if(this.isMenuTriggerOver(e,internal)){this.fireEvent('menutriggerover',this,this.menu,e);}}},monitorMouseOver:function(e){if(e.target!=this.el.dom&&!e.within(this.el)){if(this.monitoringMouseOver){this.doc.un('mouseover',this.monitorMouseOver,this);this.monitoringMouseOver=false;} +this.onMouseOut(e);}},onMouseOut:function(e){var internal=e.within(this.el)&&e.target!=this.el.dom;this.el.removeClass('x-btn-over');this.fireEvent('mouseout',this,e);if(this.isMenuTriggerOut(e,internal)){this.fireEvent('menutriggerout',this,this.menu,e);}},focus:function(){this.btnEl.focus();},blur:function(){this.btnEl.blur();},onFocus:function(e){if(!this.disabled){this.el.addClass('x-btn-focus');}},onBlur:function(e){this.el.removeClass('x-btn-focus');},getClickEl:function(e,isUp){return this.el;},onMouseDown:function(e){if(!this.disabled&&e.button===0){this.getClickEl(e).addClass('x-btn-click');this.doc.on('mouseup',this.onMouseUp,this);}},onMouseUp:function(e){if(e.button===0){this.getClickEl(e,true).removeClass('x-btn-click');this.doc.un('mouseup',this.onMouseUp,this);}},onMenuShow:function(e){if(this.menu.ownerCt==this){this.menu.ownerCt=this;this.ignoreNextClick=0;this.el.addClass('x-btn-menu-active');this.fireEvent('menushow',this,this.menu);}},onMenuHide:function(e){if(this.menu.ownerCt==this){this.el.removeClass('x-btn-menu-active');this.ignoreNextClick=this.restoreClick.defer(250,this);this.fireEvent('menuhide',this,this.menu);delete this.menu.ownerCt;}},restoreClick:function(){this.ignoreNextClick=0;}});Ext.reg('button',Ext.Button);Ext.ButtonToggleMgr=function(){var groups={};function toggleGroup(btn,state){if(state){var g=groups[btn.toggleGroup];for(var i=0,l=g.length;i<l;i++){if(g[i]!=btn){g[i].toggle(false);}}}} +return{register:function(btn){if(!btn.toggleGroup){return;} +var g=groups[btn.toggleGroup];if(!g){g=groups[btn.toggleGroup]=[];} +g.push(btn);btn.on('toggle',toggleGroup);},unregister:function(btn){if(!btn.toggleGroup){return;} +var g=groups[btn.toggleGroup];if(g){g.remove(btn);btn.un('toggle',toggleGroup);}},getPressed:function(group){var g=groups[group];if(g){for(var i=0,len=g.length;i<len;i++){if(g[i].pressed===true){return g[i];}}} +return null;}};}();Ext.SplitButton=Ext.extend(Ext.Button,{arrowSelector:'em',split:true,initComponent:function(){Ext.SplitButton.superclass.initComponent.call(this);this.addEvents("arrowclick");},onRender:function(){Ext.SplitButton.superclass.onRender.apply(this,arguments);if(this.arrowTooltip){this.el.child(this.arrowSelector).dom[this.tooltipType]=this.arrowTooltip;}},setArrowHandler:function(handler,scope){this.arrowHandler=handler;this.scope=scope;},getMenuClass:function(){return'x-btn-split'+(this.arrowAlign=='bottom'?'-bottom':'');},isClickOnArrow:function(e){if(this.arrowAlign!='bottom'){var visBtn=this.el.child('em.x-btn-split');var right=visBtn.getRegion().right-visBtn.getPadding('r');return e.getPageX()>right;}else{return e.getPageY()>this.btnEl.getRegion().bottom;}},onClick:function(e,t){e.preventDefault();if(!this.disabled){if(this.isClickOnArrow(e)){if(this.menu&&!this.menu.isVisible()&&!this.ignoreNextClick){this.showMenu();} +this.fireEvent("arrowclick",this,e);if(this.arrowHandler){this.arrowHandler.call(this.scope||this,this,e);}}else{this.doToggle();this.fireEvent("click",this,e);if(this.handler){this.handler.call(this.scope||this,this,e);}}}},isMenuTriggerOver:function(e){return this.menu&&e.target.tagName==this.arrowSelector;},isMenuTriggerOut:function(e,internal){return this.menu&&e.target.tagName!=this.arrowSelector;}});Ext.reg('splitbutton',Ext.SplitButton);Ext.CycleButton=Ext.extend(Ext.SplitButton,{getItemText:function(item){if(item&&this.showText===true){var text='';if(this.prependText){text+=this.prependText;} +text+=item.text;return text;} +return undefined;},setActiveItem:function(item,suppressEvent){if(!Ext.isObject(item)){item=this.menu.getComponent(item);} +if(item){if(!this.rendered){this.text=this.getItemText(item);this.iconCls=item.iconCls;}else{var t=this.getItemText(item);if(t){this.setText(t);} +this.setIconClass(item.iconCls);} +this.activeItem=item;if(!item.checked){item.setChecked(true,false);} +if(this.forceIcon){this.setIconClass(this.forceIcon);} +if(!suppressEvent){this.fireEvent('change',this,item);}}},getActiveItem:function(){return this.activeItem;},initComponent:function(){this.addEvents("change");if(this.changeHandler){this.on('change',this.changeHandler,this.scope||this);delete this.changeHandler;} +this.itemCount=this.items.length;this.menu={cls:'x-cycle-menu',items:[]};var checked=0;Ext.each(this.items,function(item,i){Ext.apply(item,{group:item.group||this.id,itemIndex:i,checkHandler:this.checkHandler,scope:this,checked:item.checked||false});this.menu.items.push(item);if(item.checked){checked=i;}},this);Ext.CycleButton.superclass.initComponent.call(this);this.on('click',this.toggleSelected,this);this.setActiveItem(checked,true);},checkHandler:function(item,pressed){if(pressed){this.setActiveItem(item);}},toggleSelected:function(){var m=this.menu;m.render();if(!m.hasLayout){m.doLayout();} +var nextIdx,checkItem;for(var i=1;i<this.itemCount;i++){nextIdx=(this.activeItem.itemIndex+i)%this.itemCount;checkItem=m.items.itemAt(nextIdx);if(!checkItem.disabled){checkItem.setChecked(true);break;}}}});Ext.reg('cycle',Ext.CycleButton);(function(){var Event=Ext.EventManager;var Dom=Ext.lib.Dom;Ext.dd.DragDrop=function(id,sGroup,config){if(id){this.init(id,sGroup,config);}};Ext.dd.DragDrop.prototype={id:null,config:null,dragElId:null,handleElId:null,invalidHandleTypes:null,invalidHandleIds:null,invalidHandleClasses:null,startPageX:0,startPageY:0,groups:null,locked:false,lock:function(){this.locked=true;},moveOnly:false,unlock:function(){this.locked=false;},isTarget:true,padding:null,_domRef:null,__ygDragDrop:true,constrainX:false,constrainY:false,minX:0,maxX:0,minY:0,maxY:0,maintainOffset:false,xTicks:null,yTicks:null,primaryButtonOnly:true,available:false,hasOuterHandles:false,b4StartDrag:function(x,y){},startDrag:function(x,y){},b4Drag:function(e){},onDrag:function(e){},onDragEnter:function(e,id){},b4DragOver:function(e){},onDragOver:function(e,id){},b4DragOut:function(e){},onDragOut:function(e,id){},b4DragDrop:function(e){},onDragDrop:function(e,id){},onInvalidDrop:function(e){},b4EndDrag:function(e){},endDrag:function(e){},b4MouseDown:function(e){},onMouseDown:function(e){},onMouseUp:function(e){},onAvailable:function(){},defaultPadding:{left:0,right:0,top:0,bottom:0},constrainTo:function(constrainTo,pad,inContent){if(Ext.isNumber(pad)){pad={left:pad,right:pad,top:pad,bottom:pad};} +pad=pad||this.defaultPadding;var b=Ext.get(this.getEl()).getBox(),ce=Ext.get(constrainTo),s=ce.getScroll(),c,cd=ce.dom;if(cd==document.body){c={x:s.left,y:s.top,width:Ext.lib.Dom.getViewWidth(),height:Ext.lib.Dom.getViewHeight()};}else{var xy=ce.getXY();c={x:xy[0],y:xy[1],width:cd.clientWidth,height:cd.clientHeight};} +var topSpace=b.y-c.y,leftSpace=b.x-c.x;this.resetConstraints();this.setXConstraint(leftSpace-(pad.left||0),c.width-leftSpace-b.width-(pad.right||0),this.xTickSize);this.setYConstraint(topSpace-(pad.top||0),c.height-topSpace-b.height-(pad.bottom||0),this.yTickSize);},getEl:function(){if(!this._domRef){this._domRef=Ext.getDom(this.id);} +return this._domRef;},getDragEl:function(){return Ext.getDom(this.dragElId);},init:function(id,sGroup,config){this.initTarget(id,sGroup,config);Event.on(this.id,"mousedown",this.handleMouseDown,this);},initTarget:function(id,sGroup,config){this.config=config||{};this.DDM=Ext.dd.DDM;this.groups={};if(typeof id!=="string"){id=Ext.id(id);} +this.id=id;this.addToGroup((sGroup)?sGroup:"default");this.handleElId=id;this.setDragElId(id);this.invalidHandleTypes={A:"A"};this.invalidHandleIds={};this.invalidHandleClasses=[];this.applyConfig();this.handleOnAvailable();},applyConfig:function(){this.padding=this.config.padding||[0,0,0,0];this.isTarget=(this.config.isTarget!==false);this.maintainOffset=(this.config.maintainOffset);this.primaryButtonOnly=(this.config.primaryButtonOnly!==false);},handleOnAvailable:function(){this.available=true;this.resetConstraints();this.onAvailable();},setPadding:function(iTop,iRight,iBot,iLeft){if(!iRight&&0!==iRight){this.padding=[iTop,iTop,iTop,iTop];}else if(!iBot&&0!==iBot){this.padding=[iTop,iRight,iTop,iRight];}else{this.padding=[iTop,iRight,iBot,iLeft];}},setInitPosition:function(diffX,diffY){var el=this.getEl();if(!this.DDM.verifyEl(el)){return;} +var dx=diffX||0;var dy=diffY||0;var p=Dom.getXY(el);this.initPageX=p[0]-dx;this.initPageY=p[1]-dy;this.lastPageX=p[0];this.lastPageY=p[1];this.setStartPosition(p);},setStartPosition:function(pos){var p=pos||Dom.getXY(this.getEl());this.deltaSetXY=null;this.startPageX=p[0];this.startPageY=p[1];},addToGroup:function(sGroup){this.groups[sGroup]=true;this.DDM.regDragDrop(this,sGroup);},removeFromGroup:function(sGroup){if(this.groups[sGroup]){delete this.groups[sGroup];} +this.DDM.removeDDFromGroup(this,sGroup);},setDragElId:function(id){this.dragElId=id;},setHandleElId:function(id){if(typeof id!=="string"){id=Ext.id(id);} +this.handleElId=id;this.DDM.regHandle(this.id,id);},setOuterHandleElId:function(id){if(typeof id!=="string"){id=Ext.id(id);} +Event.on(id,"mousedown",this.handleMouseDown,this);this.setHandleElId(id);this.hasOuterHandles=true;},unreg:function(){Event.un(this.id,"mousedown",this.handleMouseDown);this._domRef=null;this.DDM._remove(this);},destroy:function(){this.unreg();},isLocked:function(){return(this.DDM.isLocked()||this.locked);},handleMouseDown:function(e,oDD){if(this.primaryButtonOnly&&e.button!=0){return;} +if(this.isLocked()){return;} +this.DDM.refreshCache(this.groups);var pt=new Ext.lib.Point(Ext.lib.Event.getPageX(e),Ext.lib.Event.getPageY(e));if(!this.hasOuterHandles&&!this.DDM.isOverTarget(pt,this)){}else{if(this.clickValidator(e)){this.setStartPosition();this.b4MouseDown(e);this.onMouseDown(e);this.DDM.handleMouseDown(e,this);this.DDM.stopEvent(e);}else{}}},clickValidator:function(e){var target=e.getTarget();return(this.isValidHandleChild(target)&&(this.id==this.handleElId||this.DDM.handleWasClicked(target,this.id)));},addInvalidHandleType:function(tagName){var type=tagName.toUpperCase();this.invalidHandleTypes[type]=type;},addInvalidHandleId:function(id){if(typeof id!=="string"){id=Ext.id(id);} +this.invalidHandleIds[id]=id;},addInvalidHandleClass:function(cssClass){this.invalidHandleClasses.push(cssClass);},removeInvalidHandleType:function(tagName){var type=tagName.toUpperCase();delete this.invalidHandleTypes[type];},removeInvalidHandleId:function(id){if(typeof id!=="string"){id=Ext.id(id);} +delete this.invalidHandleIds[id];},removeInvalidHandleClass:function(cssClass){for(var i=0,len=this.invalidHandleClasses.length;i<len;++i){if(this.invalidHandleClasses[i]==cssClass){delete this.invalidHandleClasses[i];}}},isValidHandleChild:function(node){var valid=true;var nodeName;try{nodeName=node.nodeName.toUpperCase();}catch(e){nodeName=node.nodeName;} +valid=valid&&!this.invalidHandleTypes[nodeName];valid=valid&&!this.invalidHandleIds[node.id];for(var i=0,len=this.invalidHandleClasses.length;valid&&i<len;++i){valid=!Ext.fly(node).hasClass(this.invalidHandleClasses[i]);} +return valid;},setXTicks:function(iStartX,iTickSize){this.xTicks=[];this.xTickSize=iTickSize;var tickMap={};for(var i=this.initPageX;i>=this.minX;i=i-iTickSize){if(!tickMap[i]){this.xTicks[this.xTicks.length]=i;tickMap[i]=true;}} +for(i=this.initPageX;i<=this.maxX;i=i+iTickSize){if(!tickMap[i]){this.xTicks[this.xTicks.length]=i;tickMap[i]=true;}} +this.xTicks.sort(this.DDM.numericSort);},setYTicks:function(iStartY,iTickSize){this.yTicks=[];this.yTickSize=iTickSize;var tickMap={};for(var i=this.initPageY;i>=this.minY;i=i-iTickSize){if(!tickMap[i]){this.yTicks[this.yTicks.length]=i;tickMap[i]=true;}} +for(i=this.initPageY;i<=this.maxY;i=i+iTickSize){if(!tickMap[i]){this.yTicks[this.yTicks.length]=i;tickMap[i]=true;}} +this.yTicks.sort(this.DDM.numericSort);},setXConstraint:function(iLeft,iRight,iTickSize){this.leftConstraint=iLeft;this.rightConstraint=iRight;this.minX=this.initPageX-iLeft;this.maxX=this.initPageX+iRight;if(iTickSize){this.setXTicks(this.initPageX,iTickSize);} +this.constrainX=true;},clearConstraints:function(){this.constrainX=false;this.constrainY=false;this.clearTicks();},clearTicks:function(){this.xTicks=null;this.yTicks=null;this.xTickSize=0;this.yTickSize=0;},setYConstraint:function(iUp,iDown,iTickSize){this.topConstraint=iUp;this.bottomConstraint=iDown;this.minY=this.initPageY-iUp;this.maxY=this.initPageY+iDown;if(iTickSize){this.setYTicks(this.initPageY,iTickSize);} +this.constrainY=true;},resetConstraints:function(){if(this.initPageX||this.initPageX===0){var dx=(this.maintainOffset)?this.lastPageX-this.initPageX:0;var dy=(this.maintainOffset)?this.lastPageY-this.initPageY:0;this.setInitPosition(dx,dy);}else{this.setInitPosition();} +if(this.constrainX){this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize);} +if(this.constrainY){this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize);}},getTick:function(val,tickArray){if(!tickArray){return val;}else if(tickArray[0]>=val){return tickArray[0];}else{for(var i=0,len=tickArray.length;i<len;++i){var next=i+1;if(tickArray[next]&&tickArray[next]>=val){var diff1=val-tickArray[i];var diff2=tickArray[next]-val;return(diff2>diff1)?tickArray[i]:tickArray[next];}} +return tickArray[tickArray.length-1];}},toString:function(){return("DragDrop "+this.id);}};})();if(!Ext.dd.DragDropMgr){Ext.dd.DragDropMgr=function(){var Event=Ext.EventManager;return{ids:{},handleIds:{},dragCurrent:null,dragOvers:{},deltaX:0,deltaY:0,preventDefault:true,stopPropagation:true,initialized:false,locked:false,init:function(){this.initialized=true;},POINT:0,INTERSECT:1,mode:0,_execOnAll:function(sMethod,args){for(var i in this.ids){for(var j in this.ids[i]){var oDD=this.ids[i][j];if(!this.isTypeOfDD(oDD)){continue;} +oDD[sMethod].apply(oDD,args);}}},_onLoad:function(){this.init();Event.on(document,"mouseup",this.handleMouseUp,this,true);Event.on(document,"mousemove",this.handleMouseMove,this,true);Event.on(window,"unload",this._onUnload,this,true);Event.on(window,"resize",this._onResize,this,true);},_onResize:function(e){this._execOnAll("resetConstraints",[]);},lock:function(){this.locked=true;},unlock:function(){this.locked=false;},isLocked:function(){return this.locked;},locationCache:{},useCache:true,clickPixelThresh:3,clickTimeThresh:350,dragThreshMet:false,clickTimeout:null,startX:0,startY:0,regDragDrop:function(oDD,sGroup){if(!this.initialized){this.init();} +if(!this.ids[sGroup]){this.ids[sGroup]={};} +this.ids[sGroup][oDD.id]=oDD;},removeDDFromGroup:function(oDD,sGroup){if(!this.ids[sGroup]){this.ids[sGroup]={};} +var obj=this.ids[sGroup];if(obj&&obj[oDD.id]){delete obj[oDD.id];}},_remove:function(oDD){for(var g in oDD.groups){if(g&&this.ids[g]&&this.ids[g][oDD.id]){delete this.ids[g][oDD.id];}} +delete this.handleIds[oDD.id];},regHandle:function(sDDId,sHandleId){if(!this.handleIds[sDDId]){this.handleIds[sDDId]={};} +this.handleIds[sDDId][sHandleId]=sHandleId;},isDragDrop:function(id){return(this.getDDById(id))?true:false;},getRelated:function(p_oDD,bTargetsOnly){var oDDs=[];for(var i in p_oDD.groups){for(var j in this.ids[i]){var dd=this.ids[i][j];if(!this.isTypeOfDD(dd)){continue;} +if(!bTargetsOnly||dd.isTarget){oDDs[oDDs.length]=dd;}}} +return oDDs;},isLegalTarget:function(oDD,oTargetDD){var targets=this.getRelated(oDD,true);for(var i=0,len=targets.length;i<len;++i){if(targets[i].id==oTargetDD.id){return true;}} +return false;},isTypeOfDD:function(oDD){return(oDD&&oDD.__ygDragDrop);},isHandle:function(sDDId,sHandleId){return(this.handleIds[sDDId]&&this.handleIds[sDDId][sHandleId]);},getDDById:function(id){for(var i in this.ids){if(this.ids[i][id]){return this.ids[i][id];}} +return null;},handleMouseDown:function(e,oDD){if(Ext.QuickTips){Ext.QuickTips.ddDisable();} +if(this.dragCurrent){this.handleMouseUp(e);} +this.currentTarget=e.getTarget();this.dragCurrent=oDD;var el=oDD.getEl();this.startX=e.getPageX();this.startY=e.getPageY();this.deltaX=this.startX-el.offsetLeft;this.deltaY=this.startY-el.offsetTop;this.dragThreshMet=false;this.clickTimeout=setTimeout(function(){var DDM=Ext.dd.DDM;DDM.startDrag(DDM.startX,DDM.startY);},this.clickTimeThresh);},startDrag:function(x,y){clearTimeout(this.clickTimeout);if(this.dragCurrent){this.dragCurrent.b4StartDrag(x,y);this.dragCurrent.startDrag(x,y);} +this.dragThreshMet=true;},handleMouseUp:function(e){if(Ext.QuickTips){Ext.QuickTips.ddEnable();} +if(!this.dragCurrent){return;} +clearTimeout(this.clickTimeout);if(this.dragThreshMet){this.fireEvents(e,true);}else{} +this.stopDrag(e);this.stopEvent(e);},stopEvent:function(e){if(this.stopPropagation){e.stopPropagation();} +if(this.preventDefault){e.preventDefault();}},stopDrag:function(e){if(this.dragCurrent){if(this.dragThreshMet){this.dragCurrent.b4EndDrag(e);this.dragCurrent.endDrag(e);} +this.dragCurrent.onMouseUp(e);} +this.dragCurrent=null;this.dragOvers={};},handleMouseMove:function(e){if(!this.dragCurrent){return true;} +if(Ext.isIE&&(e.button!==0&&e.button!==1&&e.button!==2)){this.stopEvent(e);return this.handleMouseUp(e);} +if(!this.dragThreshMet){var diffX=Math.abs(this.startX-e.getPageX());var diffY=Math.abs(this.startY-e.getPageY());if(diffX>this.clickPixelThresh||diffY>this.clickPixelThresh){this.startDrag(this.startX,this.startY);}} +if(this.dragThreshMet){this.dragCurrent.b4Drag(e);this.dragCurrent.onDrag(e);if(!this.dragCurrent.moveOnly){this.fireEvents(e,false);}} +this.stopEvent(e);return true;},fireEvents:function(e,isDrop){var dc=this.dragCurrent;if(!dc||dc.isLocked()){return;} +var pt=e.getPoint();var oldOvers=[];var outEvts=[];var overEvts=[];var dropEvts=[];var enterEvts=[];for(var i in this.dragOvers){var ddo=this.dragOvers[i];if(!this.isTypeOfDD(ddo)){continue;} +if(!this.isOverTarget(pt,ddo,this.mode)){outEvts.push(ddo);} +oldOvers[i]=true;delete this.dragOvers[i];} +for(var sGroup in dc.groups){if("string"!=typeof sGroup){continue;} +for(i in this.ids[sGroup]){var oDD=this.ids[sGroup][i];if(!this.isTypeOfDD(oDD)){continue;} +if(oDD.isTarget&&!oDD.isLocked()&&((oDD!=dc)||(dc.ignoreSelf===false))){if(this.isOverTarget(pt,oDD,this.mode)){if(isDrop){dropEvts.push(oDD);}else{if(!oldOvers[oDD.id]){enterEvts.push(oDD);}else{overEvts.push(oDD);} +this.dragOvers[oDD.id]=oDD;}}}}} +if(this.mode){if(outEvts.length){dc.b4DragOut(e,outEvts);dc.onDragOut(e,outEvts);} +if(enterEvts.length){dc.onDragEnter(e,enterEvts);} +if(overEvts.length){dc.b4DragOver(e,overEvts);dc.onDragOver(e,overEvts);} +if(dropEvts.length){dc.b4DragDrop(e,dropEvts);dc.onDragDrop(e,dropEvts);}}else{var len=0;for(i=0,len=outEvts.length;i<len;++i){dc.b4DragOut(e,outEvts[i].id);dc.onDragOut(e,outEvts[i].id);} +for(i=0,len=enterEvts.length;i<len;++i){dc.onDragEnter(e,enterEvts[i].id);} +for(i=0,len=overEvts.length;i<len;++i){dc.b4DragOver(e,overEvts[i].id);dc.onDragOver(e,overEvts[i].id);} +for(i=0,len=dropEvts.length;i<len;++i){dc.b4DragDrop(e,dropEvts[i].id);dc.onDragDrop(e,dropEvts[i].id);}} +if(isDrop&&!dropEvts.length){dc.onInvalidDrop(e);}},getBestMatch:function(dds){var winner=null;var len=dds.length;if(len==1){winner=dds[0];}else{for(var i=0;i<len;++i){var dd=dds[i];if(dd.cursorIsOver){winner=dd;break;}else{if(!winner||winner.overlap.getArea()<dd.overlap.getArea()){winner=dd;}}}} +return winner;},refreshCache:function(groups){for(var sGroup in groups){if("string"!=typeof sGroup){continue;} +for(var i in this.ids[sGroup]){var oDD=this.ids[sGroup][i];if(this.isTypeOfDD(oDD)){var loc=this.getLocation(oDD);if(loc){this.locationCache[oDD.id]=loc;}else{delete this.locationCache[oDD.id];}}}}},verifyEl:function(el){if(el){var parent;if(Ext.isIE){try{parent=el.offsetParent;}catch(e){}}else{parent=el.offsetParent;} +if(parent){return true;}} +return false;},getLocation:function(oDD){if(!this.isTypeOfDD(oDD)){return null;} +var el=oDD.getEl(),pos,x1,x2,y1,y2,t,r,b,l;try{pos=Ext.lib.Dom.getXY(el);}catch(e){} +if(!pos){return null;} +x1=pos[0];x2=x1+el.offsetWidth;y1=pos[1];y2=y1+el.offsetHeight;t=y1-oDD.padding[0];r=x2+oDD.padding[1];b=y2+oDD.padding[2];l=x1-oDD.padding[3];return new Ext.lib.Region(t,r,b,l);},isOverTarget:function(pt,oTarget,intersect){var loc=this.locationCache[oTarget.id];if(!loc||!this.useCache){loc=this.getLocation(oTarget);this.locationCache[oTarget.id]=loc;} +if(!loc){return false;} +oTarget.cursorIsOver=loc.contains(pt);var dc=this.dragCurrent;if(!dc||!dc.getTargetCoord||(!intersect&&!dc.constrainX&&!dc.constrainY)){return oTarget.cursorIsOver;} +oTarget.overlap=null;var pos=dc.getTargetCoord(pt.x,pt.y);var el=dc.getDragEl();var curRegion=new Ext.lib.Region(pos.y,pos.x+el.offsetWidth,pos.y+el.offsetHeight,pos.x);var overlap=curRegion.intersect(loc);if(overlap){oTarget.overlap=overlap;return(intersect)?true:oTarget.cursorIsOver;}else{return false;}},_onUnload:function(e,me){Ext.dd.DragDropMgr.unregAll();},unregAll:function(){if(this.dragCurrent){this.stopDrag();this.dragCurrent=null;} +this._execOnAll("unreg",[]);for(var i in this.elementCache){delete this.elementCache[i];} +this.elementCache={};this.ids={};},elementCache:{},getElWrapper:function(id){var oWrapper=this.elementCache[id];if(!oWrapper||!oWrapper.el){oWrapper=this.elementCache[id]=new this.ElementWrapper(Ext.getDom(id));} +return oWrapper;},getElement:function(id){return Ext.getDom(id);},getCss:function(id){var el=Ext.getDom(id);return(el)?el.style:null;},ElementWrapper:function(el){this.el=el||null;this.id=this.el&&el.id;this.css=this.el&&el.style;},getPosX:function(el){return Ext.lib.Dom.getX(el);},getPosY:function(el){return Ext.lib.Dom.getY(el);},swapNode:function(n1,n2){if(n1.swapNode){n1.swapNode(n2);}else{var p=n2.parentNode;var s=n2.nextSibling;if(s==n1){p.insertBefore(n1,n2);}else if(n2==n1.nextSibling){p.insertBefore(n2,n1);}else{n1.parentNode.replaceChild(n2,n1);p.insertBefore(n1,s);}}},getScroll:function(){var t,l,dde=document.documentElement,db=document.body;if(dde&&(dde.scrollTop||dde.scrollLeft)){t=dde.scrollTop;l=dde.scrollLeft;}else if(db){t=db.scrollTop;l=db.scrollLeft;}else{} +return{top:t,left:l};},getStyle:function(el,styleProp){return Ext.fly(el).getStyle(styleProp);},getScrollTop:function(){return this.getScroll().top;},getScrollLeft:function(){return this.getScroll().left;},moveToEl:function(moveEl,targetEl){var aCoord=Ext.lib.Dom.getXY(targetEl);Ext.lib.Dom.setXY(moveEl,aCoord);},numericSort:function(a,b){return(a-b);},_timeoutCount:0,_addListeners:function(){var DDM=Ext.dd.DDM;if(Ext.lib.Event&&document){DDM._onLoad();}else{if(DDM._timeoutCount>2000){}else{setTimeout(DDM._addListeners,10);if(document&&document.body){DDM._timeoutCount+=1;}}}},handleWasClicked:function(node,id){if(this.isHandle(id,node.id)){return true;}else{var p=node.parentNode;while(p){if(this.isHandle(id,p.id)){return true;}else{p=p.parentNode;}}} +return false;}};}();Ext.dd.DDM=Ext.dd.DragDropMgr;Ext.dd.DDM._addListeners();} +Ext.dd.DD=function(id,sGroup,config){if(id){this.init(id,sGroup,config);}};Ext.extend(Ext.dd.DD,Ext.dd.DragDrop,{scroll:true,autoOffset:function(iPageX,iPageY){var x=iPageX-this.startPageX;var y=iPageY-this.startPageY;this.setDelta(x,y);},setDelta:function(iDeltaX,iDeltaY){this.deltaX=iDeltaX;this.deltaY=iDeltaY;},setDragElPos:function(iPageX,iPageY){var el=this.getDragEl();this.alignElWithMouse(el,iPageX,iPageY);},alignElWithMouse:function(el,iPageX,iPageY){var oCoord=this.getTargetCoord(iPageX,iPageY);var fly=el.dom?el:Ext.fly(el,'_dd');if(!this.deltaSetXY){var aCoord=[oCoord.x,oCoord.y];fly.setXY(aCoord);var newLeft=fly.getLeft(true);var newTop=fly.getTop(true);this.deltaSetXY=[newLeft-oCoord.x,newTop-oCoord.y];}else{fly.setLeftTop(oCoord.x+this.deltaSetXY[0],oCoord.y+this.deltaSetXY[1]);} +this.cachePosition(oCoord.x,oCoord.y);this.autoScroll(oCoord.x,oCoord.y,el.offsetHeight,el.offsetWidth);return oCoord;},cachePosition:function(iPageX,iPageY){if(iPageX){this.lastPageX=iPageX;this.lastPageY=iPageY;}else{var aCoord=Ext.lib.Dom.getXY(this.getEl());this.lastPageX=aCoord[0];this.lastPageY=aCoord[1];}},autoScroll:function(x,y,h,w){if(this.scroll){var clientH=Ext.lib.Dom.getViewHeight();var clientW=Ext.lib.Dom.getViewWidth();var st=this.DDM.getScrollTop();var sl=this.DDM.getScrollLeft();var bot=h+y;var right=w+x;var toBot=(clientH+st-y-this.deltaY);var toRight=(clientW+sl-x-this.deltaX);var thresh=40;var scrAmt=(document.all)?80:30;if(bot>clientH&&toBot<thresh){window.scrollTo(sl,st+scrAmt);} +if(y<st&&st>0&&y-st<thresh){window.scrollTo(sl,st-scrAmt);} +if(right>clientW&&toRight<thresh){window.scrollTo(sl+scrAmt,st);} +if(x<sl&&sl>0&&x-sl<thresh){window.scrollTo(sl-scrAmt,st);}}},getTargetCoord:function(iPageX,iPageY){var x=iPageX-this.deltaX;var y=iPageY-this.deltaY;if(this.constrainX){if(x<this.minX){x=this.minX;} +if(x>this.maxX){x=this.maxX;}} +if(this.constrainY){if(y<this.minY){y=this.minY;} +if(y>this.maxY){y=this.maxY;}} +x=this.getTick(x,this.xTicks);y=this.getTick(y,this.yTicks);return{x:x,y:y};},applyConfig:function(){Ext.dd.DD.superclass.applyConfig.call(this);this.scroll=(this.config.scroll!==false);},b4MouseDown:function(e){this.autoOffset(e.getPageX(),e.getPageY());},b4Drag:function(e){this.setDragElPos(e.getPageX(),e.getPageY());},toString:function(){return("DD "+this.id);}});Ext.dd.DDProxy=function(id,sGroup,config){if(id){this.init(id,sGroup,config);this.initFrame();}};Ext.dd.DDProxy.dragElId="ygddfdiv";Ext.extend(Ext.dd.DDProxy,Ext.dd.DD,{resizeFrame:true,centerFrame:false,createFrame:function(){var self=this;var body=document.body;if(!body||!body.firstChild){setTimeout(function(){self.createFrame();},50);return;} +var div=this.getDragEl();if(!div){div=document.createElement("div");div.id=this.dragElId;var s=div.style;s.position="absolute";s.visibility="hidden";s.cursor="move";s.border="2px solid #aaa";s.zIndex=999;body.insertBefore(div,body.firstChild);}},initFrame:function(){this.createFrame();},applyConfig:function(){Ext.dd.DDProxy.superclass.applyConfig.call(this);this.resizeFrame=(this.config.resizeFrame!==false);this.centerFrame=(this.config.centerFrame);this.setDragElId(this.config.dragElId||Ext.dd.DDProxy.dragElId);},showFrame:function(iPageX,iPageY){var el=this.getEl();var dragEl=this.getDragEl();var s=dragEl.style;this._resizeProxy();if(this.centerFrame){this.setDelta(Math.round(parseInt(s.width,10)/2),Math.round(parseInt(s.height,10)/2));} +this.setDragElPos(iPageX,iPageY);Ext.fly(dragEl).show();},_resizeProxy:function(){if(this.resizeFrame){var el=this.getEl();Ext.fly(this.getDragEl()).setSize(el.offsetWidth,el.offsetHeight);}},b4MouseDown:function(e){var x=e.getPageX();var y=e.getPageY();this.autoOffset(x,y);this.setDragElPos(x,y);},b4StartDrag:function(x,y){this.showFrame(x,y);},b4EndDrag:function(e){Ext.fly(this.getDragEl()).hide();},endDrag:function(e){var lel=this.getEl();var del=this.getDragEl();del.style.visibility="";this.beforeMove();lel.style.visibility="hidden";Ext.dd.DDM.moveToEl(lel,del);del.style.visibility="hidden";lel.style.visibility="";this.afterDrag();},beforeMove:function(){},afterDrag:function(){},toString:function(){return("DDProxy "+this.id);}});Ext.dd.DDTarget=function(id,sGroup,config){if(id){this.initTarget(id,sGroup,config);}};Ext.extend(Ext.dd.DDTarget,Ext.dd.DragDrop,{getDragEl:Ext.emptyFn,isValidHandleChild:Ext.emptyFn,startDrag:Ext.emptyFn,endDrag:Ext.emptyFn,onDrag:Ext.emptyFn,onDragDrop:Ext.emptyFn,onDragEnter:Ext.emptyFn,onDragOut:Ext.emptyFn,onDragOver:Ext.emptyFn,onInvalidDrop:Ext.emptyFn,onMouseDown:Ext.emptyFn,onMouseUp:Ext.emptyFn,setXConstraint:Ext.emptyFn,setYConstraint:Ext.emptyFn,resetConstraints:Ext.emptyFn,clearConstraints:Ext.emptyFn,clearTicks:Ext.emptyFn,setInitPosition:Ext.emptyFn,setDragElId:Ext.emptyFn,setHandleElId:Ext.emptyFn,setOuterHandleElId:Ext.emptyFn,addInvalidHandleClass:Ext.emptyFn,addInvalidHandleId:Ext.emptyFn,addInvalidHandleType:Ext.emptyFn,removeInvalidHandleClass:Ext.emptyFn,removeInvalidHandleId:Ext.emptyFn,removeInvalidHandleType:Ext.emptyFn,toString:function(){return("DDTarget "+this.id);}});Ext.dd.DragTracker=Ext.extend(Ext.util.Observable,{active:false,tolerance:5,autoStart:false,constructor:function(config){Ext.apply(this,config);this.addEvents('mousedown','mouseup','mousemove','dragstart','dragend','drag');this.dragRegion=new Ext.lib.Region(0,0,0,0);if(this.el){this.initEl(this.el);} +Ext.dd.DragTracker.superclass.constructor.call(this,config);},initEl:function(el){this.el=Ext.get(el);el.on('mousedown',this.onMouseDown,this,this.delegate?{delegate:this.delegate}:undefined);},destroy:function(){this.el.un('mousedown',this.onMouseDown,this);delete this.el;},onMouseDown:function(e,target){if(this.fireEvent('mousedown',this,e)!==false&&this.onBeforeStart(e)!==false){this.startXY=this.lastXY=e.getXY();this.dragTarget=this.delegate?target:this.el.dom;if(this.preventDefault!==false){e.preventDefault();} +Ext.getDoc().on({scope:this,mouseup:this.onMouseUp,mousemove:this.onMouseMove,selectstart:this.stopSelect});if(this.autoStart){this.timer=this.triggerStart.defer(this.autoStart===true?1000:this.autoStart,this,[e]);}}},onMouseMove:function(e,target){if(this.active&&Ext.isIE&&!e.browserEvent.button){e.preventDefault();this.onMouseUp(e);return;} +e.preventDefault();var xy=e.getXY(),s=this.startXY;this.lastXY=xy;if(!this.active){if(Math.abs(s[0]-xy[0])>this.tolerance||Math.abs(s[1]-xy[1])>this.tolerance){this.triggerStart(e);}else{return;}} +this.fireEvent('mousemove',this,e);this.onDrag(e);this.fireEvent('drag',this,e);},onMouseUp:function(e){var doc=Ext.getDoc(),wasActive=this.active;doc.un('mousemove',this.onMouseMove,this);doc.un('mouseup',this.onMouseUp,this);doc.un('selectstart',this.stopSelect,this);e.preventDefault();this.clearStart();this.active=false;delete this.elRegion;this.fireEvent('mouseup',this,e);if(wasActive){this.onEnd(e);this.fireEvent('dragend',this,e);}},triggerStart:function(e){this.clearStart();this.active=true;this.onStart(e);this.fireEvent('dragstart',this,e);},clearStart:function(){if(this.timer){clearTimeout(this.timer);delete this.timer;}},stopSelect:function(e){e.stopEvent();return false;},onBeforeStart:function(e){},onStart:function(xy){},onDrag:function(e){},onEnd:function(e){},getDragTarget:function(){return this.dragTarget;},getDragCt:function(){return this.el;},getXY:function(constrain){return constrain?this.constrainModes[constrain].call(this,this.lastXY):this.lastXY;},getOffset:function(constrain){var xy=this.getXY(constrain),s=this.startXY;return[s[0]-xy[0],s[1]-xy[1]];},constrainModes:{'point':function(xy){if(!this.elRegion){this.elRegion=this.getDragCt().getRegion();} +var dr=this.dragRegion;dr.left=xy[0];dr.top=xy[1];dr.right=xy[0];dr.bottom=xy[1];dr.constrainTo(this.elRegion);return[dr.left,dr.top];}}});Ext.dd.ScrollManager=function(){var ddm=Ext.dd.DragDropMgr;var els={};var dragEl=null;var proc={};var onStop=function(e){dragEl=null;clearProc();};var triggerRefresh=function(){if(ddm.dragCurrent){ddm.refreshCache(ddm.dragCurrent.groups);}};var doScroll=function(){if(ddm.dragCurrent){var dds=Ext.dd.ScrollManager;var inc=proc.el.ddScrollConfig?proc.el.ddScrollConfig.increment:dds.increment;if(!dds.animate){if(proc.el.scroll(proc.dir,inc)){triggerRefresh();}}else{proc.el.scroll(proc.dir,inc,true,dds.animDuration,triggerRefresh);}}};var clearProc=function(){if(proc.id){clearInterval(proc.id);} +proc.id=0;proc.el=null;proc.dir="";};var startProc=function(el,dir){clearProc();proc.el=el;proc.dir=dir;var group=el.ddScrollConfig?el.ddScrollConfig.ddGroup:undefined,freq=(el.ddScrollConfig&&el.ddScrollConfig.frequency)?el.ddScrollConfig.frequency:Ext.dd.ScrollManager.frequency;if(group===undefined||ddm.dragCurrent.ddGroup==group){proc.id=setInterval(doScroll,freq);}};var onFire=function(e,isDrop){if(isDrop||!ddm.dragCurrent){return;} +var dds=Ext.dd.ScrollManager;if(!dragEl||dragEl!=ddm.dragCurrent){dragEl=ddm.dragCurrent;dds.refreshCache();} +var xy=Ext.lib.Event.getXY(e);var pt=new Ext.lib.Point(xy[0],xy[1]);for(var id in els){var el=els[id],r=el._region;var c=el.ddScrollConfig?el.ddScrollConfig:dds;if(r&&r.contains(pt)&&el.isScrollable()){if(r.bottom-pt.y<=c.vthresh){if(proc.el!=el){startProc(el,"down");} +return;}else if(r.right-pt.x<=c.hthresh){if(proc.el!=el){startProc(el,"left");} +return;}else if(pt.y-r.top<=c.vthresh){if(proc.el!=el){startProc(el,"up");} +return;}else if(pt.x-r.left<=c.hthresh){if(proc.el!=el){startProc(el,"right");} +return;}}} +clearProc();};ddm.fireEvents=ddm.fireEvents.createSequence(onFire,ddm);ddm.stopDrag=ddm.stopDrag.createSequence(onStop,ddm);return{register:function(el){if(Ext.isArray(el)){for(var i=0,len=el.length;i<len;i++){this.register(el[i]);}}else{el=Ext.get(el);els[el.id]=el;}},unregister:function(el){if(Ext.isArray(el)){for(var i=0,len=el.length;i<len;i++){this.unregister(el[i]);}}else{el=Ext.get(el);delete els[el.id];}},vthresh:25,hthresh:25,increment:100,frequency:500,animate:true,animDuration:.4,ddGroup:undefined,refreshCache:function(){for(var id in els){if(typeof els[id]=='object'){els[id]._region=els[id].getRegion();}}}};}();Ext.dd.Registry=function(){var elements={};var handles={};var autoIdSeed=0;var getId=function(el,autogen){if(typeof el=="string"){return el;} +var id=el.id;if(!id&&autogen!==false){id="extdd-"+(++autoIdSeed);el.id=id;} +return id;};return{register:function(el,data){data=data||{};if(typeof el=="string"){el=document.getElementById(el);} +data.ddel=el;elements[getId(el)]=data;if(data.isHandle!==false){handles[data.ddel.id]=data;} +if(data.handles){var hs=data.handles;for(var i=0,len=hs.length;i<len;i++){handles[getId(hs[i])]=data;}}},unregister:function(el){var id=getId(el,false);var data=elements[id];if(data){delete elements[id];if(data.handles){var hs=data.handles;for(var i=0,len=hs.length;i<len;i++){delete handles[getId(hs[i],false)];}}}},getHandle:function(id){if(typeof id!="string"){id=id.id;} +return handles[id];},getHandleFromEvent:function(e){var t=Ext.lib.Event.getTarget(e);return t?handles[t.id]:null;},getTarget:function(id){if(typeof id!="string"){id=id.id;} +return elements[id];},getTargetFromEvent:function(e){var t=Ext.lib.Event.getTarget(e);return t?elements[t.id]||handles[t.id]:null;}};}();Ext.dd.StatusProxy=function(config){Ext.apply(this,config);this.id=this.id||Ext.id();this.el=new Ext.Layer({dh:{id:this.id,tag:"div",cls:"x-dd-drag-proxy "+this.dropNotAllowed,children:[{tag:"div",cls:"x-dd-drop-icon"},{tag:"div",cls:"x-dd-drag-ghost"}]},shadow:!config||config.shadow!==false});this.ghost=Ext.get(this.el.dom.childNodes[1]);this.dropStatus=this.dropNotAllowed;};Ext.dd.StatusProxy.prototype={dropAllowed:"x-dd-drop-ok",dropNotAllowed:"x-dd-drop-nodrop",setStatus:function(cssClass){cssClass=cssClass||this.dropNotAllowed;if(this.dropStatus!=cssClass){this.el.replaceClass(this.dropStatus,cssClass);this.dropStatus=cssClass;}},reset:function(clearGhost){this.el.dom.className="x-dd-drag-proxy "+this.dropNotAllowed;this.dropStatus=this.dropNotAllowed;if(clearGhost){this.ghost.update("");}},update:function(html){if(typeof html=="string"){this.ghost.update(html);}else{this.ghost.update("");html.style.margin="0";this.ghost.dom.appendChild(html);} +var el=this.ghost.dom.firstChild;if(el){Ext.fly(el).setStyle('float','none');}},getEl:function(){return this.el;},getGhost:function(){return this.ghost;},hide:function(clear){this.el.hide();if(clear){this.reset(true);}},stop:function(){if(this.anim&&this.anim.isAnimated&&this.anim.isAnimated()){this.anim.stop();}},show:function(){this.el.show();},sync:function(){this.el.sync();},repair:function(xy,callback,scope){this.callback=callback;this.scope=scope;if(xy&&this.animRepair!==false){this.el.addClass("x-dd-drag-repair");this.el.hideUnders(true);this.anim=this.el.shift({duration:this.repairDuration||.5,easing:'easeOut',xy:xy,stopFx:true,callback:this.afterRepair,scope:this});}else{this.afterRepair();}},afterRepair:function(){this.hide(true);if(typeof this.callback=="function"){this.callback.call(this.scope||this);} +this.callback=null;this.scope=null;},destroy:function(){Ext.destroy(this.ghost,this.el);}};Ext.dd.DragSource=function(el,config){this.el=Ext.get(el);if(!this.dragData){this.dragData={};} +Ext.apply(this,config);if(!this.proxy){this.proxy=new Ext.dd.StatusProxy();} +Ext.dd.DragSource.superclass.constructor.call(this,this.el.dom,this.ddGroup||this.group,{dragElId:this.proxy.id,resizeFrame:false,isTarget:false,scroll:this.scroll===true});this.dragging=false;};Ext.extend(Ext.dd.DragSource,Ext.dd.DDProxy,{dropAllowed:"x-dd-drop-ok",dropNotAllowed:"x-dd-drop-nodrop",getDragData:function(e){return this.dragData;},onDragEnter:function(e,id){var target=Ext.dd.DragDropMgr.getDDById(id);this.cachedTarget=target;if(this.beforeDragEnter(target,e,id)!==false){if(target.isNotifyTarget){var status=target.notifyEnter(this,e,this.dragData);this.proxy.setStatus(status);}else{this.proxy.setStatus(this.dropAllowed);} +if(this.afterDragEnter){this.afterDragEnter(target,e,id);}}},beforeDragEnter:function(target,e,id){return true;},alignElWithMouse:function(){Ext.dd.DragSource.superclass.alignElWithMouse.apply(this,arguments);this.proxy.sync();},onDragOver:function(e,id){var target=this.cachedTarget||Ext.dd.DragDropMgr.getDDById(id);if(this.beforeDragOver(target,e,id)!==false){if(target.isNotifyTarget){var status=target.notifyOver(this,e,this.dragData);this.proxy.setStatus(status);} +if(this.afterDragOver){this.afterDragOver(target,e,id);}}},beforeDragOver:function(target,e,id){return true;},onDragOut:function(e,id){var target=this.cachedTarget||Ext.dd.DragDropMgr.getDDById(id);if(this.beforeDragOut(target,e,id)!==false){if(target.isNotifyTarget){target.notifyOut(this,e,this.dragData);} +this.proxy.reset();if(this.afterDragOut){this.afterDragOut(target,e,id);}} +this.cachedTarget=null;},beforeDragOut:function(target,e,id){return true;},onDragDrop:function(e,id){var target=this.cachedTarget||Ext.dd.DragDropMgr.getDDById(id);if(this.beforeDragDrop(target,e,id)!==false){if(target.isNotifyTarget){if(target.notifyDrop(this,e,this.dragData)){this.onValidDrop(target,e,id);}else{this.onInvalidDrop(target,e,id);}}else{this.onValidDrop(target,e,id);} +if(this.afterDragDrop){this.afterDragDrop(target,e,id);}} +delete this.cachedTarget;},beforeDragDrop:function(target,e,id){return true;},onValidDrop:function(target,e,id){this.hideProxy();if(this.afterValidDrop){this.afterValidDrop(target,e,id);}},getRepairXY:function(e,data){return this.el.getXY();},onInvalidDrop:function(target,e,id){this.beforeInvalidDrop(target,e,id);if(this.cachedTarget){if(this.cachedTarget.isNotifyTarget){this.cachedTarget.notifyOut(this,e,this.dragData);} +this.cacheTarget=null;} +this.proxy.repair(this.getRepairXY(e,this.dragData),this.afterRepair,this);if(this.afterInvalidDrop){this.afterInvalidDrop(e,id);}},afterRepair:function(){if(Ext.enableFx){this.el.highlight(this.hlColor||"c3daf9");} +this.dragging=false;},beforeInvalidDrop:function(target,e,id){return true;},handleMouseDown:function(e){if(this.dragging){return;} +var data=this.getDragData(e);if(data&&this.onBeforeDrag(data,e)!==false){this.dragData=data;this.proxy.stop();Ext.dd.DragSource.superclass.handleMouseDown.apply(this,arguments);}},onBeforeDrag:function(data,e){return true;},onStartDrag:Ext.emptyFn,startDrag:function(x,y){this.proxy.reset();this.dragging=true;this.proxy.update("");this.onInitDrag(x,y);this.proxy.show();},onInitDrag:function(x,y){var clone=this.el.dom.cloneNode(true);clone.id=Ext.id();this.proxy.update(clone);this.onStartDrag(x,y);return true;},getProxy:function(){return this.proxy;},hideProxy:function(){this.proxy.hide();this.proxy.reset(true);this.dragging=false;},triggerCacheRefresh:function(){Ext.dd.DDM.refreshCache(this.groups);},b4EndDrag:function(e){},endDrag:function(e){this.onEndDrag(this.dragData,e);},onEndDrag:function(data,e){},autoOffset:function(x,y){this.setDelta(-12,-20);},destroy:function(){Ext.dd.DragSource.superclass.destroy.call(this);Ext.destroy(this.proxy);}});Ext.dd.DropTarget=Ext.extend(Ext.dd.DDTarget,{constructor:function(el,config){this.el=Ext.get(el);Ext.apply(this,config);if(this.containerScroll){Ext.dd.ScrollManager.register(this.el);} +Ext.dd.DropTarget.superclass.constructor.call(this,this.el.dom,this.ddGroup||this.group,{isTarget:true});},dropAllowed:"x-dd-drop-ok",dropNotAllowed:"x-dd-drop-nodrop",isTarget:true,isNotifyTarget:true,notifyEnter:function(dd,e,data){if(this.overClass){this.el.addClass(this.overClass);} +return this.dropAllowed;},notifyOver:function(dd,e,data){return this.dropAllowed;},notifyOut:function(dd,e,data){if(this.overClass){this.el.removeClass(this.overClass);}},notifyDrop:function(dd,e,data){return false;},destroy:function(){Ext.dd.DropTarget.superclass.destroy.call(this);if(this.containerScroll){Ext.dd.ScrollManager.unregister(this.el);}}});Ext.dd.DragZone=Ext.extend(Ext.dd.DragSource,{constructor:function(el,config){Ext.dd.DragZone.superclass.constructor.call(this,el,config);if(this.containerScroll){Ext.dd.ScrollManager.register(this.el);}},getDragData:function(e){return Ext.dd.Registry.getHandleFromEvent(e);},onInitDrag:function(x,y){this.proxy.update(this.dragData.ddel.cloneNode(true));this.onStartDrag(x,y);return true;},afterRepair:function(){if(Ext.enableFx){Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor||"c3daf9");} +this.dragging=false;},getRepairXY:function(e){return Ext.Element.fly(this.dragData.ddel).getXY();},destroy:function(){Ext.dd.DragZone.superclass.destroy.call(this);if(this.containerScroll){Ext.dd.ScrollManager.unregister(this.el);}}});Ext.dd.DropZone=function(el,config){Ext.dd.DropZone.superclass.constructor.call(this,el,config);};Ext.extend(Ext.dd.DropZone,Ext.dd.DropTarget,{getTargetFromEvent:function(e){return Ext.dd.Registry.getTargetFromEvent(e);},onNodeEnter:function(n,dd,e,data){},onNodeOver:function(n,dd,e,data){return this.dropAllowed;},onNodeOut:function(n,dd,e,data){},onNodeDrop:function(n,dd,e,data){return false;},onContainerOver:function(dd,e,data){return this.dropNotAllowed;},onContainerDrop:function(dd,e,data){return false;},notifyEnter:function(dd,e,data){return this.dropNotAllowed;},notifyOver:function(dd,e,data){var n=this.getTargetFromEvent(e);if(!n){if(this.lastOverNode){this.onNodeOut(this.lastOverNode,dd,e,data);this.lastOverNode=null;} +return this.onContainerOver(dd,e,data);} +if(this.lastOverNode!=n){if(this.lastOverNode){this.onNodeOut(this.lastOverNode,dd,e,data);} +this.onNodeEnter(n,dd,e,data);this.lastOverNode=n;} +return this.onNodeOver(n,dd,e,data);},notifyOut:function(dd,e,data){if(this.lastOverNode){this.onNodeOut(this.lastOverNode,dd,e,data);this.lastOverNode=null;}},notifyDrop:function(dd,e,data){if(this.lastOverNode){this.onNodeOut(this.lastOverNode,dd,e,data);this.lastOverNode=null;} +var n=this.getTargetFromEvent(e);return n?this.onNodeDrop(n,dd,e,data):this.onContainerDrop(dd,e,data);},triggerCacheRefresh:function(){Ext.dd.DDM.refreshCache(this.groups);}});Ext.Element.addMethods({initDD:function(group,config,overrides){var dd=new Ext.dd.DD(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides);},initDDProxy:function(group,config,overrides){var dd=new Ext.dd.DDProxy(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides);},initDDTarget:function(group,config,overrides){var dd=new Ext.dd.DDTarget(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides);}});Ext.tree.TreePanel=Ext.extend(Ext.Panel,{rootVisible:true,animate:Ext.enableFx,lines:true,enableDD:false,hlDrop:Ext.enableFx,pathSeparator:'/',bubbleEvents:[],initComponent:function(){Ext.tree.TreePanel.superclass.initComponent.call(this);if(!this.eventModel){this.eventModel=new Ext.tree.TreeEventModel(this);} +var l=this.loader;if(!l){l=new Ext.tree.TreeLoader({dataUrl:this.dataUrl,requestMethod:this.requestMethod});}else if(Ext.isObject(l)&&!l.load){l=new Ext.tree.TreeLoader(l);} +this.loader=l;this.nodeHash={};if(this.root){var r=this.root;delete this.root;this.setRootNode(r);} +this.addEvents('append','remove','movenode','insert','beforeappend','beforeremove','beforemovenode','beforeinsert','beforeload','load','textchange','beforeexpandnode','beforecollapsenode','expandnode','disabledchange','collapsenode','beforeclick','click','containerclick','checkchange','beforedblclick','dblclick','containerdblclick','contextmenu','containercontextmenu','beforechildrenrendered','startdrag','enddrag','dragdrop','beforenodedrop','nodedrop','nodedragover');if(this.singleExpand){this.on('beforeexpandnode',this.restrictExpand,this);}},proxyNodeEvent:function(ename,a1,a2,a3,a4,a5,a6){if(ename=='collapse'||ename=='expand'||ename=='beforecollapse'||ename=='beforeexpand'||ename=='move'||ename=='beforemove'){ename=ename+'node';} +return this.fireEvent(ename,a1,a2,a3,a4,a5,a6);},getRootNode:function(){return this.root;},setRootNode:function(node){this.destroyRoot();if(!node.render){node=this.loader.createNode(node);} +this.root=node;node.ownerTree=this;node.isRoot=true;this.registerNode(node);if(!this.rootVisible){var uiP=node.attributes.uiProvider;node.ui=uiP?new uiP(node):new Ext.tree.RootTreeNodeUI(node);} +if(this.innerCt){this.clearInnerCt();this.renderRoot();} +return node;},clearInnerCt:function(){this.innerCt.update('');},renderRoot:function(){this.root.render();if(!this.rootVisible){this.root.renderChildren();}},getNodeById:function(id){return this.nodeHash[id];},registerNode:function(node){this.nodeHash[node.id]=node;},unregisterNode:function(node){delete this.nodeHash[node.id];},toString:function(){return'[Tree'+(this.id?' '+this.id:'')+']';},restrictExpand:function(node){var p=node.parentNode;if(p){if(p.expandedChild&&p.expandedChild.parentNode==p){p.expandedChild.collapse();} +p.expandedChild=node;}},getChecked:function(a,startNode){startNode=startNode||this.root;var r=[];var f=function(){if(this.attributes.checked){r.push(!a?this:(a=='id'?this.id:this.attributes[a]));}};startNode.cascade(f);return r;},getLoader:function(){return this.loader;},expandAll:function(){this.root.expand(true);},collapseAll:function(){this.root.collapse(true);},getSelectionModel:function(){if(!this.selModel){this.selModel=new Ext.tree.DefaultSelectionModel();} +return this.selModel;},expandPath:function(path,attr,callback){if(Ext.isEmpty(path)){if(callback){callback(false,undefined);} +return;} +attr=attr||'id';var keys=path.split(this.pathSeparator);var curNode=this.root;if(curNode.attributes[attr]!=keys[1]){if(callback){callback(false,null);} +return;} +var index=1;var f=function(){if(++index==keys.length){if(callback){callback(true,curNode);} +return;} +var c=curNode.findChild(attr,keys[index]);if(!c){if(callback){callback(false,curNode);} +return;} +curNode=c;c.expand(false,false,f);};curNode.expand(false,false,f);},selectPath:function(path,attr,callback){if(Ext.isEmpty(path)){if(callback){callback(false,undefined);} +return;} +attr=attr||'id';var keys=path.split(this.pathSeparator),v=keys.pop();if(keys.length>1){var f=function(success,node){if(success&&node){var n=node.findChild(attr,v);if(n){n.select();if(callback){callback(true,n);}}else if(callback){callback(false,n);}}else{if(callback){callback(false,n);}}};this.expandPath(keys.join(this.pathSeparator),attr,f);}else{this.root.select();if(callback){callback(true,this.root);}}},getTreeEl:function(){return this.body;},onRender:function(ct,position){Ext.tree.TreePanel.superclass.onRender.call(this,ct,position);this.el.addClass('x-tree');this.innerCt=this.body.createChild({tag:'ul',cls:'x-tree-root-ct '+ +(this.useArrows?'x-tree-arrows':this.lines?'x-tree-lines':'x-tree-no-lines')});},initEvents:function(){Ext.tree.TreePanel.superclass.initEvents.call(this);if(this.containerScroll){Ext.dd.ScrollManager.register(this.body);} +if((this.enableDD||this.enableDrop)&&!this.dropZone){this.dropZone=new Ext.tree.TreeDropZone(this,this.dropConfig||{ddGroup:this.ddGroup||'TreeDD',appendOnly:this.ddAppendOnly===true});} +if((this.enableDD||this.enableDrag)&&!this.dragZone){this.dragZone=new Ext.tree.TreeDragZone(this,this.dragConfig||{ddGroup:this.ddGroup||'TreeDD',scroll:this.ddScroll});} +this.getSelectionModel().init(this);},afterRender:function(){Ext.tree.TreePanel.superclass.afterRender.call(this);this.renderRoot();},beforeDestroy:function(){if(this.rendered){Ext.dd.ScrollManager.unregister(this.body);Ext.destroy(this.dropZone,this.dragZone);} +this.destroyRoot();Ext.destroy(this.loader);this.nodeHash=this.root=this.loader=null;Ext.tree.TreePanel.superclass.beforeDestroy.call(this);},destroyRoot:function(){if(this.root&&this.root.destroy){this.root.destroy(true);}}});Ext.tree.TreePanel.nodeTypes={};Ext.reg('treepanel',Ext.tree.TreePanel);Ext.tree.TreeEventModel=function(tree){this.tree=tree;this.tree.on('render',this.initEvents,this);};Ext.tree.TreeEventModel.prototype={initEvents:function(){var t=this.tree;if(t.trackMouseOver!==false){t.mon(t.innerCt,{scope:this,mouseover:this.delegateOver,mouseout:this.delegateOut});} +t.mon(t.getTreeEl(),{scope:this,click:this.delegateClick,dblclick:this.delegateDblClick,contextmenu:this.delegateContextMenu});},getNode:function(e){var t;if(t=e.getTarget('.x-tree-node-el',10)){var id=Ext.fly(t,'_treeEvents').getAttribute('tree-node-id','ext');if(id){return this.tree.getNodeById(id);}} +return null;},getNodeTarget:function(e){var t=e.getTarget('.x-tree-node-icon',1);if(!t){t=e.getTarget('.x-tree-node-el',6);} +return t;},delegateOut:function(e,t){if(!this.beforeEvent(e)){return;} +if(e.getTarget('.x-tree-ec-icon',1)){var n=this.getNode(e);this.onIconOut(e,n);if(n==this.lastEcOver){delete this.lastEcOver;}} +if((t=this.getNodeTarget(e))&&!e.within(t,true)){this.onNodeOut(e,this.getNode(e));}},delegateOver:function(e,t){if(!this.beforeEvent(e)){return;} +if(Ext.isGecko&&!this.trackingDoc){Ext.getBody().on('mouseover',this.trackExit,this);this.trackingDoc=true;} +if(this.lastEcOver){this.onIconOut(e,this.lastEcOver);delete this.lastEcOver;} +if(e.getTarget('.x-tree-ec-icon',1)){this.lastEcOver=this.getNode(e);this.onIconOver(e,this.lastEcOver);} +if(t=this.getNodeTarget(e)){this.onNodeOver(e,this.getNode(e));}},trackExit:function(e){if(this.lastOverNode){if(this.lastOverNode.ui&&!e.within(this.lastOverNode.ui.getEl())){this.onNodeOut(e,this.lastOverNode);} +delete this.lastOverNode;Ext.getBody().un('mouseover',this.trackExit,this);this.trackingDoc=false;}},delegateClick:function(e,t){if(this.beforeEvent(e)){if(e.getTarget('input[type=checkbox]',1)){this.onCheckboxClick(e,this.getNode(e));}else if(e.getTarget('.x-tree-ec-icon',1)){this.onIconClick(e,this.getNode(e));}else if(this.getNodeTarget(e)){this.onNodeClick(e,this.getNode(e));}}else{this.checkContainerEvent(e,'click');}},delegateDblClick:function(e,t){if(this.beforeEvent(e)){if(this.getNodeTarget(e)){this.onNodeDblClick(e,this.getNode(e));}}else{this.checkContainerEvent(e,'dblclick');}},delegateContextMenu:function(e,t){if(this.beforeEvent(e)){if(this.getNodeTarget(e)){this.onNodeContextMenu(e,this.getNode(e));}}else{this.checkContainerEvent(e,'contextmenu');}},checkContainerEvent:function(e,type){if(this.disabled){e.stopEvent();return false;} +this.onContainerEvent(e,type);},onContainerEvent:function(e,type){this.tree.fireEvent('container'+type,this.tree,e);},onNodeClick:function(e,node){node.ui.onClick(e);},onNodeOver:function(e,node){this.lastOverNode=node;node.ui.onOver(e);},onNodeOut:function(e,node){node.ui.onOut(e);},onIconOver:function(e,node){node.ui.addClass('x-tree-ec-over');},onIconOut:function(e,node){node.ui.removeClass('x-tree-ec-over');},onIconClick:function(e,node){node.ui.ecClick(e);},onCheckboxClick:function(e,node){node.ui.onCheckChange(e);},onNodeDblClick:function(e,node){node.ui.onDblClick(e);},onNodeContextMenu:function(e,node){node.ui.onContextMenu(e);},beforeEvent:function(e){var node=this.getNode(e);if(this.disabled||!node||!node.ui){e.stopEvent();return false;} +return true;},disable:function(){this.disabled=true;},enable:function(){this.disabled=false;}};Ext.tree.DefaultSelectionModel=Ext.extend(Ext.util.Observable,{constructor:function(config){this.selNode=null;this.addEvents('selectionchange','beforeselect');Ext.apply(this,config);Ext.tree.DefaultSelectionModel.superclass.constructor.call(this);},init:function(tree){this.tree=tree;tree.mon(tree.getTreeEl(),'keydown',this.onKeyDown,this);tree.on('click',this.onNodeClick,this);},onNodeClick:function(node,e){this.select(node);},select:function(node,selectNextNode){if(!Ext.fly(node.ui.wrap).isVisible()&&selectNextNode){return selectNextNode.call(this,node);} +var last=this.selNode;if(node==last){node.ui.onSelectedChange(true);}else if(this.fireEvent('beforeselect',this,node,last)!==false){if(last&&last.ui){last.ui.onSelectedChange(false);} +this.selNode=node;node.ui.onSelectedChange(true);this.fireEvent('selectionchange',this,node,last);} +return node;},unselect:function(node,silent){if(this.selNode==node){this.clearSelections(silent);}},clearSelections:function(silent){var n=this.selNode;if(n){n.ui.onSelectedChange(false);this.selNode=null;if(silent!==true){this.fireEvent('selectionchange',this,null);}} +return n;},getSelectedNode:function(){return this.selNode;},isSelected:function(node){return this.selNode==node;},selectPrevious:function(s){if(!(s=s||this.selNode||this.lastSelNode)){return null;} +var ps=s.previousSibling;if(ps){if(!ps.isExpanded()||ps.childNodes.length<1){return this.select(ps,this.selectPrevious);}else{var lc=ps.lastChild;while(lc&&lc.isExpanded()&&Ext.fly(lc.ui.wrap).isVisible()&&lc.childNodes.length>0){lc=lc.lastChild;} +return this.select(lc,this.selectPrevious);}}else if(s.parentNode&&(this.tree.rootVisible||!s.parentNode.isRoot)){return this.select(s.parentNode,this.selectPrevious);} +return null;},selectNext:function(s){if(!(s=s||this.selNode||this.lastSelNode)){return null;} +if(s.firstChild&&s.isExpanded()&&Ext.fly(s.ui.wrap).isVisible()){return this.select(s.firstChild,this.selectNext);}else if(s.nextSibling){return this.select(s.nextSibling,this.selectNext);}else if(s.parentNode){var newS=null;s.parentNode.bubble(function(){if(this.nextSibling){newS=this.getOwnerTree().selModel.select(this.nextSibling,this.selectNext);return false;}});return newS;} +return null;},onKeyDown:function(e){var s=this.selNode||this.lastSelNode;var sm=this;if(!s){return;} +var k=e.getKey();switch(k){case e.DOWN:e.stopEvent();this.selectNext();break;case e.UP:e.stopEvent();this.selectPrevious();break;case e.RIGHT:e.preventDefault();if(s.hasChildNodes()){if(!s.isExpanded()){s.expand();}else if(s.firstChild){this.select(s.firstChild,e);}} +break;case e.LEFT:e.preventDefault();if(s.hasChildNodes()&&s.isExpanded()){s.collapse();}else if(s.parentNode&&(this.tree.rootVisible||s.parentNode!=this.tree.getRootNode())){this.select(s.parentNode,e);} +break;};}});Ext.tree.MultiSelectionModel=Ext.extend(Ext.util.Observable,{constructor:function(config){this.selNodes=[];this.selMap={};this.addEvents('selectionchange');Ext.apply(this,config);Ext.tree.MultiSelectionModel.superclass.constructor.call(this);},init:function(tree){this.tree=tree;tree.mon(tree.getTreeEl(),'keydown',this.onKeyDown,this);tree.on('click',this.onNodeClick,this);},onNodeClick:function(node,e){if(e.ctrlKey&&this.isSelected(node)){this.unselect(node);}else{this.select(node,e,e.ctrlKey);}},select:function(node,e,keepExisting){if(keepExisting!==true){this.clearSelections(true);} +if(this.isSelected(node)){this.lastSelNode=node;return node;} +this.selNodes.push(node);this.selMap[node.id]=node;this.lastSelNode=node;node.ui.onSelectedChange(true);this.fireEvent('selectionchange',this,this.selNodes);return node;},unselect:function(node){if(this.selMap[node.id]){node.ui.onSelectedChange(false);var sn=this.selNodes;var index=sn.indexOf(node);if(index!=-1){this.selNodes.splice(index,1);} +delete this.selMap[node.id];this.fireEvent('selectionchange',this,this.selNodes);}},clearSelections:function(suppressEvent){var sn=this.selNodes;if(sn.length>0){for(var i=0,len=sn.length;i<len;i++){sn[i].ui.onSelectedChange(false);} +this.selNodes=[];this.selMap={};if(suppressEvent!==true){this.fireEvent('selectionchange',this,this.selNodes);}}},isSelected:function(node){return this.selMap[node.id]?true:false;},getSelectedNodes:function(){return this.selNodes.concat([]);},onKeyDown:Ext.tree.DefaultSelectionModel.prototype.onKeyDown,selectNext:Ext.tree.DefaultSelectionModel.prototype.selectNext,selectPrevious:Ext.tree.DefaultSelectionModel.prototype.selectPrevious});Ext.data.Tree=Ext.extend(Ext.util.Observable,{constructor:function(root){this.nodeHash={};this.root=null;if(root){this.setRootNode(root);} +this.addEvents("append","remove","move","insert","beforeappend","beforeremove","beforemove","beforeinsert");Ext.data.Tree.superclass.constructor.call(this);},pathSeparator:"/",proxyNodeEvent:function(){return this.fireEvent.apply(this,arguments);},getRootNode:function(){return this.root;},setRootNode:function(node){this.root=node;node.ownerTree=this;node.isRoot=true;this.registerNode(node);return node;},getNodeById:function(id){return this.nodeHash[id];},registerNode:function(node){this.nodeHash[node.id]=node;},unregisterNode:function(node){delete this.nodeHash[node.id];},toString:function(){return"[Tree"+(this.id?" "+this.id:"")+"]";}});Ext.data.Node=Ext.extend(Ext.util.Observable,{constructor:function(attributes){this.attributes=attributes||{};this.leaf=this.attributes.leaf;this.id=this.attributes.id;if(!this.id){this.id=Ext.id(null,"xnode-");this.attributes.id=this.id;} +this.childNodes=[];this.parentNode=null;this.firstChild=null;this.lastChild=null;this.previousSibling=null;this.nextSibling=null;this.addEvents({"append":true,"remove":true,"move":true,"insert":true,"beforeappend":true,"beforeremove":true,"beforemove":true,"beforeinsert":true});this.listeners=this.attributes.listeners;Ext.data.Node.superclass.constructor.call(this);},fireEvent:function(evtName){if(Ext.data.Node.superclass.fireEvent.apply(this,arguments)===false){return false;} +var ot=this.getOwnerTree();if(ot){if(ot.proxyNodeEvent.apply(ot,arguments)===false){return false;}} +return true;},isLeaf:function(){return this.leaf===true;},setFirstChild:function(node){this.firstChild=node;},setLastChild:function(node){this.lastChild=node;},isLast:function(){return(!this.parentNode?true:this.parentNode.lastChild==this);},isFirst:function(){return(!this.parentNode?true:this.parentNode.firstChild==this);},hasChildNodes:function(){return!this.isLeaf()&&this.childNodes.length>0;},isExpandable:function(){return this.attributes.expandable||this.hasChildNodes();},appendChild:function(node){var multi=false;if(Ext.isArray(node)){multi=node;}else if(arguments.length>1){multi=arguments;} +if(multi){for(var i=0,len=multi.length;i<len;i++){this.appendChild(multi[i]);}}else{if(this.fireEvent("beforeappend",this.ownerTree,this,node)===false){return false;} +var index=this.childNodes.length;var oldParent=node.parentNode;if(oldParent){if(node.fireEvent("beforemove",node.getOwnerTree(),node,oldParent,this,index)===false){return false;} +oldParent.removeChild(node);} +index=this.childNodes.length;if(index===0){this.setFirstChild(node);} +this.childNodes.push(node);node.parentNode=this;var ps=this.childNodes[index-1];if(ps){node.previousSibling=ps;ps.nextSibling=node;}else{node.previousSibling=null;} +node.nextSibling=null;this.setLastChild(node);node.setOwnerTree(this.getOwnerTree());this.fireEvent("append",this.ownerTree,this,node,index);if(oldParent){node.fireEvent("move",this.ownerTree,node,oldParent,this,index);} +return node;}},removeChild:function(node,destroy){var index=this.childNodes.indexOf(node);if(index==-1){return false;} +if(this.fireEvent("beforeremove",this.ownerTree,this,node)===false){return false;} +this.childNodes.splice(index,1);if(node.previousSibling){node.previousSibling.nextSibling=node.nextSibling;} +if(node.nextSibling){node.nextSibling.previousSibling=node.previousSibling;} +if(this.firstChild==node){this.setFirstChild(node.nextSibling);} +if(this.lastChild==node){this.setLastChild(node.previousSibling);} +this.fireEvent("remove",this.ownerTree,this,node);if(destroy){node.destroy(true);}else{node.clear();} +return node;},clear:function(destroy){this.setOwnerTree(null,destroy);this.parentNode=this.previousSibling=this.nextSibling=null;if(destroy){this.firstChild=this.lastChild=null;}},destroy:function(silent){if(silent===true){this.purgeListeners();this.clear(true);Ext.each(this.childNodes,function(n){n.destroy(true);});this.childNodes=null;}else{this.remove(true);}},insertBefore:function(node,refNode){if(!refNode){return this.appendChild(node);} +if(node==refNode){return false;} +if(this.fireEvent("beforeinsert",this.ownerTree,this,node,refNode)===false){return false;} +var index=this.childNodes.indexOf(refNode);var oldParent=node.parentNode;var refIndex=index;if(oldParent==this&&this.childNodes.indexOf(node)<index){refIndex--;} +if(oldParent){if(node.fireEvent("beforemove",node.getOwnerTree(),node,oldParent,this,index,refNode)===false){return false;} +oldParent.removeChild(node);} +if(refIndex===0){this.setFirstChild(node);} +this.childNodes.splice(refIndex,0,node);node.parentNode=this;var ps=this.childNodes[refIndex-1];if(ps){node.previousSibling=ps;ps.nextSibling=node;}else{node.previousSibling=null;} +node.nextSibling=refNode;refNode.previousSibling=node;node.setOwnerTree(this.getOwnerTree());this.fireEvent("insert",this.ownerTree,this,node,refNode);if(oldParent){node.fireEvent("move",this.ownerTree,node,oldParent,this,refIndex,refNode);} +return node;},remove:function(destroy){if(this.parentNode){this.parentNode.removeChild(this,destroy);} +return this;},removeAll:function(destroy){var cn=this.childNodes,n;while((n=cn[0])){this.removeChild(n,destroy);} +return this;},item:function(index){return this.childNodes[index];},replaceChild:function(newChild,oldChild){var s=oldChild?oldChild.nextSibling:null;this.removeChild(oldChild);this.insertBefore(newChild,s);return oldChild;},indexOf:function(child){return this.childNodes.indexOf(child);},getOwnerTree:function(){if(!this.ownerTree){var p=this;while(p){if(p.ownerTree){this.ownerTree=p.ownerTree;break;} +p=p.parentNode;}} +return this.ownerTree;},getDepth:function(){var depth=0;var p=this;while(p.parentNode){++depth;p=p.parentNode;} +return depth;},setOwnerTree:function(tree,destroy){if(tree!=this.ownerTree){if(this.ownerTree){this.ownerTree.unregisterNode(this);} +this.ownerTree=tree;if(destroy!==true){Ext.each(this.childNodes,function(n){n.setOwnerTree(tree);});} +if(tree){tree.registerNode(this);}}},setId:function(id){if(id!==this.id){var t=this.ownerTree;if(t){t.unregisterNode(this);} +this.id=this.attributes.id=id;if(t){t.registerNode(this);} +this.onIdChange(id);}},onIdChange:Ext.emptyFn,getPath:function(attr){attr=attr||"id";var p=this.parentNode;var b=[this.attributes[attr]];while(p){b.unshift(p.attributes[attr]);p=p.parentNode;} +var sep=this.getOwnerTree().pathSeparator;return sep+b.join(sep);},bubble:function(fn,scope,args){var p=this;while(p){if(fn.apply(scope||p,args||[p])===false){break;} +p=p.parentNode;}},cascade:function(fn,scope,args){if(fn.apply(scope||this,args||[this])!==false){var cs=this.childNodes;for(var i=0,len=cs.length;i<len;i++){cs[i].cascade(fn,scope,args);}}},eachChild:function(fn,scope,args){var cs=this.childNodes;for(var i=0,len=cs.length;i<len;i++){if(fn.apply(scope||cs[i],args||[cs[i]])===false){break;}}},findChild:function(attribute,value,deep){return this.findChildBy(function(){return this.attributes[attribute]==value;},null,deep);},findChildBy:function(fn,scope,deep){var cs=this.childNodes,len=cs.length,i=0,n,res;for(;i<len;i++){n=cs[i];if(fn.call(scope||n,n)===true){return n;}else if(deep){res=n.findChildBy(fn,scope,deep);if(res!=null){return res;}}} +return null;},sort:function(fn,scope){var cs=this.childNodes;var len=cs.length;if(len>0){var sortFn=scope?function(){fn.apply(scope,arguments);}:fn;cs.sort(sortFn);for(var i=0;i<len;i++){var n=cs[i];n.previousSibling=cs[i-1];n.nextSibling=cs[i+1];if(i===0){this.setFirstChild(n);} +if(i==len-1){this.setLastChild(n);}}}},contains:function(node){return node.isAncestor(this);},isAncestor:function(node){var p=this.parentNode;while(p){if(p==node){return true;} +p=p.parentNode;} +return false;},toString:function(){return"[Node"+(this.id?" "+this.id:"")+"]";}});Ext.tree.TreeNode=Ext.extend(Ext.data.Node,{constructor:function(attributes){attributes=attributes||{};if(Ext.isString(attributes)){attributes={text:attributes};} +this.childrenRendered=false;this.rendered=false;Ext.tree.TreeNode.superclass.constructor.call(this,attributes);this.expanded=attributes.expanded===true;this.isTarget=attributes.isTarget!==false;this.draggable=attributes.draggable!==false&&attributes.allowDrag!==false;this.allowChildren=attributes.allowChildren!==false&&attributes.allowDrop!==false;this.text=attributes.text;this.disabled=attributes.disabled===true;this.hidden=attributes.hidden===true;this.addEvents('textchange','beforeexpand','beforecollapse','expand','disabledchange','collapse','beforeclick','click','checkchange','beforedblclick','dblclick','contextmenu','beforechildrenrendered');var uiClass=this.attributes.uiProvider||this.defaultUI||Ext.tree.TreeNodeUI;this.ui=new uiClass(this);},preventHScroll:true,isExpanded:function(){return this.expanded;},getUI:function(){return this.ui;},getLoader:function(){var owner;return this.loader||((owner=this.getOwnerTree())&&owner.loader?owner.loader:(this.loader=new Ext.tree.TreeLoader()));},setFirstChild:function(node){var of=this.firstChild;Ext.tree.TreeNode.superclass.setFirstChild.call(this,node);if(this.childrenRendered&&of&&node!=of){of.renderIndent(true,true);} +if(this.rendered){this.renderIndent(true,true);}},setLastChild:function(node){var ol=this.lastChild;Ext.tree.TreeNode.superclass.setLastChild.call(this,node);if(this.childrenRendered&&ol&&node!=ol){ol.renderIndent(true,true);} +if(this.rendered){this.renderIndent(true,true);}},appendChild:function(n){if(!n.render&&!Ext.isArray(n)){n=this.getLoader().createNode(n);} +var node=Ext.tree.TreeNode.superclass.appendChild.call(this,n);if(node&&this.childrenRendered){node.render();} +this.ui.updateExpandIcon();return node;},removeChild:function(node,destroy){this.ownerTree.getSelectionModel().unselect(node);Ext.tree.TreeNode.superclass.removeChild.apply(this,arguments);if(!destroy){var rendered=node.ui.rendered;if(rendered){node.ui.remove();} +if(rendered&&this.childNodes.length<1){this.collapse(false,false);}else{this.ui.updateExpandIcon();} +if(!this.firstChild&&!this.isHiddenRoot()){this.childrenRendered=false;}} +return node;},insertBefore:function(node,refNode){if(!node.render){node=this.getLoader().createNode(node);} +var newNode=Ext.tree.TreeNode.superclass.insertBefore.call(this,node,refNode);if(newNode&&refNode&&this.childrenRendered){node.render();} +this.ui.updateExpandIcon();return newNode;},setText:function(text){var oldText=this.text;this.text=this.attributes.text=text;if(this.rendered){this.ui.onTextChange(this,text,oldText);} +this.fireEvent('textchange',this,text,oldText);},setIconCls:function(cls){var old=this.attributes.iconCls;this.attributes.iconCls=cls;if(this.rendered){this.ui.onIconClsChange(this,cls,old);}},setTooltip:function(tip,title){this.attributes.qtip=tip;this.attributes.qtipTitle=title;if(this.rendered){this.ui.onTipChange(this,tip,title);}},setIcon:function(icon){this.attributes.icon=icon;if(this.rendered){this.ui.onIconChange(this,icon);}},setHref:function(href,target){this.attributes.href=href;this.attributes.hrefTarget=target;if(this.rendered){this.ui.onHrefChange(this,href,target);}},setCls:function(cls){var old=this.attributes.cls;this.attributes.cls=cls;if(this.rendered){this.ui.onClsChange(this,cls,old);}},select:function(){var t=this.getOwnerTree();if(t){t.getSelectionModel().select(this);}},unselect:function(silent){var t=this.getOwnerTree();if(t){t.getSelectionModel().unselect(this,silent);}},isSelected:function(){var t=this.getOwnerTree();return t?t.getSelectionModel().isSelected(this):false;},expand:function(deep,anim,callback,scope){if(!this.expanded){if(this.fireEvent('beforeexpand',this,deep,anim)===false){return;} +if(!this.childrenRendered){this.renderChildren();} +this.expanded=true;if(!this.isHiddenRoot()&&(this.getOwnerTree().animate&&anim!==false)||anim){this.ui.animExpand(function(){this.fireEvent('expand',this);this.runCallback(callback,scope||this,[this]);if(deep===true){this.expandChildNodes(true,true);}}.createDelegate(this));return;}else{this.ui.expand();this.fireEvent('expand',this);this.runCallback(callback,scope||this,[this]);}}else{this.runCallback(callback,scope||this,[this]);} +if(deep===true){this.expandChildNodes(true);}},runCallback:function(cb,scope,args){if(Ext.isFunction(cb)){cb.apply(scope,args);}},isHiddenRoot:function(){return this.isRoot&&!this.getOwnerTree().rootVisible;},collapse:function(deep,anim,callback,scope){if(this.expanded&&!this.isHiddenRoot()){if(this.fireEvent('beforecollapse',this,deep,anim)===false){return;} +this.expanded=false;if((this.getOwnerTree().animate&&anim!==false)||anim){this.ui.animCollapse(function(){this.fireEvent('collapse',this);this.runCallback(callback,scope||this,[this]);if(deep===true){this.collapseChildNodes(true);}}.createDelegate(this));return;}else{this.ui.collapse();this.fireEvent('collapse',this);this.runCallback(callback,scope||this,[this]);}}else if(!this.expanded){this.runCallback(callback,scope||this,[this]);} +if(deep===true){var cs=this.childNodes;for(var i=0,len=cs.length;i<len;i++){cs[i].collapse(true,false);}}},delayedExpand:function(delay){if(!this.expandProcId){this.expandProcId=this.expand.defer(delay,this);}},cancelExpand:function(){if(this.expandProcId){clearTimeout(this.expandProcId);} +this.expandProcId=false;},toggle:function(){if(this.expanded){this.collapse();}else{this.expand();}},ensureVisible:function(callback,scope){var tree=this.getOwnerTree();tree.expandPath(this.parentNode?this.parentNode.getPath():this.getPath(),false,function(){var node=tree.getNodeById(this.id);tree.getTreeEl().scrollChildIntoView(node.ui.anchor);this.runCallback(callback,scope||this,[this]);}.createDelegate(this));},expandChildNodes:function(deep,anim){var cs=this.childNodes,i,len=cs.length;for(i=0;i<len;i++){cs[i].expand(deep,anim);}},collapseChildNodes:function(deep){var cs=this.childNodes;for(var i=0,len=cs.length;i<len;i++){cs[i].collapse(deep);}},disable:function(){this.disabled=true;this.unselect();if(this.rendered&&this.ui.onDisableChange){this.ui.onDisableChange(this,true);} +this.fireEvent('disabledchange',this,true);},enable:function(){this.disabled=false;if(this.rendered&&this.ui.onDisableChange){this.ui.onDisableChange(this,false);} +this.fireEvent('disabledchange',this,false);},renderChildren:function(suppressEvent){if(suppressEvent!==false){this.fireEvent('beforechildrenrendered',this);} +var cs=this.childNodes;for(var i=0,len=cs.length;i<len;i++){cs[i].render(true);} +this.childrenRendered=true;},sort:function(fn,scope){Ext.tree.TreeNode.superclass.sort.apply(this,arguments);if(this.childrenRendered){var cs=this.childNodes;for(var i=0,len=cs.length;i<len;i++){cs[i].render(true);}}},render:function(bulkRender){this.ui.render(bulkRender);if(!this.rendered){this.getOwnerTree().registerNode(this);this.rendered=true;if(this.expanded){this.expanded=false;this.expand(false,false);}}},renderIndent:function(deep,refresh){if(refresh){this.ui.childIndent=null;} +this.ui.renderIndent();if(deep===true&&this.childrenRendered){var cs=this.childNodes;for(var i=0,len=cs.length;i<len;i++){cs[i].renderIndent(true,refresh);}}},beginUpdate:function(){this.childrenRendered=false;},endUpdate:function(){if(this.expanded&&this.rendered){this.renderChildren();}},destroy:function(silent){if(silent===true){this.unselect(true);} +Ext.tree.TreeNode.superclass.destroy.call(this,silent);Ext.destroy(this.ui,this.loader);this.ui=this.loader=null;},onIdChange:function(id){this.ui.onIdChange(id);}});Ext.tree.TreePanel.nodeTypes.node=Ext.tree.TreeNode;Ext.tree.AsyncTreeNode=function(config){this.loaded=config&&config.loaded===true;this.loading=false;Ext.tree.AsyncTreeNode.superclass.constructor.apply(this,arguments);this.addEvents('beforeload','load');};Ext.extend(Ext.tree.AsyncTreeNode,Ext.tree.TreeNode,{expand:function(deep,anim,callback,scope){if(this.loading){var timer;var f=function(){if(!this.loading){clearInterval(timer);this.expand(deep,anim,callback,scope);}}.createDelegate(this);timer=setInterval(f,200);return;} +if(!this.loaded){if(this.fireEvent("beforeload",this)===false){return;} +this.loading=true;this.ui.beforeLoad(this);var loader=this.loader||this.attributes.loader||this.getOwnerTree().getLoader();if(loader){loader.load(this,this.loadComplete.createDelegate(this,[deep,anim,callback,scope]),this);return;}} +Ext.tree.AsyncTreeNode.superclass.expand.call(this,deep,anim,callback,scope);},isLoading:function(){return this.loading;},loadComplete:function(deep,anim,callback,scope){this.loading=false;this.loaded=true;this.ui.afterLoad(this);this.fireEvent("load",this);this.expand(deep,anim,callback,scope);},isLoaded:function(){return this.loaded;},hasChildNodes:function(){if(!this.isLeaf()&&!this.loaded){return true;}else{return Ext.tree.AsyncTreeNode.superclass.hasChildNodes.call(this);}},reload:function(callback,scope){this.collapse(false,false);while(this.firstChild){this.removeChild(this.firstChild).destroy();} +this.childrenRendered=false;this.loaded=false;if(this.isHiddenRoot()){this.expanded=false;} +this.expand(false,false,callback,scope);}});Ext.tree.TreePanel.nodeTypes.async=Ext.tree.AsyncTreeNode;Ext.tree.TreeNodeUI=Ext.extend(Object,{constructor:function(node){Ext.apply(this,{node:node,rendered:false,animating:false,wasLeaf:true,ecc:'x-tree-ec-icon x-tree-elbow',emptyIcon:Ext.BLANK_IMAGE_URL});},removeChild:function(node){if(this.rendered){this.ctNode.removeChild(node.ui.getEl());}},beforeLoad:function(){this.addClass("x-tree-node-loading");},afterLoad:function(){this.removeClass("x-tree-node-loading");},onTextChange:function(node,text,oldText){if(this.rendered){this.textNode.innerHTML=text;}},onIconClsChange:function(node,cls,oldCls){if(this.rendered){Ext.fly(this.iconNode).replaceClass(oldCls,cls);}},onIconChange:function(node,icon){if(this.rendered){var empty=Ext.isEmpty(icon);this.iconNode.src=empty?this.emptyIcon:icon;Ext.fly(this.iconNode)[empty?'removeClass':'addClass']('x-tree-node-inline-icon');}},onTipChange:function(node,tip,title){if(this.rendered){var hasTitle=Ext.isDefined(title);if(this.textNode.setAttributeNS){this.textNode.setAttributeNS("ext","qtip",tip);if(hasTitle){this.textNode.setAttributeNS("ext","qtitle",title);}}else{this.textNode.setAttribute("ext:qtip",tip);if(hasTitle){this.textNode.setAttribute("ext:qtitle",title);}}}},onHrefChange:function(node,href,target){if(this.rendered){this.anchor.href=this.getHref(href);if(Ext.isDefined(target)){this.anchor.target=target;}}},onClsChange:function(node,cls,oldCls){if(this.rendered){Ext.fly(this.elNode).replaceClass(oldCls,cls);}},onDisableChange:function(node,state){this.disabled=state;if(this.checkbox){this.checkbox.disabled=state;} +this[state?'addClass':'removeClass']('x-tree-node-disabled');},onSelectedChange:function(state){if(state){this.focus();this.addClass("x-tree-selected");}else{this.removeClass("x-tree-selected");}},onMove:function(tree,node,oldParent,newParent,index,refNode){this.childIndent=null;if(this.rendered){var targetNode=newParent.ui.getContainer();if(!targetNode){this.holder=document.createElement("div");this.holder.appendChild(this.wrap);return;} +var insertBefore=refNode?refNode.ui.getEl():null;if(insertBefore){targetNode.insertBefore(this.wrap,insertBefore);}else{targetNode.appendChild(this.wrap);} +this.node.renderIndent(true,oldParent!=newParent);}},addClass:function(cls){if(this.elNode){Ext.fly(this.elNode).addClass(cls);}},removeClass:function(cls){if(this.elNode){Ext.fly(this.elNode).removeClass(cls);}},remove:function(){if(this.rendered){this.holder=document.createElement("div");this.holder.appendChild(this.wrap);}},fireEvent:function(){return this.node.fireEvent.apply(this.node,arguments);},initEvents:function(){this.node.on("move",this.onMove,this);if(this.node.disabled){this.onDisableChange(this.node,true);} +if(this.node.hidden){this.hide();} +var ot=this.node.getOwnerTree();var dd=ot.enableDD||ot.enableDrag||ot.enableDrop;if(dd&&(!this.node.isRoot||ot.rootVisible)){Ext.dd.Registry.register(this.elNode,{node:this.node,handles:this.getDDHandles(),isHandle:false});}},getDDHandles:function(){return[this.iconNode,this.textNode,this.elNode];},hide:function(){this.node.hidden=true;if(this.wrap){this.wrap.style.display="none";}},show:function(){this.node.hidden=false;if(this.wrap){this.wrap.style.display="";}},onContextMenu:function(e){if(this.node.hasListener("contextmenu")||this.node.getOwnerTree().hasListener("contextmenu")){e.preventDefault();this.focus();this.fireEvent("contextmenu",this.node,e);}},onClick:function(e){if(this.dropping){e.stopEvent();return;} +if(this.fireEvent("beforeclick",this.node,e)!==false){var a=e.getTarget('a');if(!this.disabled&&this.node.attributes.href&&a){this.fireEvent("click",this.node,e);return;}else if(a&&e.ctrlKey){e.stopEvent();} +e.preventDefault();if(this.disabled){return;} +if(this.node.attributes.singleClickExpand&&!this.animating&&this.node.isExpandable()){this.node.toggle();} +this.fireEvent("click",this.node,e);}else{e.stopEvent();}},onDblClick:function(e){e.preventDefault();if(this.disabled){return;} +if(this.fireEvent("beforedblclick",this.node,e)!==false){if(this.checkbox){this.toggleCheck();} +if(!this.animating&&this.node.isExpandable()){this.node.toggle();} +this.fireEvent("dblclick",this.node,e);}},onOver:function(e){this.addClass('x-tree-node-over');},onOut:function(e){this.removeClass('x-tree-node-over');},onCheckChange:function(){var checked=this.checkbox.checked;this.checkbox.defaultChecked=checked;this.node.attributes.checked=checked;this.fireEvent('checkchange',this.node,checked);},ecClick:function(e){if(!this.animating&&this.node.isExpandable()){this.node.toggle();}},startDrop:function(){this.dropping=true;},endDrop:function(){setTimeout(function(){this.dropping=false;}.createDelegate(this),50);},expand:function(){this.updateExpandIcon();this.ctNode.style.display="";},focus:function(){if(!this.node.preventHScroll){try{this.anchor.focus();}catch(e){}}else{try{var noscroll=this.node.getOwnerTree().getTreeEl().dom;var l=noscroll.scrollLeft;this.anchor.focus();noscroll.scrollLeft=l;}catch(e){}}},toggleCheck:function(value){var cb=this.checkbox;if(cb){cb.checked=(value===undefined?!cb.checked:value);this.onCheckChange();}},blur:function(){try{this.anchor.blur();}catch(e){}},animExpand:function(callback){var ct=Ext.get(this.ctNode);ct.stopFx();if(!this.node.isExpandable()){this.updateExpandIcon();this.ctNode.style.display="";Ext.callback(callback);return;} +this.animating=true;this.updateExpandIcon();ct.slideIn('t',{callback:function(){this.animating=false;Ext.callback(callback);},scope:this,duration:this.node.ownerTree.duration||.25});},highlight:function(){var tree=this.node.getOwnerTree();Ext.fly(this.wrap).highlight(tree.hlColor||"C3DAF9",{endColor:tree.hlBaseColor});},collapse:function(){this.updateExpandIcon();this.ctNode.style.display="none";},animCollapse:function(callback){var ct=Ext.get(this.ctNode);ct.enableDisplayMode('block');ct.stopFx();this.animating=true;this.updateExpandIcon();ct.slideOut('t',{callback:function(){this.animating=false;Ext.callback(callback);},scope:this,duration:this.node.ownerTree.duration||.25});},getContainer:function(){return this.ctNode;},getEl:function(){return this.wrap;},appendDDGhost:function(ghostNode){ghostNode.appendChild(this.elNode.cloneNode(true));},getDDRepairXY:function(){return Ext.lib.Dom.getXY(this.iconNode);},onRender:function(){this.render();},render:function(bulkRender){var n=this.node,a=n.attributes;var targetNode=n.parentNode?n.parentNode.ui.getContainer():n.ownerTree.innerCt.dom;if(!this.rendered){this.rendered=true;this.renderElements(n,a,targetNode,bulkRender);if(a.qtip){this.onTipChange(n,a.qtip,a.qtipTitle);}else if(a.qtipCfg){a.qtipCfg.target=Ext.id(this.textNode);Ext.QuickTips.register(a.qtipCfg);} +this.initEvents();if(!this.node.expanded){this.updateExpandIcon(true);}}else{if(bulkRender===true){targetNode.appendChild(this.wrap);}}},renderElements:function(n,a,targetNode,bulkRender){this.indentMarkup=n.parentNode?n.parentNode.ui.getChildIndent():'';var cb=Ext.isBoolean(a.checked),nel,href=this.getHref(a.href),buf=['<li class="x-tree-node"><div ext:tree-node-id="',n.id,'" class="x-tree-node-el x-tree-node-leaf x-unselectable ',a.cls,'" unselectable="on">','<span class="x-tree-node-indent">',this.indentMarkup,"</span>",'<img alt="" src="',this.emptyIcon,'" class="x-tree-ec-icon x-tree-elbow" />','<img alt="" src="',a.icon||this.emptyIcon,'" class="x-tree-node-icon',(a.icon?" x-tree-node-inline-icon":""),(a.iconCls?" "+a.iconCls:""),'" unselectable="on" />',cb?('<input class="x-tree-node-cb" type="checkbox" '+(a.checked?'checked="checked" />':'/>')):'','<a hidefocus="on" class="x-tree-node-anchor" href="',href,'" tabIndex="1" ',a.hrefTarget?' target="'+a.hrefTarget+'"':"",'><span unselectable="on">',n.text,"</span></a></div>",'<ul class="x-tree-node-ct" style="display:none;"></ul>',"</li>"].join('');if(bulkRender!==true&&n.nextSibling&&(nel=n.nextSibling.ui.getEl())){this.wrap=Ext.DomHelper.insertHtml("beforeBegin",nel,buf);}else{this.wrap=Ext.DomHelper.insertHtml("beforeEnd",targetNode,buf);} +this.elNode=this.wrap.childNodes[0];this.ctNode=this.wrap.childNodes[1];var cs=this.elNode.childNodes;this.indentNode=cs[0];this.ecNode=cs[1];this.iconNode=cs[2];var index=3;if(cb){this.checkbox=cs[3];this.checkbox.defaultChecked=this.checkbox.checked;index++;} +this.anchor=cs[index];this.textNode=cs[index].firstChild;},getHref:function(href){return Ext.isEmpty(href)?(Ext.isGecko?'':'#'):href;},getAnchor:function(){return this.anchor;},getTextEl:function(){return this.textNode;},getIconEl:function(){return this.iconNode;},isChecked:function(){return this.checkbox?this.checkbox.checked:false;},updateExpandIcon:function(){if(this.rendered){var n=this.node,c1,c2,cls=n.isLast()?"x-tree-elbow-end":"x-tree-elbow",hasChild=n.hasChildNodes();if(hasChild||n.attributes.expandable){if(n.expanded){cls+="-minus";c1="x-tree-node-collapsed";c2="x-tree-node-expanded";}else{cls+="-plus";c1="x-tree-node-expanded";c2="x-tree-node-collapsed";} +if(this.wasLeaf){this.removeClass("x-tree-node-leaf");this.wasLeaf=false;} +if(this.c1!=c1||this.c2!=c2){Ext.fly(this.elNode).replaceClass(c1,c2);this.c1=c1;this.c2=c2;}}else{if(!this.wasLeaf){Ext.fly(this.elNode).replaceClass("x-tree-node-expanded","x-tree-node-collapsed");delete this.c1;delete this.c2;this.wasLeaf=true;}} +var ecc="x-tree-ec-icon "+cls;if(this.ecc!=ecc){this.ecNode.className=ecc;this.ecc=ecc;}}},onIdChange:function(id){if(this.rendered){this.elNode.setAttribute('ext:tree-node-id',id);}},getChildIndent:function(){if(!this.childIndent){var buf=[],p=this.node;while(p){if(!p.isRoot||(p.isRoot&&p.ownerTree.rootVisible)){if(!p.isLast()){buf.unshift('<img alt="" src="'+this.emptyIcon+'" class="x-tree-elbow-line" />');}else{buf.unshift('<img alt="" src="'+this.emptyIcon+'" class="x-tree-icon" />');}} +p=p.parentNode;} +this.childIndent=buf.join("");} +return this.childIndent;},renderIndent:function(){if(this.rendered){var indent="",p=this.node.parentNode;if(p){indent=p.ui.getChildIndent();} +if(this.indentMarkup!=indent){this.indentNode.innerHTML=indent;this.indentMarkup=indent;} +this.updateExpandIcon();}},destroy:function(){if(this.elNode){Ext.dd.Registry.unregister(this.elNode.id);} +Ext.each(['textnode','anchor','checkbox','indentNode','ecNode','iconNode','elNode','ctNode','wrap','holder'],function(el){if(this[el]){Ext.fly(this[el]).remove();delete this[el];}},this);delete this.node;}});Ext.tree.RootTreeNodeUI=Ext.extend(Ext.tree.TreeNodeUI,{render:function(){if(!this.rendered){var targetNode=this.node.ownerTree.innerCt.dom;this.node.expanded=true;targetNode.innerHTML='<div class="x-tree-root-node"></div>';this.wrap=this.ctNode=targetNode.firstChild;}},collapse:Ext.emptyFn,expand:Ext.emptyFn});Ext.tree.TreeLoader=function(config){this.baseParams={};Ext.apply(this,config);this.addEvents("beforeload","load","loadexception");Ext.tree.TreeLoader.superclass.constructor.call(this);if(Ext.isString(this.paramOrder)){this.paramOrder=this.paramOrder.split(/[\s,|]/);}};Ext.extend(Ext.tree.TreeLoader,Ext.util.Observable,{uiProviders:{},clearOnLoad:true,paramOrder:undefined,paramsAsHash:false,nodeParameter:'node',directFn:undefined,load:function(node,callback,scope){if(this.clearOnLoad){while(node.firstChild){node.removeChild(node.firstChild);}} +if(this.doPreload(node)){this.runCallback(callback,scope||node,[node]);}else if(this.directFn||this.dataUrl||this.url){this.requestData(node,callback,scope||node);}},doPreload:function(node){if(node.attributes.children){if(node.childNodes.length<1){var cs=node.attributes.children;node.beginUpdate();for(var i=0,len=cs.length;i<len;i++){var cn=node.appendChild(this.createNode(cs[i]));if(this.preloadChildren){this.doPreload(cn);}} +node.endUpdate();} +return true;} +return false;},getParams:function(node){var bp=Ext.apply({},this.baseParams),np=this.nodeParameter,po=this.paramOrder;np&&(bp[np]=node.id);if(this.directFn){var buf=[node.id];if(po){if(np&&po.indexOf(np)>-1){buf=[];} +for(var i=0,len=po.length;i<len;i++){buf.push(bp[po[i]]);}}else if(this.paramsAsHash){buf=[bp];} +return buf;}else{return bp;}},requestData:function(node,callback,scope){if(this.fireEvent("beforeload",this,node,callback)!==false){if(this.directFn){var args=this.getParams(node);args.push(this.processDirectResponse.createDelegate(this,[{callback:callback,node:node,scope:scope}],true));this.directFn.apply(window,args);}else{this.transId=Ext.Ajax.request({method:this.requestMethod,url:this.dataUrl||this.url,success:this.handleResponse,failure:this.handleFailure,scope:this,argument:{callback:callback,node:node,scope:scope},params:this.getParams(node)});}}else{this.runCallback(callback,scope||node,[]);}},processDirectResponse:function(result,response,args){if(response.status){this.handleResponse({responseData:Ext.isArray(result)?result:null,responseText:result,argument:args});}else{this.handleFailure({argument:args});}},runCallback:function(cb,scope,args){if(Ext.isFunction(cb)){cb.apply(scope,args);}},isLoading:function(){return!!this.transId;},abort:function(){if(this.isLoading()){Ext.Ajax.abort(this.transId);}},createNode:function(attr){if(this.baseAttrs){Ext.applyIf(attr,this.baseAttrs);} +if(this.applyLoader!==false&&!attr.loader){attr.loader=this;} +if(Ext.isString(attr.uiProvider)){attr.uiProvider=this.uiProviders[attr.uiProvider]||eval(attr.uiProvider);} +if(attr.nodeType){return new Ext.tree.TreePanel.nodeTypes[attr.nodeType](attr);}else{return attr.leaf?new Ext.tree.TreeNode(attr):new Ext.tree.AsyncTreeNode(attr);}},processResponse:function(response,node,callback,scope){var json=response.responseText;try{var o=response.responseData||Ext.decode(json);node.beginUpdate();for(var i=0,len=o.length;i<len;i++){var n=this.createNode(o[i]);if(n){node.appendChild(n);}} +node.endUpdate();this.runCallback(callback,scope||node,[node]);}catch(e){this.handleFailure(response);}},handleResponse:function(response){this.transId=false;var a=response.argument;this.processResponse(response,a.node,a.callback,a.scope);this.fireEvent("load",this,a.node,response);},handleFailure:function(response){this.transId=false;var a=response.argument;this.fireEvent("loadexception",this,a.node,response);this.runCallback(a.callback,a.scope||a.node,[a.node]);},destroy:function(){this.abort();this.purgeListeners();}});Ext.tree.TreeFilter=function(tree,config){this.tree=tree;this.filtered={};Ext.apply(this,config);};Ext.tree.TreeFilter.prototype={clearBlank:false,reverse:false,autoClear:false,remove:false,filter:function(value,attr,startNode){attr=attr||"text";var f;if(typeof value=="string"){var vlen=value.length;if(vlen==0&&this.clearBlank){this.clear();return;} +value=value.toLowerCase();f=function(n){return n.attributes[attr].substr(0,vlen).toLowerCase()==value;};}else if(value.exec){f=function(n){return value.test(n.attributes[attr]);};}else{throw'Illegal filter type, must be string or regex';} +this.filterBy(f,null,startNode);},filterBy:function(fn,scope,startNode){startNode=startNode||this.tree.root;if(this.autoClear){this.clear();} +var af=this.filtered,rv=this.reverse;var f=function(n){if(n==startNode){return true;} +if(af[n.id]){return false;} +var m=fn.call(scope||n,n);if(!m||rv){af[n.id]=n;n.ui.hide();return false;} +return true;};startNode.cascade(f);if(this.remove){for(var id in af){if(typeof id!="function"){var n=af[id];if(n&&n.parentNode){n.parentNode.removeChild(n);}}}}},clear:function(){var t=this.tree;var af=this.filtered;for(var id in af){if(typeof id!="function"){var n=af[id];if(n){n.ui.show();}}} +this.filtered={};}};Ext.tree.TreeSorter=Ext.extend(Object,{constructor:function(tree,config){Ext.apply(this,config);tree.on({scope:this,beforechildrenrendered:this.doSort,append:this.updateSort,insert:this.updateSort,textchange:this.updateSortParent});var desc=this.dir&&this.dir.toLowerCase()=='desc',prop=this.property||'text';sortType=this.sortType;folderSort=this.folderSort;caseSensitive=this.caseSensitive===true;leafAttr=this.leafAttr||'leaf';if(Ext.isString(sortType)){sortType=Ext.data.SortTypes[sortType];} +this.sortFn=function(n1,n2){var attr1=n1.attributes,attr2=n2.attributes;if(folderSort){if(attr1[leafAttr]&&!attr2[leafAttr]){return 1;} +if(!attr1[leafAttr]&&attr2[leafAttr]){return-1;}} +var prop1=attr1[prop],prop2=attr2[prop],v1=sortType?sortType(prop1):(caseSensitive?prop1:prop1.toUpperCase());v2=sortType?sortType(prop2):(caseSensitive?prop2:prop2.toUpperCase());if(v1<v2){return desc?1:-1;}else if(v1>v2){return desc?-1:1;} +return 0;};},doSort:function(node){node.sort(this.sortFn);},updateSort:function(tree,node){if(node.childrenRendered){this.doSort.defer(1,this,[node]);}},updateSortParent:function(node){var p=node.parentNode;if(p&&p.childrenRendered){this.doSort.defer(1,this,[p]);}}});if(Ext.dd.DropZone){Ext.tree.TreeDropZone=function(tree,config){this.allowParentInsert=config.allowParentInsert||false;this.allowContainerDrop=config.allowContainerDrop||false;this.appendOnly=config.appendOnly||false;Ext.tree.TreeDropZone.superclass.constructor.call(this,tree.getTreeEl(),config);this.tree=tree;this.dragOverData={};this.lastInsertClass="x-tree-no-status";};Ext.extend(Ext.tree.TreeDropZone,Ext.dd.DropZone,{ddGroup:"TreeDD",expandDelay:1000,expandNode:function(node){if(node.hasChildNodes()&&!node.isExpanded()){node.expand(false,null,this.triggerCacheRefresh.createDelegate(this));}},queueExpand:function(node){this.expandProcId=this.expandNode.defer(this.expandDelay,this,[node]);},cancelExpand:function(){if(this.expandProcId){clearTimeout(this.expandProcId);this.expandProcId=false;}},isValidDropPoint:function(n,pt,dd,e,data){if(!n||!data){return false;} +var targetNode=n.node;var dropNode=data.node;if(!(targetNode&&targetNode.isTarget&&pt)){return false;} +if(pt=="append"&&targetNode.allowChildren===false){return false;} +if((pt=="above"||pt=="below")&&(targetNode.parentNode&&targetNode.parentNode.allowChildren===false)){return false;} +if(dropNode&&(targetNode==dropNode||dropNode.contains(targetNode))){return false;} +var overEvent=this.dragOverData;overEvent.tree=this.tree;overEvent.target=targetNode;overEvent.data=data;overEvent.point=pt;overEvent.source=dd;overEvent.rawEvent=e;overEvent.dropNode=dropNode;overEvent.cancel=false;var result=this.tree.fireEvent("nodedragover",overEvent);return overEvent.cancel===false&&result!==false;},getDropPoint:function(e,n,dd){var tn=n.node;if(tn.isRoot){return tn.allowChildren!==false?"append":false;} +var dragEl=n.ddel;var t=Ext.lib.Dom.getY(dragEl),b=t+dragEl.offsetHeight;var y=Ext.lib.Event.getPageY(e);var noAppend=tn.allowChildren===false||tn.isLeaf();if(this.appendOnly||tn.parentNode.allowChildren===false){return noAppend?false:"append";} +var noBelow=false;if(!this.allowParentInsert){noBelow=tn.hasChildNodes()&&tn.isExpanded();} +var q=(b-t)/(noAppend?2:3);if(y>=t&&y<(t+q)){return"above";}else if(!noBelow&&(noAppend||y>=b-q&&y<=b)){return"below";}else{return"append";}},onNodeEnter:function(n,dd,e,data){this.cancelExpand();},onContainerOver:function(dd,e,data){if(this.allowContainerDrop&&this.isValidDropPoint({ddel:this.tree.getRootNode().ui.elNode,node:this.tree.getRootNode()},"append",dd,e,data)){return this.dropAllowed;} +return this.dropNotAllowed;},onNodeOver:function(n,dd,e,data){var pt=this.getDropPoint(e,n,dd);var node=n.node;if(!this.expandProcId&&pt=="append"&&node.hasChildNodes()&&!n.node.isExpanded()){this.queueExpand(node);}else if(pt!="append"){this.cancelExpand();} +var returnCls=this.dropNotAllowed;if(this.isValidDropPoint(n,pt,dd,e,data)){if(pt){var el=n.ddel;var cls;if(pt=="above"){returnCls=n.node.isFirst()?"x-tree-drop-ok-above":"x-tree-drop-ok-between";cls="x-tree-drag-insert-above";}else if(pt=="below"){returnCls=n.node.isLast()?"x-tree-drop-ok-below":"x-tree-drop-ok-between";cls="x-tree-drag-insert-below";}else{returnCls="x-tree-drop-ok-append";cls="x-tree-drag-append";} +if(this.lastInsertClass!=cls){Ext.fly(el).replaceClass(this.lastInsertClass,cls);this.lastInsertClass=cls;}}} +return returnCls;},onNodeOut:function(n,dd,e,data){this.cancelExpand();this.removeDropIndicators(n);},onNodeDrop:function(n,dd,e,data){var point=this.getDropPoint(e,n,dd);var targetNode=n.node;targetNode.ui.startDrop();if(!this.isValidDropPoint(n,point,dd,e,data)){targetNode.ui.endDrop();return false;} +var dropNode=data.node||(dd.getTreeNode?dd.getTreeNode(data,targetNode,point,e):null);return this.processDrop(targetNode,data,point,dd,e,dropNode);},onContainerDrop:function(dd,e,data){if(this.allowContainerDrop&&this.isValidDropPoint({ddel:this.tree.getRootNode().ui.elNode,node:this.tree.getRootNode()},"append",dd,e,data)){var targetNode=this.tree.getRootNode();targetNode.ui.startDrop();var dropNode=data.node||(dd.getTreeNode?dd.getTreeNode(data,targetNode,'append',e):null);return this.processDrop(targetNode,data,'append',dd,e,dropNode);} +return false;},processDrop:function(target,data,point,dd,e,dropNode){var dropEvent={tree:this.tree,target:target,data:data,point:point,source:dd,rawEvent:e,dropNode:dropNode,cancel:!dropNode,dropStatus:false};var retval=this.tree.fireEvent("beforenodedrop",dropEvent);if(retval===false||dropEvent.cancel===true||!dropEvent.dropNode){target.ui.endDrop();return dropEvent.dropStatus;} +target=dropEvent.target;if(point=='append'&&!target.isExpanded()){target.expand(false,null,function(){this.completeDrop(dropEvent);}.createDelegate(this));}else{this.completeDrop(dropEvent);} +return true;},completeDrop:function(de){var ns=de.dropNode,p=de.point,t=de.target;if(!Ext.isArray(ns)){ns=[ns];} +var n;for(var i=0,len=ns.length;i<len;i++){n=ns[i];if(p=="above"){t.parentNode.insertBefore(n,t);}else if(p=="below"){t.parentNode.insertBefore(n,t.nextSibling);}else{t.appendChild(n);}} +n.ui.focus();if(Ext.enableFx&&this.tree.hlDrop){n.ui.highlight();} +t.ui.endDrop();this.tree.fireEvent("nodedrop",de);},afterNodeMoved:function(dd,data,e,targetNode,dropNode){if(Ext.enableFx&&this.tree.hlDrop){dropNode.ui.focus();dropNode.ui.highlight();} +this.tree.fireEvent("nodedrop",this.tree,targetNode,data,dd,e);},getTree:function(){return this.tree;},removeDropIndicators:function(n){if(n&&n.ddel){var el=n.ddel;Ext.fly(el).removeClass(["x-tree-drag-insert-above","x-tree-drag-insert-below","x-tree-drag-append"]);this.lastInsertClass="_noclass";}},beforeDragDrop:function(target,e,id){this.cancelExpand();return true;},afterRepair:function(data){if(data&&Ext.enableFx){data.node.ui.highlight();} +this.hideProxy();}});} +if(Ext.dd.DragZone){Ext.tree.TreeDragZone=function(tree,config){Ext.tree.TreeDragZone.superclass.constructor.call(this,tree.innerCt,config);this.tree=tree;};Ext.extend(Ext.tree.TreeDragZone,Ext.dd.DragZone,{ddGroup:"TreeDD",onBeforeDrag:function(data,e){var n=data.node;return n&&n.draggable&&!n.disabled;},onInitDrag:function(e){var data=this.dragData;this.tree.getSelectionModel().select(data.node);this.tree.eventModel.disable();this.proxy.update("");data.node.ui.appendDDGhost(this.proxy.ghost.dom);this.tree.fireEvent("startdrag",this.tree,data.node,e);},getRepairXY:function(e,data){return data.node.ui.getDDRepairXY();},onEndDrag:function(data,e){this.tree.eventModel.enable.defer(100,this.tree.eventModel);this.tree.fireEvent("enddrag",this.tree,data.node,e);},onValidDrop:function(dd,e,id){this.tree.fireEvent("dragdrop",this.tree,this.dragData.node,dd,e);this.hideProxy();},beforeInvalidDrop:function(e,id){var sm=this.tree.getSelectionModel();sm.clearSelections();sm.select(this.dragData.node);},afterRepair:function(){if(Ext.enableFx&&this.tree.hlDrop){Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor||"c3daf9");} +this.dragging=false;}});} +Ext.tree.TreeEditor=function(tree,fc,config){fc=fc||{};var field=fc.events?fc:new Ext.form.TextField(fc);Ext.tree.TreeEditor.superclass.constructor.call(this,field,config);this.tree=tree;if(!tree.rendered){tree.on('render',this.initEditor,this);}else{this.initEditor(tree);}};Ext.extend(Ext.tree.TreeEditor,Ext.Editor,{alignment:"l-l",autoSize:false,hideEl:false,cls:"x-small-editor x-tree-editor",shim:false,shadow:"frame",maxWidth:250,editDelay:350,initEditor:function(tree){tree.on({scope:this,beforeclick:this.beforeNodeClick,dblclick:this.onNodeDblClick});this.on({scope:this,complete:this.updateNode,beforestartedit:this.fitToTree,specialkey:this.onSpecialKey});this.on('startedit',this.bindScroll,this,{delay:10});},fitToTree:function(ed,el){var td=this.tree.getTreeEl().dom,nd=el.dom;if(td.scrollLeft>nd.offsetLeft){td.scrollLeft=nd.offsetLeft;} +var w=Math.min(this.maxWidth,(td.clientWidth>20?td.clientWidth:td.offsetWidth)-Math.max(0,nd.offsetLeft-td.scrollLeft)-5);this.setSize(w,'');},triggerEdit:function(node,defer){this.completeEdit();if(node.attributes.editable!==false){this.editNode=node;if(this.tree.autoScroll){Ext.fly(node.ui.getEl()).scrollIntoView(this.tree.body);} +var value=node.text||'';if(!Ext.isGecko&&Ext.isEmpty(node.text)){node.setText(' ');} +this.autoEditTimer=this.startEdit.defer(this.editDelay,this,[node.ui.textNode,value]);return false;}},bindScroll:function(){this.tree.getTreeEl().on('scroll',this.cancelEdit,this);},beforeNodeClick:function(node,e){clearTimeout(this.autoEditTimer);if(this.tree.getSelectionModel().isSelected(node)){e.stopEvent();return this.triggerEdit(node);}},onNodeDblClick:function(node,e){clearTimeout(this.autoEditTimer);},updateNode:function(ed,value){this.tree.getTreeEl().un('scroll',this.cancelEdit,this);this.editNode.setText(value);},onHide:function(){Ext.tree.TreeEditor.superclass.onHide.call(this);if(this.editNode){this.editNode.ui.focus.defer(50,this.editNode.ui);}},onSpecialKey:function(field,e){var k=e.getKey();if(k==e.ESC){e.stopEvent();this.cancelEdit();}else if(k==e.ENTER&&!e.hasModifier()){e.stopEvent();this.completeEdit();}},onDestroy:function(){clearTimeout(this.autoEditTimer);Ext.tree.TreeEditor.superclass.onDestroy.call(this);var tree=this.tree;tree.un('beforeclick',this.beforeNodeClick,this);tree.un('dblclick',this.onNodeDblClick,this);}});Ext.Window=Ext.extend(Ext.Panel,{baseCls:'x-window',resizable:true,draggable:true,closable:true,closeAction:'close',constrain:false,constrainHeader:false,plain:false,minimizable:false,maximizable:false,minHeight:100,minWidth:200,expandOnShow:true,showAnimDuration:0.25,hideAnimDuration:0.25,collapsible:false,initHidden:undefined,hidden:true,elements:'header,body',frame:true,floating:true,initComponent:function(){this.initTools();Ext.Window.superclass.initComponent.call(this);this.addEvents('resize','maximize','minimize','restore');if(Ext.isDefined(this.initHidden)){this.hidden=this.initHidden;} +if(this.hidden===false){this.hidden=true;this.show();}},getState:function(){return Ext.apply(Ext.Window.superclass.getState.call(this)||{},this.getBox(true));},onRender:function(ct,position){Ext.Window.superclass.onRender.call(this,ct,position);if(this.plain){this.el.addClass('x-window-plain');} +this.focusEl=this.el.createChild({tag:'a',href:'#',cls:'x-dlg-focus',tabIndex:'-1',html:' '});this.focusEl.swallowEvent('click',true);this.proxy=this.el.createProxy('x-window-proxy');this.proxy.enableDisplayMode('block');if(this.modal){this.mask=this.container.createChild({cls:'ext-el-mask'},this.el.dom);this.mask.enableDisplayMode('block');this.mask.hide();this.mon(this.mask,'click',this.focus,this);} +if(this.maximizable){this.mon(this.header,'dblclick',this.toggleMaximize,this);}},initEvents:function(){Ext.Window.superclass.initEvents.call(this);if(this.animateTarget){this.setAnimateTarget(this.animateTarget);} +if(this.resizable){this.resizer=new Ext.Resizable(this.el,{minWidth:this.minWidth,minHeight:this.minHeight,handles:this.resizeHandles||'all',pinned:true,resizeElement:this.resizerAction,handleCls:'x-window-handle'});this.resizer.window=this;this.mon(this.resizer,'beforeresize',this.beforeResize,this);} +if(this.draggable){this.header.addClass('x-window-draggable');} +this.mon(this.el,'mousedown',this.toFront,this);this.manager=this.manager||Ext.WindowMgr;this.manager.register(this);if(this.maximized){this.maximized=false;this.maximize();} +if(this.closable){var km=this.getKeyMap();km.on(27,this.onEsc,this);km.disable();}},initDraggable:function(){this.dd=new Ext.Window.DD(this);},onEsc:function(k,e){e.stopEvent();this[this.closeAction]();},beforeDestroy:function(){if(this.rendered){this.hide();this.clearAnchor();Ext.destroy(this.focusEl,this.resizer,this.dd,this.proxy,this.mask);} +Ext.Window.superclass.beforeDestroy.call(this);},onDestroy:function(){if(this.manager){this.manager.unregister(this);} +Ext.Window.superclass.onDestroy.call(this);},initTools:function(){if(this.minimizable){this.addTool({id:'minimize',handler:this.minimize.createDelegate(this,[])});} +if(this.maximizable){this.addTool({id:'maximize',handler:this.maximize.createDelegate(this,[])});this.addTool({id:'restore',handler:this.restore.createDelegate(this,[]),hidden:true});} +if(this.closable){this.addTool({id:'close',handler:this[this.closeAction].createDelegate(this,[])});}},resizerAction:function(){var box=this.proxy.getBox();this.proxy.hide();this.window.handleResize(box);return box;},beforeResize:function(){this.resizer.minHeight=Math.max(this.minHeight,this.getFrameHeight()+40);this.resizer.minWidth=Math.max(this.minWidth,this.getFrameWidth()+40);this.resizeBox=this.el.getBox();},updateHandles:function(){if(Ext.isIE&&this.resizer){this.resizer.syncHandleHeight();this.el.repaint();}},handleResize:function(box){var rz=this.resizeBox;if(rz.x!=box.x||rz.y!=box.y){this.updateBox(box);}else{this.setSize(box);if(Ext.isIE6&&Ext.isStrict){this.doLayout();}} +this.focus();this.updateHandles();this.saveState();},focus:function(){var f=this.focusEl,db=this.defaultButton,t=typeof db,el,ct;if(Ext.isDefined(db)){if(Ext.isNumber(db)&&this.fbar){f=this.fbar.items.get(db);}else if(Ext.isString(db)){f=Ext.getCmp(db);}else{f=db;} +el=f.getEl();ct=Ext.getDom(this.container);if(el&&ct){if(ct!=document.body&&!Ext.lib.Region.getRegion(ct).contains(Ext.lib.Region.getRegion(el.dom))){return;}}} +f=f||this.focusEl;f.focus.defer(10,f);},setAnimateTarget:function(el){el=Ext.get(el);this.animateTarget=el;},beforeShow:function(){delete this.el.lastXY;delete this.el.lastLT;if(this.x===undefined||this.y===undefined){var xy=this.el.getAlignToXY(this.container,'c-c');var pos=this.el.translatePoints(xy[0],xy[1]);this.x=this.x===undefined?pos.left:this.x;this.y=this.y===undefined?pos.top:this.y;} +this.el.setLeftTop(this.x,this.y);if(this.expandOnShow){this.expand(false);} +if(this.modal){Ext.getBody().addClass('x-body-masked');this.mask.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true));this.mask.show();}},show:function(animateTarget,cb,scope){if(!this.rendered){this.render(Ext.getBody());} +if(this.hidden===false){this.toFront();return this;} +if(this.fireEvent('beforeshow',this)===false){return this;} +if(cb){this.on('show',cb,scope,{single:true});} +this.hidden=false;if(Ext.isDefined(animateTarget)){this.setAnimateTarget(animateTarget);} +this.beforeShow();if(this.animateTarget){this.animShow();}else{this.afterShow();} +return this;},afterShow:function(isAnim){if(this.isDestroyed){return false;} +this.proxy.hide();this.el.setStyle('display','block');this.el.show();if(this.maximized){this.fitContainer();} +if(Ext.isMac&&Ext.isGecko2){this.cascade(this.setAutoScroll);} +if(this.monitorResize||this.modal||this.constrain||this.constrainHeader){Ext.EventManager.onWindowResize(this.onWindowResize,this);} +this.doConstrain();this.doLayout();if(this.keyMap){this.keyMap.enable();} +this.toFront();this.updateHandles();if(isAnim&&(Ext.isIE||Ext.isWebKit)){var sz=this.getSize();this.onResize(sz.width,sz.height);} +this.onShow();this.fireEvent('show',this);},animShow:function(){this.proxy.show();this.proxy.setBox(this.animateTarget.getBox());this.proxy.setOpacity(0);var b=this.getBox();this.el.setStyle('display','none');this.proxy.shift(Ext.apply(b,{callback:this.afterShow.createDelegate(this,[true],false),scope:this,easing:'easeNone',duration:this.showAnimDuration,opacity:0.5}));},hide:function(animateTarget,cb,scope){if(this.hidden||this.fireEvent('beforehide',this)===false){return this;} +if(cb){this.on('hide',cb,scope,{single:true});} +this.hidden=true;if(animateTarget!==undefined){this.setAnimateTarget(animateTarget);} +if(this.modal){this.mask.hide();Ext.getBody().removeClass('x-body-masked');} +if(this.animateTarget){this.animHide();}else{this.el.hide();this.afterHide();} +return this;},afterHide:function(){this.proxy.hide();if(this.monitorResize||this.modal||this.constrain||this.constrainHeader){Ext.EventManager.removeResizeListener(this.onWindowResize,this);} +if(this.keyMap){this.keyMap.disable();} +this.onHide();this.fireEvent('hide',this);},animHide:function(){this.proxy.setOpacity(0.5);this.proxy.show();var tb=this.getBox(false);this.proxy.setBox(tb);this.el.hide();this.proxy.shift(Ext.apply(this.animateTarget.getBox(),{callback:this.afterHide,scope:this,duration:this.hideAnimDuration,easing:'easeNone',opacity:0}));},onShow:Ext.emptyFn,onHide:Ext.emptyFn,onWindowResize:function(){if(this.maximized){this.fitContainer();} +if(this.modal){this.mask.setSize('100%','100%');var force=this.mask.dom.offsetHeight;this.mask.setSize(Ext.lib.Dom.getViewWidth(true),Ext.lib.Dom.getViewHeight(true));} +this.doConstrain();},doConstrain:function(){if(this.constrain||this.constrainHeader){var offsets;if(this.constrain){offsets={right:this.el.shadowOffset,left:this.el.shadowOffset,bottom:this.el.shadowOffset};}else{var s=this.getSize();offsets={right:-(s.width-100),bottom:-(s.height-25)};} +var xy=this.el.getConstrainToXY(this.container,true,offsets);if(xy){this.setPosition(xy[0],xy[1]);}}},ghost:function(cls){var ghost=this.createGhost(cls);var box=this.getBox(true);ghost.setLeftTop(box.x,box.y);ghost.setWidth(box.width);this.el.hide();this.activeGhost=ghost;return ghost;},unghost:function(show,matchPosition){if(!this.activeGhost){return;} +if(show!==false){this.el.show();this.focus.defer(10,this);if(Ext.isMac&&Ext.isGecko2){this.cascade(this.setAutoScroll);}} +if(matchPosition!==false){this.setPosition(this.activeGhost.getLeft(true),this.activeGhost.getTop(true));} +this.activeGhost.hide();this.activeGhost.remove();delete this.activeGhost;},minimize:function(){this.fireEvent('minimize',this);return this;},close:function(){if(this.fireEvent('beforeclose',this)!==false){if(this.hidden){this.doClose();}else{this.hide(null,this.doClose,this);}}},doClose:function(){this.fireEvent('close',this);this.destroy();},maximize:function(){if(!this.maximized){this.expand(false);this.restoreSize=this.getSize();this.restorePos=this.getPosition(true);if(this.maximizable){this.tools.maximize.hide();this.tools.restore.show();} +this.maximized=true;this.el.disableShadow();if(this.dd){this.dd.lock();} +if(this.collapsible){this.tools.toggle.hide();} +this.el.addClass('x-window-maximized');this.container.addClass('x-window-maximized-ct');this.setPosition(0,0);this.fitContainer();this.fireEvent('maximize',this);} +return this;},restore:function(){if(this.maximized){var t=this.tools;this.el.removeClass('x-window-maximized');if(t.restore){t.restore.hide();} +if(t.maximize){t.maximize.show();} +this.setPosition(this.restorePos[0],this.restorePos[1]);this.setSize(this.restoreSize.width,this.restoreSize.height);delete this.restorePos;delete this.restoreSize;this.maximized=false;this.el.enableShadow(true);if(this.dd){this.dd.unlock();} +if(this.collapsible&&t.toggle){t.toggle.show();} +this.container.removeClass('x-window-maximized-ct');this.doConstrain();this.fireEvent('restore',this);} +return this;},toggleMaximize:function(){return this[this.maximized?'restore':'maximize']();},fitContainer:function(){var vs=this.container.getViewSize(false);this.setSize(vs.width,vs.height);},setZIndex:function(index){if(this.modal){this.mask.setStyle('z-index',index);} +this.el.setZIndex(++index);index+=5;if(this.resizer){this.resizer.proxy.setStyle('z-index',++index);} +this.lastZIndex=index;},alignTo:function(element,position,offsets){var xy=this.el.getAlignToXY(element,position,offsets);this.setPagePosition(xy[0],xy[1]);return this;},anchorTo:function(el,alignment,offsets,monitorScroll){this.clearAnchor();this.anchorTarget={el:el,alignment:alignment,offsets:offsets};Ext.EventManager.onWindowResize(this.doAnchor,this);var tm=typeof monitorScroll;if(tm!='undefined'){Ext.EventManager.on(window,'scroll',this.doAnchor,this,{buffer:tm=='number'?monitorScroll:50});} +return this.doAnchor();},doAnchor:function(){var o=this.anchorTarget;this.alignTo(o.el,o.alignment,o.offsets);return this;},clearAnchor:function(){if(this.anchorTarget){Ext.EventManager.removeResizeListener(this.doAnchor,this);Ext.EventManager.un(window,'scroll',this.doAnchor,this);delete this.anchorTarget;} +return this;},toFront:function(e){if(this.manager.bringToFront(this)){if(!e||!e.getTarget().focus){this.focus();}} +return this;},setActive:function(active){if(active){if(!this.maximized){this.el.enableShadow(true);} +this.fireEvent('activate',this);}else{this.el.disableShadow();this.fireEvent('deactivate',this);}},toBack:function(){this.manager.sendToBack(this);return this;},center:function(){var xy=this.el.getAlignToXY(this.container,'c-c');this.setPagePosition(xy[0],xy[1]);return this;}});Ext.reg('window',Ext.Window);Ext.Window.DD=Ext.extend(Ext.dd.DD,{constructor:function(win){this.win=win;Ext.Window.DD.superclass.constructor.call(this,win.el.id,'WindowDD-'+win.id);this.setHandleElId(win.header.id);this.scroll=false;},moveOnly:true,headerOffsets:[100,25],startDrag:function(){var w=this.win;this.proxy=w.ghost(w.initialConfig.cls);if(w.constrain!==false){var so=w.el.shadowOffset;this.constrainTo(w.container,{right:so,left:so,bottom:so});}else if(w.constrainHeader!==false){var s=this.proxy.getSize();this.constrainTo(w.container,{right:-(s.width-this.headerOffsets[0]),bottom:-(s.height-this.headerOffsets[1])});}},b4Drag:Ext.emptyFn,onDrag:function(e){this.alignElWithMouse(this.proxy,e.getPageX(),e.getPageY());},endDrag:function(e){this.win.unghost();this.win.saveState();}});Ext.WindowGroup=function(){var list={};var accessList=[];var front=null;var sortWindows=function(d1,d2){return(!d1._lastAccess||d1._lastAccess<d2._lastAccess)?-1:1;};var orderWindows=function(){var a=accessList,len=a.length;if(len>0){a.sort(sortWindows);var seed=a[0].manager.zseed;for(var i=0;i<len;i++){var win=a[i];if(win&&!win.hidden){win.setZIndex(seed+(i*10));}}} +activateLast();};var setActiveWin=function(win){if(win!=front){if(front){front.setActive(false);} +front=win;if(win){win.setActive(true);}}};var activateLast=function(){for(var i=accessList.length-1;i>=0;--i){if(!accessList[i].hidden){setActiveWin(accessList[i]);return;}} +setActiveWin(null);};return{zseed:9000,register:function(win){if(win.manager){win.manager.unregister(win);} +win.manager=this;list[win.id]=win;accessList.push(win);win.on('hide',activateLast);},unregister:function(win){delete win.manager;delete list[win.id];win.un('hide',activateLast);accessList.remove(win);},get:function(id){return typeof id=="object"?id:list[id];},bringToFront:function(win){win=this.get(win);if(win!=front){win._lastAccess=new Date().getTime();orderWindows();return true;} +return false;},sendToBack:function(win){win=this.get(win);win._lastAccess=-(new Date().getTime());orderWindows();return win;},hideAll:function(){for(var id in list){if(list[id]&&typeof list[id]!="function"&&list[id].isVisible()){list[id].hide();}}},getActive:function(){return front;},getBy:function(fn,scope){var r=[];for(var i=accessList.length-1;i>=0;--i){var win=accessList[i];if(fn.call(scope||win,win)!==false){r.push(win);}} +return r;},each:function(fn,scope){for(var id in list){if(list[id]&&typeof list[id]!="function"){if(fn.call(scope||list[id],list[id])===false){return;}}}}};};Ext.WindowMgr=new Ext.WindowGroup();Ext.MessageBox=function(){var dlg,opt,mask,waitTimer,bodyEl,msgEl,textboxEl,textareaEl,progressBar,pp,iconEl,spacerEl,buttons,activeTextEl,bwidth,bufferIcon='',iconCls='',buttonNames=['ok','yes','no','cancel'];var handleButton=function(button){buttons[button].blur();if(dlg.isVisible()){dlg.hide();handleHide();Ext.callback(opt.fn,opt.scope||window,[button,activeTextEl.dom.value,opt],1);}};var handleHide=function(){if(opt&&opt.cls){dlg.el.removeClass(opt.cls);} +progressBar.reset();};var handleEsc=function(d,k,e){if(opt&&opt.closable!==false){dlg.hide();handleHide();} +if(e){e.stopEvent();}};var updateButtons=function(b){var width=0,cfg;if(!b){Ext.each(buttonNames,function(name){buttons[name].hide();});return width;} +dlg.footer.dom.style.display='';Ext.iterate(buttons,function(name,btn){cfg=b[name];if(cfg){btn.show();btn.setText(Ext.isString(cfg)?cfg:Ext.MessageBox.buttonText[name]);width+=btn.getEl().getWidth()+15;}else{btn.hide();}});return width;};return{getDialog:function(titleText){if(!dlg){var btns=[];buttons={};Ext.each(buttonNames,function(name){btns.push(buttons[name]=new Ext.Button({text:this.buttonText[name],handler:handleButton.createCallback(name),hideMode:'offsets'}));},this);dlg=new Ext.Window({autoCreate:true,title:titleText,resizable:false,constrain:true,constrainHeader:true,minimizable:false,maximizable:false,stateful:false,modal:true,shim:true,buttonAlign:"center",width:400,height:100,minHeight:80,plain:true,footer:true,closable:true,close:function(){if(opt&&opt.buttons&&opt.buttons.no&&!opt.buttons.cancel){handleButton("no");}else{handleButton("cancel");}},fbar:new Ext.Toolbar({items:btns,enableOverflow:false})});dlg.render(document.body);dlg.getEl().addClass('x-window-dlg');mask=dlg.mask;bodyEl=dlg.body.createChild({html:'<div class="ext-mb-icon"></div><div class="ext-mb-content"><span class="ext-mb-text"></span><br /><div class="ext-mb-fix-cursor"><input type="text" class="ext-mb-input" /><textarea class="ext-mb-textarea"></textarea></div></div>'});iconEl=Ext.get(bodyEl.dom.firstChild);var contentEl=bodyEl.dom.childNodes[1];msgEl=Ext.get(contentEl.firstChild);textboxEl=Ext.get(contentEl.childNodes[2].firstChild);textboxEl.enableDisplayMode();textboxEl.addKeyListener([10,13],function(){if(dlg.isVisible()&&opt&&opt.buttons){if(opt.buttons.ok){handleButton("ok");}else if(opt.buttons.yes){handleButton("yes");}}});textareaEl=Ext.get(contentEl.childNodes[2].childNodes[1]);textareaEl.enableDisplayMode();progressBar=new Ext.ProgressBar({renderTo:bodyEl});bodyEl.createChild({cls:'x-clear'});} +return dlg;},updateText:function(text){if(!dlg.isVisible()&&!opt.width){dlg.setSize(this.maxWidth,100);} +msgEl.update(text?text+' ':' ');var iw=iconCls!=''?(iconEl.getWidth()+iconEl.getMargins('lr')):0,mw=msgEl.getWidth()+msgEl.getMargins('lr'),fw=dlg.getFrameWidth('lr'),bw=dlg.body.getFrameWidth('lr'),w;w=Math.max(Math.min(opt.width||iw+mw+fw+bw,opt.maxWidth||this.maxWidth),Math.max(opt.minWidth||this.minWidth,bwidth||0));if(opt.prompt===true){activeTextEl.setWidth(w-iw-fw-bw);} +if(opt.progress===true||opt.wait===true){progressBar.setSize(w-iw-fw-bw);} +if(Ext.isIE&&w==bwidth){w+=4;} +msgEl.update(text||' ');dlg.setSize(w,'auto').center();return this;},updateProgress:function(value,progressText,msg){progressBar.updateProgress(value,progressText);if(msg){this.updateText(msg);} +return this;},isVisible:function(){return dlg&&dlg.isVisible();},hide:function(){var proxy=dlg?dlg.activeGhost:null;if(this.isVisible()||proxy){dlg.hide();handleHide();if(proxy){dlg.unghost(false,false);}} +return this;},show:function(options){if(this.isVisible()){this.hide();} +opt=options;var d=this.getDialog(opt.title||" ");d.setTitle(opt.title||" ");var allowClose=(opt.closable!==false&&opt.progress!==true&&opt.wait!==true);d.tools.close.setDisplayed(allowClose);activeTextEl=textboxEl;opt.prompt=opt.prompt||(opt.multiline?true:false);if(opt.prompt){if(opt.multiline){textboxEl.hide();textareaEl.show();textareaEl.setHeight(Ext.isNumber(opt.multiline)?opt.multiline:this.defaultTextHeight);activeTextEl=textareaEl;}else{textboxEl.show();textareaEl.hide();}}else{textboxEl.hide();textareaEl.hide();} +activeTextEl.dom.value=opt.value||"";if(opt.prompt){d.focusEl=activeTextEl;}else{var bs=opt.buttons;var db=null;if(bs&&bs.ok){db=buttons["ok"];}else if(bs&&bs.yes){db=buttons["yes"];} +if(db){d.focusEl=db;}} +if(Ext.isDefined(opt.iconCls)){d.setIconClass(opt.iconCls);} +this.setIcon(Ext.isDefined(opt.icon)?opt.icon:bufferIcon);bwidth=updateButtons(opt.buttons);progressBar.setVisible(opt.progress===true||opt.wait===true);this.updateProgress(0,opt.progressText);this.updateText(opt.msg);if(opt.cls){d.el.addClass(opt.cls);} +d.proxyDrag=opt.proxyDrag===true;d.modal=opt.modal!==false;d.mask=opt.modal!==false?mask:false;if(!d.isVisible()){document.body.appendChild(dlg.el.dom);d.setAnimateTarget(opt.animEl);d.on('show',function(){if(allowClose===true){d.keyMap.enable();}else{d.keyMap.disable();}},this,{single:true});d.show(opt.animEl);} +if(opt.wait===true){progressBar.wait(opt.waitConfig);} +return this;},setIcon:function(icon){if(!dlg){bufferIcon=icon;return;} +bufferIcon=undefined;if(icon&&icon!=''){iconEl.removeClass('x-hidden');iconEl.replaceClass(iconCls,icon);bodyEl.addClass('x-dlg-icon');iconCls=icon;}else{iconEl.replaceClass(iconCls,'x-hidden');bodyEl.removeClass('x-dlg-icon');iconCls='';} +return this;},progress:function(title,msg,progressText){this.show({title:title,msg:msg,buttons:false,progress:true,closable:false,minWidth:this.minProgressWidth,progressText:progressText});return this;},wait:function(msg,title,config){this.show({title:title,msg:msg,buttons:false,closable:false,wait:true,modal:true,minWidth:this.minProgressWidth,waitConfig:config});return this;},alert:function(title,msg,fn,scope){this.show({title:title,msg:msg,buttons:this.OK,fn:fn,scope:scope,minWidth:this.minWidth});return this;},confirm:function(title,msg,fn,scope){this.show({title:title,msg:msg,buttons:this.YESNO,fn:fn,scope:scope,icon:this.QUESTION,minWidth:this.minWidth});return this;},prompt:function(title,msg,fn,scope,multiline,value){this.show({title:title,msg:msg,buttons:this.OKCANCEL,fn:fn,minWidth:this.minPromptWidth,scope:scope,prompt:true,multiline:multiline,value:value});return this;},OK:{ok:true},CANCEL:{cancel:true},OKCANCEL:{ok:true,cancel:true},YESNO:{yes:true,no:true},YESNOCANCEL:{yes:true,no:true,cancel:true},INFO:'ext-mb-info',WARNING:'ext-mb-warning',QUESTION:'ext-mb-question',ERROR:'ext-mb-error',defaultTextHeight:75,maxWidth:600,minWidth:100,minProgressWidth:250,minPromptWidth:250,buttonText:{ok:"OK",cancel:"Cancel",yes:"Yes",no:"No"}};}();Ext.Msg=Ext.MessageBox;Ext.dd.PanelProxy=Ext.extend(Object,{constructor:function(panel,config){this.panel=panel;this.id=this.panel.id+'-ddproxy';Ext.apply(this,config);},insertProxy:true,setStatus:Ext.emptyFn,reset:Ext.emptyFn,update:Ext.emptyFn,stop:Ext.emptyFn,sync:Ext.emptyFn,getEl:function(){return this.ghost;},getGhost:function(){return this.ghost;},getProxy:function(){return this.proxy;},hide:function(){if(this.ghost){if(this.proxy){this.proxy.remove();delete this.proxy;} +this.panel.el.dom.style.display='';this.ghost.remove();delete this.ghost;}},show:function(){if(!this.ghost){this.ghost=this.panel.createGhost(this.panel.initialConfig.cls,undefined,Ext.getBody());this.ghost.setXY(this.panel.el.getXY());if(this.insertProxy){this.proxy=this.panel.el.insertSibling({cls:'x-panel-dd-spacer'});this.proxy.setSize(this.panel.getSize());} +this.panel.el.dom.style.display='none';}},repair:function(xy,callback,scope){this.hide();if(typeof callback=="function"){callback.call(scope||this);}},moveProxy:function(parentNode,before){if(this.proxy){parentNode.insertBefore(this.proxy.dom,before);}}});Ext.Panel.DD=Ext.extend(Ext.dd.DragSource,{constructor:function(panel,cfg){this.panel=panel;this.dragData={panel:panel};this.proxy=new Ext.dd.PanelProxy(panel,cfg);Ext.Panel.DD.superclass.constructor.call(this,panel.el,cfg);var h=panel.header,el=panel.body;if(h){this.setHandleElId(h.id);el=panel.header;} +el.setStyle('cursor','move');this.scroll=false;},showFrame:Ext.emptyFn,startDrag:Ext.emptyFn,b4StartDrag:function(x,y){this.proxy.show();},b4MouseDown:function(e){var x=e.getPageX(),y=e.getPageY();this.autoOffset(x,y);},onInitDrag:function(x,y){this.onStartDrag(x,y);return true;},createFrame:Ext.emptyFn,getDragEl:function(e){return this.proxy.ghost.dom;},endDrag:function(e){this.proxy.hide();this.panel.saveState();},autoOffset:function(x,y){x-=this.startPageX;y-=this.startPageY;this.setDelta(x,y);}});Ext.Toolbar=function(config){if(Ext.isArray(config)){config={items:config,layout:'toolbar'};}else{config=Ext.apply({layout:'toolbar'},config);if(config.buttons){config.items=config.buttons;}} +Ext.Toolbar.superclass.constructor.call(this,config);};(function(){var T=Ext.Toolbar;Ext.extend(T,Ext.Container,{defaultType:'button',enableOverflow:false,trackMenus:true,internalDefaults:{removeMode:'container',hideParent:true},toolbarCls:'x-toolbar',initComponent:function(){T.superclass.initComponent.call(this);this.addEvents('overflowchange');},onRender:function(ct,position){if(!this.el){if(!this.autoCreate){this.autoCreate={cls:this.toolbarCls+' x-small-editor'};} +this.el=ct.createChild(Ext.apply({id:this.id},this.autoCreate),position);Ext.Toolbar.superclass.onRender.apply(this,arguments);}},lookupComponent:function(c){if(Ext.isString(c)){if(c=='-'){c=new T.Separator();}else if(c==' '){c=new T.Spacer();}else if(c=='->'){c=new T.Fill();}else{c=new T.TextItem(c);} +this.applyDefaults(c);}else{if(c.isFormField||c.render){c=this.createComponent(c);}else if(c.tag){c=new T.Item({autoEl:c});}else if(c.tagName){c=new T.Item({el:c});}else if(Ext.isObject(c)){c=c.xtype?this.createComponent(c):this.constructButton(c);}} +return c;},applyDefaults:function(c){if(!Ext.isString(c)){c=Ext.Toolbar.superclass.applyDefaults.call(this,c);var d=this.internalDefaults;if(c.events){Ext.applyIf(c.initialConfig,d);Ext.apply(c,d);}else{Ext.applyIf(c,d);}} +return c;},addSeparator:function(){return this.add(new T.Separator());},addSpacer:function(){return this.add(new T.Spacer());},addFill:function(){this.add(new T.Fill());},addElement:function(el){return this.addItem(new T.Item({el:el}));},addItem:function(item){return this.add.apply(this,arguments);},addButton:function(config){if(Ext.isArray(config)){var buttons=[];for(var i=0,len=config.length;i<len;i++){buttons.push(this.addButton(config[i]));} +return buttons;} +return this.add(this.constructButton(config));},addText:function(text){return this.addItem(new T.TextItem(text));},addDom:function(config){return this.add(new T.Item({autoEl:config}));},addField:function(field){return this.add(field);},insertButton:function(index,item){if(Ext.isArray(item)){var buttons=[];for(var i=0,len=item.length;i<len;i++){buttons.push(this.insertButton(index+i,item[i]));} +return buttons;} +return Ext.Toolbar.superclass.insert.call(this,index,item);},trackMenu:function(item,remove){if(this.trackMenus&&item.menu){var method=remove?'mun':'mon';this[method](item,'menutriggerover',this.onButtonTriggerOver,this);this[method](item,'menushow',this.onButtonMenuShow,this);this[method](item,'menuhide',this.onButtonMenuHide,this);}},constructButton:function(item){var b=item.events?item:this.createComponent(item,item.split?'splitbutton':this.defaultType);return b;},onAdd:function(c){Ext.Toolbar.superclass.onAdd.call(this);this.trackMenu(c);if(this.disabled){c.disable();}},onRemove:function(c){Ext.Toolbar.superclass.onRemove.call(this);if(c==this.activeMenuBtn){delete this.activeMenuBtn;} +this.trackMenu(c,true);},onDisable:function(){this.items.each(function(item){if(item.disable){item.disable();}});},onEnable:function(){this.items.each(function(item){if(item.enable){item.enable();}});},onButtonTriggerOver:function(btn){if(this.activeMenuBtn&&this.activeMenuBtn!=btn){this.activeMenuBtn.hideMenu();btn.showMenu();this.activeMenuBtn=btn;}},onButtonMenuShow:function(btn){this.activeMenuBtn=btn;},onButtonMenuHide:function(btn){delete this.activeMenuBtn;}});Ext.reg('toolbar',Ext.Toolbar);T.Item=Ext.extend(Ext.BoxComponent,{hideParent:true,enable:Ext.emptyFn,disable:Ext.emptyFn,focus:Ext.emptyFn});Ext.reg('tbitem',T.Item);T.Separator=Ext.extend(T.Item,{onRender:function(ct,position){this.el=ct.createChild({tag:'span',cls:'xtb-sep'},position);}});Ext.reg('tbseparator',T.Separator);T.Spacer=Ext.extend(T.Item,{onRender:function(ct,position){this.el=ct.createChild({tag:'div',cls:'xtb-spacer',style:this.width?'width:'+this.width+'px':''},position);}});Ext.reg('tbspacer',T.Spacer);T.Fill=Ext.extend(T.Item,{render:Ext.emptyFn,isFill:true});Ext.reg('tbfill',T.Fill);T.TextItem=Ext.extend(T.Item,{constructor:function(config){T.TextItem.superclass.constructor.call(this,Ext.isString(config)?{text:config}:config);},onRender:function(ct,position){this.autoEl={cls:'xtb-text',html:this.text||''};T.TextItem.superclass.onRender.call(this,ct,position);},setText:function(t){if(this.rendered){this.el.update(t);}else{this.text=t;}}});Ext.reg('tbtext',T.TextItem);T.Button=Ext.extend(Ext.Button,{});T.SplitButton=Ext.extend(Ext.SplitButton,{});Ext.reg('tbbutton',T.Button);Ext.reg('tbsplit',T.SplitButton);})();Ext.ButtonGroup=Ext.extend(Ext.Panel,{baseCls:'x-btn-group',layout:'table',defaultType:'button',frame:true,internalDefaults:{removeMode:'container',hideParent:true},initComponent:function(){this.layoutConfig=this.layoutConfig||{};Ext.applyIf(this.layoutConfig,{columns:this.columns});if(!this.title){this.addClass('x-btn-group-notitle');} +this.on('afterlayout',this.onAfterLayout,this);Ext.ButtonGroup.superclass.initComponent.call(this);},applyDefaults:function(c){c=Ext.ButtonGroup.superclass.applyDefaults.call(this,c);var d=this.internalDefaults;if(c.events){Ext.applyIf(c.initialConfig,d);Ext.apply(c,d);}else{Ext.applyIf(c,d);} +return c;},onAfterLayout:function(){var bodyWidth=this.body.getFrameWidth('lr')+this.body.dom.firstChild.offsetWidth;this.body.setWidth(bodyWidth);this.el.setWidth(bodyWidth+this.getFrameWidth());}});Ext.reg('buttongroup',Ext.ButtonGroup);(function(){var T=Ext.Toolbar;Ext.PagingToolbar=Ext.extend(Ext.Toolbar,{pageSize:20,displayMsg:'Displaying {0} - {1} of {2}',emptyMsg:'No data to display',beforePageText:'Page',afterPageText:'of {0}',firstText:'First Page',prevText:'Previous Page',nextText:'Next Page',lastText:'Last Page',refreshText:'Refresh',initComponent:function(){var pagingItems=[this.first=new T.Button({tooltip:this.firstText,overflowText:this.firstText,iconCls:'x-tbar-page-first',disabled:true,handler:this.moveFirst,scope:this}),this.prev=new T.Button({tooltip:this.prevText,overflowText:this.prevText,iconCls:'x-tbar-page-prev',disabled:true,handler:this.movePrevious,scope:this}),'-',this.beforePageText,this.inputItem=new Ext.form.NumberField({cls:'x-tbar-page-number',allowDecimals:false,allowNegative:false,enableKeyEvents:true,selectOnFocus:true,submitValue:false,listeners:{scope:this,keydown:this.onPagingKeyDown,blur:this.onPagingBlur}}),this.afterTextItem=new T.TextItem({text:String.format(this.afterPageText,1)}),'-',this.next=new T.Button({tooltip:this.nextText,overflowText:this.nextText,iconCls:'x-tbar-page-next',disabled:true,handler:this.moveNext,scope:this}),this.last=new T.Button({tooltip:this.lastText,overflowText:this.lastText,iconCls:'x-tbar-page-last',disabled:true,handler:this.moveLast,scope:this}),'-',this.refresh=new T.Button({tooltip:this.refreshText,overflowText:this.refreshText,iconCls:'x-tbar-loading',handler:this.doRefresh,scope:this})];var userItems=this.items||this.buttons||[];if(this.prependButtons){this.items=userItems.concat(pagingItems);}else{this.items=pagingItems.concat(userItems);} +delete this.buttons;if(this.displayInfo){this.items.push('->');this.items.push(this.displayItem=new T.TextItem({}));} +Ext.PagingToolbar.superclass.initComponent.call(this);this.addEvents('change','beforechange');this.on('afterlayout',this.onFirstLayout,this,{single:true});this.cursor=0;this.bindStore(this.store,true);},onFirstLayout:function(){if(this.dsLoaded){this.onLoad.apply(this,this.dsLoaded);}},updateInfo:function(){if(this.displayItem){var count=this.store.getCount();var msg=count==0?this.emptyMsg:String.format(this.displayMsg,this.cursor+1,this.cursor+count,this.store.getTotalCount());this.displayItem.setText(msg);}},onLoad:function(store,r,o){if(!this.rendered){this.dsLoaded=[store,r,o];return;} +var p=this.getParams();this.cursor=(o.params&&o.params[p.start])?o.params[p.start]:0;var d=this.getPageData(),ap=d.activePage,ps=d.pages;this.afterTextItem.setText(String.format(this.afterPageText,d.pages));this.inputItem.setValue(ap);this.first.setDisabled(ap==1);this.prev.setDisabled(ap==1);this.next.setDisabled(ap==ps);this.last.setDisabled(ap==ps);this.refresh.enable();this.updateInfo();this.fireEvent('change',this,d);},getPageData:function(){var total=this.store.getTotalCount();return{total:total,activePage:Math.ceil((this.cursor+this.pageSize)/this.pageSize),pages:total<this.pageSize?1:Math.ceil(total/this.pageSize)};},changePage:function(page){this.doLoad(((page-1)*this.pageSize).constrain(0,this.store.getTotalCount()));},onLoadError:function(){if(!this.rendered){return;} +this.refresh.enable();},readPage:function(d){var v=this.inputItem.getValue(),pageNum;if(!v||isNaN(pageNum=parseInt(v,10))){this.inputItem.setValue(d.activePage);return false;} +return pageNum;},onPagingFocus:function(){this.inputItem.select();},onPagingBlur:function(e){this.inputItem.setValue(this.getPageData().activePage);},onPagingKeyDown:function(field,e){var k=e.getKey(),d=this.getPageData(),pageNum;if(k==e.RETURN){e.stopEvent();pageNum=this.readPage(d);if(pageNum!==false){pageNum=Math.min(Math.max(1,pageNum),d.pages)-1;this.doLoad(pageNum*this.pageSize);}}else if(k==e.HOME||k==e.END){e.stopEvent();pageNum=k==e.HOME?1:d.pages;field.setValue(pageNum);}else if(k==e.UP||k==e.PAGEUP||k==e.DOWN||k==e.PAGEDOWN){e.stopEvent();if((pageNum=this.readPage(d))){var increment=e.shiftKey?10:1;if(k==e.DOWN||k==e.PAGEDOWN){increment*=-1;} +pageNum+=increment;if(pageNum>=1&pageNum<=d.pages){field.setValue(pageNum);}}}},getParams:function(){return this.paramNames||this.store.paramNames;},beforeLoad:function(){if(this.rendered&&this.refresh){this.refresh.disable();}},doLoad:function(start){var o={},pn=this.getParams();o[pn.start]=start;o[pn.limit]=this.pageSize;if(this.fireEvent('beforechange',this,o)!==false){this.store.load({params:o});}},moveFirst:function(){this.doLoad(0);},movePrevious:function(){this.doLoad(Math.max(0,this.cursor-this.pageSize));},moveNext:function(){this.doLoad(this.cursor+this.pageSize);},moveLast:function(){var total=this.store.getTotalCount(),extra=total%this.pageSize;this.doLoad(extra?(total-extra):total-this.pageSize);},doRefresh:function(){this.doLoad(this.cursor);},bindStore:function(store,initial){var doLoad;if(!initial&&this.store){if(store!==this.store&&this.store.autoDestroy){this.store.destroy();}else{this.store.un('beforeload',this.beforeLoad,this);this.store.un('load',this.onLoad,this);this.store.un('exception',this.onLoadError,this);} +if(!store){this.store=null;}} +if(store){store=Ext.StoreMgr.lookup(store);store.on({scope:this,beforeload:this.beforeLoad,load:this.onLoad,exception:this.onLoadError});doLoad=true;} +this.store=store;if(doLoad){this.onLoad(store,null,{});}},unbind:function(store){this.bindStore(null);},bind:function(store){this.bindStore(store);},onDestroy:function(){this.bindStore(null);Ext.PagingToolbar.superclass.onDestroy.call(this);}});})();Ext.reg('paging',Ext.PagingToolbar);
\ No newline at end of file diff --git a/modules/organize/views/organize_dialog.html.php b/modules/organize/views/organize_dialog.html.php index 3ea1143d..a386fa77 100644 --- a/modules/organize/views/organize_dialog.html.php +++ b/modules/organize/views/organize_dialog.html.php @@ -1,144 +1,23 @@ <?php defined("SYSPATH") or die("No direct script access.") ?> -<script type="text/javascript" src="<?= url::file("lib/swfobject.js") ?>"></script> -<style type="text/css" media="screen"> - .g-organize { - padding: 0; - margins: 0; - } - - object { - display: block; - outline: none; - } - - #g-dialog { - padding: 0; - } -</style> - +<link rel="stylesheet" type="text/css" href="<?= url::file("modules/organize/css/organize_dialog.css") ?>" /> <script type="text/javascript"> - $("#g-dialog").bind("dialogclose", function(event, ui) { - // @todo do a call to organize/closing to end the batch - if ($(this).data("reload.location")) { - window.location = $(this).data("reload.location"); - } else { - window.location.reload(); - } - }); - - function closeOrganizeDialog() { + var ORGANIZE_TITLE = + <?= t("Organize :: %album_title", array("album_title" => "__TITLE__"))->for_js() ?>; + var done_organizing = function(album_id) { $("#g-dialog").dialog("close"); + window.location = '<?= url::site("items/__ID__") ?>'.replace("__ID__", album_id); } - function setLocation(url) { - $("#g-dialog").data("reload.location", url); - } - - function setTitle(title) { - $("#ui-dialog-title-g-dialog").text(<?= t("Organize :: ")->for_js() ?> + title); - } - - function getOrganizeStyles() { - return { - color: colorToHex($("#g-organize").css("color")), - backgroundColor: colorToHex($("#g-organize").css("backgroundColor")), - borderColor: colorToHex($("#g-organize").css("borderLeftColor")), - rollOverColor: colorToHex($("#g-organize-hover").css("backgroundColor")), - selectionColor: colorToHex($("#g-organize-active").css("backgroundColor")) - }; + var set_title = function(title) { + $("#g-dialog").dialog("option", "title", ORGANIZE_TITLE.replace("__TITLE__", title)); } + set_title("<?= $album->title ?>"); - function colorToHex(color) { - // Surprising no one, the color extracted from the css is in a different format - // in IE than it is when extracted from FF or Chrome. FF and Chrome return - // the of "rgb(nn,nn,nn)". Where as IE returns it as #hhhhhh. - - if (color.indexOf("#") === 0) { - return '0x' + color.substring(1); - } else { - var digits = /(.*?)rgb\((\d+), (\d+), (\d+)\)/.exec(color); - - var red = parseInt(digits[2]); - var green = parseInt(digits[3]); - var blue = parseInt(digits[4]); - - var rgb = blue | (green << 8) | (red << 16); - return digits[1] + '0x' + rgb.toString(16); - } + var done_loading = function() { + $("#g-organize-app-loading").hide(); } - - function getTextStrings() { - return { - statusText: <?= t("Drag and drop photos to re-order or move between album")->for_js() ?>, - remoteError: - <?= t("Remote server error, please contact your gallery administrator")->for_js() ?>, - addAlbumError: <?= t("The above highlighted fields are invalid")->for_js() ?>, - errorOccurred: <?= t("Remote error ocurred")->for_js() ?>, - addAlbum: <?= t("Add album")->for_js() ?>, - addImages: <?= t("Add photo")->for_js() ?>, - deleteSelected: <?= t("Delete")->for_js() ?>, - uploadedText: <?= t("Uploaded {0}")->for_js() ?>, - removeFileText: <?= t("Remove")->for_js() ?>, - progressLabel: <?= t("Completed image %1 of %2")->for_js() ?>, - uploadLabel: <?= t("Loaded %1 of %2 bytes")->for_js() ?>, - moveTitle: <?= t("Move images")->for_js() ?>, - deleteTitle: <?= t("Delete image")->for_js() ?>, - uploadTitle: <?= t("Upload image")->for_js() ?>, - cancel: <?= t("Cancel")->for_js() ?>, - close: <?= t("Close")->for_js() ?> - }; - } - - function getGalleryParameters() { - return { - domain: "<?= $domain ?>", - accessKey: "<?= $access_key ?>", - protocol: "<?= request::protocol() ?>", - fileFilter: "<?= $file_filter ?>", - sortOrder: "<?= $sort_order ?>", - sortFields: "<?= $sort_fields ?>", - albumId: "<?= $album->id ?>", - selectedId: "<?= $selected_id ?>", - restUri: "<?= $rest_uri ?>", - controllerUri: "<?= $controller_uri ?>" - }; - }; - - // For version detection, set to minimum required Flash Player version, or 0 (or 0.0.0), - // for no version detection. - var swfVersionStr = "<?= $flash_minimum_version = "10.0.0" ?>"; - - // To use express install, set to playerProductInstall.swf, otherwise the empty string. - var xiSwfUrlStr = ""; - var flashvars = {}; - - var size = $.gallery_get_viewport_size(); - - var params = {}; - params.quality = "high"; - params.bgcolor = "#ffffff"; - params.allowNetworking = "all"; - params.allowscriptaccess = "sameDomain"; - params.allowfullscreen = "true"; - var attributes = {}; - attributes.id = "Gallery3WebClient"; - attributes.name = "Gallery3WebClient"; - attributes.align = "middle"; - swfobject.embedSWF("<?= $swf_uri ?>", - "flashContent", size.width() - 100, size.height() - 135, - swfVersionStr, xiSwfUrlStr, flashvars, params, attributes); </script> -<div id="g-organize" class="g-dialog-panel"> - <!-- The following spans are placeholders so we can load the hover and active styles for the flex component --> - <span id="g-organize-hover" /><span id="g-organize-active" /> - <h1 style="display:none"><?= t("Organize :: %name", array("name" => html::purify($album->title))) ?></h1> - <div id="flashContent"> - <p> - <?= t("Your browser must have Adobe Flash Player version %flash_minimum_version or greater installed to use this feature.", array("flash_minimum_version" => $flash_minimum_version)) ?> - </p> - <a href="http://www.adobe.com/go/getflashplayer"> - <img src="<?= request::protocol() ?>://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" - alt=<?= t("Get Adobe Flash Player")->for_js() ?> /> - </a> - </div> -</div> +<div id="g-organize-app-loading"> </div> +<iframe id="g-organize-frame" src="<?= url::site("organize/frame/{$album->id}") ?>"> +</iframe> + diff --git a/modules/organize/views/organize_frame.html.php b/modules/organize/views/organize_frame.html.php new file mode 100644 index 00000000..650574ab --- /dev/null +++ b/modules/organize/views/organize_frame.html.php @@ -0,0 +1,526 @@ +<?php defined("SYSPATH") or die("No direct script access.") ?> +<link rel="stylesheet" type="text/css" href="<?= url::file("modules/organize/vendor/ext/css/ext-all.css") ?>" /> +<link rel="stylesheet" type="text/css" href="<?= url::file("modules/organize/vendor/ext/css/ux-all.css") ?>" /> +<link rel="stylesheet" type="text/css" href="<?= url::file("modules/organize/css/organize_frame.css") ?>" /> +<style type="text/css"> + .g-organize div.thumb-album div.icon { + background-image: url(<?= url::file("modules/organize/vendor/ext/images/default/tree/folder.gif") ?>); + } +</style> +<script type="text/javascript" src="<?= url::file("modules/organize/vendor/ext/js/ext-organize-bundle.js") ?>"></script> +<script type="text/javascript"> + Ext.BLANK_IMAGE_URL = "<?= url::file("modules/organize/vendor/ext/images/default/s.gif") ?>"; + Ext.Ajax.timeout = 1000000; // something really large + // I18N for dialog boxes. + Ext.Msg.buttonText = { + ok: <?= t("OK")->for_js() ?>, + cancel: <?= t("Cancel")->for_js() ?>, + yes: <?= t("Yes")->for_js() ?>, + no: <?= t("No")->for_js() ?> + }; + + Ext.onReady(function() { + /* + * ******************************************************************************** + * Utility functions for loading data and making changes + * ******************************************************************************** + */ + var start_busy = function(msg) { + thumb_data_view.el.mask(msg, "loading"); + } + + var stop_busy = function() { + thumb_data_view.el.unmask(); + } + + // Notify the parent dialog that the ExtJS app is loaded + if (parent.done_loading) { + parent.done_loading(); + } + + var show_generic_error = function() { + stop_busy(); + Ext.Msg.alert( + <?= t("An error occurred. Consult your system administrator.")->for_js() ?>); + } + + var current_album_id = null; + var current_album_editable = null; + var load_album_data = function(id) { + if (current_album_id) { + // Don't show the loading message on the initial load, it + // feels a little jarring. + start_busy(<?= t("Loading...")->for_js() ?>); + } + Ext.Ajax.request({ + url: '<?= url::site("organize/album_info/__ID__") ?>'.replace("__ID__", id), + success: function(xhr, opts) { + stop_busy(); + var album_info = Ext.util.JSON.decode(xhr.responseText); + var store = new Ext.data.JsonStore({ + autoDestroy: true, + fields: ["id", "thumb_url", "width", "height", "type", "title"], + idProperty: "id", + root: "children", + data: album_info + }); + current_album_id = id; + thumb_data_view.bindStore(store); + sort_column_combobox.setValue(album_info.sort_column); + sort_order_combobox.setValue(album_info.sort_order); + + current_album_editable = album_info.editable; + if (current_album_editable) { + thumb_data_view.dragZone.unlock(); + } else { + thumb_data_view.dragZone.lock(); + } + if (parent.set_title) { + parent.set_title(album_info.title); + } + }, + failure: show_generic_error + }); + }; + + var reload_album_data = function() { + if (current_album_id) { + load_album_data(current_album_id); + } + }; + + var set_album_sort = function(params) { + start_busy(<?= t("Changing sort...")->for_js() ?>); + params["csrf"] = '<?= access::csrf_token() ?>'; + Ext.Ajax.request({ + url: '<?= url::site("organize/set_sort/__ID__") ?>'.replace("__ID__", current_album_id), + method: "post", + success: function() { + stop_busy(); + reload_album_data(); + }, + failure: show_generic_error, + params: params + }); + } + + var delete_selected_items = function() { + var nodes = thumb_data_view.getSelectedNodes(); + item_ids = []; + for (var i = 0; i != nodes.length; i++) { + var node = Ext.fly(nodes[i]); + item_ids.push(node.getAttribute("rel")); + } + start_busy(<?= t("Deleting...")->for_js() ?>); + Ext.Ajax.request({ + url: '<?= url::site("organize/delete") ?>', + method: "post", + success: function() { + stop_busy(); + reload_album_data(); + }, + failure: show_generic_error, + params: { + item_ids: item_ids.join(","), + csrf: '<?= access::csrf_token() ?>' + } + }); + }; + + /* + * ******************************************************************************** + * JsonStore, DataView and Panel for viewing albums + * ******************************************************************************** + */ + var thumb_data_view = new Ext.DataView({ + autoScroll: true, + enableDragDrop: true, + itemSelector: "div.thumb", + plugins: [ + new Ext.DataView.DragSelector({dragSafe: true}) + ], + listeners: { + "dblclick": function(v, index, node, e) { + node = Ext.get(node); + if (node.hasClass("thumb-album")) { + var id = node.getAttribute("rel"); + tree_panel.fireEvent("click", tree_panel.getNodeById(id)) + } + }, + "render": function(v) { + v.dragZone = new Ext.dd.DragZone(v.getEl(), { + ddGroup: "organizeDD", + containerScroll: true, + getDragData: function(e) { + var target = e.getTarget(v.itemSelector, 10); + if (target) { + if (!v.isSelected(target)) { + v.onClick(e); + } + var selected_nodes = v.getSelectedNodes(); + var drag_data = { + nodes: selected_nodes, + repair_xy: Ext.fly(target).getXY() + }; + if (selected_nodes.length == 1) { + drag_data.ddel = target; + } else { + var drag_ghost = document.createElement("div"); + drag_ghost.className = "drag-ghost"; + for (var i = 0; i != selected_nodes.length; i++) { + var inner = document.createElement("div"); + drag_ghost.appendChild(inner); + + var img = Ext.get(selected_nodes[i]).dom.firstChild; + var child = inner.appendChild(img.cloneNode(true)); + Ext.get(child).setWidth(Ext.fly(img).getWidth() / 2); + Ext.get(child).setHeight(Ext.fly(img).getHeight() / 2); + } + // The contents of the ghost float, and the ghost is wide enough for + // 4 images across so make sure that the ghost is tall enough. Thumbnails + // are max 120px high max, and ghost thumbs are half of that, but leave some + // padding because IE is unpredictable. + drag_ghost.style.height = Math.ceil(i/4) * 72 + "px"; + drag_data.ddel = drag_ghost; + } + return drag_data; + } + }, + getRepairXY: function() { + return this.dragData.repair_xy; + } + }); + + v.dropZone = new Ext.dd.DropZone(v.getEl(), { + ddGroup: "organizeDD", + getTargetFromEvent: function(e) { + return e.getTarget("div.thumb", 10); + }, + onNodeOut: function(target, dd, e, data) { + Ext.fly(target).removeClass("active-left"); + Ext.fly(target).removeClass("active-right"); + }, + onNodeOver: function(target, dd, e, data) { + var target_x = Ext.lib.Dom.getX(target); + var target_center = target_x + (target.offsetWidth / 2); + if (Ext.lib.Event.getPageX(e) < target_center) { + Ext.fly(target).addClass("active-left"); + Ext.fly(target).removeClass("active-right"); + this.drop_side = "before"; + } else { + Ext.fly(target).removeClass("active-left"); + Ext.fly(target).addClass("active-right"); + this.drop_side = "after"; + } + return Ext.dd.DropZone.prototype.dropAllowed; + }, + onNodeDrop: function(target, dd, e, data) { + var nodes = data.nodes; + source_ids = []; + for (var i = 0; i != nodes.length; i++) { + source_ids.push(Ext.fly(nodes[i]).getAttribute("rel")); + } + start_busy(<?= t("Rearranging...")->for_js() ?>); + target = Ext.fly(target); + Ext.Ajax.request({ + url: '<?= url::site("organize/rearrange") ?>', + method: "post", + success: function() { + stop_busy(); + reload_album_data(); + }, + failure: show_generic_error, + params: { + source_ids: source_ids.join(","), + target_id: target.getAttribute("rel"), + relative: this.drop_side, // calculated in onNodeOver + csrf: '<?= access::csrf_token() ?>' + } + }); + return true; + } + }); + }, + "selectionchange": function(v, selections) { + delete_button.setDisabled(!selections.length || !current_album_editable); + } + }, + multiSelect: true, + selectedClass: "selected", + tpl: new Ext.XTemplate( + '<tpl for=".">', + '<tpl if="thumb_url">', + '<div class="thumb thumb-{type}" id="thumb-{id}" rel="{id}">', + '<img src="{thumb_url}" width="{width}" height="{height}" title="{title}">', + '<div class="icon"></div>', + '</div>', + '</tpl>', + '<tpl if="!thumb_url">', + '<div class="thumb thumb-missing thumb-{type}" id="thumb-{id}" rel="{id}">', + '<span>' + <?= t("No thumbnail")->for_js() ?> + '</span>', + '<div class="icon"></div>', + '</div>', + '</tpl>', + '</tpl>') + }); + + /* + * ******************************************************************************** + * Toolbar with sort column, sort order, delete and close buttons. + * ******************************************************************************** + */ + + sort_order_data = []; + <? foreach (album::get_sort_order_options() as $key => $value): ?> + sort_order_data.push(["<?= $key ?>", <?= $value->for_js() ?>]); + <? endforeach ?> + var sort_column_combobox = new Ext.form.ComboBox({ + mode: "local", + editable: false, + allowBlank: false, + forceSelection: true, + triggerAction: "all", + flex: 3, + store: new Ext.data.ArrayStore({ + id: 0, + fields: ["key", "value"], + data: sort_order_data + }), + listeners: { + "select": function(combo, record, index) { + set_album_sort({sort_column: record.id}); + } + }, + valueField: "key", + displayField: "value" + }); + + var sort_order_combobox = new Ext.form.ComboBox({ + mode: "local", + editable: false, + allowBlank: false, + forceSelection: true, + triggerAction: "all", + flex: 2, + store: new Ext.data.ArrayStore({ + id: 0, + fields: ["key", "value"], + data: [ + ["ASC", <?= t("Ascending")->for_js() ?>], + ["DESC", <?= t("Descending")->for_js() ?>]] + }), + listeners: { + "select": function(combo, record, index) { + set_album_sort({sort_order: record.id}); + } + }, + valueField: "key", + displayField: "value" + }); + + var delete_button = new Ext.Button({ + flex: 2, + text: <?= t("Delete")->for_js() ?>, + cls: "x-btn-text-icon", + iconCls: "delete", + id: "delete-button", + disabled: true, + listeners: { + "click": function() { + Ext.Msg.show({ + title: <?= t("Are you sure you want to delete the selected items?")->for_js() ?>, + buttons: Ext.Msg.YESNO, + fn: function(buttonId) { + if (buttonId == "yes") { + delete_selected_items(); + } + } + }); + return true; + } + } + }); + + var button_panel = new Ext.Panel({ + layout: "hbox", + region: "south", + height: 24, + layoutConfig: { + align: "stretch" + }, + items: [ + { + xtype: "panel", + layout: "hbox", + width: 300, + items: [ + { + xtype: "label", + cls: "sort", + flex: 2, + text: <?= t("Sort order: ")->for_js() ?> + }, + sort_column_combobox, + sort_order_combobox + ] + }, { + xtype: "spacer", + flex: 10 + }, + delete_button, + { + xtype: "button", + flex: 2, + text: <?= t("Close")->for_js() ?>, + listeners: { + "click": function() { + parent.done_organizing(current_album_id); + } + } + } + ] + }); + + var album_panel = new Ext.Panel({ + layout: "fit", + region: "center", + title: <?= t("Drag and drop photos to re-order or move between albums")->for_js() ?>, + items: [thumb_data_view], + bbar: button_panel + }); + + /* + * ******************************************************************************** + * TreeLoader and TreePanel + * ******************************************************************************** + */ + var tree_loader = new Ext.tree.TreeLoader({ + dataUrl: '<?= url::site("organize/tree/{$album->id}") ?>', + nodeParameter: "root_id", + requestMethod: "post" + }); + + var tree_panel = new Ext.tree.TreePanel({ + useArrows: true, + autoScroll: true, + animate: true, + border: false, + containerScroll: true, + enableDD: true, + dropConfig: { + appendOnly: true, + ddGroup: "organizeDD" + }, + listeners: { + "click": function(node) { + load_album_data(node.id); + if (node.isExpandable() && !node.isExpanded()) { + node.expand(); + } + }, + "afterrender": function(v) { + // Override Ext.tree.TreeDropZone.onNodeOver to change the + // x-tree-drop-ok-append CSS class to be x-dd-drop-ok since + // that connotes "ok" instead of "adding something new" and we're + // moving the item, not adding it. + // + // There's probably a better way of overriding the parent method, but + // my JavaScript-fu is weak. + v.dropZone.super_onNodeOver = v.dropZone.onNodeOver; + v.dropZone.onNodeOver = function(target, dd, e, data) { + var returnCls = this.super_onNodeOver(target, dd, e, data); + if (returnCls == "x-tree-drop-ok-append") { + return "x-dd-drop-ok"; + } + return returnCls; + } + + // Override Ext.tree.TreeDropZone.getDropPoint so that it allows dropping + // on any node. The standard function won't let you drop on leaves, but + // in our model we consider an album without sub-albums a leaf. + v.dropZone.getDropPoint = function(e, n, dd) { + return "append"; + } + + v.dropZone.onNodeDrop = function(target, dd, e, data) { + var nodes = data.nodes; + source_ids = []; + var moving_albums = 0; + for (var i = 0; i != nodes.length; i++) { + var node = Ext.fly(nodes[i]); + source_ids.push(node.getAttribute("rel")); + moving_albums |= node.hasClass("thumb-album"); + } + start_busy(<?= t("Moving...")->for_js() ?>); + Ext.Ajax.request({ + url: '<?= url::site("organize/reparent") ?>', + method: "post", + success: function() { + stop_busy(); + reload_album_data(); + + // If we're moving albums around then we need to refresh the tree when we're done + if (moving_albums) { + target.node.reload(); + + // If the target node contains the selected node, then the selected + // node just got strafed by the target's reload and no longer exists, + // so we can't reload it. + var selected_node = v.getNodeById(current_album_id); + if (selected_node) { + selected_node.reload(); + } + } + }, + failure: show_generic_error, + params: { + source_ids: source_ids.join(","), + target_id: target.node.id, + csrf: '<?= access::csrf_token() ?>' + } + }); + return true; + } + } + }, + loader: tree_loader, + + region: "west", + split: true, + minSize: 200, + maxSize: 350, + width: 200, + + root: { + allowDrop: Boolean(<?= access::can("edit", item::root()) ?>), + nodeType: "async", + text: "<?= item::root()->title ?>", + draggable: false, + id: "<?= item::root()->id ?>", + expanded: true + } + }); + + var first_organize_load = true; + tree_loader.addListener("load", function() { + if (first_organize_load) { + tree_panel.getNodeById(<?= $album->id ?>).select(); + load_album_data(<?= $album->id ?>); + first_organize_load = false; + + // This is a hack that allows us to reload tree nodes asynchronously + // even though they came with preloaded hierarchical data from the + // initial tree load. Without this, any nodes that were preloaded + // initially won't refresh if you call node.reload() on them. + tree_loader.doPreload = function() { return false; } + } + }); + tree_panel.getRootNode().expand(); + + var outer = new Ext.Viewport({ + layout: "border", + cls: "g-organize", + items: [tree_panel, album_panel] + }); + }); +</script> diff --git a/modules/recaptcha/controllers/admin_recaptcha.php b/modules/recaptcha/controllers/admin_recaptcha.php index 264d3177..464a6cfb 100644 --- a/modules/recaptcha/controllers/admin_recaptcha.php +++ b/modules/recaptcha/controllers/admin_recaptcha.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/recaptcha/helpers/recaptcha.php b/modules/recaptcha/helpers/recaptcha.php index 68905bd8..e695cd4f 100644 --- a/modules/recaptcha/helpers/recaptcha.php +++ b/modules/recaptcha/helpers/recaptcha.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/recaptcha/helpers/recaptcha_event.php b/modules/recaptcha/helpers/recaptcha_event.php index f185f92b..494da1e9 100644 --- a/modules/recaptcha/helpers/recaptcha_event.php +++ b/modules/recaptcha/helpers/recaptcha_event.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/recaptcha/helpers/recaptcha_installer.php b/modules/recaptcha/helpers/recaptcha_installer.php index b970d0ab..5c3c425d 100644 --- a/modules/recaptcha/helpers/recaptcha_installer.php +++ b/modules/recaptcha/helpers/recaptcha_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/recaptcha/helpers/recaptcha_theme.php b/modules/recaptcha/helpers/recaptcha_theme.php index ee880986..e2899725 100644 --- a/modules/recaptcha/helpers/recaptcha_theme.php +++ b/modules/recaptcha/helpers/recaptcha_theme.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,10 +19,10 @@ */ class recaptcha_theme_Core { static function head($theme) { - $theme->css("recaptcha.css"); + return $theme->css("recaptcha.css"); } static function admin_head($theme) { - $theme->css("recaptcha.css"); + return $theme->css("recaptcha.css"); } }
\ No newline at end of file diff --git a/modules/recaptcha/libraries/Form_Recaptcha.php b/modules/recaptcha/libraries/Form_Recaptcha.php index 736e0d95..9e9d866c 100644 --- a/modules/recaptcha/libraries/Form_Recaptcha.php +++ b/modules/recaptcha/libraries/Form_Recaptcha.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/recaptcha/views/form_recaptcha.html.php b/modules/recaptcha/views/form_recaptcha.html.php index 20e7359e..7481d000 100644 --- a/modules/recaptcha/views/form_recaptcha.html.php +++ b/modules/recaptcha/views/form_recaptcha.html.php @@ -1,6 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access.") ?> <div id="g-recaptcha"></div> -<script type="text/javascript" src="http://api.recaptcha.net/js/recaptcha_ajax.js"></script> +<script type="text/javascript" src="<?= request::protocol() ?>://www.google.com/recaptcha/api/js/recaptcha_ajax.js"> +</script> <script type="text/javascript"> setTimeout(function() { Recaptcha.create( diff --git a/modules/rest/controllers/rest.php b/modules/rest/controllers/rest.php index c4e0fda4..52d9925b 100644 --- a/modules/rest/controllers/rest.php +++ b/modules/rest/controllers/rest.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ class Rest_Controller extends Controller { + const ALLOW_PRIVATE_GALLERY = true; + public function index() { $username = Input::instance()->post("user"); $password = Input::instance()->post("password"); diff --git a/modules/rest/helpers/registry_rest.php b/modules/rest/helpers/registry_rest.php index e9c8b955..b8be26f1 100644 --- a/modules/rest/helpers/registry_rest.php +++ b/modules/rest/helpers/registry_rest.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/rest/helpers/rest.php b/modules/rest/helpers/rest.php index 58943700..1954f46e 100644 --- a/modules/rest/helpers/rest.php +++ b/modules/rest/helpers/rest.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -54,6 +54,11 @@ class rest_Core { $html = t("Empty response"); } print "<pre>$html</pre>"; + if (Session::instance()->get("profiler", false)) { + Profiler::enable(); + $profiler = new Profiler(); + $profiler->render(); + } break; default: @@ -104,7 +109,7 @@ class rest_Core { if (!$key->loaded()) { $key->user_id = identity::active_user()->id; - $key->access_key = md5(md5(uniqid(mt_rand(), true) . access::private_key())); + $key->access_key = md5(random::hash() . access::private_key()); $key->save(); } diff --git a/modules/rest/helpers/rest_event.php b/modules/rest/helpers/rest_event.php index d8c69e94..1fdd49e2 100644 --- a/modules/rest/helpers/rest_event.php +++ b/modules/rest/helpers/rest_event.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -43,7 +43,7 @@ class rest_event { static function user_add_form_admin_completed($user, $form) { $key = ORM::factory("user_access_key"); $key->user_id = $user->id; - $key->access_key = md5($user->name . rand()); + $key->access_key = random::hash($user->name); $key->save(); } @@ -64,7 +64,7 @@ class rest_event { if (!$key->loaded()) { $key->user_id = $user->id; - $key->access_key = md5($user->name . rand()); + $key->access_key = random::hash($user->name); $key->save(); } @@ -93,7 +93,7 @@ class rest_event { if (!$key->loaded()) { $key->user_id = $data->user->id; - $key->access_key = md5($data->user->name . rand()); + $key->access_key = random::hash($data->user->name); $key->save(); } $view->rest_key = $key->access_key; diff --git a/modules/rest/helpers/rest_installer.php b/modules/rest/helpers/rest_installer.php index 3c7fea4b..7a63e371 100644 --- a/modules/rest/helpers/rest_installer.php +++ b/modules/rest/helpers/rest_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/rest/libraries/Rest_Exception.php b/modules/rest/libraries/Rest_Exception.php index 087da939..be8515fd 100644 --- a/modules/rest/libraries/Rest_Exception.php +++ b/modules/rest/libraries/Rest_Exception.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/rest/models/user_access_key.php b/modules/rest/models/user_access_key.php index 93c3cf7f..dda110f7 100644 --- a/modules/rest/models/user_access_key.php +++ b/modules/rest/models/user_access_key.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/rest/tests/Rest_Controller_Test.php b/modules/rest/tests/Rest_Controller_Test.php index 43139d29..5e113030 100644 --- a/modules/rest/tests/Rest_Controller_Test.php +++ b/modules/rest/tests/Rest_Controller_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/rss/controllers/rss.php b/modules/rss/controllers/rss.php index 407220da..84858cc9 100644 --- a/modules/rss/controllers/rss.php +++ b/modules/rss/controllers/rss.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/rss/helpers/rss.php b/modules/rss/helpers/rss.php index 684dad08..bc868e54 100644 --- a/modules/rss/helpers/rss.php +++ b/modules/rss/helpers/rss.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/rss/helpers/rss_block.php b/modules/rss/helpers/rss_block.php index 5e53e492..b60f8208 100644 --- a/modules/rss/helpers/rss_block.php +++ b/modules/rss/helpers/rss_block.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/search/controllers/search.php b/modules/search/controllers/search.php index e5894f30..eef009a0 100644 --- a/modules/search/controllers/search.php +++ b/modules/search/controllers/search.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -34,10 +34,10 @@ class Search_Controller extends Controller { $max_pages = max(ceil($count / $page_size), 1); $template = new Theme_View("page.html", "collection", "search"); - $template->set_global("page", $page); - $template->set_global("max_pages", $max_pages); - $template->set_global("page_size", $page_size); - $template->set_global("children_count", $count); + $template->set_global(array("page" => $page, + "max_pages" => $max_pages, + "page_size" => $page_size, + "children_count" => $count)); $template->content = new View("search.html"); $template->content->items = $result; diff --git a/modules/search/helpers/search.php b/modules/search/helpers/search.php index 24c4ed2b..09e5e83f 100644 --- a/modules/search/helpers/search.php +++ b/modules/search/helpers/search.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/search/helpers/search_event.php b/modules/search/helpers/search_event.php index 45f7da4c..458135bf 100644 --- a/modules/search/helpers/search_event.php +++ b/modules/search/helpers/search_event.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/search/helpers/search_installer.php b/modules/search/helpers/search_installer.php index 929cc1a8..7b6ed37b 100644 --- a/modules/search/helpers/search_installer.php +++ b/modules/search/helpers/search_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/search/helpers/search_task.php b/modules/search/helpers/search_task.php index 48a6688b..5489ed93 100644 --- a/modules/search/helpers/search_task.php +++ b/modules/search/helpers/search_task.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/search/helpers/search_theme.php b/modules/search/helpers/search_theme.php index 07066caa..ffbfac8f 100644 --- a/modules/search/helpers/search_theme.php +++ b/modules/search/helpers/search_theme.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ class search_theme_Core { if ($theme->page_subtype() != "login") { $view = new View("search_link.html"); return $view->render(); - }else { + } else { return ""; } } diff --git a/modules/search/models/search_record.php b/modules/search/models/search_record.php index 77290903..35541b4c 100644 --- a/modules/search/models/search_record.php +++ b/modules/search/models/search_record.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/server_add/controllers/admin_server_add.php b/modules/server_add/controllers/admin_server_add.php index 2e743c81..90a60c73 100644 --- a/modules/server_add/controllers/admin_server_add.php +++ b/modules/server_add/controllers/admin_server_add.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/server_add/controllers/server_add.php b/modules/server_add/controllers/server_add.php index e4c3e69c..2afa93a7 100644 --- a/modules/server_add/controllers/server_add.php +++ b/modules/server_add/controllers/server_add.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,12 @@ class Server_Add_Controller extends Admin_Controller { $files[] = $path; } + // Clean leftover task rows. There really should be support for this in the task framework + db::build() + ->where("task_id", "NOT IN", db::build()->select("id")->from("tasks")) + ->delete("server_add_entries") + ->execute(); + $item = ORM::factory("item", $id); $view = new View("server_add_tree_dialog.html"); $view->item = $item; @@ -79,17 +85,22 @@ class Server_Add_Controller extends Admin_Controller { access::verify_csrf(); $item = ORM::factory("item", Input::instance()->get("item_id")); - foreach (Input::instance()->post("paths") as $path) { - if (server_add::is_valid_path($path)) { - $paths[] = array($path, null); - } - } - $task_def = Task_Definition::factory() ->callback("Server_Add_Controller::add") ->description(t("Add photos or movies from the local server")) ->name(t("Add from server")); - $task = task::create($task_def, array("item_id" => $item->id, "queue" => $paths)); + $task = task::create($task_def, array("item_id" => $item->id)); + + foreach (Input::instance()->post("paths") as $path) { + if (server_add::is_valid_path($path)) { + $entry = ORM::factory("server_add_entry"); + $entry->path = $path; + $entry->is_directory = intval(is_dir($path)); + $entry->parent_id = null; + $entry->task_id = $task->id; + $entry->save(); + } + } json::reply( array("result" => "started", @@ -118,7 +129,7 @@ class Server_Add_Controller extends Admin_Controller { /** * This is the task code that adds photos and albums. It first examines all the target files - * and creates a set of Server_Add_File_Models, then runs through the list of models and adds + * and creates a set of Server_Add_Entry_Models, then runs through the list of models and adds * them one at a time. */ static function add($task) { @@ -128,6 +139,7 @@ class Server_Add_Controller extends Admin_Controller { switch ($mode) { case "init": $task->set("mode", "build-file-list"); + $task->set("dirs_scanned", 0); $task->percent_complete = 0; $task->status = t("Starting up"); batch::start(); @@ -136,58 +148,61 @@ class Server_Add_Controller extends Admin_Controller { case "build-file-list": // 0% to 10% // We can't fit an arbitrary number of paths in a task, so store them in a separate table. // Don't use an iterator here because we can't get enough control over it when we're dealing - // with a deep hierarchy and we don't want to go over our time quota. The queue is in the - // form [path, parent_id] where the parent_id refers to another Server_Add_File_Model. We - // have this extra level of abstraction because we don't know its Item_Model id yet. - $queue = $task->get("queue"); + // with a deep hierarchy and we don't want to go over our time quota. $paths = unserialize(module::get_var("server_add", "authorized_paths")); + $dirs_scanned = $task->get("dirs_scanned"); + while (microtime(true) - $start < 0.5) { + // Process every directory that doesn't yet have a parent id, these are the + // paths that we're importing. + $entry = ORM::factory("server_add_entry") + ->where("task_id", "=", $task->id) + ->where("is_directory", "=", 1) + ->where("checked", "=", 0) + ->order_by("id", "ASC") + ->find(); - while ($queue && microtime(true) - $start < 0.5) { - list($file, $parent_entry_id) = array_shift($queue); - // Ignore the staging directories as directories to be imported. - if (empty($paths[$file])) { - $entry = ORM::factory("server_add_file"); - $entry->task_id = $task->id; - $entry->file = $file; - $entry->parent_id = $parent_entry_id; - $entry->save(); - $entry_id = $entry->id; - } else { - $entry_id = null; - } - - $file = preg_quote($file); - foreach (glob("$file/*") as $child) { - if (is_dir($child)) { - $queue[] = array($child, $entry_id); - } else { - $ext = strtolower(pathinfo($child, PATHINFO_EXTENSION)); - if (in_array($ext, array("gif", "jpeg", "jpg", "png", "flv", "mp4", "m4v")) && - filesize($child) > 0) { - $child_entry = ORM::factory("server_add_file"); - $child_entry->task_id = $task->id; - $child_entry->file = $child; - $child_entry->parent_id = $entry_id; - $child_entry->save(); + if ($entry->loaded()) { + $child_paths = glob(preg_quote($entry->path) . "/*"); + if (!$child_paths) { + $child_paths = glob("{$entry->path}/*"); + } + foreach ($child_paths as $child_path) { + if (!is_dir($child_path)) { + $ext = strtolower(pathinfo($child_path, PATHINFO_EXTENSION)); + if (!in_array($ext, array("gif", "jpeg", "jpg", "png", "flv", "mp4", "m4v")) || + !filesize($child_path)) { + // Not importable, skip it. + continue; + } } + + $child_entry = ORM::factory("server_add_entry"); + $child_entry->task_id = $task->id; + $child_entry->path = $child_path; + $child_entry->parent_id = $entry->id; // null if the parent was a staging dir + $child_entry->is_directory = is_dir($child_path); + $child_entry->save(); } + + // We've processed this entry, mark it as done. + $entry->checked = 1; + $entry->save(); + $dirs_scanned++; } } // We have no idea how long this can take because we have no idea how deep the tree // hierarchy rabbit hole goes. Leave ourselves room here for 100 iterations and don't go // over 10% in percent_complete. - $task->set("queue", $queue); + $task->set("dirs_scanned", $dirs_scanned); $task->percent_complete = min($task->percent_complete + 0.1, 10); - $task->status = t2( - "Found one file", "Found %count files", - ORM::factory("server_add_file")->where("task_id", "=", $task->id)->count_all()); + $task->status = t2("Scanned one directory", "Scanned %count directories", $dirs_scanned); - if (!$queue) { + if (!$entry->loaded()) { $task->set("mode", "add-files"); $task->set( "total_files", - ORM::factory("server_add_file")->where("task_id", "=", $task->id)->count_all()); + ORM::factory("server_add_entry")->where("task_id", "=", $task->id)->count_all()); $task->percent_complete = 10; } break; @@ -199,7 +214,7 @@ class Server_Add_Controller extends Admin_Controller { // Ordering by id ensures that we add them in the order that we created the entries, which // will create albums first. Ignore entries which already have an Item_Model attached, // they're done. - $entries = ORM::factory("server_add_file") + $entries = ORM::factory("server_add_entry") ->where("task_id", "=", $task->id) ->where("item_id", "IS", null) ->order_by("id", "ASC") @@ -218,22 +233,24 @@ class Server_Add_Controller extends Admin_Controller { // Look up the parent item for this entry. By now it should exist, but if none was // specified, then this belongs as a child of the current item. - $parent_entry = ORM::factory("server_add_file", $entry->parent_id); + $parent_entry = ORM::factory("server_add_entry", $entry->parent_id); if (!$parent_entry->loaded()) { $parent = ORM::factory("item", $task->get("item_id")); } else { $parent = ORM::factory("item", $parent_entry->item_id); } - $name = basename($entry->file); + $name = basename($entry->path); $title = item::convert_filename_to_title($name); - if (is_dir($entry->file)) { + if ($entry->is_directory) { $album = ORM::factory("item"); $album->type = "album"; $album->parent_id = $parent->id; $album->name = $name; $album->title = $title; $album->owner_id = $owner_id; + $album->sort_order = $parent->sort_order; + $album->sort_column = $parent->sort_column; $album->save(); $entry->item_id = $album->id; } else { @@ -243,7 +260,7 @@ class Server_Add_Controller extends Admin_Controller { $photo = ORM::factory("item"); $photo->type = "photo"; $photo->parent_id = $parent->id; - $photo->set_data_file($entry->file); + $photo->set_data_file($entry->path); $photo->name = $name; $photo->title = $title; $photo->owner_id = $owner_id; @@ -253,7 +270,7 @@ class Server_Add_Controller extends Admin_Controller { $movie = ORM::factory("item"); $movie->type = "movie"; $movie->parent_id = $parent->id; - $movie->set_data_file($entry->file); + $movie->set_data_file($entry->path); $movie->name = $name; $movie->title = $title; $movie->owner_id = $owner_id; @@ -264,12 +281,12 @@ class Server_Add_Controller extends Admin_Controller { // process. But just in, case.. set this to a non-null value so that we skip this // entry. $entry->item_id = 0; - $task->log("Skipping unknown file type: $entry->file"); + $task->log("Skipping unknown file type: {$entry->path}"); } } catch (Exception $e) { // This can happen if a photo file is invalid, like a BMP masquerading as a .jpg $entry->item_id = 0; - $task->log("Skipping invalid file: $entry->file"); + $task->log("Skipping invalid file: {$entry->file}"); } } @@ -288,10 +305,9 @@ class Server_Add_Controller extends Admin_Controller { $task->done = true; $task->state = "success"; $task->percent_complete = 100; - db::build() - ->delete("server_add_files") + ORM::factory("server_add_entry") ->where("task_id", "=", $task->id) - ->execute(); + ->delete_all(); message::info(t2("Successfully added one photo / album", "Successfully added %count photos / albums", $task->get("completed_files"))); diff --git a/modules/server_add/helpers/server_add.php b/modules/server_add/helpers/server_add.php index 03869f2d..a412cb38 100644 --- a/modules/server_add/helpers/server_add.php +++ b/modules/server_add/helpers/server_add.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/server_add/helpers/server_add_event.php b/modules/server_add/helpers/server_add_event.php index fd4ade71..c12ac288 100644 --- a/modules/server_add/helpers/server_add_event.php +++ b/modules/server_add/helpers/server_add_event.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/server_add/helpers/server_add_installer.php b/modules/server_add/helpers/server_add_installer.php index 676bc3cf..4d8b66cd 100644 --- a/modules/server_add/helpers/server_add_installer.php +++ b/modules/server_add/helpers/server_add_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,15 +20,17 @@ class server_add_installer { static function install() { $db = Database::instance(); - $db->query("CREATE TABLE {server_add_files} ( + $db->query("CREATE TABLE {server_add_entries} ( `id` int(9) NOT NULL auto_increment, - `file` varchar(255) NOT NULL, + `checked` boolean default 0, + `is_directory` boolean default 0, `item_id` int(9), `parent_id` int(9), + `path` varchar(255) NOT NULL, `task_id` int(9) NOT NULL, PRIMARY KEY (`id`)) DEFAULT CHARSET=utf8;"); - module::set_version("server_add", 3); + module::set_version("server_add", 4); server_add::check_config(); } @@ -49,6 +51,21 @@ class server_add_installer { $db->query("ALTER TABLE {server_add_files} ADD COLUMN `parent_id` int(9)"); module::set_version("server_add", $version = 3); } + + if ($version == 3) { + $db->query("DROP TABLE {server_add_files}"); + $db->query("CREATE TABLE {server_add_entries} ( + `id` int(9) NOT NULL auto_increment, + `checked` boolean default 0, + `is_directory` boolean default 0, + `item_id` int(9), + `parent_id` int(9), + `path` varchar(255) NOT NULL, + `task_id` int(9) NOT NULL, + PRIMARY KEY (`id`)) + DEFAULT CHARSET=utf8;"); + module::set_version("server_add", $version = 4); + } } static function deactivate() { diff --git a/modules/server_add/helpers/server_add_theme.php b/modules/server_add/helpers/server_add_theme.php index 53f78772..50c050a8 100644 --- a/modules/server_add/helpers/server_add_theme.php +++ b/modules/server_add/helpers/server_add_theme.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,24 +20,24 @@ class server_add_theme_Core { static function head($theme) { if (identity::active_user()->admin) { - $theme->css("server_add.css"); - $theme->script("server_add.js"); + return $theme->css("server_add.css") + . $theme->script("server_add.js"); } } static function admin_head($theme) { - $head = array(); + $buf = ""; if (strpos(Router::$current_uri, "admin/server_add") !== false) { - $theme->css("server_add.css"); - $theme->css("jquery.autocomplete.css"); + $buf .= $theme->css("server_add.css") + . $theme->css("jquery.autocomplete.css"); $base = url::site("__ARGS__"); $csrf = access::csrf_token(); - $head[] = "<script type=\"text/javascript\"> var base_url = \"$base\"; var csrf = \"$csrf\";</script>"; + $buf .= "<script type=\"text/javascript\"> var base_url = \"$base\"; var csrf = \"$csrf\";</script>"; - $theme->script("jquery.autocomplete.js"); - $theme->script("admin.js"); + $buf .= $theme->script("jquery.autocomplete.js") + . $theme->script("admin.js"); } - return implode("\n", $head); + return $buf; } }
\ No newline at end of file diff --git a/modules/server_add/models/server_add_file.php b/modules/server_add/models/server_add_entry.php index 92b9f6de..6e64031a 100644 --- a/modules/server_add/models/server_add_file.php +++ b/modules/server_add/models/server_add_entry.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,5 +17,5 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ -class Server_Add_File_Model_Core extends ORM { +class Server_Add_Entry_Model_Core extends ORM { } diff --git a/modules/server_add/module.info b/modules/server_add/module.info index 23acab94..87b317b1 100644 --- a/modules/server_add/module.info +++ b/modules/server_add/module.info @@ -1,3 +1,3 @@ name = "Server Add" description = "Allows authorized users to load images directly from your web server" -version = 3 +version = 4 diff --git a/modules/slideshow/helpers/slideshow_event.php b/modules/slideshow/helpers/slideshow_event.php index 167fa7ff..d5b063c1 100644 --- a/modules/slideshow/helpers/slideshow_event.php +++ b/modules/slideshow/helpers/slideshow_event.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/slideshow/helpers/slideshow_installer.php b/modules/slideshow/helpers/slideshow_installer.php index cabbf7a8..2557a018 100644 --- a/modules/slideshow/helpers/slideshow_installer.php +++ b/modules/slideshow/helpers/slideshow_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/slideshow/helpers/slideshow_theme.php b/modules/slideshow/helpers/slideshow_theme.php index a3d6ef37..bbb68821 100644 --- a/modules/slideshow/helpers/slideshow_theme.php +++ b/modules/slideshow/helpers/slideshow_theme.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/tag/controllers/admin_tags.php b/modules/tag/controllers/admin_tags.php index 99743a8e..73042a55 100644 --- a/modules/tag/controllers/admin_tags.php +++ b/modules/tag/controllers/admin_tags.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/tag/controllers/tag.php b/modules/tag/controllers/tag.php index 0e924f3d..7aa038c6 100644 --- a/modules/tag/controllers/tag.php +++ b/modules/tag/controllers/tag.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,18 +29,18 @@ class Tag_Controller extends Controller { // Make sure that the page references a valid offset if ($page < 1) { - url::redirect($album->abs_url()); + url::redirect(url::merge(array("page" => 1))); } else if ($page > $max_pages) { - url::redirect($album->abs_url("page=$max_pages")); + url::redirect(url::merge(array("page" => $max_pages))); } $template = new Theme_View("page.html", "collection", "tag"); - $template->set_global("page", $page); - $template->set_global("max_pages", $max_pages); - $template->set_global("page_size", $page_size); - $template->set_global("tag", $tag); - $template->set_global("children", $tag->items($page_size, $offset)); - $template->set_global("children_count", $children_count); + $template->set_global(array("page" => $page, + "max_pages" => $max_pages, + "page_size" => $page_size, + "tag" => $tag, + "children" => $tag->items($page_size, $offset), + "children_count" => $children_count)); $template->content = new View("dynamic.html"); $template->content->title = t("Tag: %tag_name", array("tag_name" => $tag->name)); diff --git a/modules/tag/controllers/tags.php b/modules/tag/controllers/tags.php index aa39b6cd..fe6d747b 100644 --- a/modules/tag/controllers/tags.php +++ b/modules/tag/controllers/tags.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/tag/helpers/item_tags_rest.php b/modules/tag/helpers/item_tags_rest.php index 02c79e5d..74505cf7 100644 --- a/modules/tag/helpers/item_tags_rest.php +++ b/modules/tag/helpers/item_tags_rest.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/tag/helpers/tag.php b/modules/tag/helpers/tag.php index 14d27c94..733215b3 100644 --- a/modules/tag/helpers/tag.php +++ b/modules/tag/helpers/tag.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -36,11 +36,9 @@ class tag_Core { $tag = ORM::factory("tag")->where("name", "=", $tag_name)->find(); if (!$tag->loaded()) { $tag->name = $tag_name; - $tag->count = 0; } $tag->add($item); - $tag->count++; return $tag->save(); } @@ -118,7 +116,7 @@ class tag_Core { static function clear_all($item) { db::build() ->update("tags") - ->set("count", new Database_Expression("`count` - 1")) + ->set("count", db::expr("`count` - 1")) ->where("count", ">", 0) ->where("id", "IN", db::build()->select("tag_id")->from("items_tags")->where("item_id", "=", $item->id)) ->execute(); diff --git a/modules/tag/helpers/tag_block.php b/modules/tag/helpers/tag_block.php index 0473e4b2..8df58a6e 100644 --- a/modules/tag/helpers/tag_block.php +++ b/modules/tag/helpers/tag_block.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/tag/helpers/tag_event.php b/modules/tag/helpers/tag_event.php index 829089c4..cd79f734 100644 --- a/modules/tag/helpers/tag_event.php +++ b/modules/tag/helpers/tag_event.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -147,4 +147,19 @@ class tag_event_Core { } } } + + static function info_block_get_metadata($block, $item) { + $tags = array(); + foreach (tag::item_tags($item) as $tag) { + $tags[] = "<a href=\"" . url::site("tag/{$tag->name}") . "\">{$tag->name}</a>"; + } + if ($tags) { + $info = $block->content->metadata; + $info["tags"] = array( + "label" => t("Tags:"), + "value" => implode(", ", $tags) + ); + $block->content->metadata = $info; + } + } } diff --git a/modules/tag/helpers/tag_installer.php b/modules/tag/helpers/tag_installer.php index df6f0c65..16ad1239 100644 --- a/modules/tag/helpers/tag_installer.php +++ b/modules/tag/helpers/tag_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/tag/helpers/tag_item_rest.php b/modules/tag/helpers/tag_item_rest.php index 17cb726e..a8d3d0bc 100644 --- a/modules/tag/helpers/tag_item_rest.php +++ b/modules/tag/helpers/tag_item_rest.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/tag/helpers/tag_items_rest.php b/modules/tag/helpers/tag_items_rest.php index 848c2cd3..535ab513 100644 --- a/modules/tag/helpers/tag_items_rest.php +++ b/modules/tag/helpers/tag_items_rest.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/tag/helpers/tag_rest.php b/modules/tag/helpers/tag_rest.php index e0b7bd87..7f744a9e 100644 --- a/modules/tag/helpers/tag_rest.php +++ b/modules/tag/helpers/tag_rest.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/tag/helpers/tag_rss.php b/modules/tag/helpers/tag_rss.php index f60bd908..a8947c84 100644 --- a/modules/tag/helpers/tag_rss.php +++ b/modules/tag/helpers/tag_rss.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/tag/helpers/tag_task.php b/modules/tag/helpers/tag_task.php index 7bf50546..39df6c21 100644 --- a/modules/tag/helpers/tag_task.php +++ b/modules/tag/helpers/tag_task.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/tag/helpers/tag_theme.php b/modules/tag/helpers/tag_theme.php index f731dbb7..c532e708 100644 --- a/modules/tag/helpers/tag_theme.php +++ b/modules/tag/helpers/tag_theme.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,13 +19,13 @@ */ class tag_theme_Core { static function head($theme) { - $theme->css("jquery.autocomplete.css"); - $theme->script("jquery.autocomplete.js"); - $theme->css("tag.css"); + return $theme->css("jquery.autocomplete.css") + . $theme->script("jquery.autocomplete.js") + . $theme->css("tag.css"); } static function admin_head($theme) { - $theme->css("tag.css"); - $theme->script("gallery.in_place_edit.js"); + return $theme->css("tag.css") + . $theme->script("gallery.in_place_edit.js"); } }
\ No newline at end of file diff --git a/modules/tag/helpers/tags_rest.php b/modules/tag/helpers/tags_rest.php index 4f40e7f4..8785ad79 100644 --- a/modules/tag/helpers/tags_rest.php +++ b/modules/tag/helpers/tags_rest.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/tag/models/tag.php b/modules/tag/models/tag.php index c038f6d1..53ccc856 100644 --- a/modules/tag/models/tag.php +++ b/modules/tag/models/tag.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,6 +20,15 @@ class Tag_Model_Core extends ORM { protected $has_and_belongs_to_many = array("items"); + public function __construct($id=null) { + parent::__construct($id); + + if (!$this->loaded()) { + // Set reasonable defaults + $this->count = 0; + } + } + /** * Return all viewable items associated with this tag. * @param integer $limit number of rows to limit result to @@ -69,10 +78,13 @@ class Tag_Model_Core extends ORM { $related_item_ids[$row->item_id] = 1; } - if (isset($this->changed_relations["items"])) { - $changed = array_merge( - array_diff($this->changed_relations["items"], $this->object_relations["items"]), - array_diff($this->object_relations["items"], $this->changed_relations["items"])); + if (isset($this->object_relations["items"])) { + $added = array_diff($this->changed_relations["items"], $this->object_relations["items"]); + $removed = array_diff($this->object_relations["items"], $this->changed_relations["items"]); + if (isset($this->changed_relations["items"])) { + $changed = array_merge($added, $removed); + } + $this->count = count($this->object_relations["items"]) + count($added) - count($removed); } $result = parent::save(); diff --git a/modules/tag/tests/Tag_Item_Rest_Helper_Test.php b/modules/tag/tests/Tag_Item_Rest_Helper_Test.php index 533f832d..1c5caf35 100644 --- a/modules/tag/tests/Tag_Item_Rest_Helper_Test.php +++ b/modules/tag/tests/Tag_Item_Rest_Helper_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/tag/tests/Tag_Rest_Helper_Test.php b/modules/tag/tests/Tag_Rest_Helper_Test.php index a8aa89d4..48ee7872 100644 --- a/modules/tag/tests/Tag_Rest_Helper_Test.php +++ b/modules/tag/tests/Tag_Rest_Helper_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/tag/tests/Tag_Test.php b/modules/tag/tests/Tag_Test.php index 38c32e47..f5ccb3a2 100644 --- a/modules/tag/tests/Tag_Test.php +++ b/modules/tag/tests/Tag_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/tag/tests/Tags_Rest_Helper_Test.php b/modules/tag/tests/Tags_Rest_Helper_Test.php index 1b909e50..1b0c83a7 100644 --- a/modules/tag/tests/Tags_Rest_Helper_Test.php +++ b/modules/tag/tests/Tags_Rest_Helper_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/tag/views/tag_block.html.php b/modules/tag/views/tag_block.html.php index cc204c72..98fa0d4f 100644 --- a/modules/tag/views/tag_block.html.php +++ b/modules/tag/views/tag_block.html.php @@ -1,14 +1,14 @@ <?php defined("SYSPATH") or die("No direct script access.") ?> <script type="text/javascript"> $("#g-add-tag-form").ready(function() { - var url = $("#g-tag-cloud").attr("ref") + "/autocomplete"; + var url = $("#g-tag-cloud-autocomplete-url").attr("href"); $("#g-add-tag-form input:text").autocomplete( url, { max: 30, multiple: true, multipleSeparator: ',', cacheLength: 1, - selectFirst: false, + selectFirst: false } ); $("#g-add-tag-form").ajaxForm({ @@ -22,7 +22,9 @@ }); }); </script> -<div id="g-tag-cloud" ref="<?= url::site("tags") ?>"> +<div id="g-tag-cloud"> + <a id="g-tag-cloud-autocomplete-url" style="display: none" + href="<?= url::site("tags/autocomplete") ?>"></a> <?= $cloud ?> </div> <?= $form ?> diff --git a/modules/unit_test/libraries/Unit_Test.php b/modules/unit_test/libraries/Unit_Test.php index 46a926d8..253d6fb6 100644 --- a/modules/unit_test/libraries/Unit_Test.php +++ b/modules/unit_test/libraries/Unit_Test.php @@ -185,6 +185,8 @@ class Unit_Test_Core { $e = null; try { + // Enforce a time limit + set_time_limit(30); // Run the actual test $object->$method_name(); diff --git a/modules/user/config/identity.php b/modules/user/config/identity.php index 36ebc038..718c0300 100644 --- a/modules/user/config/identity.php +++ b/modules/user/config/identity.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/user/controllers/admin_users.php b/modules/user/controllers/admin_users.php index 23032ab3..a3633b52 100644 --- a/modules/user/controllers/admin_users.php +++ b/modules/user/controllers/admin_users.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,8 +22,34 @@ class Admin_Users_Controller extends Admin_Controller { $view = new Admin_View("admin.html"); $view->page_title = t("Users and groups"); $view->content = new View("admin_users.html"); - $view->content->users = ORM::factory("user")->order_by("name", "ASC")->find_all(); + + // @todo: add this as a config option + $page_size = module::get_var("user", "page_size", 10); + $page = Input::instance()->get("page", "1"); + $builder = db::build(); + $user_count = $builder->from("users")->count_records(); + + $view->content->pager = new Pagination(); + $view->content->pager->initialize( + array("query_string" => "page", + "total_items" => $user_count, + "items_per_page" => $page_size, + "style" => "classic")); + + // Make sure that the page references a valid offset + if ($page < 1) { + url::redirect(url::merge(array("page" => 1))); + } else if ($page > $view->content->pager->total_pages) { + url::redirect(url::merge(array("page" => $view->content->pager->total_pages))); + } + + // Join our users against the items table so that we can get a count of their items + // in the same query. + $view->content->users = ORM::factory("user") + ->order_by("users.name", "ASC") + ->find_all($page_size, $view->content->pager->sql_offset); $view->content->groups = ORM::factory("group")->order_by("name", "ASC")->find_all(); + print $view; } diff --git a/modules/user/controllers/password.php b/modules/user/controllers/password.php index 2e5eac5f..4e93d5ce 100644 --- a/modules/user/controllers/password.php +++ b/modules/user/controllers/password.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -51,7 +51,7 @@ class Password_Controller extends Controller { $user_name = $form->reset->inputs["name"]->value; $user = user::lookup_by_name($user_name); if ($user && !empty($user->email)) { - $user->hash = md5(uniqid(mt_rand(), true)); + $user->hash = random::hash(); $user->save(); $message = new View("reset_password.html"); $message->confirm_url = url::abs_site("password/do_reset?key=$user->hash"); diff --git a/modules/user/controllers/users.php b/modules/user/controllers/users.php index 6bb4967f..3e0e0e54 100644 --- a/modules/user/controllers/users.php +++ b/modules/user/controllers/users.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/user/css/user.css b/modules/user/css/user.css index 084eac31..93e3d02e 100644 --- a/modules/user/css/user.css +++ b/modules/user/css/user.css @@ -12,6 +12,7 @@ #g-user-admin { width: auto; + margin-bottom: 4em; } #g-group-admin { diff --git a/modules/user/helpers/group.php b/modules/user/helpers/group.php index 88bfac35..801387d8 100644 --- a/modules/user/helpers/group.php +++ b/modules/user/helpers/group.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/user/helpers/user.php b/modules/user/helpers/user.php index be50d6d1..49eec360 100644 --- a/modules/user/helpers/user.php +++ b/modules/user/helpers/user.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/user/helpers/user_event.php b/modules/user/helpers/user_event.php index 3b6ddc66..9913e52d 100644 --- a/modules/user/helpers/user_event.php +++ b/modules/user/helpers/user_event.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/user/helpers/user_installer.php b/modules/user/helpers/user_installer.php index afa0bd16..b889af49 100644 --- a/modules/user/helpers/user_installer.php +++ b/modules/user/helpers/user_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/user/helpers/user_theme.php b/modules/user/helpers/user_theme.php index 5a7161ed..e2479bc3 100644 --- a/modules/user/helpers/user_theme.php +++ b/modules/user/helpers/user_theme.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,12 +19,12 @@ */ class user_theme_Core { static function head($theme) { - $theme->css("user.css"); - $theme->script("password_strength.js"); + return $theme->css("user.css") + . $theme->script("password_strength.js"); } static function admin_head($theme) { - $theme->css("user.css"); - $theme->script("password_strength.js"); + return $theme->css("user.css") + . $theme->script("password_strength.js"); } }
\ No newline at end of file diff --git a/modules/user/libraries/drivers/IdentityProvider/Gallery.php b/modules/user/libraries/drivers/IdentityProvider/Gallery.php index 73ac9bd0..8cba3c82 100644 --- a/modules/user/libraries/drivers/IdentityProvider/Gallery.php +++ b/modules/user/libraries/drivers/IdentityProvider/Gallery.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/user/models/group.php b/modules/user/models/group.php index 17d9320b..4409dcb8 100644 --- a/modules/user/models/group.php +++ b/modules/user/models/group.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,6 +19,7 @@ */ class Group_Model_Core extends ORM implements Group_Definition { protected $has_and_belongs_to_many = array("users"); + protected $users_cache = null; /** * @see ORM::delete() @@ -28,10 +29,14 @@ class Group_Model_Core extends ORM implements Group_Definition { module::event("group_before_delete", $this); parent::delete($id); module::event("group_deleted", $old); + $this->users_cache = null; } public function users() { - return $this->users->find_all(); + if (!$this->users_cache) { + $this->users_cache = $this->users->find_all()->as_array(); + } + return $this->users_cache; } /** @@ -60,6 +65,7 @@ class Group_Model_Core extends ORM implements Group_Definition { module::event("group_updated", $original, $this); } + $this->users_cache = null; return $this; } diff --git a/modules/user/models/user.php b/modules/user/models/user.php index 55bb3d6a..145738ca 100644 --- a/modules/user/models/user.php +++ b/modules/user/models/user.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ class User_Model_Core extends ORM implements User_Definition { protected $has_and_belongs_to_many = array("groups"); protected $password_length = null; + protected $groups_cache = null; public function __set($column, $value) { switch ($column) { @@ -43,6 +44,7 @@ class User_Model_Core extends ORM implements User_Definition { module::event("user_before_delete", $this); parent::delete($id); module::event("user_deleted", $old); + $this->groups_cache = null; } /** @@ -56,7 +58,10 @@ class User_Model_Core extends ORM implements User_Definition { } public function groups() { - return $this->groups->find_all(); + if (!$this->groups_cache) { + $this->groups_cache = $this->groups->find_all()->as_array(); + } + return $this->groups_cache; } /** @@ -108,6 +113,7 @@ class User_Model_Core extends ORM implements User_Definition { module::event("user_updated", $original, $this); } + $this->groups_cache = null; return $this; } diff --git a/modules/user/tests/No_Direct_ORM_Access_Test.php b/modules/user/tests/No_Direct_ORM_Access_Test.php index 0e5aa263..f696d194 100644 --- a/modules/user/tests/No_Direct_ORM_Access_Test.php +++ b/modules/user/tests/No_Direct_ORM_Access_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/user/tests/User_Groups_Test.php b/modules/user/tests/User_Groups_Test.php index c3e90718..e58df209 100644 --- a/modules/user/tests/User_Groups_Test.php +++ b/modules/user/tests/User_Groups_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/user/tests/User_Installer_Test.php b/modules/user/tests/User_Installer_Test.php index 98e5edff..de86f8ea 100644 --- a/modules/user/tests/User_Installer_Test.php +++ b/modules/user/tests/User_Installer_Test.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/user/views/admin_users.html.php b/modules/user/views/admin_users.html.php index f067cae8..a7bd6b27 100644 --- a/modules/user/views/admin_users.html.php +++ b/modules/user/views/admin_users.html.php @@ -108,6 +108,11 @@ </tr> <? endforeach ?> </table> + + <div class="g-paginator"> + <?= $pager ?> + </div> + </div> </div> diff --git a/modules/watermark/controllers/admin_watermarks.php b/modules/watermark/controllers/admin_watermarks.php index a2cafee0..a436cfe9 100644 --- a/modules/watermark/controllers/admin_watermarks.php +++ b/modules/watermark/controllers/admin_watermarks.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/watermark/helpers/watermark.php b/modules/watermark/helpers/watermark.php index 515f8abb..3fecb6bb 100644 --- a/modules/watermark/helpers/watermark.php +++ b/modules/watermark/helpers/watermark.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/watermark/helpers/watermark_event.php b/modules/watermark/helpers/watermark_event.php index 8254e6ff..d0b14955 100644 --- a/modules/watermark/helpers/watermark_event.php +++ b/modules/watermark/helpers/watermark_event.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/modules/watermark/helpers/watermark_installer.php b/modules/watermark/helpers/watermark_installer.php index 23d1c3ee..547daf6e 100644 --- a/modules/watermark/helpers/watermark_installer.php +++ b/modules/watermark/helpers/watermark_installer.php @@ -1,7 +1,7 @@ <?php defined("SYSPATH") or die("No direct script access."); /** * Gallery - a web based photo album viewer and editor - * Copyright (C) 2000-2010 Bharat Mediratta + * Copyright (C) 2000-2011 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/php.ini b/php.ini new file mode 100644 index 00000000..d2f96f51 --- /dev/null +++ b/php.ini @@ -0,0 +1,19 @@ +; Set some reasonable defaults for PHP. Most of these cannot be set +; inside the script itself. These settings are mirrored in the +; .htaccess file for hosts that support .htaccess but not per-dir +; php.ini files. +; +[PHP] +short_open_tag = On +magic_quotes_gpc = Off +magic_quotes_sybase = Off +magic_quotes_runtime = Off +register_globals = Off +upload_max_filesize = 20M +post_max_size = 100M + +[Session] +session.auto_start = Off + +[suhosin] +suhosin.session.encrypt = Off diff --git a/themes/admin_wind/css/screen.css b/themes/admin_wind/css/screen.css index 273ac116..a5376ff6 100644 --- a/themes/admin_wind/css/screen.css +++ b/themes/admin_wind/css/screen.css @@ -759,7 +759,7 @@ form .g-error { } .g-loading-small { - background: #e8e8e8 url('..lib/images/loading-small.gif') no-repeat center center !important; + background: #e8e8e8 url('../images/loading-small.gif') no-repeat center center !important; } /** ******************************************************************* @@ -888,10 +888,10 @@ button { background-position: .4em .3em; border: 1px solid #ccc; padding: 0; + margin-bottom: 1em; } #g-action-status { - margin-bottom: 1em; } #g-action-status li, diff --git a/themes/admin_wind/views/admin.html.php b/themes/admin_wind/views/admin.html.php index c8041069..9e011c69 100644 --- a/themes/admin_wind/views/admin.html.php +++ b/themes/admin_wind/views/admin.html.php @@ -1,9 +1,10 @@ <?php defined("SYSPATH") or die("No direct script access.") ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<html xmlns="http://www.w3.org/1999/xhtml" <?= $theme->html_attributes() ?> xml:lang="en" lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> + <? $theme->start_combining("script,css") ?> <title> <? if ($page_title): ?> <?= t("Gallery Admin: %page_title", array("page_title" => $page_title)) ?> @@ -11,8 +12,26 @@ <?= t("Admin dashboard") ?> <? endif ?> </title> - <link rel="shortcut icon" href="<?= url::file(module::get_var("gallery", "favicon_url")) ?>" type="image/x-icon" /> + <link rel="shortcut icon" + href="<?= url::file(module::get_var("gallery", "favicon_url")) ?>" + type="image/x-icon" /> + <?= $theme->script("jquery.js") ?> + <?= $theme->script("jquery.form.js") ?> + <?= $theme->script("jquery-ui.js") ?> + <?= $theme->script("gallery.common.js") ?> + <? /* MSG_CANCEL is required by gallery.dialog.js */ ?> + <script type="text/javascript"> + var MSG_CANCEL = <?= t("Cancel")->for_js() ?>; + </script> + <?= $theme->script("gallery.ajax.js") ?> + <?= $theme->script("gallery.dialog.js") ?> + <?= $theme->script("superfish/js/superfish.js") ?> + + <?= $theme->admin_head() ?> + + <? /* Theme specific CSS/JS goes last so that it can override module CSS/JS */ ?> + <?= $theme->script("ui.init.js") ?> <?= $theme->css("yui/reset-fonts-grids.css") ?> <?= $theme->css("themeroller/ui.base.css") ?> <?= $theme->css("superfish/css/superfish.css") ?> @@ -22,20 +41,11 @@ media="screen,print,projection" /> <![endif]--> - <?= $theme->script("jquery.js") ?> - <?= $theme->script("jquery.form.js") ?> - <?= $theme->script("jquery-ui.js") ?> - <?= $theme->script("gallery.common.js") ?> - <? /* MSG_CANCEL is required by gallery.dialog.js */ ?> - <script type="text/javascript"> - var MSG_CANCEL = <?= t("Cancel")->for_js() ?>; - </script> - <?= $theme->script("gallery.ajax.js") ?> - <?= $theme->script("gallery.dialog.js") ?> - <?= $theme->script("superfish/js/superfish.js") ?> - <?= $theme->script("ui.init.js") ?> + <!-- LOOKING FOR YOUR JAVASCRIPT? It's all been combined into the link below --> + <?= $theme->get_combined("script") ?> - <?= $theme->admin_head() ?> + <!-- LOOKING FOR YOUR CSS? It's all been combined into the link below --> + <?= $theme->get_combined("css") ?> </head> <body <?= $theme->body_attributes() ?>> diff --git a/themes/wind/views/no_sidebar.html.php b/themes/wind/views/no_sidebar.html.php index a9eb0e3e..58c57256 100644 --- a/themes/wind/views/no_sidebar.html.php +++ b/themes/wind/views/no_sidebar.html.php @@ -1,6 +1,11 @@ <?php defined("SYSPATH") or die("No direct script access.") ?> <ul class="g-message-block"> - <li class="g-warning"><?= t("No active sidebar blocks.") ?> - <br/><a href="<?= url::site("admin/sidebar") ?>"><?= t("Add blocks") ?></a> + <li class="g-warning"> + <? if (block_manager::get_active("site_sidebar")): ?> + <?= t("Active sidebar blocks have no content.") ?> + <? else: ?> + <?= t("No active sidebar blocks.") ?> + <? endif ?> + <a href="<?= url::site("admin/sidebar") ?>"><?= t("configure blocks") ?></a> </li> </ul> diff --git a/themes/wind/views/page.html.php b/themes/wind/views/page.html.php index b3379416..0e5bdf6b 100644 --- a/themes/wind/views/page.html.php +++ b/themes/wind/views/page.html.php @@ -1,50 +1,42 @@ <?php defined("SYSPATH") or die("No direct script access.") ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<html xmlns="http://www.w3.org/1999/xhtml" <?= $theme->html_attributes() ?> xml:lang="en" lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> + <? $theme->start_combining("script,css") ?> <title> <? if ($page_title): ?> <?= $page_title ?> <? else: ?> <? if ($theme->item()): ?> - <? if ($theme->item()->is_album()): ?> - <?= t("Browse Album :: %album_title", array("album_title" => $theme->item()->title)) ?> - <? elseif ($theme->item()->is_photo()): ?> - <?= t("Photo :: %photo_title", array("photo_title" => $theme->item()->title)) ?> - <? else: ?> - <?= t("Movie :: %movie_title", array("movie_title" => $theme->item()->title)) ?> - <? endif ?> + <?= $theme->item()->title ?> <? elseif ($theme->tag()): ?> - <?= t("Browse Tag :: %tag_title", array("tag_title" => $theme->tag()->name)) ?> + <?= t("Photos tagged with %tag_title", array("tag_title" => $theme->tag()->name)) ?> <? else: /* Not an item, not a tag, no page_title specified. Help! */ ?> - <?= t("Gallery") ?> + <?= item::root()->title ?> <? endif ?> <? endif ?> </title> - <link rel="shortcut icon" href="<?= url::file(module::get_var("gallery", "favicon_url")) ?>" type="image/x-icon" /> - <?= $theme->css("yui/reset-fonts-grids.css") ?> - <?= $theme->css("superfish/css/superfish.css") ?> - <?= $theme->css("themeroller/ui.base.css") ?> - <?= $theme->css("screen.css") ?> - <!--[if lte IE 8]> - <link rel="stylesheet" type="text/css" href="<?= $theme->url("css/fix-ie.css") ?>" - media="screen,print,projection" /> - <![endif]--> + <link rel="shortcut icon" + href="<?= url::file(module::get_var("gallery", "favicon_url")) ?>" + type="image/x-icon" /> + <? if ($theme->page_type == "collection"): ?> <? if ($thumb_proportion != 1): ?> <? $new_width = round($thumb_proportion * 213) ?> <? $new_height = round($thumb_proportion * 240) ?> - <style type="text/css"> - .g-view #g-content #g-album-grid .g-item { - width: <?= $new_width ?>px; - height: <?= $new_height ?>px; - /* <?= $thumb_proportion ?> */ - } - </style> + <style type="text/css"> + .g-view #g-content #g-album-grid .g-item { + width: <?= $new_width ?>px; + height: <?= $new_height ?>px; + /* <?= $thumb_proportion ?> */ + } + </style> <? endif ?> <? endif ?> + + <?= $theme->script("json2-min.js") ?> <?= $theme->script("jquery.js") ?> <?= $theme->script("jquery.form.js") ?> <?= $theme->script("jquery-ui.js") ?> @@ -57,9 +49,8 @@ <?= $theme->script("gallery.dialog.js") ?> <?= $theme->script("superfish/js/superfish.js") ?> <?= $theme->script("jquery.localscroll.js") ?> - <?= $theme->script("ui.init.js") ?> - <? /* These are page specific, but if we put them before $theme->head() they get combined */ ?> + <? /* These are page specific but they get combined */ ?> <? if ($theme->page_subtype == "photo"): ?> <?= $theme->script("jquery.scrollTo.js") ?> <?= $theme->script("gallery.show_full_size.js") ?> @@ -68,6 +59,23 @@ <? endif ?> <?= $theme->head() ?> + + <? /* Theme specific CSS/JS goes last so that it can override module CSS/JS */ ?> + <?= $theme->script("ui.init.js") ?> + <?= $theme->css("yui/reset-fonts-grids.css") ?> + <?= $theme->css("superfish/css/superfish.css") ?> + <?= $theme->css("themeroller/ui.base.css") ?> + <?= $theme->css("screen.css") ?> + <!--[if lte IE 8]> + <link rel="stylesheet" type="text/css" href="<?= $theme->url("css/fix-ie.css") ?>" + media="screen,print,projection" /> + <![endif]--> + + <!-- LOOKING FOR YOUR JAVASCRIPT? It's all been combined into the link below --> + <?= $theme->get_combined("script") ?> + + <!-- LOOKING FOR YOUR CSS? It's all been combined into the link below --> + <?= $theme->get_combined("css") ?> </head> <body <?= $theme->body_attributes() ?>> |